bool FieldArchivePS::openBG(Field *field) const { if(!iso) return false; FieldPS *fieldPS = (FieldPS *)field; quint32 isoFieldID = fieldPS->isoFieldID(); QByteArray dat, mim, lzk; if (iso->isDemo()) { if((int)isoFieldID+2 >= iso->fieldCount()) { qWarning() << "FieldArchivePS::openBG field ID out of range" << isoFieldID << iso->fieldCount(); return false; } dat = iso->fileLZS(iso->fieldFile(isoFieldID)); mim = iso->fileLZS(iso->fieldFile(isoFieldID+1)); lzk = iso->fileLZS(iso->fieldFile(isoFieldID+2)); } else { if(isoFieldID < 1 || (int)isoFieldID+1 >= iso->fieldCount()) { qWarning() << "FieldArchivePS::openBG field ID out of range" << isoFieldID << iso->fieldCount(); return false; } mim = iso->fileLZS(iso->fieldFile(isoFieldID-1)); dat = iso->fileLZS(iso->fieldFile(isoFieldID)); lzk = iso->file(iso->fieldFile(isoFieldID+1)); } return fieldPS->open2(dat, mim, lzk); }
bool FieldArchivePS::openBG(Field *field) const { if(!iso) return false; FieldPS *fieldPS = (FieldPS *)field; quint32 isoFieldID = fieldPS->isoFieldID(); if(isoFieldID < 1 || (int)isoFieldID+1 >= iso->fieldCount()) return false; QByteArray mim = iso->fileLZS(iso->fieldFile(isoFieldID-1)); if(mim.isEmpty()) return false; QByteArray dat = iso->fileLZS(iso->fieldFile(isoFieldID)); if(dat.isEmpty()) return false; QByteArray lzk = iso->file(iso->fieldFile(isoFieldID+1)); if(lzk.isEmpty()) return false; return fieldPS->open2(dat, mim, lzk); }
int FieldArchivePS::open(const QString &path, ArchiveObserver *progress) { FieldPS *field; QString desc; int i, currentMap=0, fieldID=0; if(iso) delete iso; iso = new FF8DiscArchive(path); if(!iso->open(QIODevice::ReadOnly)) { errorMsg = QObject::tr("Impossible d'ouvrir le fichier image disque. (%1)").arg(iso->errorString()); return 1; } if(!iso->findIMG()) { errorMsg = QObject::tr("Fichier FF8DISC?.IMG introuvable."); return 4; } const QList<FF8DiscFile> &fieldFiles = iso->fieldDirectory(); int tocSize = fieldFiles.size(); const int tocStart = iso->isDemo() ? 0 : 77; if(tocSize == 0) { errorMsg = QObject::tr("Impossible d'ouvrir le dossier field."); return 4; } clearFields(); setMapList(QStringList()); int indexOf; quint32 freq = ((tocSize - tocStart) / 3)/100; if(freq == 0) { freq = 1; } progress->setObserverMaximum((tocSize - tocStart) / 3); for(i=tocStart ; i<tocSize ; i += 3) { QCoreApplication::processEvents(); if(progress->observerWasCanceled()) { clearFields(); errorMsg = QObject::tr("Ouverture annulée."); return 2; } if(currentMap % freq == 0) { progress->setObserverValue(currentMap); } QByteArray fieldData = iso->fileLZS(fieldFiles.at(i)); if(!fieldData.isEmpty()) { if (iso->isDemo()) { field = new FieldJpDemoPS(i); } else { field = new FieldPS(i); } if(field->open(fieldData)) { if(field->hasJsmFile()) desc = Data::location(field->getJsmFile()->mapID()); else desc = QString(); indexOf = mapList().indexOf(field->name()); QString mapId = indexOf==-1 ? "~" : QString("%1").arg(indexOf, 3, 10, QChar('0')); fields.append(field); fieldsSortByName.insert(field->name(), fieldID); fieldsSortByDesc.insert(desc, fieldID); fieldsSortByMapId.insert(mapId, fieldID); ++fieldID; } else { delete field; } } ++currentMap; } if(fields.isEmpty()) { errorMsg = QObject::tr("Aucun écran trouvé."); return 4; } openModels(); if(iso->isJp() && Config::value("encoding", "00").toString() == "00") { Config::setValue("encoding", "01"); } else if(!iso->isJp() && Config::value("encoding", "00").toString() == "01") { Config::setValue("encoding", "00"); } return 0; }