improve format awareness, improve RNG

This commit is contained in:
Syping 2023-10-03 22:47:11 +02:00
parent 01424ef51f
commit 4fdde8e485
5 changed files with 80 additions and 64 deletions

View file

@ -60,12 +60,16 @@ QString AppEnv::getGameFolder(bool *ok)
if (dir.exists()) {
if (ok)
*ok = true;
qputenv("GTAV_FOLDER", dir.absolutePath().toUtf8());
return dir.absolutePath();
}
}
#ifdef Q_OS_WIN
const QString GTAV_defaultFolder = StandardPaths::documentsLocation() % "/Rockstar Games/GTA V";
#else
// TODO: Try to locate the Steam Proton GTA V folder
const QString GTAV_defaultFolder = StandardPaths::documentsLocation() % "/Rockstar Games/GTA V";
#endif
QString GTAV_returnFolder = GTAV_defaultFolder;
QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
@ -79,7 +83,6 @@ QString AppEnv::getGameFolder(bool *ok)
if (dir.exists()) {
if (ok)
*ok = true;
qputenv("GTAV_FOLDER", dir.absolutePath().toUtf8());
return dir.absolutePath();
}
}
@ -88,7 +91,6 @@ QString AppEnv::getGameFolder(bool *ok)
if (dir.exists()) {
if (ok)
*ok = true;
qputenv("GTAV_FOLDER", dir.absolutePath().toUtf8());
return dir.absolutePath();
}
@ -97,7 +99,6 @@ QString AppEnv::getGameFolder(bool *ok)
if (dir.exists()) {
if (ok)
*ok = true;
qputenv("GTAV_FOLDER", dir.absolutePath().toUtf8());
return dir.absolutePath();
}
}
@ -111,10 +112,8 @@ bool AppEnv::setGameFolder(QString gameFolder)
{
QDir dir;
dir.setPath(gameFolder);
if (dir.exists()) {
qputenv("GTAV_FOLDER", dir.absolutePath().toUtf8());
if (dir.exists())
return true;
}
return false;
}

View file

