@@ -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));
0 commit comments