Skip to content

Commit 9006e58

Browse files
committed
Use QList of regions, Add Save Text for non ff7 edits
1 parent 5cc3635 commit 9006e58

File tree

4 files changed

+41
-29
lines changed

4 files changed

+41
-29
lines changed

src/data/FF7Save.cpp

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@
2525
FF7Save::FF7Save()
2626
{
2727
fileHasChanged = false;
28-
for (int i = 0; i < 15; i++)
28+
for (int i = 0; i < 15; i++) {
2929
slotChanged[i] = false;
30+
SG_Region_String.append(QString());
31+
}
3032
buffer_slot.checksum = 0x4D1D;
3133
}
3234

@@ -104,9 +106,9 @@ bool FF7Save::loadFile(const QString &fileName)
104106
if (FF7SaveInfo::isTypePC(fileFormat)) {
105107
for (int i = 0; i < 15; i++) {
106108
if (slot[i].checksum != 0x0000 && slot[i].checksum != 0x4D1D)
107-
SG_Region_String[i] = QString("BASCUS-94163FF7-S%1").arg(QString::number(i + 1), 2, QChar('0'));
109+
SG_Region_String.replace(i, QString("BASCUS-94163FF7-S%1").arg(QString::number(i + 1), 2, QChar('0')));
108110
else
109-
SG_Region_String[i].clear();
111+
SG_Region_String.replace(i, QString());
110112
}
111113
} else if (FF7SaveInfo::isTypeVMC(fileFormat)) {
112114
QByteArray mc_header;
@@ -116,21 +118,21 @@ bool FF7Save::loadFile(const QString &fileName)
116118
for (int i = 0; i < 15; i++) {
117119
int index = (128 * i) + 138;
118120
QString temp = QString(mc_header.mid(index, 20));
119-
SG_Region_String[i] = (temp != invalidRegion) ? QString(mc_header.mid(index, 20)) : QString();
121+
SG_Region_String.replace(i, (temp != invalidRegion) ? QString(mc_header.mid(index, 20)) : QString());
120122
}
121123
} else if (FF7SaveInfo::isTypeSSS(fileFormat)) {
122124
if (fileFormat == FF7SaveInfo::FORMAT::PSX) {
123-
SG_Region_String[0] = QFileInfo(file).fileName();
125+
SG_Region_String.replace(0, QFileInfo(file).fileName());
124126
} else {
125127
file.seek(FF7SaveInfo::psxSaveNameOffset(fileFormat));
126-
SG_Region_String[0] = QString(file.read(20));
128+
SG_Region_String.replace(0, QString(file.read(20)));
127129
}
128130
for (int i = 1; i < 15; i++)
129131
clearSlot(i);
130132
} else if (fileFormat == FF7SaveInfo::FORMAT::PDA) {
131133
file.seek(0);
132134
QString temp = file.read(20);
133-
SG_Region_String[0] = (temp != invalidRegion) ? file.read(20) : QString();
135+
SG_Region_String.replace(0, (temp != invalidRegion) ? file.read(20) : QString());
134136
} else {
135137
return false;
136138
}
@@ -315,7 +317,7 @@ bool FF7Save::exportPCFormat(const QString &fileName, FF7SaveInfo::FORMAT export
315317
FF7HEADFOOT prev_slot_hf[15];
316318
bool prev_slotChanged[15];
317319
for(int i =0; i < 15; i++) {
318-
prev_regionString[i] = SG_Region_String[i];
320+
prev_regionString[i] = SG_Region_String.at(i);
319321
prev_slots[i] = slot[i];
320322
prev_slotChanged[i] = slotChanged[i];
321323
prev_slot_hf[i] = hf[i];
@@ -348,7 +350,7 @@ bool FF7Save::exportPCFormat(const QString &fileName, FF7SaveInfo::FORMAT export
348350
filename = prev_fileName;
349351
_fileHeader = prev_fileHeader;
350352
for(int i =0; i < 15; i++) {
351-
SG_Region_String[i] = prev_regionString[i];
353+
SG_Region_String.replace(i, prev_regionString[i]);
352354
slot[i] = prev_slots[i];
353355
slotChanged[i] = prev_slotChanged[i];
354356
hf[i] = prev_slot_hf[i];
@@ -369,7 +371,7 @@ bool FF7Save::exportVMCFormat(const QString &fileName, FF7SaveInfo::FORMAT expor
369371
FF7HEADFOOT prev_slot_hf[15];
370372
bool prev_slotChanged[15];
371373
for(int i =0; i < 15; i++) {
372-
prev_regionString[i] = SG_Region_String[i];
374+
prev_regionString[i] = SG_Region_String.at(i);
373375
prev_slots[i] = slot[i];
374376
prev_slotChanged[i] = slotChanged[i];
375377
prev_slot_hf[i] = hf[i];
@@ -405,7 +407,7 @@ bool FF7Save::exportVMCFormat(const QString &fileName, FF7SaveInfo::FORMAT expor
405407
filename = prev_fileName;
406408
_fileHeader = prev_fileHeader;
407409
for(int i =0; i < 15; i++) {
408-
SG_Region_String[i] = prev_regionString[i];
410+
SG_Region_String.replace(i, prev_regionString[i]);
409411
slot[i] = prev_slots[i];
410412
slotChanged[i] = prev_slotChanged[i];
411413
if(slotChanged[i])
@@ -556,7 +558,7 @@ void FF7Save::clearSlot(int rmslot)
556558
setSlotHeader(rmslot, QByteArray(FF7SaveInfo::slotHeaderSize(fileFormat), 0x00));
557559
setSlotFF7Data(rmslot, QByteArray(FF7SaveInfo::slotSize(), 0x00));
558560
setSlotFooter(rmslot, QByteArray(FF7SaveInfo::slotFooterSize(fileFormat), 0x00));
559-
SG_Region_String[rmslot].clear();
561+
SG_Region_String.insert(rmslot, QString());
560562
if (FF7SaveInfo::isTypeVMC(fileFormat)) {
561563
//clean the mem card header if needed.
562564
int index = (128 + (128 * rmslot));
@@ -762,7 +764,7 @@ void FF7Save::fix_psv_header(int s, int blocks)
762764
fix_psx_header(s);//adjust time.
763765
QByteArray data = fileHeader();
764766
data.replace(FF7SaveInfo::psxSaveNameOffset(FF7SaveInfo::FORMAT::PS3), 0x20, QByteArray(0x20, '\x00'));
765-
data.replace(FF7SaveInfo::psxSaveNameOffset(FF7SaveInfo::FORMAT::PS3), SG_Region_String[s].size(), SG_Region_String[s].toLatin1());
767+
data.replace(FF7SaveInfo::psxSaveNameOffset(FF7SaveInfo::FORMAT::PS3), SG_Region_String.at(s).size(), SG_Region_String.at(s).toLatin1());
766768
QByteArray bSize(3, '\x00');
767769
switch((blocks * FF7SaveInfo::fileSize(FF7SaveInfo::FORMAT::PSX))) {
768770
default: bSize.setRawData("\x00\x20\x00", 3); break;
@@ -861,8 +863,9 @@ void FF7Save::setSaveNumber(int s, int saveNum)
861863
{
862864
if (!isFF7(s))
863865
return;
864-
865-
SG_Region_String[s].replace(SG_Region_String[s].lastIndexOf(QChar('S'))+ 1, 2, QString("%1").arg(QString::number(saveNum + 1), 2, QChar('0')));
866+
auto str = SG_Region_String.at(s);
867+
str.replace(str.lastIndexOf(QChar('S'))+ 1, 2, QString("%1").arg(QString::number(saveNum + 1), 2, QChar('0')));
868+
SG_Region_String.replace(s, str);
866869

867870
switch(format()) {
868871
default: break;
@@ -878,26 +881,26 @@ void FF7Save::setSaveNumber(int s, int saveNum)
878881

879882
QString FF7Save::region(int s)
880883
{
881-
return SG_Region_String[s];
884+
return SG_Region_String.at(s);
882885
}
883886
void FF7Save::setRegion(int s, const QString &new_region)
884887
{
885888
if ((new_region == "USA") || (new_region == "NTSC-U") || (new_region == "1")) {
886-
SG_Region_String[s] = QString("BASCUS-94163FF7-S%1").arg(QString::number(s + 1), 2, QChar('0'));
889+
SG_Region_String.replace(s, QString("BASCUS-94163FF7-S%1").arg(QString::number(s + 1), 2, QChar('0')));
887890
} else if ((new_region == "UK") || (new_region == "PAL-E") || (new_region == "2")) {
888-
SG_Region_String[s] = QString("BESCES-00867FF7-S%1").arg(QString::number(s + 1), 2, QChar('0'));
891+
SG_Region_String.replace(s, QString("BESCES-00867FF7-S%1").arg(QString::number(s + 1), 2, QChar('0')));
889892
} else if ((new_region == "French") || (new_region == "PAL-FR") || (new_region == "3")) {
890-
SG_Region_String[s] = QString("BESCES-00868FF7-S%1").arg(QString::number(s + 1), 2, QChar('0'));
893+
SG_Region_String.replace(s, QString("BESCES-00868FF7-S%1").arg(QString::number(s + 1), 2, QChar('0')));
891894
} else if ((new_region == "German") || (new_region == "PAL-DE") || (new_region == "4")) {
892-
SG_Region_String[s] = QString("BESCES-00869FF7-S%1").arg(QString::number(s + 1), 2, QChar('0'));
895+
SG_Region_String.replace(s, QString("BESCES-00869FF7-S%1").arg(QString::number(s + 1), 2, QChar('0')));
893896
} else if ((new_region == "Spanish") || (new_region == "PAL-ES") || (new_region == "5")) {
894-
SG_Region_String[s] = QString("BESCES-00900FF7-S%1").arg(QString::number(s + 1), 2, QChar('0'));
897+
SG_Region_String.replace(s, QString("BESCES-00900FF7-S%1").arg(QString::number(s + 1), 2, QChar('0')));
895898
} else if ((new_region == "Japanese") || (new_region == "NTSC-J") || (new_region == "6")) {
896-
SG_Region_String[s] = QString("BISLPS-00700FF7-S%1").arg(QString::number(s + 1), 2, QChar('0'));
899+
SG_Region_String.replace(s, QString("BISLPS-00700FF7-S%1").arg(QString::number(s + 1), 2, QChar('0')));
897900
} else if ((new_region == "International") || (new_region == "NTSC-JI") || (new_region == "7")) {
898-
SG_Region_String[s] = QString("BISLPS-01057FF7-S%1").arg(QString::number(s + 1), 2, QChar('0'));
901+
SG_Region_String.replace(s, QString("BISLPS-01057FF7-S%1").arg(QString::number(s + 1), 2, QChar('0')));
899902
} else {
900-
SG_Region_String[s] = new_region;
903+
SG_Region_String.replace(s, new_region);
901904
}
902905

903906
if (FF7SaveInfo::isTypeVMC(fileFormat)) {
@@ -912,14 +915,14 @@ void FF7Save::setRegion(int s, const QString &new_region)
912915
void FF7Save::copySlot(int s)
913916
{
914917
buffer_slot = slot[s];
915-
buffer_region = SG_Region_String[s];
918+
buffer_region = SG_Region_String.at(s);
916919
}
917920

918921
void FF7Save::pasteSlot(int s)
919922
{
920923
slot[s] = buffer_slot;
921-
SG_Region_String[s] = buffer_region;
922-
SG_Region_String[s].replace(SG_Region_String[s].lastIndexOf(QChar('S'))+ 1, 2, QString("%1").arg(QString::number(s + 1), 2, QChar('0')));
924+
auto newRegion = buffer_region.replace(buffer_region.lastIndexOf(QChar('S'))+ 1, 2, QString("%1").arg(QString::number(s + 1), 2, QChar('0')));
925+
SG_Region_String.replace(s, newRegion);
923926
if (FF7SaveInfo::isTypeVMC(fileFormat)) {
924927
vmcRegionEval(s);
925928
fix_vmc_header();
@@ -5682,7 +5685,7 @@ void FF7Save::vmcRegionEval(int s)
56825685
}
56835686
}
56845687
}
5685-
SG_Region_String[s] = newRegionString;
5688+
SG_Region_String.replace(s, newRegionString);
56865689
}
56875690
bool FF7Save::subMiniGameVictory(int s)
56885691
{

src/data/FF7Save.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1040,7 +1040,7 @@ class FF7TKDATA_EXPORT FF7Save: public QObject
10401040
bool slotChanged[15];
10411041
bool fileHasChanged;
10421042
QString buffer_region; // hold the buffers region data.
1043-
QString SG_Region_String[15];
1043+
QList<QString> SG_Region_String;
10441044
QString filename;//opened file
10451045
QVector< SubContainer > parseXML(const QString &fileName, const QString &metadataPath, const QString &UserID);
10461046
QVector< SubContainer > createMetadata(const QString &fileName, const QString &UserID);

unittests/data/FF7Save_test.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1679,4 +1679,12 @@ void FF7Save_Test::test_non7Export()
16791679
QVERIFY(ff7save->exportFile(_saveFileNameVMC, FF7SaveInfo::FORMAT::VMC, 0));
16801680
}
16811681

1682+
void FF7Save_Test::test_editN7()
1683+
{
1684+
auto data = _non7slotData;
1685+
data.replace(0x100, 1, QByteArray::fromRawData("\x13", 1));
1686+
ff7save->setSlotPsxRawData(0, data);
1687+
QVERIFY(ff7save->exportFile(_saveFileNameVMC, FF7SaveInfo::FORMAT::VMC, 0));
1688+
}
1689+
16821690
QTEST_MAIN(FF7Save_Test)

unittests/data/FF7Save_test.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ private slots:
160160
//NON FF7 TESTS
161161
void test_nonff7();
162162
void test_non7Export();
163+
void test_editN7();
163164

164165
private:
165166
FF7Save *ff7save = nullptr;

0 commit comments

Comments
 (0)