@ -60,10 +60,6 @@
#include <QUrl>
#include <QDir>
#include <cstdint>
#include <random>
#include <ctime>
#ifdef GTA5SYNC_TELEMETRY
#include "TelemetryClass.h"
#include <QJsonDocument>
@ -138,12 +134,10 @@ ProfileInterface::ProfileInterface(ProfileDatabase *profileDB, CrewDatabase *cre
#endif
// Seed RNG
pcg32_srandom_r(&rng, time(NULL), (intptr_t)&rng);
pcg32_srandom_r(&rng, QDateTime::currentMSecsSinceEpoch(), (intptr_t)&rng);
#if QT_VERSION >= 0x050000
// Register Metatypes
qRegisterMetaType<QVector<QString>>();
#endif
setMouseTracking(true);
installEventFilter(this);
@ -175,10 +169,11 @@ ProfileInterface::~ProfileInterface()
delete ui;
}
void ProfileInterface::setProfileFolder(QString folder, QString profile)
void ProfileInterface::setProfileFolder(QString folder, QString profile, quint32 format)
{
profileFolder = folder;
profileName = profile;
photoFormat = format;
}
void ProfileInterface::setupProfileInterface()
@ -186,9 +181,7 @@ void ProfileInterface::setupProfileInterface()
fixedPictures.clear();
ui->labProfileLoading->setText(tr("Loading..."));
profileLoader = new ProfileLoader(profileFolder, crewDB);
#if QT_VERSION >= 0x050000
QObject::connect(profileLoader, SIGNAL(directoryScanned(QVector<QString>,QVector<QString>)), this, SLOT(directoryScanned(QVector<QString>,QVector<QString>)));
#endif
QObject::connect(profileLoader, SIGNAL(savegameLoaded(SavegameData*, QString)), this, SLOT(savegameLoaded_event(SavegameData*, QString)));
QObject::connect(profileLoader, SIGNAL(pictureLoaded(SnapmaticPicture*)), this, SLOT(pictureLoaded_event(SnapmaticPicture*)));
QObject::connect(profileLoader, SIGNAL(pictureFixed(SnapmaticPicture*)), this, SLOT(pictureFixed_event(SnapmaticPicture*)));
@ -264,7 +257,6 @@ void ProfileInterface::loadingProgress(int value, int maximum)
ui->labProfileLoading->setText(loadingStr.arg(QString::number(value), QString::number(maximum)));
}
#if QT_VERSION >= 0x050000
void ProfileInterface::directoryChanged(const QString &path)
{
Q_UNUSED(path)
@ -330,7 +322,6 @@ void ProfileInterface::directoryScanned(QVector<QString> savegameFiles_s, QVecto
fileSystemWatcher.addPath(profileFolder);
QObject::connect(&fileSystemWatcher, &QFileSystemWatcher::directoryChanged, this, &ProfileInterface::directoryChanged);
}
#endif
void ProfileInterface::insertSnapmaticIPI(QWidget *widget)
{
@ -726,7 +717,7 @@ bool ProfileInterface::importFile(QString selectedFile, QDateTime importDateTime
}
else if (isSupportedImageFile(selectedFileName)) {
SnapmaticPicture *picture = new SnapmaticPicture();
picture->initialise(RagePhoto::PhotoFormat::GTA5); // TODO: check which game we want create for
picture->initialise(photoFormat);
if (!notMultiple) {
QFile snapmaticFile(selectedFile);
if (!snapmaticFile.open(QFile::ReadOnly)) {
@ -1045,27 +1036,39 @@ bool ProfileInterface::importRemote(QUrl remoteUrl)
bool ProfileInterface::importImage(QImage *snapmaticImage, QDateTime importDateTime)
{
bool success = false;
SnapmaticPicture *picture = new SnapmaticPicture();
picture->initialise(RagePhoto::PhotoFormat::GTA5); // TODO: check which game we want create for
picture->initialise(photoFormat);
ImportDialog *importDialog = new ImportDialog(profileName, this);
importDialog->setImage(snapmaticImage);
importDialog->setModal(true);
importDialog->show();
importDialog->exec();
bool success = false;
if (importDialog->isImportAgreed()) {
if (picture->setImage(importDialog->image(), importDialog->isUnlimitedBuffer())) {
QString fileFormat;
switch (photoFormat) {
case RagePhoto::PhotoFormat::GTA5:
fileFormat = "PGTA5%1";
break;
case RagePhoto::PhotoFormat::RDR2:
fileFormat = "PRDR3%1";
break;
default:
fileFormat = "%1.lrpx";
break;
}
SnapmaticProperties spJson = picture->getSnapmaticProperties();
spJson.uid = getRandomUid();
bool fExists = QFile::exists(profileFolder % "/PGTA5" % QString::number(spJson.uid));
bool fExistsBackup = QFile::exists(profileFolder % "/PGTA5" % QString::number(spJson.uid) % ".bak");
bool fExistsHidden = QFile::exists(profileFolder % "/PGTA5" % QString::number(spJson.uid) % ".hidden");
bool fExists = QFile::exists(profileFolder % "/" % fileFormat.arg(QString::number(spJson.uid)));
bool fExistsBackup = QFile::exists(profileFolder % "/" % fileFormat.arg(QString::number(spJson.uid) % ".bak"));
bool fExistsHidden = QFile::exists(profileFolder % "/" % fileFormat.arg(QString::number(spJson.uid) % ".hidden"));
int cEnough = 0;
while ((fExists || fExistsBackup || fExistsHidden) && cEnough < findRetryLimit) {
spJson.uid = getRandomUid();
fExists = QFile::exists(profileFolder % "/PGTA5" % QString::number(spJson.uid));
fExistsBackup = QFile::exists(profileFolder % "/PGTA5" % QString::number(spJson.uid) % ".bak");
fExistsHidden = QFile::exists(profileFolder % "/PGTA5" % QString::number(spJson.uid) % ".hidden");
fExists = QFile::exists(profileFolder % "/" % fileFormat.arg(QString::number(spJson.uid)));
fExistsBackup = QFile::exists(profileFolder % "/" % fileFormat.arg(QString::number(spJson.uid) % ".bak"));
fExistsHidden = QFile::exists(profileFolder % "/" % fileFormat.arg(QString::number(spJson.uid) % ".hidden"));
cEnough++;
}
spJson.createdDateTime = importDateTime;
@ -1079,10 +1082,8 @@ bool ProfileInterface::importImage(QImage *snapmaticImage, QDateTime importDateT
spJson.createdTimestamp = spJson.createdDateTime.toTime_t();
#endif
picture->setSnapmaticProperties(spJson);
const QString picFileName = QString("PGTA5%1").arg(QString::number(spJson.uid));
picture->setPicFileName(picFileName);
picture->setPicFileName(fileFormat.arg(QString::number(spJson.uid)));
picture->setPictureTitle(importDialog->getImageTitle());
picture->updateStrings();
success = importSnapmaticPicture(picture, true);
}
}
@ -1098,6 +1099,23 @@ bool ProfileInterface::importImage(QImage *snapmaticImage, QDateTime importDateT
bool ProfileInterface::importSnapmaticPicture(SnapmaticPicture *picture, bool warn)
{
QString fileFormat;
SnapmaticFormat spFormat;
switch (picture->ragePhoto()->format()) {
case RagePhoto::PhotoFormat::GTA5:
case G5EPhotoFormat::G5EX:
fileFormat = "PGTA5%1";
spFormat = SnapmaticFormat::PGTA5_Format;
break;
case RagePhoto::PhotoFormat::RDR2:
fileFormat = "PRDR3%1";
spFormat = SnapmaticFormat::PRDR3_Format;
break;
default:
fileFormat = "%.lrpx";
spFormat = SnapmaticFormat::G5E_Format;
break;
}
QString picFileName = picture->getPictureFileName();
QString adjustedFileName = picture->getOriginalPictureFileName();
if (!picFileName.startsWith("PGTA5") && !picFileName.startsWith("PRDR3")) {
@ -1122,15 +1140,15 @@ bool ProfileInterface::importSnapmaticPicture(SnapmaticPicture *picture, bool wa
#else
snapmaticProperties.createdTimestamp = snapmaticProperties.createdDateTime.toTime_t();
#endif
bool fExists = QFile::exists(profileFolder % "/PGTA5" % QString::number(snapmaticProperties.uid));
bool fExistsBackup = QFile::exists(profileFolder % "/PGTA5" % QString::number(snapmaticProperties.uid) % ".bak");
bool fExistsHidden = QFile::exists(profileFolder % "/PGTA5" % QString::number(snapmaticProperties.uid) % ".hidden");
bool fExists = QFile::exists(profileFolder % "/" % fileFormat.arg(QString::number(snapmaticProperties.uid)));
bool fExistsBackup = QFile::exists(profileFolder % "/" % fileFormat.arg(QString::number(snapmaticProperties.uid)) % ".bak");
bool fExistsHidden = QFile::exists(profileFolder % "/" % fileFormat.arg(QString::number(snapmaticProperties.uid)) % ".hidden");
int cEnough = 0;
while ((fExists || fExistsBackup || fExistsHidden) && cEnough < findRetryLimit) {
snapmaticProperties.uid = getRandomUid();
fExists = QFile::exists(profileFolder % "/PGTA5" % QString::number(snapmaticProperties.uid));
fExistsBackup = QFile::exists(profileFolder % "/PGTA5" % QString::number(snapmaticProperties.uid) % ".bak");
fExistsHidden = QFile::exists(profileFolder % "/PGTA5" % QString::number(snapmaticProperties.uid) % ".hidden");
fExists = QFile::exists(profileFolder % "/" % fileFormat.arg(QString::number(snapmaticProperties.uid)));
fExistsBackup = QFile::exists(profileFolder % "/" % fileFormat.arg(QString::number(snapmaticProperties.uid)) % ".bak");
fExistsHidden = QFile::exists(profileFolder % "/" % fileFormat.arg(QString::number(snapmaticProperties.uid)) % ".hidden");
cEnough++;
}
if (fExists || fExistsBackup || fExistsHidden) {
@ -1141,9 +1159,8 @@ bool ProfileInterface::importSnapmaticPicture(SnapmaticPicture *picture, bool wa
// That should never happen
return false;
}
picture->updateStrings();
picFileName = picture->getPictureFileName();
adjustedFileName = picture->getOriginalPictureFileName();
adjustedFileName = fileFormat.arg(QString::number(snapmaticProperties.uid));
picture->setPicFileName(adjustedFileName);
}
else {
return false;
@ -1155,15 +1172,15 @@ bool ProfileInterface::importSnapmaticPicture(SnapmaticPicture *picture, bool wa
snapmaticProperties.createdDateTime = QDateTime::currentDateTime();
qint64 timestamp = snapmaticProperties.createdDateTime.toSecsSinceEpoch();
snapmaticProperties.createdTimestamp = timestamp;
bool fExists = QFile::exists(profileFolder % "/PGTA5" % QString::number(snapmaticProperties.uid));
bool fExistsBackup = QFile::exists(profileFolder % "/PGTA5" % QString::number(snapmaticProperties.uid) % ".bak");
bool fExistsHidden = QFile::exists(profileFolder % "/PGTA5" % QString::number(snapmaticProperties.uid) % ".hidden");
bool fExists = QFile::exists(profileFolder % "/" % fileFormat.arg(QString::number(snapmaticProperties.uid)));
bool fExistsBackup = QFile::exists(profileFolder % "/" % fileFormat.arg(QString::number(snapmaticProperties.uid)) % ".bak");
bool fExistsHidden = QFile::exists(profileFolder % "/" % fileFormat.arg(QString::number(snapmaticProperties.uid)) % ".hidden");
int cEnough = 0;
while ((fExists || fExistsBackup || fExistsHidden) && cEnough < findRetryLimit) {
snapmaticProperties.uid = getRandomUid();
fExists = QFile::exists(profileFolder % "/PGTA5" % QString::number(snapmaticProperties.uid));
fExistsBackup = QFile::exists(profileFolder % "/PGTA5" % QString::number(snapmaticProperties.uid) % ".bak");
fExistsHidden = QFile::exists(profileFolder % "/PGTA5" % QString::number(snapmaticProperties.uid) % ".hidden");
fExists = QFile::exists(profileFolder % "/" % fileFormat.arg(QString::number(snapmaticProperties.uid)));
fExistsBackup = QFile::exists(profileFolder % "/" % fileFormat.arg(QString::number(snapmaticProperties.uid)) % ".bak");
fExistsHidden = QFile::exists(profileFolder % "/" % fileFormat.arg(QString::number(snapmaticProperties.uid)) % ".hidden");
cEnough++;
}
if (fExists || fExistsBackup || fExistsHidden) {
@ -1174,13 +1191,13 @@ bool ProfileInterface::importSnapmaticPicture(SnapmaticPicture *picture, bool wa
// That should never happen
return false;
}
picture->updateStrings();
picFileName = picture->getPictureFileName();
adjustedFileName = picture->getOriginalPictureFileName();
adjustedFileName = fileFormat.arg(QString::number(snapmaticProperties.uid));
picture->setPicFileName(adjustedFileName);
}
}
if (picture->exportPicture(profileFolder % "/" % adjustedFileName, SnapmaticFormat::PGTA5_Format)) {
picture->setSnapmaticFormat(SnapmaticFormat::PGTA5_Format);
if (picture->exportPicture(profileFolder % "/" % adjustedFileName, spFormat)) {
picture->updateStrings();
picture->setSnapmaticFormat(spFormat);
picture->setPicFilePath(profileFolder % "/" % adjustedFileName);
snapmaticPics << picture->getPictureFileName();
pictureLoaded(picture, true);
@ -1216,9 +1233,7 @@ bool ProfileInterface::importSavegameData(SavegameData *savegame, QString sgdPat
const QString newSgdPath = profileFolder % "/" % sgdFileName;
if (QFile::copy(sgdPath, newSgdPath)) {
savegame->setSavegameFileName(newSgdPath);
#if QT_VERSION >= 0x050000
savegameFiles << newSgdPath;
#endif
savegameLoaded(savegame, newSgdPath, true);
return true;
}
@ -2374,8 +2389,7 @@ preSelectionTitle:
}
}
int ProfileInterface::getRandomUid()
quint32 ProfileInterface::getRandomUid()
{
int random_int = pcg32_boundedrand_r(&rng, 2147483647);
return random_int;
return pcg32_boundedrand_r(&rng, 2147483647UL);
}

View file

@ -49,7 +49,7 @@ class ProfileInterface : public QWidget
Q_OBJECT
public:
explicit ProfileInterface(ProfileDatabase *profileDB, CrewDatabase *crewDB, DatabaseThread *threadDB, QWidget *parent = 0);
void setProfileFolder(QString folder, QString profile);
void setProfileFolder(QString folder, QString profile, quint32 defaultPhotoFormat);
void settingsApplied(int contentMode, bool languageChanged);
void setupProfileInterface();
void massTool(MassTool tool);
@ -90,10 +90,8 @@ private slots:
void dialogNextPictureRequested(QWidget *dialog);
void dialogPreviousPictureRequested(QWidget *dialog);
void on_saProfileContent_dropped(const QMimeData *mimeData);
#if QT_VERSION >= 0x050000
void directoryChanged(const QString &path);
void directoryScanned(QVector<QString> savegameFiles, QVector<QString> snapmaticPics);
#endif
protected:
bool eventFilter(QObject *watched, QEvent *event);
@ -109,11 +107,9 @@ private:
QList<SavegameData*> savegames;
QList<SnapmaticPicture*> pictures;
QMap<ProfileWidget*,QString> widgets;
#if QT_VERSION >= 0x050000
QFileSystemWatcher fileSystemWatcher;
QVector<QString> savegameFiles;
QVector<QString> snapmaticPics;
#endif
QSpacerItem *saSpacerItem;
QStringList fixedPictures;
QString enabledPicStr;
@ -121,6 +117,7 @@ private:
QString profileName;
QString loadingStr;
QString language;
quint32 photoFormat;
pcg32_random_t rng;
bool contextMenuOpened;
bool isProfileLoaded;
@ -143,7 +140,7 @@ private:
void insertSnapmaticIPI(QWidget *widget);
void insertSavegameIPI(QWidget *widget);
void sortingProfileInterface();
int getRandomUid();
quint32 getRandomUid();
signals:
void profileLoaded();

View file

@ -1250,7 +1250,13 @@ bool SnapmaticPicture::exportPicture(const QString &fileName, SnapmaticFormat fo
}
else {
bool ok;
const std::string photo = p_ragePhoto.save(&ok);
std::string photo;
if (format == SnapmaticFormat::PGTA5_Format)
photo = p_ragePhoto.save(RagePhoto::PhotoFormat::GTA5, &ok);
else if (format == SnapmaticFormat::PRDR3_Format)
photo = p_ragePhoto.save(RagePhoto::PhotoFormat::RDR2, &ok);
else
photo = p_ragePhoto.save(&ok);
if (ok)
picFile.write(photo.data(), photo.size());
saveSuccess = picFile.commit();

View file

@ -425,7 +425,7 @@ void UserInterface::openProfile(const QString &profileName_)
profileUI = new ProfileInterface(profileDB, crewDB, threadDB);
ui->swProfile->addWidget(profileUI);
ui->swProfile->setCurrentWidget(profileUI);
profileUI->setProfileFolder(GTAV_ProfilesFolder % QDir::separator() % profileName, profileName);
profileUI->setProfileFolder(GTAV_ProfilesFolder % "/" % profileName, profileName, RagePhoto::PhotoFormat::GTA5); // TODO: do not assume GTA V
profileUI->settingsApplied(contentMode, false);
profileUI->setupProfileInterface();
QObject::connect(profileUI, SIGNAL(profileClosed()), this, SLOT(closeProfile()));