Skip to content

Commit f8eb08a

Browse files
vegetass4sithlord48
authored andcommitted
Initial PS4 file support
First phase PS4 compatibility
1 parent 4e5eb49 commit f8eb08a

File tree

12 files changed

+221
-86
lines changed

12 files changed

+221
-86
lines changed

src/data/FF7Save.cpp

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,29 @@ FF7SaveInfo::FORMAT FF7Save::fileDataFormat(QFile &file)
7676
return FF7SaveInfo::FORMAT::UNKNOWN;
7777
}
7878
}
79+
if ( (file_size == FF7SaveInfo::fileSize(FF7SaveInfo::FORMAT::PS4)) && file.peek(0x00B0 + FF7SaveInfo::fileIdentifier(FF7SaveInfo::FORMAT::PS4).length()).mid(0x00B0,FF7SaveInfo::instance()->fileIdentifier(FF7SaveInfo::FORMAT::PS4).length()) == FF7SaveInfo::instance()->fileIdentifier(FF7SaveInfo::FORMAT::PS4)) {
80+
QTextStream(stdout)
81+
<< "[FF7Save::loadFile] PS4 Save "
82+
<< file.peek(0x00B0+FF7SaveInfo::instance()->fileIdentifier(FF7SaveInfo::FORMAT::PS4).length()).mid(0x00B0,FF7SaveInfo::instance()->fileIdentifier(FF7SaveInfo::FORMAT::PS4).length()).toHex( )
83+
<< "\n";
84+
QFile ps4binfile(QFileInfo(file).path() + "/" + QFileInfo(file).fileName() + ".bin");//QFileInfo(file).baseName()
85+
if (!ps4binfile.open(QIODevice::ReadOnly)) {
86+
QTextStream(stdout) << "[FF7Save::loadFile] PS4 BIN File error: missing file: " << QFileInfo(ps4binfile).absoluteFilePath();
87+
return FF7SaveInfo::FORMAT::UNKNOWN;
88+
} else {
89+
QTextStream(stdout) << "[FF7Save::loadFile] PS4 BIN File loaded: " << QFileInfo(ps4binfile).absoluteFilePath() << "\n";
90+
if(ps4binfile.size() == FF7SaveInfo::instance()->fileSize(FF7SaveInfo::FORMAT::PS4BIN) && (ps4binfile.peek(FF7SaveInfo::fileHeaderSize(FF7SaveInfo::FORMAT::PS4BIN)) == FF7SaveInfo::fileIdentifier(FF7SaveInfo::FORMAT::PS4BIN))) {
91+
auto ps4bin = ps4binfile.readAll();
92+
m_ps4_iv = ps4bin.mid(0x10, 0x10);
93+
m_ps4_key = ps4bin.mid(0x20, 0x10);
94+
QTextStream(stdout)
95+
<< "[FF7Save::loadFile] PS4 BIN File Size: " << FF7SaveInfo::instance()->fileSize(FF7SaveInfo::FORMAT::PS4BIN) << "\n"
96+
<< "[FF7Save::loadFile] PS4 BIN pfsSKKey IV: " << m_ps4_iv.toHex() << "\n"
97+
<< "[FF7Save::loadFile] PS4 BIN pfsSKKey KEY: " << m_ps4_key.toHex() << "\n";
98+
setFormat(FF7SaveInfo::FORMAT::PS4);
99+
}
100+
}
101+
}
79102
if ((file_size == FF7SaveInfo::fileSize(FF7SaveInfo::FORMAT::PSP)) && (file.peek(25)).startsWith(FF7SaveInfo::fileIdentifier(FF7SaveInfo::FORMAT::PSP)))
80103
return FF7SaveInfo::FORMAT::PSP;
81104
if ((file_size == FF7SaveInfo::fileSize(FF7SaveInfo::FORMAT::VGS)) && (file.peek(25)).startsWith(FF7SaveInfo::fileIdentifier(FF7SaveInfo::FORMAT::VGS)))
@@ -946,7 +969,8 @@ char FF7Save::psx_block_type(int s)
946969
case FF7SaveInfo::FORMAT::PC:
947970
case FF7SaveInfo::FORMAT::SWITCH:
948971
case FF7SaveInfo::FORMAT::PSX:
949-
case FF7SaveInfo::FORMAT::PS3: return 0x00;
972+
case FF7SaveInfo::FORMAT::PS3:
973+
case FF7SaveInfo::FORMAT::PS4: return 0x00;
950974
case FF7SaveInfo::FORMAT::PGE: return _fileHeader.at(0);
951975
default:
952976
int index = 128 + (128 * s);
@@ -963,7 +987,8 @@ void FF7Save::setPsx_block_type(int s, char block_type)
963987
case FF7SaveInfo::FORMAT::PC:
964988
case FF7SaveInfo::FORMAT::SWITCH:
965989
case FF7SaveInfo::FORMAT::PSX:
966-
case FF7SaveInfo::FORMAT::PS3: return;
990+
case FF7SaveInfo::FORMAT::PS3:
991+
case FF7SaveInfo::FORMAT::PS4: return;
967992
case FF7SaveInfo::FORMAT::PGE: _fileHeader.replace(0, 1, QByteArray(1, block_type)); break;
968993
default:
969994
int index = 128 + (128 * s);
@@ -984,7 +1009,8 @@ void FF7Save::setPsx_block_next(int s, int next)
9841009
case FF7SaveInfo::FORMAT::PC:
9851010
case FF7SaveInfo::FORMAT::SWITCH:
9861011
case FF7SaveInfo::FORMAT::PSX:
987-
case FF7SaveInfo::FORMAT::PS3: return;
1012+
case FF7SaveInfo::FORMAT::PS3:
1013+
case FF7SaveInfo::FORMAT::PS4: return;
9881014
case FF7SaveInfo::FORMAT::PGE: _fileHeader.replace(8, 1, QByteArray(1, next)); break;
9891015
default:
9901016
int index = 128 + (128 * s);
@@ -1001,7 +1027,8 @@ quint8 FF7Save::psx_block_next(int s)
10011027
case FF7SaveInfo::FORMAT::PC:
10021028
case FF7SaveInfo::FORMAT::SWITCH:
10031029
case FF7SaveInfo::FORMAT::PSX:
1004-
case FF7SaveInfo::FORMAT::PS3: return 0x00;
1030+
case FF7SaveInfo::FORMAT::PS3:
1031+
case FF7SaveInfo::FORMAT::PS4: return 0x00;
10051032
case FF7SaveInfo::FORMAT::PGE: return quint8(_fileHeader.at(0x08));
10061033
default:
10071034
int index = 128 + (128 * s);
@@ -1018,7 +1045,8 @@ void FF7Save::setPsx_block_size(int s, int blockSize)
10181045
case FF7SaveInfo::FORMAT::PC:
10191046
case FF7SaveInfo::FORMAT::SWITCH:
10201047
case FF7SaveInfo::FORMAT::PSX:
1021-
case FF7SaveInfo::FORMAT::PS3: return;
1048+
case FF7SaveInfo::FORMAT::PS3:
1049+
case FF7SaveInfo::FORMAT::PS4: return;
10221050
default: break;
10231051
}
10241052

