diff --git a/include/launchercore.h b/include/launchercore.h index f986a2e..3ca076a 100755 --- a/include/launchercore.h +++ b/include/launchercore.h @@ -41,13 +41,13 @@ struct ProfileSettings { // game int language = 1; // 1 is english, thats all i know QString gamePath, winePath, winePrefixPath; - QString bootVersion, gameVersion, wineVersion; + QString bootVersion, wineVersion; int installedMaxExpansion = -1; - QList expansionVersions; + QVector gameVersions; bool enableWatchdog = false; bool isGameInstalled() const { - return !gameVersion.isEmpty(); + return !gameVersions.isEmpty(); } bool isWineInstalled() const { @@ -175,14 +175,17 @@ public: QString nativeLauncherVersion; int defaultProfileIndex = 0; + + QVector expansionNames; + signals: void settingsChanged(); void successfulLaunch(); void gameClosed(); private: - void readExpansionVersions(ProfileSettings& info, int max); bool checkIfInPath(QString program); + void readGameData(ProfileSettings& profile); QString getDefaultGamePath(); QString getDefaultWinePrefixPath(); diff --git a/src/launchercore.cpp b/src/launchercore.cpp index 9c9ad77..29177d1 100755 --- a/src/launchercore.cpp +++ b/src/launchercore.cpp @@ -28,6 +28,8 @@ #include "blowfish.h" #include "assetupdater.h" #include "encryptedarg.h" +#include "gamedata.h" +#include "exdparser.h" #ifdef ENABLE_WATCHDOG #include "watchdog.h" @@ -86,7 +88,7 @@ void LauncherCore::launchGame(const ProfileSettings& profile, const LoginAuth au gameArgs.push_back({"DEV.TestSID", auth.SID}); gameArgs.push_back({"SYS.Region", QString::number(auth.region)}); gameArgs.push_back({"language", QString::number(profile.language)}); - gameArgs.push_back({"ver", profile.gameVersion}); + gameArgs.push_back({"ver", profile.gameVersions[0]}); if(!auth.lobbyhost.isEmpty()) { gameArgs.push_back({"DEV.GMServerHost", auth.frontierHost}); @@ -151,7 +153,7 @@ void LauncherCore::launchGame(const ProfileSettings& profile, const LoginAuth au startInfo["AssetDirectory"] = dataDir + "\\DalamudAssets"; startInfo["DefaultPluginDirectory"] = dataDir + "\\devPlugins"; startInfo["DelayInitializeMs"] = 0; - startInfo["GameVersion"] = profile.gameVersion; + startInfo["GameVersion"] = profile.gameVersions[0]; startInfo["Language"] = profile.language; startInfo["OptOutMbCollection"] = profile.dalamud.optOutOfMbCollection; @@ -496,18 +498,38 @@ void LauncherCore::readWineInfo(ProfileSettings& profile) { void LauncherCore::readGameVersion() { for(auto& profile : profileSettings) { profile.bootVersion = readVersion(profile.gamePath + "/boot/ffxivboot.ver"); - profile.gameVersion = readVersion(profile.gamePath + "/game/ffxivgame.ver"); profile.installedMaxExpansion = 0; - for(auto dir : QDir(profile.gamePath + "/game/sqpack/").entryList(QDir::Filter::Dirs)) { - if(dir.contains("ex") && dir.length() == 3 && dir[2].isDigit()) { - const int expacVersion = dir[2].digitValue(); + auto sqpackDirectories = QDir(profile.gamePath + "/game/sqpack/").entryList(QDir::Filter::Dirs | QDir::Filter::NoDotAndDotDot); + profile.gameVersions.resize(sqpackDirectories.size()); - profile.installedMaxExpansion = std::max(profile.installedMaxExpansion, expacVersion); + for(auto dir : sqpackDirectories) { + if(dir.contains("ex") || dir == "ffxiv") { + int expansion = -1; + + // we're going to treat ffxiv as ex0 + if(dir == "ffxiv") { + expansion = 0; + + profile.gameVersions[0] = readVersion(profile.gamePath + QString("/game/ffxivgame.ver")); + } else { + QString originalName = dir.remove("ex"); + bool ok = false; + int convertedInt = originalName.toInt(&ok); + if(ok) + expansion = convertedInt; + + profile.gameVersions[convertedInt] = readVersion(QString("%1/game/sqpack/ex%2/ex%2.ver").arg(profile.gamePath, QString::number(expansion))); + } + + if(expansion != -1) { + profile.installedMaxExpansion = std::max(profile.installedMaxExpansion, expansion); + } } } - readExpansionVersions(profile, profile.installedMaxExpansion); + if(profile.installedMaxExpansion >= 0) + readGameData(profile); } } @@ -658,13 +680,6 @@ void LauncherCore::addUpdateButtons(const ProfileSettings& settings, QMessageBox messageBox.addButton(QMessageBox::StandardButton::Ok); } -void LauncherCore::readExpansionVersions(ProfileSettings& info, int max) { - info.expansionVersions.clear(); - - for(int i = 0; i < max; i++) - info.expansionVersions.push_back(readVersion(QString("%1/game/sqpack/ex%2/ex%2.ver").arg(info.gamePath, QString::number(i + 1)))); -} - bool LauncherCore::checkIfInPath(const QString program) { // TODO: also check /usr/local/bin, /bin32 etc (basically read $PATH) const QString directory = "/usr/bin"; @@ -705,4 +720,17 @@ void LauncherCore::addRegistryKey(const ProfileSettings& settings, auto process = new QProcess(this); process->setProcessEnvironment(QProcessEnvironment::systemEnvironment()); launchExecutable(settings, process, {"reg", "add", key, "/v", value, "/d", data, "/f" }, false, false); -} \ No newline at end of file +} + +void LauncherCore::readGameData(ProfileSettings& profile) { + GameData data(profile.gamePath.toStdString() + "/game/sqpack"); + + if(auto exh = data.readExcelSheet("ExVersion")) { + auto path = getEXDFilename(*exh, "exversion", "en", exh->pages[0]); + auto exd = readEXD(*exh, *data.extractFile("exd/" + path), exh->pages[0]); + + for(auto row : exd.rows) { + expansionNames.push_back(row.data[0].data.c_str()); + } + } +} diff --git a/src/settingswindow.cpp b/src/settingswindow.cpp index e908e75..c09bfd0 100644 --- a/src/settingswindow.cpp +++ b/src/settingswindow.cpp @@ -485,29 +485,14 @@ void SettingsWindow::reloadControls() { expacString += "Boot"; expacString += QString(" (%1)\n").arg(profile.bootVersion); - if(profile.installedMaxExpansion >= 0) { - expacString += "A Realm Reborn"; - expacString += QString(" (%1)\n").arg(profile.gameVersion); - } + for(int i = 0; i < profile.gameVersions.size(); i++) { + QString expansionName = "Unknown Expansion"; + if(i < core.expansionNames.size()) { + expansionName = core.expansionNames[i]; + } - if(profile.installedMaxExpansion >= 1) { - expacString += "Heavensward"; - expacString += QString(" (%1)\n").arg(profile.expansionVersions[0]); - } - - if(profile.installedMaxExpansion >= 2) { - expacString += "Stormblood"; - expacString += QString(" (%1)\n").arg(profile.expansionVersions[1]); - } - - if(profile.installedMaxExpansion >= 3) { - expacString += "Shadowbringers"; - expacString += QString(" (%1)\n").arg(profile.expansionVersions[2]); - } - - if(profile.installedMaxExpansion >= 4) { - expacString += "Endwalker"; - expacString += QString(" (%1)\n").arg(profile.expansionVersions[3]); + expacString += expansionName; + expacString += QString(" (%1)\n").arg(profile.gameVersions[i]); } expansionVersionLabel->setText(expacString); diff --git a/src/squarelauncher.cpp b/src/squarelauncher.cpp index bba3a06..f05cdf7 100644 --- a/src/squarelauncher.cpp +++ b/src/squarelauncher.cpp @@ -161,7 +161,7 @@ void SquareLauncher::registerSession(const LoginInformation& info) { QUrl url; url.setScheme("https"); url.setHost("patch-gamever.ffxiv.com"); - url.setPath(QString("/http/win32/ffxivneo_release_game/%1/%2").arg(info.settings->gameVersion, SID)); + url.setPath(QString("/http/win32/ffxivneo_release_game/%1/%2").arg(info.settings->gameVersions[0], SID)); auto request = QNetworkRequest(url); window.setSSL(request); @@ -171,8 +171,8 @@ void SquareLauncher::registerSession(const LoginInformation& info) { QString report = info.settings->bootVersion + "=" + getBootHash(info); - for(int i = 0; i < info.settings->installedMaxExpansion; i++) - report += QString("\nex%1\t%2").arg(QString::number(i + 1), info.settings->expansionVersions[i]); + for(int i = 1; i < info.settings->installedMaxExpansion; i++) + report += QString("\nex%1\t%2").arg(QString::number(i), info.settings->gameVersions[i]); auto reply = window.mgr->post(request, report.toUtf8()); connect(reply, &QNetworkReply::finished, [=] {