@@ -1041,6 +1069,7 @@ quint8 FF7Save::psx_block_size(int s)
10411069
switch (fileFormat) {
10421070
case FF7SaveInfo::FORMAT::UNKNOWN:
10431071
case FF7SaveInfo::FORMAT::PC:
1072+
case FF7SaveInfo::FORMAT::PS4:
10441073
case FF7SaveInfo::FORMAT::SWITCH: return 1;
10451074
case FF7SaveInfo::FORMAT::PSX: return quint8(QFile(fileName()).size() / FF7SaveInfo::fileSize(FF7SaveInfo::FORMAT::PSX));
10461075
case FF7SaveInfo::FORMAT::PS3: return quint8((QFile(fileName()).size() - 0x84) / FF7SaveInfo::fileSize(FF7SaveInfo::FORMAT::PSX));

src/data/FF7Save.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1050,6 +1050,8 @@ class FF7TKDATA_EXPORT FF7Save: public QObject
10501050
bool fileHasChanged;
10511051
QString buffer_region; // hold the buffers region data.
10521052
QString SG_Region_String[15];
1053+
QByteArray m_ps4_iv;
1054+
QByteArray m_ps4_key;
10531055
QString filename;//opened file
10541056
QVector< SubContainer > parseXML(const QString &fileName, const QString &metadataPath, const QString &UserID);
10551057
QVector< SubContainer > createMetadata(const QString &fileName, const QString &UserID);

0 commit comments

Comments
 (0)