diff --git a/libs/zonefile/360/zonefile_cod10_360.cpp b/libs/zonefile/360/zonefile_cod10_360.cpp index aa722a2..82bb52d 100644 --- a/libs/zonefile/360/zonefile_cod10_360.cpp +++ b/libs/zonefile/360/zonefile_cod10_360.cpp @@ -15,1058 +15,47 @@ ZoneFile_COD10_360::~ZoneFile_COD10_360() } bool ZoneFile_COD10_360::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::BigEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD10_360::pParseZoneHeader(QDataStream *aZoneFileStream) { - SetSize(pParseZoneSize(aZoneFileStream)); - pParseZoneUnknownsA(aZoneFileStream); - - SetTagCount(pParseZoneTagCount(aZoneFileStream)); - pParseZoneUnknownsB(aZoneFileStream); - - SetRecordCount(pParseZoneRecordCount(aZoneFileStream)); - - quint32 tagCount = GetTagCount(); - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD10_360::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD10_360::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD10_360::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD10_360::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD10_360::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD10_360::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD10_360::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD10_360::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD10_360::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD10_360::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD10_360::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -void ZoneFile_COD10_360::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD10_360::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD10_360::pParseAsset_Material(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); - - return Material(); -} - -Shader ZoneFile_COD10_360::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD10_360::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD10_360::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD10_360::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD10_360::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_360::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_360::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_360::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_360::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_360::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_360::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_360::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD10_360::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD10_360::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD10_360::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_360::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD10_360::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD10_360::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD10_360::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_LOCAL_STRING; + return Utils::ASSET_LOCALIZE_ENTRY; } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD10_360::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/360/zonefile_cod10_360.h b/libs/zonefile/360/zonefile_cod10_360.h index eae80e4..ba6a5fd 100644 --- a/libs/zonefile/360/zonefile_cod10_360.h +++ b/libs/zonefile/360/zonefile_cod10_360.h @@ -10,43 +10,7 @@ public: ~ZoneFile_COD10_360(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD10_360_H diff --git a/libs/zonefile/360/zonefile_cod11_360.cpp b/libs/zonefile/360/zonefile_cod11_360.cpp index 7b00a7b..b91eafa 100644 --- a/libs/zonefile/360/zonefile_cod11_360.cpp +++ b/libs/zonefile/360/zonefile_cod11_360.cpp @@ -15,1058 +15,133 @@ ZoneFile_COD11_360::~ZoneFile_COD11_360() } bool ZoneFile_COD11_360::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::BigEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD11_360::pParseZoneHeader(QDataStream *aZoneFileStream) { - SetSize(pParseZoneSize(aZoneFileStream)); - pParseZoneUnknownsA(aZoneFileStream); - - SetTagCount(pParseZoneTagCount(aZoneFileStream)); - pParseZoneUnknownsB(aZoneFileStream); - - SetRecordCount(pParseZoneRecordCount(aZoneFileStream)); - - quint32 tagCount = GetTagCount(); - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD11_360::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD11_360::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD11_360::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD11_360::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD11_360::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD11_360::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD11_360::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD11_360::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD11_360::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD11_360::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD11_360::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -void ZoneFile_COD11_360::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD11_360::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD11_360::pParseAsset_Material(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); - - return Material(); -} - -Shader ZoneFile_COD11_360::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD11_360::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD11_360::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD11_360::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD11_360::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_360::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_360::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_360::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_360::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_360::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_360::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_360::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD11_360::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD11_360::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD11_360::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_360::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD11_360::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD11_360::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD11_360::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); - if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_LOCAL_STRING; - } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_RAW_FILE; - } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; - } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; - } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; - } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; - } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; - } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; - } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; - } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; - } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; - } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; - } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; - } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; - } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; - } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; - } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; - } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + if (cleanedType == "00000000") { + return Utils::ASSET_PHYSPRESET; + } else if (cleanedType == "00000001") { + return Utils::ASSET_PHYSCOLLMAP; + } else if (cleanedType == "00000002") { + return Utils::ASSET_Animation; + } else if (cleanedType == "00000003") { + return Utils::ASSET_XMODEL_SURFS; + } else if (cleanedType == "00000004") { + return Utils::ASSET_XMODEL; + } else if (cleanedType == "00000005") { + return Utils::ASSET_MATERIAL; + } else if (cleanedType == "00000006") { + return Utils::ASSET_PIXELSHADER; + } else if (cleanedType == "00000007") { + return Utils::ASSET_TECHNIQUE_SET; + } else if (cleanedType == "00000008") { + return Utils::ASSET_IMAGE; + } else if (cleanedType == "00000009") { + return Utils::ASSET_SOUND; + } else if (cleanedType == "0000000A") { + return Utils::ASSET_SOUND_SUBMIX; + } else if (cleanedType == "0000000B") { + return Utils::ASSET_SOUND_CURVE; + } else if (cleanedType == "0000000C") { + return Utils::ASSET_SOUND_EVENT; + } else if (cleanedType == "0000000D") { + return Utils::ASSET_LPF_CURVE; + } else if (cleanedType == "0000000E") { + return Utils::ASSET_REVERB_CURVE; + } else if (cleanedType == "0000000F") { + return Utils::ASSET_LOADED_SOUND; + } else if (cleanedType == "00000010") { + return Utils::ASSET_CLIPMAP; + } else if (cleanedType == "00000011") { + return Utils::ASSET_COMWORLD; + } else if (cleanedType == "00000012") { + return Utils::ASSET_GLASSWORLD; + } else if (cleanedType == "00000013") { + return Utils::ASSET_PATHDATA; + } else if (cleanedType == "00000014") { + return Utils::ASSET_VEHICLE_TRACK; + } else if (cleanedType == "00000015") { + return Utils::ASSET_MAP_ENTS; + } else if (cleanedType == "00000016") { + return Utils::ASSET_FXWORLD; + } else if (cleanedType == "00000017") { + return Utils::ASSET_GFXWORLD; + } else if (cleanedType == "00000018") { + return Utils::ASSET_GFXWORLD_TRANSIENT_ZONE; + } else if (cleanedType == "00000019") { + return Utils::ASSET_LIGHT_DEF; + } else if (cleanedType == "0000001A") { + return Utils::ASSET_UI_MAP; + } else if (cleanedType == "0000001B") { + return Utils::ASSET_FONT; + } else if (cleanedType == "0000001C") { + return Utils::ASSET_MENULIST; + } else if (cleanedType == "0000001D") { + return Utils::ASSET_MENU; + } else if (cleanedType == "0000001E") { + return Utils::ASSET_ANIMCLASS; + } else if (cleanedType == "0000001F") { + return Utils::ASSET_LOCALIZE_ENTRY; + } else if (cleanedType == "00000020") { + return Utils::ASSET_ATTACHMENT; + } else if (cleanedType == "00000021") { + return Utils::ASSET_WEAPON; + } else if (cleanedType == "00000022") { + return Utils::ASSET_SNDDRIVER_GLOBALS; + } else if (cleanedType == "00000023") { + return Utils::ASSET_FX; + } else if (cleanedType == "00000024") { + return Utils::ASSET_IMPACT_FX; + } else if (cleanedType == "00000025") { + return Utils::ASSET_SURFACE_FX; + } else if (cleanedType == "00000026") { + return Utils::ASSET_AITYPE; + } else if (cleanedType == "00000027") { + return Utils::ASSET_MPTYPE; + } else if (cleanedType == "00000028") { + return Utils::ASSET_CHARACTER; + } else if (cleanedType == "00000029") { + return Utils::ASSET_XMODELALIAS; + } else if (cleanedType == "0000002A") { + return Utils::ASSET_RAWFILE; + } else if (cleanedType == "0000002B") { + return Utils::ASSET_SCRIPTFILE; + } else if (cleanedType == "0000002C") { + return Utils::ASSET_STRINGTABLE; + } else if (cleanedType == "0000002D") { + return Utils::ASSET_LEADERBOARD; + } else if (cleanedType == "0000002E") { + return Utils::ASSET_STRUCTURED_DATA_DEF; + } else if (cleanedType == "0000002F") { + return Utils::ASSET_TRACER; + } else if (cleanedType == "00000030") { + return Utils::ASSET_VEHICLE; + } else if (cleanedType == "00000031") { + return Utils::ASSET_ADDON_MAP_ENTS; + } else if (cleanedType == "00000032") { + return Utils::ASSET_NET_CONST_STRINGS; + } else if (cleanedType == "00000033") { + return Utils::ASSET_REVERB_PRESET; + } else if (cleanedType == "00000034") { + return Utils::ASSET_LUA_FILE; + } else if (cleanedType == "00000035") { + return Utils::ASSET_SCRIPTABLE; + } else if (cleanedType == "00000036") { + return Utils::ASSET_EQUIPMENT_SND_TABLE; + } else if (cleanedType == "00000037") { + return Utils::ASSET_DOPPLER_PRESET; + } else if (cleanedType == "00000038") { + return Utils::ASSET_LASER; + } else if (cleanedType == "00000039") { + return Utils::ASSET_SKELETON_SCRIPT; + } else if (cleanedType == "0000003A") { + return Utils::ASSET_COUNT; + } else if (cleanedType == "0000003A") { + return Utils::ASSET_STRING; + } else if (cleanedType == "0000003B") { + return Utils::ASSET_ASSETLIST; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD11_360::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/360/zonefile_cod11_360.h b/libs/zonefile/360/zonefile_cod11_360.h index b916039..05a9349 100644 --- a/libs/zonefile/360/zonefile_cod11_360.h +++ b/libs/zonefile/360/zonefile_cod11_360.h @@ -10,43 +10,7 @@ public: ~ZoneFile_COD11_360(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD11_360_H diff --git a/libs/zonefile/360/zonefile_cod12_360.cpp b/libs/zonefile/360/zonefile_cod12_360.cpp index e82d6ef..57bcc66 100644 --- a/libs/zonefile/360/zonefile_cod12_360.cpp +++ b/libs/zonefile/360/zonefile_cod12_360.cpp @@ -15,1193 +15,144 @@ ZoneFile_COD12_360::~ZoneFile_COD12_360() } bool ZoneFile_COD12_360::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::LittleEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD12_360::pParseZoneHeader(QDataStream *aZoneFileStream) { - quint32 tagCount = pParseZoneTagCount(aZoneFileStream); - SetTagCount(tagCount); - - aZoneFileStream->skipRawData(7 * 4); - - quint32 recordCount = pParseZoneRecordCount(aZoneFileStream) - 1; - SetRecordCount(recordCount); - - aZoneFileStream->skipRawData(5 * 4); - - if (tagCount) { - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } -} - -quint32 ZoneFile_COD12_360::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD12_360::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD12_360::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD12_360::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD12_360::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD12_360::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD12_360::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(8 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - if (aZoneFileStream->device()->peek(8).toHex().contains("00000000")) { - break; - } - - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD12_360::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(8, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 8); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(8); - } - return result; -} - -AssetMap ZoneFile_COD12_360::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // raw file - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_SCRIPT_PARSE_TREE) { // gsc - auto gscFile = pParseAsset_GSCFile(aZoneFileStream); - if (gscFile.length) { - result.gscFiles << gscFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD12_360::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD12_360::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -GscFile ZoneFile_COD12_360::pParseAsset_GSCFile(QDataStream *aZoneFileStream) { - GscFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(8); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(8); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -void ZoneFile_COD12_360::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD12_360::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD12_360::pParseAsset_Material(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); - - return Material(); -} - -Shader ZoneFile_COD12_360::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD12_360::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD12_360::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD12_360::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - return result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD12_360::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_360::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_360::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_360::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_360::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_360::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_360::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_360::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD12_360::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD12_360::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD12_360::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_360::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD12_360::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD12_360::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD12_360::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "0000000000000000") { - return ASSET_PHYS_PRESET; + return Utils::ASSET_PHYSPRESET; } else if (cleanedType == "0100000000000000") { - return ASSET_PHYS_CONSTRAINTS; + return Utils::ASSET_PHYS_CONSTRAINTS; } else if (cleanedType == "0200000000000000") { - return ASSET_DESTRUCTIBLE_DEF; + return Utils::ASSET_DESTRUCTIBLE_DEF; } else if (cleanedType == "0300000000000000") { - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0400000000000000") { - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0500000000000000") { - return ASSET_MODEL_MESH; + return Utils::ASSET_XMODEL_MESH; } else if (cleanedType == "0600000000000000") { - return ASSET_MATERIAL; + return Utils::ASSET_MATERIAL; } else if (cleanedType == "0700000000000000") { - return ASSET_COMPUTE_SHADER_SET; + return Utils::ASSET_COMPUTE_SHADER_SET; } else if (cleanedType == "0800000000000000") { - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "0900000000000000") { - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0A00000000000000") { - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "1100000000000000") { - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "1500000000000000") { - return ASSET_FONT_ICON; + return Utils::ASSET_FONT_ICON; } else if (cleanedType == "1700000000000000") { - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "1C00000000000000") { - return ASSET_PLAYER_SOUNDS_TABLE; + return Utils::ASSET_PLAYER_SOUNDS_TABLE; } else if (cleanedType == "1D00000000000000") { - return ASSET_PLAYER_FX_TABLE; + return Utils::ASSET_PLAYER_FX_TABLE; } else if (cleanedType == "1E00000000000000") { - return ASSET_SHARED_WEAPON_SOUNDS; + return Utils::ASSET_SHARED_WEAPON_SOUNDS; } else if (cleanedType == "1F00000000000000") { - return ASSET_ATTACHMENT; + return Utils::ASSET_ATTACHMENT; } else if (cleanedType == "2000000000000000") { - return ASSET_ATTACHMENT_UNIQUE; + return Utils::ASSET_ATTACHMENT_UNIQUE; } else if (cleanedType == "2100000000000000") { - return ASSET_WEAPON_CAMO; + return Utils::ASSET_WEAPON_CAMO; } else if (cleanedType == "2200000000000000") { - return ASSET_CUSTOMIZATION_TABLE; + return Utils::ASSET_CUSTOMIZATION_TABLE; } else if (cleanedType == "2300000000000000") { - return ASSET_CUSTOMIZATION_TABLE_FEIMAGES; + return Utils::ASSET_CUSTOMIZATION_TABLE_FEIMAGES; } else if (cleanedType == "2400000000000000") { - return ASSET_CUSTOMIZATION_TABLE_COLOR; + return Utils::ASSET_CUSTOMIZATION_TABLE_COLOR; }else if (cleanedType == "2600000000000000") { - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "2F00000000000000") { - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "3000000000000000") { - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "3100000000000000") { - return ASSET_STRUCTURED_TABLE; + return Utils::ASSET_STRUCTURED_TABLE; } else if (cleanedType == "3200000000000000") { - return ASSET_LEADERBOARD_DEF; + return Utils::ASSET_LEADERBOARD_DEF; } else if (cleanedType == "3300000000000000") { - return ASSET_DDL; + return Utils::ASSET_DDL; } else if (cleanedType == "3600000000000000") { - return ASSET_SCRIPT_PARSE_TREE; + return Utils::ASSET_SCRIPT_PARSE_TREE; } else if (cleanedType == "3700000000000000") { - return ASSET_KEY_VALUE_PAIRS; + return Utils::ASSET_KEY_VALUE_PAIRS; } else if (cleanedType == "3800000000000000") { - return ASSET_VEHICLE; + return Utils::ASSET_VEHICLE; } else if (cleanedType == "3A00000000000000") { - return ASSET_VEHICLE_TRACER; + return Utils::ASSET_VEHICLE_TRACER; } else if (cleanedType == "3C00000000000000") { - return ASSET_SURFACE_FX_TABLE; + return Utils::ASSET_SURFACE_FX_TABLE; } else if (cleanedType == "3D00000000000000") { - return ASSET_SURFACE_SOUND_DEF; + return Utils::ASSET_SURFACE_SOUND_DEF; } else if (cleanedType == "3E00000000000000") { - return ASSET_FOOTSTEP_TABLE; + return Utils::ASSET_FOOTSTEP_TABLE; } else if (cleanedType == "3F00000000000000") { - return ASSET_ENTITY_FX_IMPACTS; + return Utils::ASSET_ENTITY_FX_IMPACTS; } else if (cleanedType == "4000000000000000") { - return ASSET_ENTITY_SOUND_IMPACTS; + return Utils::ASSET_ENTITY_SOUND_IMPACTS; } else if (cleanedType == "4200000000000000") { - return ASSET_VEHICLE_FX_DEF; + return Utils::ASSET_VEHICLE_FX_DEF; } else if (cleanedType == "4300000000000000") { - return ASSET_VEHICLE_SOUND_DEF; + return Utils::ASSET_VEHICLE_SOUND_DEF; } else if (cleanedType == "4500000000000000") { - return ASSET_SCRIPT_BUNDLE; + return Utils::ASSET_SCRIPT_BUNDLE; } else if (cleanedType == "4600000000000000") { - return ASSET_SCRIPT_BUNDLE_LIST; + return Utils::ASSET_SCRIPT_BUNDLE_LIST; } else if (cleanedType == "4700000000000000") { - return ASSET_RUMBLE; + return Utils::ASSET_RUMBLE; } else if (cleanedType == "4A00000000000000") { - return ASSET_AIM_TABLE; + return Utils::ASSET_AIM_TABLE; } else if (cleanedType == "4B00000000000000") { - return ASSET_ANIM_SELECTOR_TABLE; + return Utils::ASSET_ANIM_SELECTOR_TABLE; } else if (cleanedType == "4C00000000000000") { - return ASSET_ANIM_MAPPING_TABLE; + return Utils::ASSET_ANIM_MAPPING_TABLE; } else if (cleanedType == "4D00000000000000") { - return ASSET_ANIM_STATE_MACHINE; + return Utils::ASSET_ANIM_STATE_MACHINE; } else if (cleanedType == "4E00000000000000") { - return ASSET_BEHAVIOR_TREE; + return Utils::ASSET_BEHAVIOR_TREE; } else if (cleanedType == "4F00000000000000") { - return ASSET_BEHAVIOR_STATE_MACHINE; + return Utils::ASSET_BEHAVIOR_STATE_MACHINE; } else if (cleanedType == "5100000000000000") { - return ASSET_S_ANIM; + return Utils::ASSET_S_ANIM; } else if (cleanedType == "5200000000000000") { - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "5300000000000000") { - return ASSET_BIT_FIELD; + return Utils::ASSET_BIT_FIELD; } else if (cleanedType == "5400000000000000") { - return ASSET_SURFACE_SOUND_DEF; + return Utils::ASSET_SURFACE_SOUND_DEF; } else if (cleanedType == "5500000000000000") { - return ASSET_SURFACE_FX_TABLE; + return Utils::ASSET_SURFACE_FX_TABLE; } else if (cleanedType == "5600000000000000") { - return ASSET_RUMBLE; + return Utils::ASSET_RUMBLE; } else if (cleanedType == "5900000000000000") { - return ASSET_AIM_TABLE; + return Utils::ASSET_AIM_TABLE; } else if (cleanedType == "5A00000000000000") { - return ASSET_MAP_TABLE; + return Utils::ASSET_MAP_TABLE; } else if (cleanedType == "5B00000000000000") { - return ASSET_MAP_TABLE_LOADING_IMAGES; + return Utils::ASSET_MAP_TABLE_LOADING_IMAGES; } else if (cleanedType == "5C00000000000000") { - return ASSET_MEDAL; + return Utils::ASSET_MEDAL; } else if (cleanedType == "5D00000000000000") { - return ASSET_MEDAL_TABLE; + return Utils::ASSET_MEDAL_TABLE; } else if (cleanedType == "5E00000000000000") { - return ASSET_OBJECTIVE; + return Utils::ASSET_OBJECTIVE; } else if (cleanedType == "5F00000000000000") { - return ASSET_OBJECTIVE_LIST; + return Utils::ASSET_OBJECTIVE_LIST; } else if (cleanedType == "6400000000000000") { - return ASSET_LASER; + return Utils::ASSET_LASER; } else if (cleanedType == "6500000000000000") { - return ASSET_BEAM; + return Utils::ASSET_BEAM; } else if (cleanedType == "6600000000000000") { - return ASSET_STREAMER_HINT; + return Utils::ASSET_STREAMER_HINT; } else if (cleanedType == "1B00000000000000") { - return ASSET_CG_MEDIA_TABLE; + return Utils::ASSET_CG_MEDIA_TABLE; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD12_360::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/360/zonefile_cod12_360.h b/libs/zonefile/360/zonefile_cod12_360.h index 9aacabe..6a88aa6 100644 --- a/libs/zonefile/360/zonefile_cod12_360.h +++ b/libs/zonefile/360/zonefile_cod12_360.h @@ -10,44 +10,7 @@ public: ~ZoneFile_COD12_360(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - GscFile pParseAsset_GSCFile(QDataStream *aZoneFileStream) ; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD12_PC_H diff --git a/libs/zonefile/360/zonefile_cod2_360.cpp b/libs/zonefile/360/zonefile_cod2_360.cpp index 6a3f758..14cac8b 100644 --- a/libs/zonefile/360/zonefile_cod2_360.cpp +++ b/libs/zonefile/360/zonefile_cod2_360.cpp @@ -15,1119 +15,51 @@ ZoneFile_COD2_360::~ZoneFile_COD2_360() } bool ZoneFile_COD2_360::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::BigEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - - zoneFileStream.skipRawData(4 * GetMiscCount()); - pParseMiscTags(&zoneFileStream); - - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD2_360::pParseZoneHeader(QDataStream *aZoneFileStream) { - SetTagCount(pParseZoneTagCount(aZoneFileStream)); - - aZoneFileStream->skipRawData(4); - - SetMiscCount(pParseZoneTagCount(aZoneFileStream)); - - aZoneFileStream->skipRawData(4); - - SetRecordCount(pParseZoneRecordCount(aZoneFileStream)); - - aZoneFileStream->skipRawData(4); - - quint32 tagCount = GetTagCount(); - if (tagCount) { - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD2_360::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD2_360::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD2_360::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD2_360::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD2_360::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD2_360::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD2_360::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * tagCount); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -QStringList ZoneFile_COD2_360::pParseMiscTags(QDataStream *aZoneFileStream) { - QStringList tags; - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - while (aZoneFileStream->device()->peek(8).right(4).toHex() != "ffffffff") { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD2_360::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - // Parse index & map found asset types - for (quint32 i = 0; i < recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD2_360::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - //aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType assetType = AssetStrToEnum(typeHex); - - if (assetType == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (assetType == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (assetType == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (assetType == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (assetType == ASSET_MATERIAL) { // material - result.materials << pParseAsset_Material(aZoneFileStream); - } else if (assetType == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (assetType == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (assetType == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (assetType == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (assetType == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (assetType == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (assetType == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (assetType == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (assetType == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (assetType == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (assetType == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (assetType == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (assetType == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (assetType == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (assetType == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (assetType == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (assetType == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD2_360::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD2_360::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - qint32 rawFilePtr; - *aZoneFileStream >> rawFilePtr; - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - const QStringList tags = GetTags(); - if (rawFilePtr == -1) { - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - } else if (rawFilePtr > 0 && rawFilePtr < tags.size() + 2) { - result.path = tags[rawFilePtr - 1]; - } - - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - if (result.length) { - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - } else { - aZoneFileStream->skipRawData(1); - } - return result; -} - -void ZoneFile_COD2_360::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD2_360::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Shader ZoneFile_COD2_360::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD2_360::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD2_360::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna - >> result.unknownb - >> result.unknownc - >> result.unknownd - >> result.unknowne - >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -Material ZoneFile_COD2_360::pParseAsset_Material(QDataStream *aZoneFileStream) { - Material result; - - *aZoneFileStream >> result.namePtr; - if (result.namePtr != quint32(-1) && result.namePtr > 0 && - GetTagCount() > static_cast(result.namePtr - 1)) { - result.name = GetTags()[result.namePtr - 1]; - } - *aZoneFileStream >> result.refNamePtr; - if (result.refNamePtr != 4294967295 && GetTagCount() > result.refNamePtr - 1) { - result.refName = GetTags()[result.refNamePtr - 1]; - } - aZoneFileStream->skipRawData(12); - - for (int i = 0; i < 13; i++) { - qint32 unknownPtr; - *aZoneFileStream >> unknownPtr; - result.pointers << unknownPtr; - } - - *aZoneFileStream >> result.stateBits[0] >> result.stateBits[1] - >> result.textureCount >> result.constCount >> result.techSetPtr - >> result.texturePtr >> result.constPtr; - - - return result; -} - -SoundAsset ZoneFile_COD2_360::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - qDebug() << "- " << aZoneFileStream->device()->pos(); - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD2_360::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD2_360::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD2_360::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD2_360::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD2_360::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD2_360::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD2_360::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD2_360::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD2_360::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD2_360::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD2_360::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD2_360::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD2_360::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD2_360::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD2_360::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "00000017") { - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "") { - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "") { - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "") { - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "") { - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "") { - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "") { - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "") { - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "") { - return ASSET_LOCAL_STRING; + return Utils::ASSET_LOCALIZE_ENTRY; } else if (cleanedType == "") { - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "") { - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "") { - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "") { - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "00000006") { - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "00000002") { - return ASSET_MATERIAL; + return Utils::ASSET_MATERIAL; } else if (cleanedType == "") { - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "") { - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } else if (cleanedType == "") { - return ASSET_PHYS_PRESET; + return Utils::ASSET_PHYSPRESET; } else if (cleanedType == "") { - return ASSET_DESTRUCTIBLE; + return Utils::ASSET_DESTRUCTIBLE; } else if (cleanedType == "00000004") { - return ASSET_SHOCK_FILE; + return Utils::ASSET_SHOCK_FILE; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD2_360::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/360/zonefile_cod2_360.h b/libs/zonefile/360/zonefile_cod2_360.h index ac50d24..d10bc4e 100644 --- a/libs/zonefile/360/zonefile_cod2_360.h +++ b/libs/zonefile/360/zonefile_cod2_360.h @@ -10,55 +10,7 @@ public: ~ZoneFile_COD2_360(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - - void SetMiscCount(quint32 aMiscCount) { - mMiscCount = aMiscCount; - } - - quint32 GetMiscCount() { - return mMiscCount; - } - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseMiscTags(QDataStream *aZoneFileStream); - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; - -private: - quint32 mMiscCount; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD2_360_H diff --git a/libs/zonefile/360/zonefile_cod4_360.cpp b/libs/zonefile/360/zonefile_cod4_360.cpp index d9ecb43..0518b32 100644 --- a/libs/zonefile/360/zonefile_cod4_360.cpp +++ b/libs/zonefile/360/zonefile_cod4_360.cpp @@ -1,5 +1,7 @@ #include "zonefile_cod4_360.h" #include "utils.h" +#include "file.h" +#include "assetlist.h" #include #include @@ -15,1183 +17,228 @@ ZoneFile_COD4_360::~ZoneFile_COD4_360() { } bool ZoneFile_COD4_360::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::BigEndian); + QDataStream zoneStream(aFileData); - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); + // DB_LoadXFileData() + XFile headerData; + zoneStream >> headerData.size << headerData.externalSize; + for (int i = 0; i < 7; i++) { + zoneStream >> headerData.blockSize[i]; + } + + // Load_XAssetListCustom(); + XAssetList assetList; + zoneStream >> assetList.stringList.count; + zoneStream.skipRawData(4); + zoneStream >> assetList.assetCount; + zoneStream.skipRawData(4); + + zoneStream.skipRawData(4); + + for (int i = 0; i < assetList.stringList.count; i++) { + qint32 stringPtr; + zoneStream >> stringPtr; + + assetList.stringList.stringPtrs.append(stringPtr); + } + + for (int i = 0; i < assetList.stringList.count; i++) { + qint32 currentStringPtr = assetList.stringList.stringPtrs[i]; + if (currentStringPtr == -1) { + QString currentString; + char currentChar; + + zoneStream >> currentChar; + while (currentChar != '\0') { + currentString.append(currentChar); + zoneStream >> currentChar; + } + assetList.stringList.scriptStrings.append(currentString); + } + } + zoneStream.skipRawData(4); + + for (int i = 0; i < assetList.assetCount; i++) { + XAsset asset; + zoneStream >> asset.type; + zoneStream.skipRawData(4); + } + + // for (int i = 0; i < assetList.assetCount; i++) { + // XAssetType type = assetList.assets[i].type; + // switch (type) { + // case ASSET_TYPE_XANIMPARTS: + // assets.assetMap.animations << assets.Load_Animation(&zoneStream); + // break; + // case ASSET_TYPE_XMODEL: + // assets.assetMap.models << assets.Load_Model(&zoneStream); + // break; + // case ASSET_TYPE_MATERIAL: + // assets.assetMap.materials << assets.Load_Material(&zoneStream); + // break; + // case ASSET_TYPE_PIXELSHADER: + // assets.assetMap.pixelShaders << assets.Load_MaterialPixelShader(&zoneStream); + // break; + // case ASSET_TYPE_TECHNIQUE_SET: + // assets.assetMap.techSets << assets.Load_MaterialTechSet(&zoneStream); + // break; + // case ASSET_TYPE_IMAGE: + // assets.assetMap.images << assets.Load_GfxImage(&zoneStream); + // break; + // case ASSET_TYPE_SOUND: + // assets.assetMap.sounds << assets.Load_SoundAliasList(&zoneStream); + // break; + // case ASSET_TYPE_SOUND_CURVE: + // assets.assetMap.soundCurves << assets.Load_SoundCurve(&zoneStream); + // break; + // case ASSET_TYPE_LOADED_SOUND: + // assets.assetMap.loadedSounds << assets.Load_LoadedSound(&zoneStream); + // break; + // case ASSET_TYPE_CLIPMAP: + // case ASSET_TYPE_CLIPMAP_PVS: + // assets.assetMap.clipMaps << assets.Load_ClipMap(&zoneStream); + // break; + // case ASSET_TYPE_COMWORLD: + // assets.assetMap.comWorlds << assets.Load_ComWorld(&zoneStream); + // break; + // case ASSET_TYPE_GAMEWORLD_SP: + // assets.assetMap.gameWorldSPs << assets.Load_GameWorldSp(&zoneStream); + // break; + // case ASSET_TYPE_GAMEWORLD_MP: + // assets.assetMap.gameWorldMPs << assets.Load_GameWorldMp(&zoneStream); + // break; + // case ASSET_TYPE_MAP_ENTS: + // assets.assetMap.mapEntities << assets.Load_MapEnts(&zoneStream); + // break; + // case ASSET_TYPE_GFXWORLD: + // assets.assetMap.gfxWorlds << assets.Load_GfxWorld(&zoneStream); + // break; + // case ASSET_TYPE_LIGHT_DEF: + // assets.assetMap.gfxLightDefs << assets.Load_GfxLightPtr(&zoneStream); + // break; + // case ASSET_TYPE_FONT: + // assets.assetMap.fonts << assets.Load_GameFont(&zoneStream); + // break; + // case ASSET_TYPE_MENULIST: + // assets.assetMap.menuLists << assets.Load_MenuList(&zoneStream); + // break; + // case ASSET_TYPE_MENU: + // assets.assetMap.menuDefinitions << assets.Load_MenuDef(&zoneStream); + // break; + // case ASSET_TYPE_LOCALIZE_ENTRY: + // assets.assetMap.localizeEntries << assets.Load_LocalizeEntry(&zoneStream); + // break; + // case ASSET_TYPE_WEAPON: + // assets.assetMap.weaponDefinitions << assets.Load_WeaponDef(&zoneStream); + // break; + // case ASSET_TYPE_SNDDRIVER_GLOBALS: + // assets.assetMap.soundDrivers << assets.Load_SoundDriver(&zoneStream); + // break; + // case ASSET_TYPE_FX: + // assets.assetMap.effectDefinitions << assets.Load_EffectDef(&zoneStream); + // break; + // case ASSET_TYPE_IMPACT_FX: + // assets.assetMap.impactTables << assets.Load_ImpactTable(&zoneStream); + // break; + // case ASSET_TYPE_RAWFILE: + // assets.assetMap.rawFiles << assets.Load_RawFile(&zoneStream); + // break; + // case ASSET_TYPE_STRINGTABLE: + // assets.assetMap.stringTables << assets.Load_StringTable(&zoneStream); + // break; + // case ASSET_TYPE_COUNT: + // case ASSET_TYPE_ASSETLIST: + // case ASSET_TYPE_XMODELPIECES: + // case ASSET_TYPE_PHYSPRESET: + // case ASSET_TYPE_UI_MAP: + // case ASSET_TYPE_AITYPE: + // case ASSET_TYPE_MPTYPE: + // case ASSET_TYPE_CHARACTER: + // case ASSET_TYPE_XMODELALIAS: + // default: + // break; + // } + // } return true; } -void ZoneFile_COD4_360::pParseZoneHeader(QDataStream *aZoneFileStream) { - SetSize(pParseZoneSize(aZoneFileStream)); - pParseZoneUnknownsA(aZoneFileStream); - - SetTagCount(pParseZoneTagCount(aZoneFileStream)); - pParseZoneUnknownsB(aZoneFileStream); - - SetRecordCount(pParseZoneRecordCount(aZoneFileStream)); - - quint32 tagCount = GetTagCount(); - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD4_360::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD4_360::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD4_360::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD4_360::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD4_360::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD4_360::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD4_360::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { - tags << zoneTag; - } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD4_360::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 1); - } - - // Parse index & map found asset types - for (quint32 i = 0; i < recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD4_360::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType assetType = AssetStrToEnum(typeHex); - const QString typeStr = AssetEnumToStr(assetType); - - if (assetType == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (assetType == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (assetType == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (assetType == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (assetType == ASSET_MATERIAL) { // material - result.materials << pParseAsset_Material(aZoneFileStream); - } else if (assetType == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (assetType == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (assetType == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (assetType == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (assetType == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (assetType == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (assetType == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (assetType == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (assetType == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (assetType == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (assetType == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (assetType == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (assetType == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (assetType == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (assetType == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (assetType == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (assetType == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD4_360::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - qint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == -1) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == -1) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD4_360::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - result.startPos = aZoneFileStream->device()->pos(); - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - if (result.path.contains(".bik")) { - QByteArray bikData(result.length, Qt::Uninitialized); - aZoneFileStream->readRawData(bikData.data(), result.length); - - //QFile bikFile(QDir::currentPath() + "/" + rawFilePath.split('/').last()); - //qDebug() << bikFile.fileName(); - //if (!bikFile.open(QIODevice::WriteOnly)) { - // qWarning() << "Failed to open .bik file for writing!"; - // return; - //} - //qDebug() << QString("%1: %2").arg(rawFilePath).arg(bikFile.fileName()); - //bikFile.write(bikData); - } else { - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - } - - result.endPos = aZoneFileStream->device()->pos(); - return result; -} - -void ZoneFile_COD4_360::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD4_360::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - aZoneFileStream->skipRawData(4); - - QByteArray modelMagic(4, Qt::Uninitialized); - aZoneFileStream->readRawData(modelMagic.data(), 4); - if (modelMagic.toHex() != "01010200") { - qDebug() << "Invalid model magic: " << modelMagic.toHex(); - return result; - } - qDebug() << "Model Magic: " << modelMagic.toHex(); - - aZoneFileStream->skipRawData(8 * 4); - - for (int i = 0; i < 4; i++) { - - QByteArray lodData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(lodData.data(), 4); - - float levelOfDetail = qFromBigEndian(reinterpret_cast(lodData.constData())); - - quint16 surfacePresent; - *aZoneFileStream >> surfacePresent; - - quint16 surfaceIndex; - *aZoneFileStream >> surfaceIndex; - - if (surfacePresent) { - qDebug() << "Surface " << surfaceIndex << " detected"; - qDebug() << "- Level of Detail: " << levelOfDetail; - } - aZoneFileStream->skipRawData(4 * 4); - } - aZoneFileStream->skipRawData(17 * 4); - - qDebug() << "Name Char: " << aZoneFileStream->device()->pos(); - QString modelName; - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar != 0) { - modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - qDebug() << "Model Name: " << modelName; - - aZoneFileStream->skipRawData(4 * 9 + 1); - - quint16 vertCount, faceCount; - *aZoneFileStream >> vertCount >> faceCount; - qDebug() << "Vertex count 1: " << vertCount; - qDebug() << "Face count 1: " << faceCount; - - aZoneFileStream->skipRawData(57 * 4 - 2); - - qDebug() << "Vertex Listing: " << aZoneFileStream->device()->pos(); - for (int i = 0; i < vertCount; i++) { - qDebug() << "- Vertex " << i; - - QByteArray xOffData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(xOffData.data(), 4); - float xOff = qFromBigEndian(reinterpret_cast(xOffData.constData())); - - QByteArray yOffData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(yOffData.data(), 4); - float yOff = qFromBigEndian(reinterpret_cast(yOffData.constData())); - - QByteArray zOffData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(zOffData.data(), 4); - float zOff = qFromBigEndian(reinterpret_cast(zOffData.constData())); - - qDebug() << " - Offset: " << xOff << ", " << yOff << ", " << zOff; - aZoneFileStream->skipRawData(20); - } - - qDebug() << "Count 2: " << aZoneFileStream->device()->pos(); - quint32 vertCount1, faceCount1; - *aZoneFileStream >> vertCount1 >> faceCount1; - qDebug() << "Vertex count 2: " << vertCount1; - qDebug() << "Face count 2: " << faceCount1; - - aZoneFileStream->skipRawData(1968); - - for (int i = 0; i < faceCount - 6; i++) { - aZoneFileStream->skipRawData(64); - } - aZoneFileStream->skipRawData(224); - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() + aZoneFileStream->device()->peek(1024).toHex().indexOf("ffffffff")); - - return result; -} - -Material ZoneFile_COD4_360::pParseAsset_Material(QDataStream *aZoneFileStream) { - Material result; - - *aZoneFileStream >> result.namePtr; - - //aZoneFileStream->skipRawData(23 * 4); - - for (int i = 0; i < 23; i++) { - qint32 unknownPtr; - *aZoneFileStream >> unknownPtr; - result.pointers << unknownPtr; - } - - if (result.namePtr == -1) { - aZoneFileStream->skipRawData(1); - - QString materialName; - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.name += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - } - - aZoneFileStream->skipRawData(3 * 4); - - qint32 compressionPtr, compression, unknownSectionPtr; - *aZoneFileStream >> compressionPtr; - if (compressionPtr == -1) { - *aZoneFileStream >> compression; - - *aZoneFileStream >> unknownSectionPtr; - if (unknownSectionPtr == -2) { - aZoneFileStream->skipRawData(6 * 4); - } - } - - qint32 imageNamePtr; - *aZoneFileStream >> imageNamePtr; - if (imageNamePtr == -1) { - QString imageName; - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - imageName += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - } - - QByteArray compressionData(4, Qt::Uninitialized); - QString compressionStr; - if (compressionPtr == -1) { - aZoneFileStream->skipRawData(2 * 4); - aZoneFileStream->readRawData(compressionData.data(), 4); - aZoneFileStream->skipRawData(4); - compressionStr = QString::fromUtf8(compressionData); - aZoneFileStream->skipRawData(4); - } - aZoneFileStream->skipRawData(4); - - return result; -} - -Shader ZoneFile_COD4_360::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD4_360::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - qint32 namePtr; - *aZoneFileStream >> namePtr; - - - for (int i = 0; i < 28; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - - if (namePtr == -1) { - aZoneFileStream->skipRawData(1); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - } - - //result.name.replace(",", ""); - return result; -} - -Image ZoneFile_COD4_360::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - qDebug() << "Header" << aZoneFileStream->device()->pos(); - qDebug() << "- Start Pos: " << aZoneFileStream->device()->pos(); - aZoneFileStream->skipRawData(14); - - QByteArray sectionCountData(1, Qt::Uninitialized); - aZoneFileStream->readRawData(sectionCountData.data(), 1); - - QString sectionCountStr = sectionCountData.toHex(); - std::reverse(sectionCountStr.begin(), sectionCountStr.end()); - - quint32 sectionCount = sectionCountStr.toInt(); - qDebug() << "- Section Count: " << sectionCountStr << " : " << sectionCount; - - aZoneFileStream->skipRawData(25); - - // Parse image name - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - result.materialName += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - qDebug() << "- Name: " << result.name; - qDebug() << "- End Pos: " << aZoneFileStream->device()->pos(); - - qDebug() << "Chunks [" << sectionCount << "]"; - for (int i = 0; i < sectionCount; i++) { - qDebug() << "- Chunk " << sectionCount; - qDebug() << " - Header" << sectionCount; - qDebug() << " - Start Pos: " << aZoneFileStream->device()->pos(); - - // TODO: Parse header/index/pointers? - for (int j = 0; j < 60; j++) { - quint32 unknownPtr; - *aZoneFileStream >> unknownPtr; - - result.unknowns.append(unknownPtr); - } - - qDebug() << " - End Pos: " << aZoneFileStream->device()->pos(); - qDebug() << " - Data" << sectionCount; - qDebug() << " - Start Pos: " << aZoneFileStream->device()->pos(); - - // TODO: Parse data chunks - aZoneFileStream->skipRawData(3856); - qDebug() << " - End Pos: " << aZoneFileStream->device()->pos(); - } - - qDebug() << "Footer"; - qDebug() << "- Start Pos: " << aZoneFileStream->device()->pos(); - // TODO: Parse pointers/footer? - for (int k = 0; k < 17; k++) { - aZoneFileStream->skipRawData(4); - } - qDebug() << "- End Pos: " << aZoneFileStream->device()->pos(); - - return result; -} - -SoundAsset ZoneFile_COD4_360::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - // TODO Reimplement proper sound parsing - return result; - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD4_360::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_360::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_360::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_360::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_360::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_360::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_360::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_360::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD4_360::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD4_360::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD4_360::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_360::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD4_360::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD4_360::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD4_360::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); - if (cleanedType == "00000020") { - return ASSET_RAW_FILE; - } else if (cleanedType == "0000001A") { - return ASSET_EFFECT; - } else if (cleanedType == "00000017") { - return ASSET_LOCAL_STRING; - } else if (cleanedType == "00000002") { - return ASSET_ANIMATION; - } else if (cleanedType == "0000000C") { - return ASSET_COLLISION_MAP; - } else if (cleanedType == "00000021") { - return ASSET_STRING_TABLE; - } else if (cleanedType == "00000015") { - return ASSET_MENU; - } else if (cleanedType == "00000006") { - return ASSET_TECH_SET; - } else if (cleanedType == "00000018") { - return ASSET_WEAPON; - } else if (cleanedType == "00000011") { - return ASSET_GFX_MAP; - } else if (cleanedType == "00000012") { - return ASSET_LIGHT_DEF; - } else if (cleanedType == "00000014") { - return ASSET_FONT; - } else if (cleanedType == "0000000D") { - return ASSET_D3DBSP; - } else if (cleanedType == "00000008") { - return ASSET_MATERIAL; - } else if (cleanedType == "0000000E") { - return ASSET_GAME_MAP_SP; - } else if (cleanedType == "0000000B") { - return ASSET_COL_MAP_SP; + if (cleanedType == "00000000") { + return Utils::ASSET_XMODELPIECES; } else if (cleanedType == "00000001") { - return ASSET_PHYS_PRESET; + return Utils::ASSET_PHYSPRESET; + } else if (cleanedType == "00000002") { + return Utils::ASSET_Animation; } else if (cleanedType == "00000003") { - return ASSET_MODEL; - } else if (cleanedType == "00000016") { - return ASSET_MENU; - } else if (cleanedType == "0000001B") { - return ASSET_UI_MAP; + return Utils::ASSET_XMODEL; + } else if (cleanedType == "00000004") { + return Utils::ASSET_MATERIAL; + } else if (cleanedType == "00000005") { + return Utils::ASSET_PIXELSHADER; + } else if (cleanedType == "00000006") { + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "00000007") { - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; + } else if (cleanedType == "00000008") { + return Utils::ASSET_SOUND; } else if (cleanedType == "00000009") { - return ASSET_SOUND_DRIVER_GLOBALS; + return Utils::ASSET_SOUND_CURVE; + } else if (cleanedType == "0000000A") { + return Utils::ASSET_LOADED_SOUND; + } else if (cleanedType == "0000000B") { + return Utils::ASSET_CLIPMAP; + } else if (cleanedType == "0000000C") { + return Utils::ASSET_CLIPMAP_PVS; + } else if (cleanedType == "0000000D") { + return Utils::ASSET_COMWORLD; + } else if (cleanedType == "0000000E") { + return Utils::ASSET_GAMEWORLD_SP; + } else if (cleanedType == "0000000F") { + return Utils::ASSET_GAMEWORLD_MP; + } else if (cleanedType == "00000010") { + return Utils::ASSET_MAP_ENTS; + } else if (cleanedType == "00000011") { + return Utils::ASSET_GFXWORLD; + } else if (cleanedType == "00000012") { + return Utils::ASSET_LIGHT_DEF; + } else if (cleanedType == "00000013") { + return Utils::ASSET_UI_MAP; + } else if (cleanedType == "00000014") { + return Utils::ASSET_FONT; + } else if (cleanedType == "00000015") { + return Utils::ASSET_MENULIST; + } else if (cleanedType == "00000016") { + return Utils::ASSET_MENU; + } else if (cleanedType == "00000017") { + return Utils::ASSET_LOCALIZE_ENTRY; + } else if (cleanedType == "00000018") { + return Utils::ASSET_WEAPON; } else if (cleanedType == "00000019") { - return ASSET_SOUND; + return Utils::ASSET_SNDDRIVER_GLOBALS; + } else if (cleanedType == "0000001A") { + return Utils::ASSET_FX; + } else if (cleanedType == "0000001B") { + return Utils::ASSET_IMPACT_FX; + } else if (cleanedType == "0000001C") { + return Utils::ASSET_AITYPE; + } else if (cleanedType == "0000001D") { + return Utils::ASSET_MPTYPE; + } else if (cleanedType == "0000001E") { + return Utils::ASSET_CHARACTER; + } else if (cleanedType == "0000001F") { + return Utils::ASSET_XMODELALIAS; + } else if (cleanedType == "00000020") { + return Utils::ASSET_RAWFILE; + } else if (cleanedType == "00000021") { + return Utils::ASSET_STRINGTABLE; + } else if (cleanedType == "00000022") { + return Utils::ASSET_COUNT; + } else if (cleanedType == "00000022") { + return Utils::ASSET_STRING; + } else if (cleanedType == "00000023") { + return Utils::ASSET_ASSETLIST; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD4_360::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/360/zonefile_cod4_360.h b/libs/zonefile/360/zonefile_cod4_360.h index 173db2d..a2d5fcb 100644 --- a/libs/zonefile/360/zonefile_cod4_360.h +++ b/libs/zonefile/360/zonefile_cod4_360.h @@ -12,43 +12,10 @@ public: ~ZoneFile_COD4_360(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; private: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + //Assets_COD4_360 assets; }; #endif // ZONEFILE_COD4_360_H diff --git a/libs/zonefile/360/zonefile_cod5_360.cpp b/libs/zonefile/360/zonefile_cod5_360.cpp index b47b0b0..21a1d73 100644 --- a/libs/zonefile/360/zonefile_cod5_360.cpp +++ b/libs/zonefile/360/zonefile_cod5_360.cpp @@ -14,1138 +14,51 @@ ZoneFile_COD5_360::~ZoneFile_COD5_360() { } bool ZoneFile_COD5_360::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::BigEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD5_360::pParseZoneHeader(QDataStream *aZoneFileStream) { - SetSize(pParseZoneSize(aZoneFileStream)); - pParseZoneUnknownsA(aZoneFileStream); - - SetTagCount(pParseZoneTagCount(aZoneFileStream)); - pParseZoneUnknownsB(aZoneFileStream); - - SetRecordCount(pParseZoneRecordCount(aZoneFileStream)); - - quint32 tagCount = GetTagCount(); - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD5_360::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD5_360::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD5_360::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD5_360::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD5_360::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD5_360::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD5_360::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount - 1; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { - if (!zoneTag.isEmpty()) { tags << zoneTag; } - } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD5_360::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - // Parse index & map found asset types - for (quint32 i = 0; i < recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD5_360::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType assetType = AssetStrToEnum(typeHex); - const QString typeStr = AssetEnumToStr(assetType); - - if (assetType == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (assetType == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (assetType == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (assetType == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (assetType == ASSET_MATERIAL) { // material - result.materials << pParseAsset_Material(aZoneFileStream); - } else if (assetType == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (assetType == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (assetType == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (assetType == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (assetType == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (assetType == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (assetType == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (assetType == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (assetType == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (assetType == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (assetType == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (assetType == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (assetType == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (assetType == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (assetType == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (assetType == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (assetType == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD5_360::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD5_360::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - if (result.path.contains(".bik")) { - QByteArray bikData(result.length, Qt::Uninitialized); - aZoneFileStream->readRawData(bikData.data(), result.length); - - //QFile bikFile(QDir::currentPath() + "/" + rawFilePath.split('/').last()); - //qDebug() << bikFile.fileName(); - //if (!bikFile.open(QIODevice::WriteOnly)) { - // qWarning() << "Failed to open .bik file for writing!"; - // return; - //} - //qDebug() << QString("%1: %2").arg(rawFilePath).arg(bikFile.fileName()); - //bikFile.write(bikData); - } else { - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - } - return result; -} - -void ZoneFile_COD5_360::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD5_360::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD5_360::pParseAsset_Material(QDataStream *aZoneFileStream) { - Material result; - - *aZoneFileStream >> result.namePtr; - - //aZoneFileStream->skipRawData(23 * 4); - - for (int i = 0; i < 23; i++) { - qint32 unknownPtr; - *aZoneFileStream >> unknownPtr; - result.pointers << unknownPtr; - } - - if (result.namePtr == -1) { - aZoneFileStream->skipRawData(1); - - QString materialName; - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.name += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - } - - aZoneFileStream->skipRawData(3 * 4); - - qint32 compressionPtr, compression, unknownSectionPtr; - *aZoneFileStream >> compressionPtr; - if (compressionPtr == -1) { - *aZoneFileStream >> compression; - - *aZoneFileStream >> unknownSectionPtr; - if (unknownSectionPtr == -2) { - aZoneFileStream->skipRawData(6 * 4); - } - } - - qint32 imageNamePtr; - *aZoneFileStream >> imageNamePtr; - if (imageNamePtr == -1) { - QString imageName; - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - imageName += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - } - - QByteArray compressionData(4, Qt::Uninitialized); - QString compressionStr; - if (compressionPtr == -1) { - aZoneFileStream->skipRawData(2 * 4); - aZoneFileStream->readRawData(compressionData.data(), 4); - aZoneFileStream->skipRawData(4); - compressionStr = QString::fromUtf8(compressionData); - aZoneFileStream->skipRawData(4); - } - aZoneFileStream->skipRawData(4); - - return result; -} - -Shader ZoneFile_COD5_360::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD5_360::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - qint32 namePtr; - *aZoneFileStream >> namePtr; - - - for (int i = 0; i < 53; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - - //aZoneFileStream->skipRawData(53 * 4); - - if (namePtr == -1) { - aZoneFileStream->skipRawData(1); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - } - - //result.name.replace(",", ""); - return result; -} - -Image ZoneFile_COD5_360::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD5_360::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD5_360::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_360::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_360::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_360::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_360::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_360::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_360::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_360::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD5_360::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD5_360::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD5_360::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_360::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD5_360::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD5_360::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD5_360::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "00000021") { - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "0000001A") { - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "00000009") { - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "00000004") { - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0000000C") { - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "00000021") { - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "00000015") { - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "00000008") { - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "00000018") { - return ASSET_LOCAL_STRING; + return Utils::ASSET_LOCALIZE_ENTRY; } else if (cleanedType == "00000011") { - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "00000012") { - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "00000014") { - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "00000005") { - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0000000D") { - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "00000006") { - return ASSET_MATERIAL; + return Utils::ASSET_MATERIAL; } else if (cleanedType == "0000000E") { - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "0000000B") { - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } else if (cleanedType == "00000001") { - return ASSET_PHYS_PRESET; + return Utils::ASSET_PHYSPRESET; } else if (cleanedType == "00000003") { - return ASSET_DESTRUCTIBLE; + return Utils::ASSET_DESTRUCTIBLE; } else if (cleanedType == "00000016") { - return ASSET_MENU; + return Utils::ASSET_MENU; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD5_360::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/360/zonefile_cod5_360.h b/libs/zonefile/360/zonefile_cod5_360.h index b46409d..9b9dc48 100644 --- a/libs/zonefile/360/zonefile_cod5_360.h +++ b/libs/zonefile/360/zonefile_cod5_360.h @@ -12,43 +12,7 @@ public: ~ZoneFile_COD5_360(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -private: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD5_360_H diff --git a/libs/zonefile/360/zonefile_cod6_360.cpp b/libs/zonefile/360/zonefile_cod6_360.cpp index 5ab538c..6e04503 100644 --- a/libs/zonefile/360/zonefile_cod6_360.cpp +++ b/libs/zonefile/360/zonefile_cod6_360.cpp @@ -15,1139 +15,1196 @@ ZoneFile_COD6_360::~ZoneFile_COD6_360() { bool ZoneFile_COD6_360::Load(const QByteArray aFileData) { // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::BigEndian); + // QDataStream zoneFileStream(aFileData); + // zoneFileStream.setByteOrder(QDataStream::BigEndian); - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); + // // Parse data from zone file header + // pParseZoneHeader(&zoneFileStream); + // qDebug() << zoneFileStream.device()->pos(); + // SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); + // qDebug() << zoneFileStream.device()->pos(); + // SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); + // qDebug() << zoneFileStream.device()->pos(); return true; } -void ZoneFile_COD6_360::pParseZoneHeader(QDataStream *aZoneFileStream) { - SetSize(pParseZoneSize(aZoneFileStream)); - - aZoneFileStream->skipRawData(28); - - SetTagCount(pParseZoneTagCount(aZoneFileStream)); - pParseZoneUnknownsB(aZoneFileStream); - - SetRecordCount(pParseZoneRecordCount(aZoneFileStream)); - - quint32 tagCount = GetTagCount(); - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD6_360::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 32; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD6_360::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD6_360::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD6_360::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD6_360::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD6_360::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD6_360::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount + 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { - if (!zoneTag.isEmpty()) { tags << zoneTag; } - } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD6_360::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - // Parse index & map found asset types - for (quint32 i = 0; i < recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD6_360::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType assetType = AssetStrToEnum(typeHex); - const QString typeStr = AssetEnumToStr(assetType); - - if (assetType == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (assetType == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (assetType == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (assetType == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (assetType == ASSET_MATERIAL) { // material - result.materials << pParseAsset_Material(aZoneFileStream); - } else if (assetType == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (assetType == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (assetType == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (assetType == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (assetType == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (assetType == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (assetType == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (assetType == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (assetType == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (assetType == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (assetType == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (assetType == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (assetType == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (assetType == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (assetType == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (assetType == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (assetType == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD6_360::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD6_360::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - if (result.path.contains(".bik")) { - QByteArray bikData(result.length, Qt::Uninitialized); - aZoneFileStream->readRawData(bikData.data(), result.length); - - //QFile bikFile(QDir::currentPath() + "/" + rawFilePath.split('/').last()); - //qDebug() << bikFile.fileName(); - //if (!bikFile.open(QIODevice::WriteOnly)) { - // qWarning() << "Failed to open .bik file for writing!"; - // return; - //} - //qDebug() << QString("%1: %2").arg(rawFilePath).arg(bikFile.fileName()); - //bikFile.write(bikData); - } else { - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - } - return result; -} - -void ZoneFile_COD6_360::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD6_360::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD6_360::pParseAsset_Material(QDataStream *aZoneFileStream) { - Material result; - - *aZoneFileStream >> result.namePtr; - - //aZoneFileStream->skipRawData(23 * 4); - - for (int i = 0; i < 23; i++) { - qint32 unknownPtr; - *aZoneFileStream >> unknownPtr; - result.pointers << unknownPtr; - } - - if (result.namePtr == -1) { - aZoneFileStream->skipRawData(1); - - QString materialName; - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.name += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - } - - aZoneFileStream->skipRawData(3 * 4); - - qint32 compressionPtr, compression, unknownSectionPtr; - *aZoneFileStream >> compressionPtr; - if (compressionPtr == -1) { - *aZoneFileStream >> compression; - - *aZoneFileStream >> unknownSectionPtr; - if (unknownSectionPtr == -2) { - aZoneFileStream->skipRawData(6 * 4); - } - } - - qint32 imageNamePtr; - *aZoneFileStream >> imageNamePtr; - if (imageNamePtr == -1) { - QString imageName; - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - imageName += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - } - - QByteArray compressionData(4, Qt::Uninitialized); - QString compressionStr; - if (compressionPtr == -1) { - aZoneFileStream->skipRawData(2 * 4); - aZoneFileStream->readRawData(compressionData.data(), 4); - aZoneFileStream->skipRawData(4); - compressionStr = QString::fromUtf8(compressionData); - aZoneFileStream->skipRawData(4); - } - aZoneFileStream->skipRawData(4); - - return result; -} - -Shader ZoneFile_COD6_360::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD6_360::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - qint32 namePtr; - *aZoneFileStream >> namePtr; - - - for (int i = 0; i < 53; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - - //aZoneFileStream->skipRawData(53 * 4); - - if (namePtr == -1) { - aZoneFileStream->skipRawData(1); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - } - - //result.name.replace(",", ""); - return result; -} - -Image ZoneFile_COD6_360::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); +// void ZoneFile_COD6_360::pParseZoneHeader(QDataStream *aZoneFileStream) { +// SetSize(pParseZoneSize(aZoneFileStream)); + +// aZoneFileStream->skipRawData(28); + +// SetTagCount(pParseZoneTagCount(aZoneFileStream)); +// pParseZoneUnknownsB(aZoneFileStream); + +// SetRecordCount(pParseZoneRecordCount(aZoneFileStream)); + +// quint32 tagCount = GetTagCount(); +// if (tagCount) { +// pParseZoneUnknownsC(aZoneFileStream); +// SetTags(pParseZoneTags(aZoneFileStream, tagCount)); +// } else { +// aZoneFileStream->skipRawData(4); +// } +// } + +// quint32 ZoneFile_COD6_360::pParseZoneSize(QDataStream *aZoneFileStream) { +// quint32 zoneFileSize; +// *aZoneFileStream >> zoneFileSize; +// if (zoneFileSize <= 0) { +// qDebug() << "Tried to open empty zone file!"; +// exit(-1); +// } +// zoneFileSize += 32; +// return zoneFileSize; +// } + +// /* +// ParseZoneUnknownsA() + +// Parses the 1st section of unknowns as hex vals and uint32s +// */ +// void ZoneFile_COD6_360::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { +// // Byte 4-7, 8-11, 12-15: unknown +// QByteArray unknown1(4, Qt::Uninitialized); +// aZoneFileStream->readRawData(unknown1.data(), 4); + +// QByteArray unknown2(4, Qt::Uninitialized); +// aZoneFileStream->readRawData(unknown2.data(), 4); + +// QByteArray unknown3(4, Qt::Uninitialized); +// aZoneFileStream->readRawData(unknown3.data(), 4); + +// // Byte 16-19, 20-23: empty/unknown +// QByteArray unknown4(4, Qt::Uninitialized); +// aZoneFileStream->readRawData(unknown4.data(), 4); + +// QByteArray unknown5(4, Qt::Uninitialized); +// aZoneFileStream->readRawData(unknown5.data(), 4); + +// // Byte 24-27: somehow related to the filesize, but smaller value +// QByteArray unknown6(4, Qt::Uninitialized); +// aZoneFileStream->readRawData(unknown6.data(), 4); + +// // Byte 28-31, 32-35: unknown +// QByteArray unknown7(4, Qt::Uninitialized); +// aZoneFileStream->readRawData(unknown7.data(), 4); + +// QByteArray unknown8(4, Qt::Uninitialized); +// aZoneFileStream->readRawData(unknown8.data(), 4); +// } + +// /* +// ParseZoneTagCount() + +// Parses the number of string tags in the zone index +// */ +// quint32 ZoneFile_COD6_360::pParseZoneTagCount(QDataStream *aZoneFileStream) { +// quint32 tagCount; +// *aZoneFileStream >> tagCount; +// return tagCount; +// } + +// /* +// ParseZoneRecordCount() + +// Parses the number of records in the zone index +// */ +// quint32 ZoneFile_COD6_360::pParseZoneRecordCount(QDataStream *aZoneFileStream) { +// quint32 recordCount; +// *aZoneFileStream >> recordCount; +// return recordCount; +// } + +// /* +// ParseZoneUnknownsB() + +// Parses the 2nd section of unknowns as hex vals and uint32s +// */ +// void ZoneFile_COD6_360::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { +// // Byte 44-47: Unknown/empty? +// QByteArray unknown9(4, Qt::Uninitialized); +// aZoneFileStream->readRawData(unknown9.data(), 4); +// } + +// /* +// pParseZoneUnknownsC() + +// Parses the 3rd section of unknowns as hex vals and uint32s +// */ +// void ZoneFile_COD6_360::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { +// // Byte 40-43: Unknown/empty? +// QByteArray unknown10(4, Qt::Uninitialized); +// aZoneFileStream->readRawData(unknown10.data(), 4); + +// // Byte 44-47: Unknown/empty? +// QByteArray unknown11(4, Qt::Uninitialized); +// aZoneFileStream->readRawData(unknown11.data(), 4); +// } + +// /* +// ParseZoneTags() + +// Parses the string tags ate the start of zone file +// */ +// QStringList ZoneFile_COD6_360::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { +// QStringList tags; + +// // Byte 48-51: Repeated separators? ÿÿÿÿ x i +// aZoneFileStream->skipRawData(4 * (tagCount - 1)); + +// // Parse tags/strings before index +// QString zoneTag; +// char zoneTagChar; +// for (quint32 i = 0; i < tagCount - 1; i++) { +// *aZoneFileStream >> zoneTagChar; +// while (zoneTagChar != 0) { +// zoneTag += zoneTagChar; +// *aZoneFileStream >> zoneTagChar; +// } +// if (!zoneTag.isEmpty()) { +// tags << zoneTag; +// } +// zoneTag.clear(); +// } + +// if (!aZoneFileStream->device()->peek(8).toHex().contains("ffffffff")) { +// *aZoneFileStream >> zoneTagChar; +// while (zoneTagChar != 0) { +// zoneTag += zoneTagChar; +// *aZoneFileStream >> zoneTagChar; +// } +// if (!zoneTag.isEmpty()) { +// tags << zoneTag; +// } +// } + +// return tags; +// } + +// /* +// ParseZoneIndex() + +// Parse the binary zone index data and populate table +// */ +// QStringList ZoneFile_COD6_360::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { +// QStringList result; +// qDebug() << aZoneFileStream->device()->pos(); +// // Don't parse if no records +// if (!recordCount) { return result; } + +// // Parse index & map found asset types +// for (quint32 i = 0; i < recordCount; i++) { +// // Skip record start +// QByteArray rawAssetType(4, Qt::Uninitialized); +// aZoneFileStream->readRawData(rawAssetType.data(), 4); +// result << rawAssetType.toHex(); + +// // Skip separator +// aZoneFileStream->skipRawData(4); +// } +// return result; +// } + +// AssetMap ZoneFile_COD6_360::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { +// AssetMap result; + +// for (int i = 0; i < assetOrder.size(); i++) { +// const QString typeHex = assetOrder[i]; +// const Utils::AssetType assetType = AssetStrToEnum(typeHex); +// const QString typeStr = Utils::AssetTypeToStr(assetType); + +// if (assetType == Utils::ASSET_LOCALIZE_ENTRY) { // localized string asset +// result.localizeEntries << pParseAsset_LocalString(aZoneFileStream); +// } else if (assetType == Utils::ASSET_RAWFILE) { // gsc +// auto rawFile = pParseAsset_RawFile(aZoneFileStream); +// if (rawFile.length) { +// result.rawFiles << rawFile; +// } +// } else if (assetType == Utils::ASSET_PHYSPRESET) { // physpreset +// pParseAsset_PhysPreset(aZoneFileStream); +// } else if (assetType == Utils::ASSET_XMODEL) { // xmodel +// result.models << pParseAsset_XModel(aZoneFileStream); +// } else if (assetType == Utils::ASSET_MATERIAL) { // material +// result.materials << pParseAsset_Material(aZoneFileStream); +// } else if (assetType == Utils::ASSET_SHADER) { // pixelshader +// pParseAsset_Shader(aZoneFileStream); +// } else if (assetType == Utils::ASSET_TECHNIQUE_SET) { // techset include +// result.techSets << pParseAsset_TechSet(aZoneFileStream); +// } else if (assetType == Utils::ASSET_IMAGE) { // image +// result.images << pParseAsset_Image(aZoneFileStream); +// } else if (assetType == Utils::ASSET_SOUND) { // loaded_sound +// result.sounds << pParseAsset_Sound(aZoneFileStream); +// } else if (assetType == Utils::ASSET_COLLISION_MAP) { // col_map_mp +// pParseAsset_ColMapMP(aZoneFileStream); +// } else if (assetType == Utils::ASSET_MP_MAP) { // game_map_sp +// pParseAsset_GameMapSP(aZoneFileStream); +// } else if (assetType == Utils::ASSET_SP_MAP) { // game_map_mp +// pParseAsset_GameMapMP(aZoneFileStream); +// } else if (assetType == Utils::ASSET_LIGHT_DEF) { // lightdef +// pParseAsset_LightDef(aZoneFileStream); +// } else if (assetType == Utils::ASSET_UI_MAP) { // ui_map +// pParseAsset_UIMap(aZoneFileStream); +// } else if (assetType == Utils::ASSET_SNDDRIVER_GLOBALS) { // SoundDriver +// pParseAsset_SoundDriver(aZoneFileStream); +// } else if (assetType == Utils::ASSET_AI_TYPE) { // aitype +// pParseAsset_AIType(aZoneFileStream); +// } else if (assetType == Utils::ASSET_FX) { // aitype +// pParseAsset_FX(aZoneFileStream); +// } else if (assetType == Utils::ASSET_Animation) { // aitype +// result.animations << pParseAsset_Animation(aZoneFileStream); +// } else if (assetType == Utils::ASSET_STRINGTABLE) { // string_table +// result.stringTables << pParseAsset_StringTable(aZoneFileStream); +// } else if (assetType == Utils::ASSET_MENU) { // string_table +// result.menuDefinitions << pParseAsset_MenuDef(aZoneFileStream); +// } else if (assetType == Utils::ASSET_WEAPON) { // string_table +// pParseAsset_Weapon(aZoneFileStream); +// } else if (assetType == Utils::ASSET_D3DBSP) { // string_table +// pParseAsset_D3DBSP(aZoneFileStream); +// } +// } +// return result; +// } + +// LocalizeEntry ZoneFile_COD6_360::pParseAsset_LocalString(QDataStream *aZoneFileStream) { +// LocalizeEntry result; + +// quint32 stringPtr, aliasPtr; +// *aZoneFileStream >> stringPtr >> aliasPtr; +// if (stringPtr == 4294967295) { +// // Parse local string asset contents +// QString localStr; +// char localStrChar; +// *aZoneFileStream >> localStrChar; +// while (localStrChar != 0) { +// result.string += localStrChar; +// *aZoneFileStream >> localStrChar; +// } +// } else { +// result.string = "String Ptr: " + QString::number(stringPtr); +// } + +// if (aliasPtr == 4294967295) { +// // Parse rawfile name +// QString aliasName; +// char aliasNameChar; +// *aZoneFileStream >> aliasNameChar; +// while (aliasNameChar != 0) { +// result.alias += aliasNameChar; +// *aZoneFileStream >> aliasNameChar; +// } +// } else { +// result.string = "Alias Ptr: " + QString::number(aliasPtr); +// } + +// return result; +// } + +// RawFile ZoneFile_COD6_360::pParseAsset_RawFile(QDataStream *aZoneFileStream) { +// RawFile result; + +// // Skip start separator FF FF FF FF (pointer?) +// aZoneFileStream->skipRawData(4); + +// *aZoneFileStream >> result.length; + +// // Skip unknown 4 byte data +// aZoneFileStream->skipRawData(4); + +// // Parse rawfile path +// char scriptPathChar; +// *aZoneFileStream >> scriptPathChar; +// while (scriptPathChar != 0) { +// result.path += scriptPathChar; +// *aZoneFileStream >> scriptPathChar; +// } +// result.path.replace(",", ""); + +// const QStringList pathParts = result.path.split('/'); +// if (pathParts.size() == 0) { +// qDebug() << "Failed to parse ff path! " << result.path; +// exit(-1); +// } +// if (result.path.contains(".bik")) { +// QByteArray bikData(result.length, Qt::Uninitialized); +// aZoneFileStream->readRawData(bikData.data(), result.length); + +// //QFile bikFile(QDir::currentPath() + "/" + rawFilePath.split('/').last()); +// //qDebug() << bikFile.fileName(); +// //if (!bikFile.open(QIODevice::WriteOnly)) { +// // qWarning() << "Failed to open .bik file for writing!"; +// // return; +// //} +// //qDebug() << QString("%1: %2").arg(rawFilePath).arg(bikFile.fileName()); +// //bikFile.write(bikData); +// } else { +// // Parse gsc contents +// char rawFileContentsChar; +// *aZoneFileStream >> rawFileContentsChar; +// while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { +// result.contents += rawFileContentsChar; +// *aZoneFileStream >> rawFileContentsChar; +// } +// } +// return result; +// } + +// void ZoneFile_COD6_360::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { +// Q_UNUSED(aZoneFileStream); +// } + +// Model ZoneFile_COD6_360::pParseAsset_XModel(QDataStream *aZoneFileStream) { +// Model result; + +// *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount +// >> result.surfCount >> result.unknownCount >> result.boneNamePtr +// >> result.parentListPtr >> result.quatsPtr >> result.transPtr +// >> result.partClassPtr >> result.baseMatPtr +// >> result.surfsPtr >> result.materialHandlesPtr; + +// // Parse XModelLodInfo +// for (int i = 1; i <= 4; i++) { +// quint32 intDist; +// *aZoneFileStream >> intDist; + +// std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); +// *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; + +// aZoneFileStream->skipRawData(4); + +// *aZoneFileStream >> result.lodInfo[i].partBits[0] +// >> result.lodInfo[i].partBits[1] +// >> result.lodInfo[i].partBits[2] +// >> result.lodInfo[i].partBits[3]; +// } + +// *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; + +// quint32 intRadius, intMins[3], intMaxs[3]; +// *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] +// >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; + +// std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); + +// std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); +// std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); +// std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); + +// std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); +// std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); +// std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); + +// *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr +// >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; + +// // Parse model name +// char modelNameChar; +// *aZoneFileStream >> modelNameChar; +// while (modelNameChar == 0) { +// *aZoneFileStream >> modelNameChar; +// } +// while (modelNameChar != 0) { +// result.modelName += modelNameChar; +// *aZoneFileStream >> modelNameChar; +// } +// return result; +// } + +// Material ZoneFile_COD6_360::pParseAsset_Material(QDataStream *aZoneFileStream) { +// Material result; + +// *aZoneFileStream >> result.namePtr; + +// //aZoneFileStream->skipRawData(23 * 4); + +// for (int i = 0; i < 23; i++) { +// qint32 unknownPtr; +// *aZoneFileStream >> unknownPtr; +// result.pointers << unknownPtr; +// } + +// if (result.namePtr == -1) { +// aZoneFileStream->skipRawData(1); + +// QString materialName; +// char materialNameChar; +// *aZoneFileStream >> materialNameChar; +// while (materialNameChar != 0) { +// result.name += materialNameChar; +// *aZoneFileStream >> materialNameChar; +// } +// } + +// aZoneFileStream->skipRawData(3 * 4); + +// qint32 compressionPtr, compression, unknownSectionPtr; +// *aZoneFileStream >> compressionPtr; +// if (compressionPtr == -1) { +// *aZoneFileStream >> compression; + +// *aZoneFileStream >> unknownSectionPtr; +// if (unknownSectionPtr == -2) { +// aZoneFileStream->skipRawData(6 * 4); +// } +// } + +// qint32 imageNamePtr; +// *aZoneFileStream >> imageNamePtr; +// if (imageNamePtr == -1) { +// QString imageName; +// char imageNameChar; +// *aZoneFileStream >> imageNameChar; +// while (imageNameChar != 0) { +// imageName += imageNameChar; +// *aZoneFileStream >> imageNameChar; +// } +// } + +// QByteArray compressionData(4, Qt::Uninitialized); +// QString compressionStr; +// if (compressionPtr == -1) { +// aZoneFileStream->skipRawData(2 * 4); +// aZoneFileStream->readRawData(compressionData.data(), 4); +// aZoneFileStream->skipRawData(4); +// compressionStr = QString::fromUtf8(compressionData); +// aZoneFileStream->skipRawData(4); +// } +// aZoneFileStream->skipRawData(4); + +// return result; +// } + +// Shader ZoneFile_COD6_360::pParseAsset_Shader(QDataStream *aZoneFileStream) { +// Shader result = Shader(); + +// quint8 minorVersion, majorVersion; +// *aZoneFileStream >> minorVersion >> majorVersion; + +// quint32 magic; +// *aZoneFileStream >> magic; + +// // Verify .fxc magic +// if (magic != 65534 && magic != 65535) { return result; } + +// SHADER_TYPE type = SHADER_NONE; +// quint16 rawShaderType; +// *aZoneFileStream >> rawShaderType; +// if (rawShaderType == 65535) { // Pixel shader +// type = SHADER_PIXEL; +// } else if (rawShaderType == 65534) { // Vertex shader +// type = SHADER_VERTEX; +// } +// Q_UNUSED(type); + +// while (true) { +// quint32 instructionToken; +// *aZoneFileStream >> instructionToken; + +// SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); + +// int size; +// if (opCode == OPCODE_End) { +// break; +// } else if (opCode == OPCODE_Comment) { +// size = (int)((instructionToken >> 16) & 0x7FFF); +// } else { +// size = (int)((instructionToken >> 24) & 0x0f); +// } +// Q_UNUSED(size); +// } + + +// return result; +// } + +// MaterialTechSet ZoneFile_COD6_360::pParseAsset_TechSet(QDataStream *aZoneFileStream) { +// MaterialTechSet result; + +// qint32 namePtr; +// *aZoneFileStream >> namePtr; + + +// for (int i = 0; i < 53; i++) { +// quint32 ptr; +// *aZoneFileStream >> ptr; + +// //result.pointers << ptr; +// } + +// //aZoneFileStream->skipRawData(53 * 4); + +// if (namePtr == -1) { +// aZoneFileStream->skipRawData(1); + +// // Parse techset name +// char techSetNameChar; +// *aZoneFileStream >> techSetNameChar; +// while (techSetNameChar != 0) { +// result.name += techSetNameChar; +// *aZoneFileStream >> techSetNameChar; +// } +// } + +// //result.name.replace(",", ""); +// return result; +// } + +// Image ZoneFile_COD6_360::pParseAsset_Image(QDataStream *aZoneFileStream) { +// Image result; + +// aZoneFileStream->skipRawData(4); +// *aZoneFileStream >> result.unknowna >> result.unknownb +// >> result.unknownc >> result.unknownd +// >> result.unknowne >> result.unknownf +// >> result.unknowng; + +// aZoneFileStream->skipRawData(15 * 4); +// *aZoneFileStream >> result.unknownh >> result.unknowni; + +// aZoneFileStream->skipRawData(4); +// *aZoneFileStream >> result.unknownj; + +// aZoneFileStream->skipRawData(4); + +// char materialNameChar; +// *aZoneFileStream >> materialNameChar; +// while (materialNameChar != 0) { +// result.materialName += materialNameChar; +// *aZoneFileStream >> materialNameChar; +// } +// result.materialName.replace(",", ""); + +// if (result.unknowna) { +// *aZoneFileStream >> result.unknownk; +// *aZoneFileStream >> result.unknownl; +// *aZoneFileStream >> result.unknownm; + +// aZoneFileStream->skipRawData(4); + +// *aZoneFileStream >> result.unknown1; + +// aZoneFileStream->skipRawData(4); + +// *aZoneFileStream >> result.unknown2 >> result.unknown3 +// >> result.size1 >> result.size2 +// >> result.unknown4 >> result.unknown5; + +// aZoneFileStream->skipRawData(4); - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; +// char imageNameChar; +// *aZoneFileStream >> imageNameChar; +// while (imageNameChar != 0) { +// result.name += imageNameChar; +// *aZoneFileStream >> imageNameChar; +// } + +// *aZoneFileStream >> result.unknown6 >> result.unknown7; - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD6_360::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - return result; - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD6_360::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_360::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_360::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_360::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_360::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_360::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_360::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_360::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD6_360::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD6_360::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD6_360::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_360::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD6_360::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD6_360::AssetStrToEnum(const QString aAssetType) { +// QByteArray compressionData(8, Qt::Uninitialized); +// aZoneFileStream->readRawData(compressionData.data(), 8); +// if (compressionData.contains("DXT1")) { +// result.compression = COMPRESSION_DXT1; +// } else if (compressionData.contains("DXT3")) { +// result.compression = COMPRESSION_DXT3; +// } else if (compressionData.contains("DXT5")) { +// result.compression = COMPRESSION_DXT5; +// } else { +// result.compression = COMPRESSION_NONE; +// } + +// *aZoneFileStream >> result.unknown8 >> result.unknown9; +// } + +// return result; +// } + +// SoundAliasList ZoneFile_COD6_360::pParseAsset_Sound(QDataStream *aZoneFileStream) { +// LoadedSound result; +// return result; + +// QByteArray rootNamePtr(4, Qt::Uninitialized); +// aZoneFileStream->readRawData(rootNamePtr.data(), 4); + +// aZoneFileStream->skipRawData(4); + +// *aZoneFileStream >> result.count; + +// if (rootNamePtr.toHex() == "ffffffff") { +// // Read in sound file name +// char soundNameChar; +// *aZoneFileStream >> soundNameChar; +// while (soundNameChar != 0) { +// result.name += soundNameChar; +// *aZoneFileStream >> soundNameChar; +// } +// } + +// int tagCount = 0; +// int resultCount = 0; +// for (quint32 i = 0; i < result.count; i++) { +// aZoneFileStream->skipRawData(12); + +// QByteArray tagPtr(4, Qt::Uninitialized); +// aZoneFileStream->readRawData(tagPtr.data(), 4); + +// if (tagPtr.toHex() == "ffffffff") { +// tagCount++; +// } +// aZoneFileStream->skipRawData(4); + +// QByteArray pathPtr(4, Qt::Uninitialized); +// aZoneFileStream->readRawData(pathPtr.data(), 4); + +// if (pathPtr.toHex() == "ffffffff") { +// resultCount++; +// } + +// aZoneFileStream->skipRawData(160); +// } + +// for (int i = 0; i < tagCount; i++) { +// // Read in tag? +// QString tag; +// char tagChar; +// *aZoneFileStream >> tagChar; +// while (tagChar != 0) { +// tag += tagChar; +// *aZoneFileStream >> tagChar; +// } +// } + +// for (int i = 0; i < resultCount; i++) { +// Sound sound; + +// if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { +// aZoneFileStream->skipRawData(12); +// } + +// aZoneFileStream->skipRawData(8); + +// QByteArray aliasPtr(4, Qt::Uninitialized); +// aZoneFileStream->readRawData(aliasPtr.data(), 4); + +// QByteArray namePtr(4, Qt::Uninitialized); +// aZoneFileStream->readRawData(namePtr.data(), 4); + +// *aZoneFileStream >> sound.dataLength; + +// if (aliasPtr.toHex() == "ffffffff") { +// // Read in sound alias name +// char soundAliasChar; +// *aZoneFileStream >> soundAliasChar; +// while (soundAliasChar != 0) { +// sound.alias += soundAliasChar; +// *aZoneFileStream >> soundAliasChar; +// } +// } + +// if (aZoneFileStream->device()->peek(4) == "RIFF") { +// sound.path = sound.alias; +// sound.alias = ""; +// } else if (namePtr.toHex() == "ffffffff") { +// // Read in sound file path +// char soundPathChar; +// *aZoneFileStream >> soundPathChar; +// while (soundPathChar != 0) { +// sound.path += soundPathChar; +// *aZoneFileStream >> soundPathChar; +// } +// sound.path.replace(",", ""); +// } + +// if (sound.dataLength) { +// QByteArray data(sound.dataLength, Qt::Uninitialized); +// aZoneFileStream->readRawData(data.data(), sound.dataLength); +// sound.data = data; +// } +// result.sounds.append(sound); +// } + +// return result; +// } + +// void ZoneFile_COD6_360::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { +// Q_UNUSED(aZoneFileStream); +// } + +// void ZoneFile_COD6_360::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { +// Q_UNUSED(aZoneFileStream); +// } + +// void ZoneFile_COD6_360::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { +// Q_UNUSED(aZoneFileStream); +// } + +// void ZoneFile_COD6_360::pParseAsset_LightDef(QDataStream *aZoneFileStream) { +// Q_UNUSED(aZoneFileStream); +// } + +// void ZoneFile_COD6_360::pParseAsset_UIMap(QDataStream *aZoneFileStream) { +// Q_UNUSED(aZoneFileStream); +// } + +// void ZoneFile_COD6_360::pParseAsset_SoundDriver(QDataStream *aZoneFileStream) { +// Q_UNUSED(aZoneFileStream); +// } + +// void ZoneFile_COD6_360::pParseAsset_AIType(QDataStream *aZoneFileStream) { +// Q_UNUSED(aZoneFileStream); +// } + +// void ZoneFile_COD6_360::pParseAsset_FX(QDataStream *aZoneFileStream) { +// Q_UNUSED(aZoneFileStream); +// } + +// Animation ZoneFile_COD6_360::pParseAsset_Animation(QDataStream *aZoneFileStream) { +// Animation result; + +// aZoneFileStream->skipRawData(4); + +// *aZoneFileStream +// >> result.dataByteCount +// >> result.dataShortCount +// >> result.dataIntCount +// >> result.randomDataByteCount +// >> result.randomDataIntCount +// >> result.numframes +// >> result.isLooped +// >> result.isDelta +// >> result.noneRotatedBoneCount +// >> result.twoDRotatedBoneCount +// >> result.normalRotatedBoneCount +// >> result.twoDRotatedBoneCount +// >> result.normalRotatedBoneCount +// >> result.normalTranslatedBoneCount +// >> result.preciseTranslatedBoneCount +// >> result.staticTranslatedBoneCount +// >> result.noneTranslatedBoneCount +// >> result.totalBoneCount +// >> result.otherBoneCount1 +// >> result.otherBoneCount2 +// >> result.notifyCount +// >> result.assetType +// >> result.pad +// >> result.randomDataShortCount +// >> result.indexCount +// >> result.frameRate +// >> result.frequency +// >> result.boneIDsPtr +// >> result.dataBytePtr +// >> result.dataShortPtr +// >> result.dataIntPtr +// >> result.randomDataShortPtr +// >> result.randomDataBytePtr +// >> result.randomDataIntPtr +// >> result.longIndiciesPtr +// >> result.notificationsPtr +// >> result.deltaPartsPtr; + +// // Read in x_anim file name +// QString xAnimName; +// char xAnimNameChar; +// *aZoneFileStream >> xAnimNameChar; +// while (xAnimNameChar != 0) { +// result.name += xAnimNameChar; +// *aZoneFileStream >> xAnimNameChar; +// } + +// // Parse x_anim index header +// QVector sectionLengths; +// for (int i = 0; i < result.numframes; i++) { +// quint8 sectionlength; +// *aZoneFileStream >> sectionlength; +// sectionLengths.push_back(sectionlength); +// // Skip padding +// aZoneFileStream->skipRawData(1); +// } +// // Skip unknown section +// aZoneFileStream->skipRawData(2 * 8); + +// return result; +// } + +// MenuDef ZoneFile_COD6_360::pParseAsset_MenuDef(QDataStream *aZoneFileStream) { +// //MENU_FILE +// MenuDef result; + +// aZoneFileStream->skipRawData(4); // Separator + +// // Parse menu def count +// *aZoneFileStream >> result.menuCount; + +// // Clearly misparsed, never have this much +// if (result.menuCount > 1000) { +// qDebug() << "Failure reported when parsing menu file."; +// return result; +// } +// for (uint i = 0; i < result.menuCount; i++) { +// Menu menu; + +// aZoneFileStream->skipRawData(4); // Separator + +// // Read in x_anim file name +// char MenuDefpathChar; +// *aZoneFileStream >> MenuDefpathChar; +// while (MenuDefpathChar != 0) { +// menu.filePath += MenuDefpathChar; +// *aZoneFileStream >> MenuDefpathChar; +// } +// aZoneFileStream->skipRawData(4); // Separator + +// *aZoneFileStream >> menu.menuNamePtr; + +// float menuRectX, menuRectY, menuRectWidth, menuRectHeight; +// *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; +// menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); + +// quint32 hAlignInt, vAlignInt; +// *aZoneFileStream >> hAlignInt >> vAlignInt; +// menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; +// menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; + +// float rectClientX, rectClientY, rectClientWidth, rectClientHeight; +// *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; +// menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); + +// quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; +// *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr +// >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags +// >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; +// menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; +// menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; +// menu.style = (MENU_WINDOW_STYLE)styleInt; +// menu.border = (MENU_WINDOW_BORDER)borderInt; + +// float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, +// backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, +// borderColorR, borderColorG, borderColorB, borderColorA, +// outlineColorR, outlineColorG, outlineColorB, outlineColorA; +// *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA +// >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA +// >> borderColorR >> borderColorG >> borderColorB >> borderColorA +// >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; + +// menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); +// menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); +// menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); +// menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); + +// *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount +// >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp +// >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr +// >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr +// >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr +// >> menu.soundNamePtr >> menu.imageTrack; + +// float focusColorR, focusColorG, focusColorB, focusColorA, +// disabledColorR, disabledColorG, disabledColorB, disabledColorA; +// *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA +// >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; +// menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); +// menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); + +// *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; + +// aZoneFileStream->skipRawData(4); // Separator + +// char menuDefNameChar; +// int menuDefNameLen = 0; +// *aZoneFileStream >> menuDefNameChar; +// while (menuDefNameChar != 0 && menuDefNameLen < 30) { +// menuDefNameLen++; +// menu.name += menuDefNameChar; +// *aZoneFileStream >> menuDefNameChar; +// } + +// char defStringChar; +// int defStringLen = 0; +// *aZoneFileStream >> defStringChar; +// while (defStringChar != 0 && defStringLen < 30) { +// defStringLen++; +// menu.definition += defStringChar; +// *aZoneFileStream >> defStringChar; +// } +// aZoneFileStream->skipRawData(4 * 10); + +// *aZoneFileStream >> menu.itemWindowDefNamePtr; + +// float itemRectX, itemRectY, itemRectWidth, itemRectHeight; +// *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; +// menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); + +// *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr +// >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw +// >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags +// >> menu.itemDynamicFlags >> menu.itemNextTime; + +// float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, +// itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, +// itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, +// itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; +// *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA +// >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA +// >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA +// >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; + +// menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); +// menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); +// menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); +// menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); + +// *aZoneFileStream >> menu.itemMaterialPtr; + +// float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; +// *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; +// menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); + +// quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; +// *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType +// >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny +// >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode +// >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; +// menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; +// menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; +// menu.itemType = (MENU_ITEM_TYPE)itemType; +// menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; +// menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; + +// *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit +// >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest +// >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr +// >> menu.special >> menu.cursorPos; + +// // itemDefData_t typeData; + +// // listBoxDef_s *listBox; + +// *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; + +// *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; + +// *aZoneFileStream >> menu.elementStyle >> menu.numColumns; + +// //columnInfo_s columnInfo[16]; + +// *aZoneFileStream >> menu.doubleClickPtr; + + +// *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; + +// float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, +// itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, +// itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; +// *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA +// >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA +// >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; +// menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); +// menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); +// menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); + +// *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; + +// // editFieldDef_s *editField; + +// *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars +// >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; + +// // multiDef_s *multi; + +// for (int i = 0; i < 32; i++) { +// quint32 dvarList; +// *aZoneFileStream >> dvarList; +// menu.dvarListPtrs.push_back(dvarList); +// } + +// for (int i = 0; i < 32; i++) { +// quint32 dvarStr; +// *aZoneFileStream >> dvarStr; +// menu.dvarStrPtrs.push_back(dvarStr); +// } + +// for (int i = 0; i < 32; i++) { +// float dvarValue; +// *aZoneFileStream >> dvarValue; +// menu.dvarValues.push_back(dvarValue); +// } + +// *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; +// aZoneFileStream->skipRawData(4); +// //>> menu.dataPtr +// *aZoneFileStream >> menu.itemImageTrack; + +// qDebug() << aZoneFileStream->device()->pos(); + +// //statement_s visibleExp; +// //statement_s textExp; +// //statement_s materialExp; +// //statement_s rectXExp; +// //statement_s rectYExp; +// //statement_s rectWExp; +// //statement_s rectHExp; +// //statement_s foreColorAExp; +// result.menuDefinitions << menu; +// } +// return result; +// } + +// void ZoneFile_COD6_360::pParseAsset_Weapon(QDataStream *aZoneFileStream) { +// //WEAPON_FILE +// Q_UNUSED(aZoneFileStream); +// } + +// void ZoneFile_COD6_360::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { +// //D3DBSP_DUMP +// Q_UNUSED(aZoneFileStream); +// } + +// StringTable ZoneFile_COD6_360::pParseAsset_StringTable(QDataStream *aZoneFileStream) { +// StringTable result; + +// aZoneFileStream->skipRawData(4); + +// *aZoneFileStream +// >> result.columnCount +// >> result.rowCount; + +// // Todo fix this +// result.columnCount = 0; +// result.rowCount = 0; + +// aZoneFileStream->skipRawData(4); + +// QString stringTableName; +// char stringTableNameChar; +// *aZoneFileStream >> stringTableNameChar; +// while (stringTableNameChar != 0) { +// result.name += stringTableNameChar; +// *aZoneFileStream >> stringTableNameChar; +// } + +// for (quint32 i = 0; i < result.rowCount; i++) { +// QByteArray pointerData(4, Qt::Uninitialized); +// aZoneFileStream->readRawData(pointerData.data(), 4); +// result.tablePointers.push_back(pointerData.toHex()); + +// aZoneFileStream->skipRawData(4); +// } + +// for (const QString &pointerAddr : result.tablePointers) { +// QString leadingContent = ""; +// if (pointerAddr == "FFFFFFFF") { +// char leadingContentChar; +// *aZoneFileStream >> leadingContentChar; +// while (leadingContentChar != 0) { +// leadingContent += leadingContentChar; +// *aZoneFileStream >> leadingContentChar; +// } +// } else { +// leadingContent = pointerAddr; +// } + +// QString content; +// char contentChar; +// *aZoneFileStream >> contentChar; +// while (contentChar != 0) { +// content += contentChar; +// *aZoneFileStream >> contentChar; +// } +// result.content[leadingContent] = content; +// } +// return result; +// } + +Utils::AssetType ZoneFile_COD6_360::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); - if (cleanedType == "00000021") { - return ASSET_RAW_FILE; - } else if (cleanedType == "0000001A") { - return ASSET_EFFECT; - } else if (cleanedType == "00000009") { - return ASSET_SOUND; - } else if (cleanedType == "00000004") { - return ASSET_ANIMATION; - } else if (cleanedType == "0000000C") { - return ASSET_COLLISION_MAP; - } else if (cleanedType == "00000021") { - return ASSET_STRING_TABLE; - } else if (cleanedType == "00000015") { - return ASSET_MENU; - } else if (cleanedType == "00000008") { - return ASSET_TECH_SET; - } else if (cleanedType == "00000018") { - return ASSET_LOCAL_STRING; - } else if (cleanedType == "00000011") { - return ASSET_GFX_MAP; - } else if (cleanedType == "00000012") { - return ASSET_LIGHT_DEF; - } else if (cleanedType == "00000014") { - return ASSET_FONT; - } else if (cleanedType == "00000005") { - return ASSET_MODEL; - } else if (cleanedType == "0000000D") { - return ASSET_D3DBSP; - } else if (cleanedType == "00000006") { - return ASSET_MATERIAL; - } else if (cleanedType == "0000000E") { - return ASSET_GAME_MAP_SP; - } else if (cleanedType == "0000000B") { - return ASSET_COL_MAP_SP; + if (cleanedType == "00000000") { + return Utils::ASSET_PHYSPRESET; } else if (cleanedType == "00000001") { - return ASSET_PHYS_PRESET; + return Utils::ASSET_PHYSCOLLMAP; + } else if (cleanedType == "00000002") { + return Utils::ASSET_Animation; } else if (cleanedType == "00000003") { - return ASSET_DESTRUCTIBLE; + return Utils::ASSET_XMODEL_SURFS; + } else if (cleanedType == "00000004") { + return Utils::ASSET_XMODEL; + } else if (cleanedType == "00000005") { + return Utils::ASSET_MATERIAL; + } else if (cleanedType == "00000006") { + return Utils::ASSET_PIXELSHADER; + } else if (cleanedType == "00000007") { + return Utils::ASSET_TECHNIQUE_SET; + } else if (cleanedType == "00000008") { + return Utils::ASSET_IMAGE; + } else if (cleanedType == "00000009") { + return Utils::ASSET_SOUND; + } else if (cleanedType == "0000000A") { + return Utils::ASSET_SOUND_CURVE; + } else if (cleanedType == "0000000B") { + return Utils::ASSET_LOADED_SOUND; + } else if (cleanedType == "0000000C") { + return Utils::ASSET_CLIPMAP_SP; + } else if (cleanedType == "0000000D") { + return Utils::ASSET_CLIPMAP_MP; + } else if (cleanedType == "0000000E") { + return Utils::ASSET_COMWORLD; + } else if (cleanedType == "0000000F") { + return Utils::ASSET_GAMEWORLD_SP; + } else if (cleanedType == "00000010") { + return Utils::ASSET_GAMEWORLD_MP; + } else if (cleanedType == "00000011") { + return Utils::ASSET_MAP_ENTS; + } else if (cleanedType == "00000012") { + return Utils::ASSET_FXWORLD; + } else if (cleanedType == "00000013") { + return Utils::ASSET_GFXWORLD; + } else if (cleanedType == "00000014") { + return Utils::ASSET_LIGHT_DEF; + } else if (cleanedType == "00000015") { + return Utils::ASSET_UI_MAP; } else if (cleanedType == "00000016") { - return ASSET_MENU; + return Utils::ASSET_FONT; + } else if (cleanedType == "00000017") { + return Utils::ASSET_MENULIST; + } else if (cleanedType == "00000018") { + return Utils::ASSET_MENU; + } else if (cleanedType == "00000019") { + return Utils::ASSET_LOCALIZE_ENTRY; + } else if (cleanedType == "0000001A") { + return Utils::ASSET_WEAPON; + } else if (cleanedType == "0000001B") { + return Utils::ASSET_SNDDRIVER_GLOBALS; + } else if (cleanedType == "0000001C") { + return Utils::ASSET_FX; + } else if (cleanedType == "0000001D") { + return Utils::ASSET_IMPACT_FX; + } else if (cleanedType == "0000001E") { + return Utils::ASSET_AITYPE; + } else if (cleanedType == "0000001F") { + return Utils::ASSET_MPTYPE; + } else if (cleanedType == "00000020") { + return Utils::ASSET_CHARACTER; + } else if (cleanedType == "00000021") { + return Utils::ASSET_XMODELALIAS; + } else if (cleanedType == "00000022") { + return Utils::ASSET_RAWFILE; + } else if (cleanedType == "00000023") { + return Utils::ASSET_STRINGTABLE; + } else if (cleanedType == "00000024") { + return Utils::ASSET_LEADERBOARD; + } else if (cleanedType == "00000025") { + return Utils::ASSET_STRUCTURED_DATA_DEF; + } else if (cleanedType == "00000026") { + return Utils::ASSET_TRACER; + } else if (cleanedType == "00000027") { + return Utils::ASSET_VEHICLE; + } else if (cleanedType == "00000028") { + return Utils::ASSET_ADDON_MAP_ENTS; + } else if (cleanedType == "00000029") { + return Utils::ASSET_COUNT; + } else if (cleanedType == "00000029") { + return Utils::ASSET_STRING; + } else if (cleanedType == "0000002A") { + return Utils::ASSET_ASSETLIST; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD6_360::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/360/zonefile_cod6_360.h b/libs/zonefile/360/zonefile_cod6_360.h index 3086068..afdf949 100644 --- a/libs/zonefile/360/zonefile_cod6_360.h +++ b/libs/zonefile/360/zonefile_cod6_360.h @@ -12,43 +12,7 @@ public: ~ZoneFile_COD6_360(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -private: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD6_360_H diff --git a/libs/zonefile/360/zonefile_cod7_360.cpp b/libs/zonefile/360/zonefile_cod7_360.cpp index f3a173c..d343500 100644 --- a/libs/zonefile/360/zonefile_cod7_360.cpp +++ b/libs/zonefile/360/zonefile_cod7_360.cpp @@ -15,1063 +15,103 @@ ZoneFile_COD7_360::~ZoneFile_COD7_360() } bool ZoneFile_COD7_360::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::BigEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - zoneFileStream.device()->seek(zoneFileStream.device()->pos() - 1); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD7_360::pParseZoneHeader(QDataStream *aZoneFileStream) { - quint32 size = pParseZoneSize(aZoneFileStream); - SetSize(size); - - pParseZoneUnknownsA(aZoneFileStream); - - quint32 tagCount = pParseZoneTagCount(aZoneFileStream); - SetTagCount(tagCount); - - pParseZoneUnknownsB(aZoneFileStream); - - quint32 recordCount = pParseZoneRecordCount(aZoneFileStream); - SetRecordCount(recordCount); - - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD7_360::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD7_360::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD7_360::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD7_360::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD7_360::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD7_360::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD7_360::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD7_360::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD7_360::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD7_360::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD7_360::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -void ZoneFile_COD7_360::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD7_360::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD7_360::pParseAsset_Material(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); - - return Material(); -} - -Shader ZoneFile_COD7_360::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD7_360::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD7_360::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD7_360::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD7_360::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_360::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_360::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_360::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_360::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_360::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_360::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_360::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD7_360::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD7_360::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD7_360::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_360::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD7_360::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD7_360::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD7_360::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); - if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_LOCAL_STRING; - } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_RAW_FILE; - } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; - } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; - } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; - } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; - } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; - } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; - } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; - } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; - } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; - } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; - } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; - } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; - } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; - } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; - } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; - } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + if (cleanedType == "00000000") { + return Utils::ASSET_XMODELPIECES; + } else if (cleanedType == "00000001") { + return Utils::ASSET_PHYSPRESET; + } else if (cleanedType == "00000002") { + return Utils::ASSET_PHYSCONSTRAINTS; + } else if (cleanedType == "00000003") { + return Utils::ASSET_DESTRUCTIBLEDEF; + } else if (cleanedType == "00000004") { + return Utils::ASSET_Animation; + } else if (cleanedType == "00000005") { + return Utils::ASSET_XMODEL; + } else if (cleanedType == "00000006") { + return Utils::ASSET_MATERIAL; + } else if (cleanedType == "00000007") { + return Utils::ASSET_TECHNIQUE_SET; + } else if (cleanedType == "00000008") { + return Utils::ASSET_IMAGE; + } else if (cleanedType == "00000009") { + return Utils::ASSET_SOUND; + } else if (cleanedType == "0000000A") { + return Utils::ASSET_SOUND_PATCH; + } else if (cleanedType == "0000000B") { + return Utils::ASSET_CLIPMAP; + } else if (cleanedType == "0000000C") { + return Utils::ASSET_CLIPMAP_PVS; + } else if (cleanedType == "0000000D") { + return Utils::ASSET_COMWORLD; + } else if (cleanedType == "0000000E") { + return Utils::ASSET_GAMEWORLD_SP; + } else if (cleanedType == "0000000F") { + return Utils::ASSET_GAMEWORLD_MP; + } else if (cleanedType == "00000010") { + return Utils::ASSET_MAP_ENTS; + } else if (cleanedType == "00000011") { + return Utils::ASSET_GFXWORLD; + } else if (cleanedType == "00000012") { + return Utils::ASSET_LIGHT_DEF; + } else if (cleanedType == "00000013") { + return Utils::ASSET_UI_MAP; + } else if (cleanedType == "00000014") { + return Utils::ASSET_FONT; + } else if (cleanedType == "00000015") { + return Utils::ASSET_MENULIST; + } else if (cleanedType == "00000016") { + return Utils::ASSET_MENU; + } else if (cleanedType == "00000017") { + return Utils::ASSET_LOCALIZE_ENTRY; + } else if (cleanedType == "00000018") { + return Utils::ASSET_WEAPON; + } else if (cleanedType == "00000019") { + return Utils::ASSET_WEAPONDEF; + } else if (cleanedType == "0000001A") { + return Utils::ASSET_WEAPON_VARIANT; + } else if (cleanedType == "0000001B") { + return Utils::ASSET_SNDDRIVER_GLOBALS; + } else if (cleanedType == "0000001C") { + return Utils::ASSET_FX; + } else if (cleanedType == "0000001D") { + return Utils::ASSET_IMPACT_FX; + } else if (cleanedType == "0000001E") { + return Utils::ASSET_AITYPE; + } else if (cleanedType == "0000001F") { + return Utils::ASSET_MPTYPE; + } else if (cleanedType == "00000020") { + return Utils::ASSET_MPBODY; + } else if (cleanedType == "00000021") { + return Utils::ASSET_MPHEAD; + } else if (cleanedType == "00000022") { + return Utils::ASSET_CHARACTER; + } else if (cleanedType == "00000023") { + return Utils::ASSET_XMODELALIAS; + } else if (cleanedType == "00000024") { + return Utils::ASSET_RAWFILE; + } else if (cleanedType == "00000025") { + return Utils::ASSET_STRINGTABLE; + } else if (cleanedType == "00000026") { + return Utils::ASSET_PACK_INDEX; + } else if (cleanedType == "00000027") { + return Utils::ASSET_XGLOBALS; + } else if (cleanedType == "00000028") { + return Utils::ASSET_DDL; + } else if (cleanedType == "00000029") { + return Utils::ASSET_GLASSES; + } else if (cleanedType == "0000002A") { + return Utils::ASSET_EMBLEMSET; + } else if (cleanedType == "0000002B") { + return Utils::ASSET_COUNT; + } else if (cleanedType == "0000002B") { + return Utils::ASSET_STRING; + } else if (cleanedType == "0000002C") { + return Utils::ASSET_ASSETLIST; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD7_360::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/360/zonefile_cod7_360.h b/libs/zonefile/360/zonefile_cod7_360.h index f61f040..07af1e6 100644 --- a/libs/zonefile/360/zonefile_cod7_360.h +++ b/libs/zonefile/360/zonefile_cod7_360.h @@ -10,43 +10,7 @@ public: ~ZoneFile_COD7_360(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD7_360_H diff --git a/libs/zonefile/360/zonefile_cod8_360.cpp b/libs/zonefile/360/zonefile_cod8_360.cpp index 76eba46..c46a4d7 100644 --- a/libs/zonefile/360/zonefile_cod8_360.cpp +++ b/libs/zonefile/360/zonefile_cod8_360.cpp @@ -15,1063 +15,104 @@ ZoneFile_COD8_360::~ZoneFile_COD8_360() } bool ZoneFile_COD8_360::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::BigEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - zoneFileStream.device()->seek(zoneFileStream.device()->pos() - 1); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD8_360::pParseZoneHeader(QDataStream *aZoneFileStream) { - quint32 size = pParseZoneSize(aZoneFileStream); - SetSize(size); - - pParseZoneUnknownsA(aZoneFileStream); - - quint32 tagCount = pParseZoneTagCount(aZoneFileStream); - SetTagCount(tagCount); - - pParseZoneUnknownsB(aZoneFileStream); - - quint32 recordCount = pParseZoneRecordCount(aZoneFileStream); - SetRecordCount(recordCount); - - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); +Utils::AssetType ZoneFile_COD8_360::AssetStrToEnum(const QString aAssetType) { + const QString cleanedType = aAssetType.toUpper();if (cleanedType == "0x00000000") { + return Utils::ASSET_PHYSPRESET; + } else if (cleanedType == "0x00000001") { + return Utils::ASSET_PHYSCOLLMAP; + } else if (cleanedType == "0x00000002") { + return Utils::ASSET_Animation; + } else if (cleanedType == "0x00000003") { + return Utils::ASSET_XMODEL_SURFS; + } else if (cleanedType == "0x00000004") { + return Utils::ASSET_XMODEL; + } else if (cleanedType == "0x00000005") { + return Utils::ASSET_MATERIAL; + } else if (cleanedType == "0x00000006") { + return Utils::ASSET_PIXELSHADER; + } else if (cleanedType == "0x00000007") { + return Utils::ASSET_TECHNIQUE_SET; + } else if (cleanedType == "0x00000008") { + return Utils::ASSET_IMAGE; + } else if (cleanedType == "0x00000009") { + return Utils::ASSET_SOUND; + } else if (cleanedType == "0x0000000A") { + return Utils::ASSET_SOUND_CURVE; + } else if (cleanedType == "0x0000000B") { + return Utils::ASSET_LOADED_SOUND; + } else if (cleanedType == "0x0000000C") { + return Utils::ASSET_CLIPMAP; + } else if (cleanedType == "0x0000000D") { + return Utils::ASSET_COMWORLD; + } else if (cleanedType == "0x0000000E") { + return Utils::ASSET_GLASSWORLD; + } else if (cleanedType == "0x0000000F") { + return Utils::ASSET_PATHDATA; + } else if (cleanedType == "0x00000010") { + return Utils::ASSET_VEHICLE_TRACK; + } else if (cleanedType == "0x00000011") { + return Utils::ASSET_MAP_ENTS; + } else if (cleanedType == "0x00000012") { + return Utils::ASSET_FXWORLD; + } else if (cleanedType == "0x00000013") { + return Utils::ASSET_GFXWORLD; + } else if (cleanedType == "0x00000014") { + return Utils::ASSET_LIGHT_DEF; + } else if (cleanedType == "0x00000015") { + return Utils::ASSET_UI_MAP; + } else if (cleanedType == "0x00000016") { + return Utils::ASSET_FONT; + } else if (cleanedType == "0x00000017") { + return Utils::ASSET_MENULIST; + } else if (cleanedType == "0x00000018") { + return Utils::ASSET_MENU; + } else if (cleanedType == "0x00000019") { + return Utils::ASSET_LOCALIZE_ENTRY; + } else if (cleanedType == "0x0000001A") { + return Utils::ASSET_ATTACHMENT; + } else if (cleanedType == "0x0000001B") { + return Utils::ASSET_WEAPON; + } else if (cleanedType == "0x0000001C") { + return Utils::ASSET_SNDDRIVER_GLOBALS; + } else if (cleanedType == "0x0000001D") { + return Utils::ASSET_FX; + } else if (cleanedType == "0x0000001E") { + return Utils::ASSET_IMPACT_FX; + } else if (cleanedType == "0x0000001F") { + return Utils::ASSET_SURFACE_FX; + } else if (cleanedType == "0x00000020") { + return Utils::ASSET_AITYPE; + } else if (cleanedType == "0x00000021") { + return Utils::ASSET_MPTYPE; + } else if (cleanedType == "0x00000022") { + return Utils::ASSET_CHARACTER; + } else if (cleanedType == "0x00000023") { + return Utils::ASSET_XMODELALIAS; + } else if (cleanedType == "0x00000024") { + return Utils::ASSET_RAWFILE; + } else if (cleanedType == "0x00000025") { + return Utils::ASSET_SCRIPTFILE; + } else if (cleanedType == "0x00000026") { + return Utils::ASSET_STRINGTABLE; + } else if (cleanedType == "0x00000027") { + return Utils::ASSET_LEADERBOARD; + } else if (cleanedType == "0x00000028") { + return Utils::ASSET_STRUCTURED_DATA_DEF; + } else if (cleanedType == "0x00000029") { + return Utils::ASSET_TRACER; + } else if (cleanedType == "0x0000002A") { + return Utils::ASSET_VEHICLE; + } else if (cleanedType == "0x0000002B") { + return Utils::ASSET_ADDON_MAP_ENTS; + } else if (cleanedType == "0x0000002C") { + return Utils::ASSET_COUNT; + } else if (cleanedType == "0x0000002C") { + return Utils::ASSET_STRING; + } else if (cleanedType == "0x0000002D") { + return Utils::ASSET_ASSETLIST; } -} - -quint32 ZoneFile_COD8_360::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD8_360::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD8_360::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD8_360::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD8_360::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD8_360::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD8_360::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD8_360::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD8_360::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD8_360::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD8_360::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -void ZoneFile_COD8_360::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD8_360::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD8_360::pParseAsset_Material(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); - - return Material(); -} - -Shader ZoneFile_COD8_360::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD8_360::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD8_360::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD8_360::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD8_360::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_360::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_360::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_360::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_360::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_360::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_360::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_360::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD8_360::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD8_360::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD8_360::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_360::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD8_360::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD8_360::AssetStrToEnum(const QString aAssetType) { - const QString cleanedType = aAssetType.toUpper(); - if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_LOCAL_STRING; - } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_RAW_FILE; - } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; - } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; - } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; - } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; - } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; - } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; - } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; - } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; - } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; - } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; - } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; - } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; - } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; - } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; - } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; - } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; - } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD8_360::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/360/zonefile_cod8_360.h b/libs/zonefile/360/zonefile_cod8_360.h index 13c419e..453012d 100644 --- a/libs/zonefile/360/zonefile_cod8_360.h +++ b/libs/zonefile/360/zonefile_cod8_360.h @@ -10,43 +10,7 @@ public: ~ZoneFile_COD8_360(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD8_360_H diff --git a/libs/zonefile/360/zonefile_cod9_360.cpp b/libs/zonefile/360/zonefile_cod9_360.cpp index c944b25..97c11d4 100644 --- a/libs/zonefile/360/zonefile_cod9_360.cpp +++ b/libs/zonefile/360/zonefile_cod9_360.cpp @@ -15,1058 +15,47 @@ ZoneFile_COD9_360::~ZoneFile_COD9_360() } bool ZoneFile_COD9_360::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::BigEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD9_360::pParseZoneHeader(QDataStream *aZoneFileStream) { - SetSize(pParseZoneSize(aZoneFileStream)); - pParseZoneUnknownsA(aZoneFileStream); - - SetTagCount(pParseZoneTagCount(aZoneFileStream)); - pParseZoneUnknownsB(aZoneFileStream); - - SetRecordCount(pParseZoneRecordCount(aZoneFileStream)); - - quint32 tagCount = GetTagCount(); - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD9_360::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD9_360::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD9_360::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD9_360::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD9_360::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD9_360::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD9_360::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD9_360::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD9_360::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD9_360::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD9_360::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -void ZoneFile_COD9_360::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD9_360::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD9_360::pParseAsset_Material(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); - - return Material(); -} - -Shader ZoneFile_COD9_360::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD9_360::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD9_360::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD9_360::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD9_360::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_360::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_360::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_360::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_360::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_360::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_360::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_360::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD9_360::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD9_360::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD9_360::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_360::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD9_360::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD9_360::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD9_360::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_LOCAL_STRING; + return Utils::ASSET_LOCALIZE_ENTRY; } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD9_360::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/360/zonefile_cod9_360.h b/libs/zonefile/360/zonefile_cod9_360.h index f52fcde..ff7341c 100644 --- a/libs/zonefile/360/zonefile_cod9_360.h +++ b/libs/zonefile/360/zonefile_cod9_360.h @@ -10,43 +10,7 @@ public: ~ZoneFile_COD9_360(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD9_360_H diff --git a/libs/zonefile/PC/zonefile_cod10_pc.cpp b/libs/zonefile/PC/zonefile_cod10_pc.cpp index 3cedc33..74cb021 100644 --- a/libs/zonefile/PC/zonefile_cod10_pc.cpp +++ b/libs/zonefile/PC/zonefile_cod10_pc.cpp @@ -15,1058 +15,46 @@ ZoneFile_COD10_PC::~ZoneFile_COD10_PC() } bool ZoneFile_COD10_PC::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::LittleEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } - -void ZoneFile_COD10_PC::pParseZoneHeader(QDataStream *aZoneFileStream) { - SetSize(pParseZoneSize(aZoneFileStream)); - pParseZoneUnknownsA(aZoneFileStream); - - SetTagCount(pParseZoneTagCount(aZoneFileStream)); - pParseZoneUnknownsB(aZoneFileStream); - - SetRecordCount(pParseZoneRecordCount(aZoneFileStream)); - - quint32 tagCount = GetTagCount(); - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD10_PC::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD10_PC::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD10_PC::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD10_PC::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD10_PC::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD10_PC::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD10_PC::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD10_PC::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD10_PC::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD10_PC::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD10_PC::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -void ZoneFile_COD10_PC::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD10_PC::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD10_PC::pParseAsset_Material(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); - - return Material(); -} - -Shader ZoneFile_COD10_PC::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD10_PC::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD10_PC::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD10_PC::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD10_PC::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_PC::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_PC::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_PC::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_PC::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_PC::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_PC::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_PC::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD10_PC::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD10_PC::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD10_PC::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_PC::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD10_PC::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD10_PC::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD10_PC::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_LOCAL_STRING; + return Utils::ASSET_LOCALIZE_ENTRY; } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD10_PC::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/PC/zonefile_cod10_pc.h b/libs/zonefile/PC/zonefile_cod10_pc.h index 8443654..564b023 100644 --- a/libs/zonefile/PC/zonefile_cod10_pc.h +++ b/libs/zonefile/PC/zonefile_cod10_pc.h @@ -10,43 +10,7 @@ public: ~ZoneFile_COD10_PC(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD10_PC_H diff --git a/libs/zonefile/PC/zonefile_cod11_pc.cpp b/libs/zonefile/PC/zonefile_cod11_pc.cpp index 02969da..d81803d 100644 --- a/libs/zonefile/PC/zonefile_cod11_pc.cpp +++ b/libs/zonefile/PC/zonefile_cod11_pc.cpp @@ -15,1058 +15,47 @@ ZoneFile_COD11_PC::~ZoneFile_COD11_PC() } bool ZoneFile_COD11_PC::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::LittleEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD11_PC::pParseZoneHeader(QDataStream *aZoneFileStream) { - SetSize(pParseZoneSize(aZoneFileStream)); - pParseZoneUnknownsA(aZoneFileStream); - - SetTagCount(pParseZoneTagCount(aZoneFileStream)); - pParseZoneUnknownsB(aZoneFileStream); - - SetRecordCount(pParseZoneRecordCount(aZoneFileStream)); - - quint32 tagCount = GetTagCount(); - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD11_PC::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD11_PC::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD11_PC::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD11_PC::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD11_PC::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD11_PC::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD11_PC::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD11_PC::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD11_PC::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD11_PC::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD11_PC::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -void ZoneFile_COD11_PC::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD11_PC::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD11_PC::pParseAsset_Material(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); - - return Material(); -} - -Shader ZoneFile_COD11_PC::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD11_PC::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD11_PC::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD11_PC::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD11_PC::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_PC::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_PC::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_PC::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_PC::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_PC::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_PC::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_PC::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD11_PC::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD11_PC::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD11_PC::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_PC::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD11_PC::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD11_PC::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD11_PC::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_LOCAL_STRING; + return Utils::ASSET_LOCALIZE_ENTRY; } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD11_PC::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/PC/zonefile_cod11_pc.h b/libs/zonefile/PC/zonefile_cod11_pc.h index 27f0003..b7adaba 100644 --- a/libs/zonefile/PC/zonefile_cod11_pc.h +++ b/libs/zonefile/PC/zonefile_cod11_pc.h @@ -10,43 +10,7 @@ public: ~ZoneFile_COD11_PC(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD11_H diff --git a/libs/zonefile/PC/zonefile_cod12_pc.cpp b/libs/zonefile/PC/zonefile_cod12_pc.cpp index 175bccc..70bddb0 100644 --- a/libs/zonefile/PC/zonefile_cod12_pc.cpp +++ b/libs/zonefile/PC/zonefile_cod12_pc.cpp @@ -15,1193 +15,145 @@ ZoneFile_COD12_PC::~ZoneFile_COD12_PC() } bool ZoneFile_COD12_PC::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::LittleEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD12_PC::pParseZoneHeader(QDataStream *aZoneFileStream) { - quint32 tagCount = pParseZoneTagCount(aZoneFileStream); - SetTagCount(tagCount); - - aZoneFileStream->skipRawData(7 * 4); - - quint32 recordCount = pParseZoneRecordCount(aZoneFileStream) - 1; - SetRecordCount(recordCount); - - aZoneFileStream->skipRawData(5 * 4); - - if (tagCount) { - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } -} - -quint32 ZoneFile_COD12_PC::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD12_PC::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD12_PC::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD12_PC::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD12_PC::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD12_PC::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD12_PC::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(8 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - if (aZoneFileStream->device()->peek(8).toHex().contains("00000000")) { - break; - } - - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD12_PC::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(8, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 8); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(8); - } - return result; -} - -AssetMap ZoneFile_COD12_PC::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // raw file - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_SCRIPT_PARSE_TREE) { // gsc - auto gscFile = pParseAsset_GSCFile(aZoneFileStream); - if (gscFile.length) { - result.gscFiles << gscFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD12_PC::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD12_PC::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -GscFile ZoneFile_COD12_PC::pParseAsset_GSCFile(QDataStream *aZoneFileStream) { - GscFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(8); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(8); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -void ZoneFile_COD12_PC::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD12_PC::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD12_PC::pParseAsset_Material(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); - - return Material(); -} - -Shader ZoneFile_COD12_PC::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD12_PC::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD12_PC::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD12_PC::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - return result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD12_PC::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_PC::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_PC::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_PC::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_PC::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_PC::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_PC::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_PC::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD12_PC::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD12_PC::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD12_PC::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_PC::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD12_PC::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD12_PC::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD12_PC::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "0000000000000000") { - return ASSET_PHYS_PRESET; + return Utils::ASSET_PHYSPRESET; } else if (cleanedType == "0100000000000000") { - return ASSET_PHYS_CONSTRAINTS; + return Utils::ASSET_PHYS_CONSTRAINTS; } else if (cleanedType == "0200000000000000") { - return ASSET_DESTRUCTIBLE_DEF; + return Utils::ASSET_DESTRUCTIBLE_DEF; } else if (cleanedType == "0300000000000000") { - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0400000000000000") { - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0500000000000000") { - return ASSET_MODEL_MESH; + return Utils::ASSET_XMODEL_MESH; } else if (cleanedType == "0600000000000000") { - return ASSET_MATERIAL; + return Utils::ASSET_MATERIAL; } else if (cleanedType == "0700000000000000") { - return ASSET_COMPUTE_SHADER_SET; + return Utils::ASSET_COMPUTE_SHADER_SET; } else if (cleanedType == "0800000000000000") { - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "0900000000000000") { - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0A00000000000000") { - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "1100000000000000") { - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "1500000000000000") { - return ASSET_FONT_ICON; + return Utils::ASSET_FONT_ICON; } else if (cleanedType == "1700000000000000") { - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "1C00000000000000") { - return ASSET_PLAYER_SOUNDS_TABLE; + return Utils::ASSET_PLAYER_SOUNDS_TABLE; } else if (cleanedType == "1D00000000000000") { - return ASSET_PLAYER_FX_TABLE; + return Utils::ASSET_PLAYER_FX_TABLE; } else if (cleanedType == "1E00000000000000") { - return ASSET_SHARED_WEAPON_SOUNDS; + return Utils::ASSET_SHARED_WEAPON_SOUNDS; } else if (cleanedType == "1F00000000000000") { - return ASSET_ATTACHMENT; + return Utils::ASSET_ATTACHMENT; } else if (cleanedType == "2000000000000000") { - return ASSET_ATTACHMENT_UNIQUE; + return Utils::ASSET_ATTACHMENT_UNIQUE; } else if (cleanedType == "2100000000000000") { - return ASSET_WEAPON_CAMO; + return Utils::ASSET_WEAPON_CAMO; } else if (cleanedType == "2200000000000000") { - return ASSET_CUSTOMIZATION_TABLE; + return Utils::ASSET_CUSTOMIZATION_TABLE; } else if (cleanedType == "2300000000000000") { - return ASSET_CUSTOMIZATION_TABLE_FEIMAGES; + return Utils::ASSET_CUSTOMIZATION_TABLE_FEIMAGES; } else if (cleanedType == "2400000000000000") { - return ASSET_CUSTOMIZATION_TABLE_COLOR; + return Utils::ASSET_CUSTOMIZATION_TABLE_COLOR; }else if (cleanedType == "2600000000000000") { - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "2F00000000000000") { - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "3000000000000000") { - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "3100000000000000") { - return ASSET_STRUCTURED_TABLE; + return Utils::ASSET_STRUCTURED_TABLE; } else if (cleanedType == "3200000000000000") { - return ASSET_LEADERBOARD_DEF; + return Utils::ASSET_LEADERBOARD_DEF; } else if (cleanedType == "3300000000000000") { - return ASSET_DDL; + return Utils::ASSET_DDL; } else if (cleanedType == "3600000000000000") { - return ASSET_SCRIPT_PARSE_TREE; + return Utils::ASSET_SCRIPT_PARSE_TREE; } else if (cleanedType == "3700000000000000") { - return ASSET_KEY_VALUE_PAIRS; + return Utils::ASSET_KEY_VALUE_PAIRS; } else if (cleanedType == "3800000000000000") { - return ASSET_VEHICLE; + return Utils::ASSET_VEHICLE; } else if (cleanedType == "3A00000000000000") { - return ASSET_VEHICLE_TRACER; + return Utils::ASSET_VEHICLE_TRACER; } else if (cleanedType == "3C00000000000000") { - return ASSET_SURFACE_FX_TABLE; + return Utils::ASSET_SURFACE_FX_TABLE; } else if (cleanedType == "3D00000000000000") { - return ASSET_SURFACE_SOUND_DEF; + return Utils::ASSET_SURFACE_SOUND_DEF; } else if (cleanedType == "3E00000000000000") { - return ASSET_FOOTSTEP_TABLE; + return Utils::ASSET_FOOTSTEP_TABLE; } else if (cleanedType == "3F00000000000000") { - return ASSET_ENTITY_FX_IMPACTS; + return Utils::ASSET_ENTITY_FX_IMPACTS; } else if (cleanedType == "4000000000000000") { - return ASSET_ENTITY_SOUND_IMPACTS; + return Utils::ASSET_ENTITY_SOUND_IMPACTS; } else if (cleanedType == "4200000000000000") { - return ASSET_VEHICLE_FX_DEF; + return Utils::ASSET_VEHICLE_FX_DEF; } else if (cleanedType == "4300000000000000") { - return ASSET_VEHICLE_SOUND_DEF; + return Utils::ASSET_VEHICLE_SOUND_DEF; } else if (cleanedType == "4500000000000000") { - return ASSET_SCRIPT_BUNDLE; + return Utils::ASSET_SCRIPT_BUNDLE; } else if (cleanedType == "4600000000000000") { - return ASSET_SCRIPT_BUNDLE_LIST; + return Utils::ASSET_SCRIPT_BUNDLE_LIST; } else if (cleanedType == "4700000000000000") { - return ASSET_RUMBLE; + return Utils::ASSET_RUMBLE; } else if (cleanedType == "4A00000000000000") { - return ASSET_AIM_TABLE; + return Utils::ASSET_AIM_TABLE; } else if (cleanedType == "4B00000000000000") { - return ASSET_ANIM_SELECTOR_TABLE; + return Utils::ASSET_ANIM_SELECTOR_TABLE; } else if (cleanedType == "4C00000000000000") { - return ASSET_ANIM_MAPPING_TABLE; + return Utils::ASSET_ANIM_MAPPING_TABLE; } else if (cleanedType == "4D00000000000000") { - return ASSET_ANIM_STATE_MACHINE; + return Utils::ASSET_ANIM_STATE_MACHINE; } else if (cleanedType == "4E00000000000000") { - return ASSET_BEHAVIOR_TREE; + return Utils::ASSET_BEHAVIOR_TREE; } else if (cleanedType == "4F00000000000000") { - return ASSET_BEHAVIOR_STATE_MACHINE; + return Utils::ASSET_BEHAVIOR_STATE_MACHINE; } else if (cleanedType == "5100000000000000") { - return ASSET_S_ANIM; + return Utils::ASSET_S_ANIM; } else if (cleanedType == "5200000000000000") { - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "5300000000000000") { - return ASSET_BIT_FIELD; + return Utils::ASSET_BIT_FIELD; } else if (cleanedType == "5400000000000000") { - return ASSET_SURFACE_SOUND_DEF; + return Utils::ASSET_SURFACE_SOUND_DEF; } else if (cleanedType == "5500000000000000") { - return ASSET_SURFACE_FX_TABLE; + return Utils::ASSET_SURFACE_FX_TABLE; } else if (cleanedType == "5600000000000000") { - return ASSET_RUMBLE; + return Utils::ASSET_RUMBLE; } else if (cleanedType == "5900000000000000") { - return ASSET_AIM_TABLE; + return Utils::ASSET_AIM_TABLE; } else if (cleanedType == "5A00000000000000") { - return ASSET_MAP_TABLE; + return Utils::ASSET_MAP_TABLE; } else if (cleanedType == "5B00000000000000") { - return ASSET_MAP_TABLE_LOADING_IMAGES; + return Utils::ASSET_MAP_TABLE_LOADING_IMAGES; } else if (cleanedType == "5C00000000000000") { - return ASSET_MEDAL; + return Utils::ASSET_MEDAL; } else if (cleanedType == "5D00000000000000") { - return ASSET_MEDAL_TABLE; + return Utils::ASSET_MEDAL_TABLE; } else if (cleanedType == "5E00000000000000") { - return ASSET_OBJECTIVE; + return Utils::ASSET_OBJECTIVE; } else if (cleanedType == "5F00000000000000") { - return ASSET_OBJECTIVE_LIST; + return Utils::ASSET_OBJECTIVE_LIST; } else if (cleanedType == "6400000000000000") { - return ASSET_LASER; + return Utils::ASSET_LASER; } else if (cleanedType == "6500000000000000") { - return ASSET_BEAM; + return Utils::ASSET_BEAM; } else if (cleanedType == "6600000000000000") { - return ASSET_STREAMER_HINT; + return Utils::ASSET_STREAMER_HINT; } else if (cleanedType == "1B00000000000000") { - return ASSET_CG_MEDIA_TABLE; + return Utils::ASSET_CG_MEDIA_TABLE; } - return ASSET_NONE; + return Utils::ASSET_NONE; } -QByteArray ZoneFile_COD12_PC::GetBinaryData() { - QByteArray result; - - return result; -} diff --git a/libs/zonefile/PC/zonefile_cod12_pc.h b/libs/zonefile/PC/zonefile_cod12_pc.h index 5d246a1..c484b3f 100644 --- a/libs/zonefile/PC/zonefile_cod12_pc.h +++ b/libs/zonefile/PC/zonefile_cod12_pc.h @@ -10,44 +10,7 @@ public: ~ZoneFile_COD12_PC(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - GscFile pParseAsset_GSCFile(QDataStream *aZoneFileStream) ; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD12_PC_H diff --git a/libs/zonefile/PC/zonefile_cod4_pc.cpp b/libs/zonefile/PC/zonefile_cod4_pc.cpp index 2b12310..952fd8f 100644 --- a/libs/zonefile/PC/zonefile_cod4_pc.cpp +++ b/libs/zonefile/PC/zonefile_cod4_pc.cpp @@ -14,1135 +14,55 @@ ZoneFile_COD4_PC::~ZoneFile_COD4_PC() { } bool ZoneFile_COD4_PC::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::LittleEndian); - - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD4_PC::pParseZoneHeader(QDataStream *aZoneFileStream) { - SetSize(pParseZoneSize(aZoneFileStream)); - - aZoneFileStream->skipRawData(40); - - SetTagCount(pParseZoneTagCount(aZoneFileStream)); - pParseZoneUnknownsB(aZoneFileStream); - - SetRecordCount(pParseZoneRecordCount(aZoneFileStream) - 1); - - quint32 tagCount = GetTagCount(); - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD4_PC::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD4_PC::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD4_PC::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD4_PC::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD4_PC::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD4_PC::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD4_PC::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD4_PC::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD4_PC::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD4_PC::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD4_PC::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - if (result.path.contains(".bik")) { - qDebug() << "rawFileLength: " << result.length; - QByteArray bikData(result.length, Qt::Uninitialized); - aZoneFileStream->readRawData(bikData.data(), result.length); - - //QFile bikFile(QDir::currentPath() + "/" + rawFilePath.split('/').last()); - //qDebug() << bikFile.fileName(); - //if (!bikFile.open(QIODevice::WriteOnly)) { - // qWarning() << "Failed to open .bik file for writing!"; - // return; - //} - //qDebug() << QString("%1: %2").arg(rawFilePath).arg(bikFile.fileName()); - //bikFile.write(bikData); - } else { - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - } - return result; -} - -void ZoneFile_COD4_PC::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD4_PC::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD4_PC::pParseAsset_Material(QDataStream *aZoneFileStream) { - aZoneFileStream->skipRawData(27 * 4); - - qint32 materialNamePtr; - *aZoneFileStream >> materialNamePtr; - if (materialNamePtr == -1) { - QString materialName; - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - } - - aZoneFileStream->skipRawData(3 * 4); - - qint32 compressionPtr, compression, unknownSectionPtr; - *aZoneFileStream >> compressionPtr; - if (compressionPtr == -1) { - *aZoneFileStream >> compression; - - *aZoneFileStream >> unknownSectionPtr; - if (unknownSectionPtr == -2) { - aZoneFileStream->skipRawData(6 * 4); - } - } - - qint32 imageNamePtr; - *aZoneFileStream >> imageNamePtr; - if (imageNamePtr == -1) { - QString imageName; - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - imageName += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - } - - QByteArray compressionData(4, Qt::Uninitialized); - QString compressionStr; - if (compressionPtr == -1) { - aZoneFileStream->skipRawData(2 * 4); - aZoneFileStream->readRawData(compressionData.data(), 4); - aZoneFileStream->skipRawData(4); - compressionStr = QString::fromUtf8(compressionData); - aZoneFileStream->skipRawData(4); - } - aZoneFileStream->skipRawData(4); - - // TODO: Fill out this material - return Material(); -} - -Shader ZoneFile_COD4_PC::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD4_PC::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD4_PC::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD4_PC::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - // TODO Reimplement proper sound parsing - return result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD4_PC::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_PC::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_PC::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_PC::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_PC::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_PC::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_PC::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_PC::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD4_PC::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD4_PC::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD4_PC::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_PC::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD4_PC::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD4_PC::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD4_PC::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "1F000000") { - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "20000000") { - return ASSET_SCRIPT_PARSE_TREE; + return Utils::ASSET_SCRIPT_PARSE_TREE; } else if (cleanedType == "19000000") { - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "16000000") { - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "02000000") { - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0B000000") { - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "21000000") { - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "14000000") { - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "07000000") { - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "17000000") { - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "10000000") { - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "12000000") { - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "15000000") { - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "03000000") { - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0C000000") { - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "06000000") { - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0D000000") { - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "0A000000") { - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } else if (cleanedType == "01000000") { - return ASSET_PHYS_PRESET; + return Utils::ASSET_PHYSPRESET; } else if (cleanedType == "05000000") { - return ASSET_DESTRUCTIBLE; + return Utils::ASSET_DESTRUCTIBLE; } else if (cleanedType == "18000000") { - return ASSET_LOCAL_STRING; + return Utils::ASSET_LOCALIZE_ENTRY; } else if (cleanedType == "1A000000") { - return ASSET_UI_MAP; + return Utils::ASSET_UI_MAP; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD4_PC::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/PC/zonefile_cod4_pc.h b/libs/zonefile/PC/zonefile_cod4_pc.h index be47e4f..b3c99d3 100644 --- a/libs/zonefile/PC/zonefile_cod4_pc.h +++ b/libs/zonefile/PC/zonefile_cod4_pc.h @@ -12,43 +12,7 @@ public: ~ZoneFile_COD4_PC(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -private: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD4_PC_H diff --git a/libs/zonefile/PC/zonefile_cod5_pc.cpp b/libs/zonefile/PC/zonefile_cod5_pc.cpp index 2a1ab72..2df0289 100644 --- a/libs/zonefile/PC/zonefile_cod5_pc.cpp +++ b/libs/zonefile/PC/zonefile_cod5_pc.cpp @@ -14,1127 +14,51 @@ ZoneFile_COD5_PC::~ZoneFile_COD5_PC() { } bool ZoneFile_COD5_PC::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::LittleEndian); - - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD5_PC::pParseZoneHeader(QDataStream *aZoneFileStream) { - SetSize(pParseZoneSize(aZoneFileStream)); - pParseZoneUnknownsA(aZoneFileStream); - - SetTagCount(pParseZoneTagCount(aZoneFileStream)); - pParseZoneUnknownsB(aZoneFileStream); - - SetRecordCount(pParseZoneRecordCount(aZoneFileStream)); - - quint32 tagCount = GetTagCount(); - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD5_PC::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD5_PC::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD5_PC::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD5_PC::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD5_PC::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD5_PC::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD5_PC::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD5_PC::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD5_PC::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD5_PC::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD5_PC::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - if (result.path.contains(".bik")) { - qDebug() << "rawFileLength: " << result.length; - QByteArray bikData(result.length, Qt::Uninitialized); - aZoneFileStream->readRawData(bikData.data(), result.length); - - //QFile bikFile(QDir::currentPath() + "/" + rawFilePath.split('/').last()); - //qDebug() << bikFile.fileName(); - //if (!bikFile.open(QIODevice::WriteOnly)) { - // qWarning() << "Failed to open .bik file for writing!"; - // return; - //} - //qDebug() << QString("%1: %2").arg(rawFilePath).arg(bikFile.fileName()); - //bikFile.write(bikData); - } else { - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - } - return result; -} - -void ZoneFile_COD5_PC::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD5_PC::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD5_PC::pParseAsset_Material(QDataStream *aZoneFileStream) { - aZoneFileStream->skipRawData(27 * 4); - - qint32 materialNamePtr; - *aZoneFileStream >> materialNamePtr; - if (materialNamePtr == -1) { - QString materialName; - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - } - - aZoneFileStream->skipRawData(3 * 4); - - qint32 compressionPtr, compression, unknownSectionPtr; - *aZoneFileStream >> compressionPtr; - if (compressionPtr == -1) { - *aZoneFileStream >> compression; - - *aZoneFileStream >> unknownSectionPtr; - if (unknownSectionPtr == -2) { - aZoneFileStream->skipRawData(6 * 4); - } - } - - qint32 imageNamePtr; - *aZoneFileStream >> imageNamePtr; - if (imageNamePtr == -1) { - QString imageName; - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - imageName += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - } - - QByteArray compressionData(4, Qt::Uninitialized); - QString compressionStr; - if (compressionPtr == -1) { - aZoneFileStream->skipRawData(2 * 4); - aZoneFileStream->readRawData(compressionData.data(), 4); - aZoneFileStream->skipRawData(4); - compressionStr = QString::fromUtf8(compressionData); - aZoneFileStream->skipRawData(4); - } - aZoneFileStream->skipRawData(4); - - // TODO: Fill out this material - return Material(); -} - -Shader ZoneFile_COD5_PC::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD5_PC::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD5_PC::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD5_PC::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD5_PC::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_PC::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_PC::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_PC::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_PC::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_PC::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_PC::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_PC::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD5_PC::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD5_PC::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD5_PC::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_PC::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD5_PC::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD5_PC::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD5_PC::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_SCRIPT_PARSE_TREE; + return Utils::ASSET_SCRIPT_PARSE_TREE; } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } else if (cleanedType == "01000000") { // physics preset PARTIALLY VERIFIED - return ASSET_PHYS_PRESET; + return Utils::ASSET_PHYSPRESET; } else if (cleanedType == "03000000") { // destructible def PARTIALLY VERIFIED - return ASSET_DESTRUCTIBLE; + return Utils::ASSET_DESTRUCTIBLE; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD5_PC::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/PC/zonefile_cod5_pc.h b/libs/zonefile/PC/zonefile_cod5_pc.h index 5125441..bd0cf71 100644 --- a/libs/zonefile/PC/zonefile_cod5_pc.h +++ b/libs/zonefile/PC/zonefile_cod5_pc.h @@ -12,43 +12,7 @@ public: ~ZoneFile_COD5_PC(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -private: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD5_PC_H diff --git a/libs/zonefile/PC/zonefile_cod6_pc.cpp b/libs/zonefile/PC/zonefile_cod6_pc.cpp index 29e99d4..3b71215 100644 --- a/libs/zonefile/PC/zonefile_cod6_pc.cpp +++ b/libs/zonefile/PC/zonefile_cod6_pc.cpp @@ -14,1127 +14,51 @@ ZoneFile_COD6_PC::~ZoneFile_COD6_PC() { } bool ZoneFile_COD6_PC::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::LittleEndian); - - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD6_PC::pParseZoneHeader(QDataStream *aZoneFileStream) { - SetSize(pParseZoneSize(aZoneFileStream)); - pParseZoneUnknownsA(aZoneFileStream); - - SetTagCount(pParseZoneTagCount(aZoneFileStream)); - pParseZoneUnknownsB(aZoneFileStream); - - SetRecordCount(pParseZoneRecordCount(aZoneFileStream)); - - quint32 tagCount = GetTagCount(); - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD6_PC::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD6_PC::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD6_PC::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD6_PC::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD6_PC::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD6_PC::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD6_PC::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD6_PC::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD6_PC::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD6_PC::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD6_PC::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - if (result.path.contains(".bik")) { - qDebug() << "rawFileLength: " << result.length; - QByteArray bikData(result.length, Qt::Uninitialized); - aZoneFileStream->readRawData(bikData.data(), result.length); - - //QFile bikFile(QDir::currentPath() + "/" + rawFilePath.split('/').last()); - //qDebug() << bikFile.fileName(); - //if (!bikFile.open(QIODevice::WriteOnly)) { - // qWarning() << "Failed to open .bik file for writing!"; - // return; - //} - //qDebug() << QString("%1: %2").arg(rawFilePath).arg(bikFile.fileName()); - //bikFile.write(bikData); - } else { - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - } - return result; -} - -void ZoneFile_COD6_PC::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD6_PC::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD6_PC::pParseAsset_Material(QDataStream *aZoneFileStream) { - aZoneFileStream->skipRawData(27 * 4); - - qint32 materialNamePtr; - *aZoneFileStream >> materialNamePtr; - if (materialNamePtr == -1) { - QString materialName; - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - } - - aZoneFileStream->skipRawData(3 * 4); - - qint32 compressionPtr, compression, unknownSectionPtr; - *aZoneFileStream >> compressionPtr; - if (compressionPtr == -1) { - *aZoneFileStream >> compression; - - *aZoneFileStream >> unknownSectionPtr; - if (unknownSectionPtr == -2) { - aZoneFileStream->skipRawData(6 * 4); - } - } - - qint32 imageNamePtr; - *aZoneFileStream >> imageNamePtr; - if (imageNamePtr == -1) { - QString imageName; - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - imageName += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - } - - QByteArray compressionData(4, Qt::Uninitialized); - QString compressionStr; - if (compressionPtr == -1) { - aZoneFileStream->skipRawData(2 * 4); - aZoneFileStream->readRawData(compressionData.data(), 4); - aZoneFileStream->skipRawData(4); - compressionStr = QString::fromUtf8(compressionData); - aZoneFileStream->skipRawData(4); - } - aZoneFileStream->skipRawData(4); - - // TODO: Fill out this material - return Material(); -} - -Shader ZoneFile_COD6_PC::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD6_PC::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD6_PC::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD6_PC::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD6_PC::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_PC::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_PC::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_PC::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_PC::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_PC::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_PC::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_PC::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD6_PC::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD6_PC::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD6_PC::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_PC::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD6_PC::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD6_PC::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD6_PC::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_SCRIPT_PARSE_TREE; + return Utils::ASSET_SCRIPT_PARSE_TREE; } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } else if (cleanedType == "01000000") { // physics preset PARTIALLY VERIFIED - return ASSET_PHYS_PRESET; + return Utils::ASSET_PHYSPRESET; } else if (cleanedType == "03000000") { // destructible def PARTIALLY VERIFIED - return ASSET_DESTRUCTIBLE; + return Utils::ASSET_DESTRUCTIBLE; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD6_PC::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/PC/zonefile_cod6_pc.h b/libs/zonefile/PC/zonefile_cod6_pc.h index 4ecfed3..c70576e 100644 --- a/libs/zonefile/PC/zonefile_cod6_pc.h +++ b/libs/zonefile/PC/zonefile_cod6_pc.h @@ -12,43 +12,7 @@ public: ~ZoneFile_COD6_PC(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -private: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD6_PC_H diff --git a/libs/zonefile/PC/zonefile_cod7_pc.cpp b/libs/zonefile/PC/zonefile_cod7_pc.cpp index a6f83bd..0576ac0 100644 --- a/libs/zonefile/PC/zonefile_cod7_pc.cpp +++ b/libs/zonefile/PC/zonefile_cod7_pc.cpp @@ -15,1063 +15,103 @@ ZoneFile_COD7_PC::~ZoneFile_COD7_PC() } bool ZoneFile_COD7_PC::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::LittleEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - zoneFileStream.device()->seek(zoneFileStream.device()->pos() - 1); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD7_PC::pParseZoneHeader(QDataStream *aZoneFileStream) { - quint32 size = pParseZoneSize(aZoneFileStream); - SetSize(size); - - pParseZoneUnknownsA(aZoneFileStream); - - quint32 tagCount = pParseZoneTagCount(aZoneFileStream); - SetTagCount(tagCount); - - pParseZoneUnknownsB(aZoneFileStream); - - quint32 recordCount = pParseZoneRecordCount(aZoneFileStream); - SetRecordCount(recordCount); - - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD7_PC::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD7_PC::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD7_PC::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD7_PC::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD7_PC::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD7_PC::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD7_PC::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD7_PC::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD7_PC::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD7_PC::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD7_PC::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -void ZoneFile_COD7_PC::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD7_PC::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD7_PC::pParseAsset_Material(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); - - return Material(); -} - -Shader ZoneFile_COD7_PC::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD7_PC::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD7_PC::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD7_PC::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD7_PC::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_PC::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_PC::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_PC::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_PC::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_PC::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_PC::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_PC::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD7_PC::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD7_PC::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD7_PC::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_PC::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD7_PC::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD7_PC::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD7_PC::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); - if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_LOCAL_STRING; - } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_RAW_FILE; - } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; - } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; - } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; - } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; - } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; - } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; - } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; - } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; - } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; - } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; - } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; - } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; - } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; - } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; - } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; - } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + if (cleanedType == "00000000") { + return Utils::ASSET_XMODELPIECES; + } else if (cleanedType == "01000000") { + return Utils::ASSET_PHYSPRESET; + } else if (cleanedType == "02000000") { + return Utils::ASSET_PHYSCONSTRAINTS; + } else if (cleanedType == "03000000") { + return Utils::ASSET_DESTRUCTIBLEDEF; + } else if (cleanedType == "04000000") { + return Utils::ASSET_Animation; + } else if (cleanedType == "05000000") { + return Utils::ASSET_XMODEL; + } else if (cleanedType == "06000000") { + return Utils::ASSET_MATERIAL; + } else if (cleanedType == "07000000") { + return Utils::ASSET_TECHNIQUE_SET; + } else if (cleanedType == "08000000") { + return Utils::ASSET_IMAGE; + } else if (cleanedType == "09000000") { + return Utils::ASSET_SOUND; + } else if (cleanedType == "0A000000") { + return Utils::ASSET_SOUND_PATCH; + } else if (cleanedType == "0B000000") { + return Utils::ASSET_CLIPMAP; + } else if (cleanedType == "0C000000") { + return Utils::ASSET_CLIPMAP_PVS; + } else if (cleanedType == "0D000000") { + return Utils::ASSET_COMWORLD; + } else if (cleanedType == "0E000000") { + return Utils::ASSET_GAMEWORLD_SP; + } else if (cleanedType == "0F000000") { + return Utils::ASSET_GAMEWORLD_MP; + } else if (cleanedType == "10000000") { + return Utils::ASSET_MAP_ENTS; + } else if (cleanedType == "11000000") { + return Utils::ASSET_GFXWORLD; + } else if (cleanedType == "12000000") { + return Utils::ASSET_LIGHT_DEF; + } else if (cleanedType == "13000000") { + return Utils::ASSET_UI_MAP; + } else if (cleanedType == "14000000") { + return Utils::ASSET_FONT; + } else if (cleanedType == "15000000") { + return Utils::ASSET_MENULIST; + } else if (cleanedType == "16000000") { + return Utils::ASSET_MENU; + } else if (cleanedType == "17000000") { + return Utils::ASSET_LOCALIZE_ENTRY; + } else if (cleanedType == "18000000") { + return Utils::ASSET_WEAPON; + } else if (cleanedType == "19000000") { + return Utils::ASSET_WEAPONDEF; + } else if (cleanedType == "1A000000") { + return Utils::ASSET_WEAPON_VARIANT; + } else if (cleanedType == "1B000000") { + return Utils::ASSET_SNDDRIVER_GLOBALS; + } else if (cleanedType == "1C000000") { + return Utils::ASSET_FX; + } else if (cleanedType == "1D000000") { + return Utils::ASSET_IMPACT_FX; + } else if (cleanedType == "1E000000") { + return Utils::ASSET_AITYPE; + } else if (cleanedType == "1F000000") { + return Utils::ASSET_MPTYPE; + } else if (cleanedType == "20000000") { + return Utils::ASSET_MPBODY; + } else if (cleanedType == "21000000") { + return Utils::ASSET_MPHEAD; + } else if (cleanedType == "22000000") { + return Utils::ASSET_CHARACTER; + } else if (cleanedType == "23000000") { + return Utils::ASSET_XMODELALIAS; + } else if (cleanedType == "24000000") { + return Utils::ASSET_RAWFILE; + } else if (cleanedType == "25000000") { + return Utils::ASSET_STRINGTABLE; + } else if (cleanedType == "26000000") { + return Utils::ASSET_PACK_INDEX; + } else if (cleanedType == "27000000") { + return Utils::ASSET_XGLOBALS; + } else if (cleanedType == "28000000") { + return Utils::ASSET_DDL; + } else if (cleanedType == "29000000") { + return Utils::ASSET_GLASSES; + } else if (cleanedType == "2A000000") { + return Utils::ASSET_EMBLEMSET; + } else if (cleanedType == "2B000000") { + return Utils::ASSET_COUNT; + } else if (cleanedType == "2B000000") { + return Utils::ASSET_STRING; + } else if (cleanedType == "2C000000") { + return Utils::ASSET_ASSETLIST; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD7_PC::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/PC/zonefile_cod7_pc.h b/libs/zonefile/PC/zonefile_cod7_pc.h index dec60e4..91f084a 100644 --- a/libs/zonefile/PC/zonefile_cod7_pc.h +++ b/libs/zonefile/PC/zonefile_cod7_pc.h @@ -10,43 +10,7 @@ public: ~ZoneFile_COD7_PC(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD7_PC_H diff --git a/libs/zonefile/PC/zonefile_cod8_pc.cpp b/libs/zonefile/PC/zonefile_cod8_pc.cpp index 9b7d341..8ec1719 100644 --- a/libs/zonefile/PC/zonefile_cod8_pc.cpp +++ b/libs/zonefile/PC/zonefile_cod8_pc.cpp @@ -15,1063 +15,47 @@ ZoneFile_COD8_PC::~ZoneFile_COD8_PC() } bool ZoneFile_COD8_PC::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::LittleEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - zoneFileStream.device()->seek(zoneFileStream.device()->pos() - 1); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD8_PC::pParseZoneHeader(QDataStream *aZoneFileStream) { - quint32 size = pParseZoneSize(aZoneFileStream); - SetSize(size); - - pParseZoneUnknownsA(aZoneFileStream); - - quint32 tagCount = pParseZoneTagCount(aZoneFileStream); - SetTagCount(tagCount); - - pParseZoneUnknownsB(aZoneFileStream); - - quint32 recordCount = pParseZoneRecordCount(aZoneFileStream); - SetRecordCount(recordCount); - - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD8_PC::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD8_PC::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD8_PC::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD8_PC::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD8_PC::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD8_PC::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD8_PC::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD8_PC::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD8_PC::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD8_PC::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD8_PC::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -void ZoneFile_COD8_PC::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD8_PC::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD8_PC::pParseAsset_Material(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); - - return Material(); -} - -Shader ZoneFile_COD8_PC::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD8_PC::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD8_PC::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD8_PC::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD8_PC::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_PC::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_PC::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_PC::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_PC::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_PC::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_PC::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_PC::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD8_PC::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD8_PC::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD8_PC::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_PC::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD8_PC::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD8_PC::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD8_PC::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_LOCAL_STRING; + return Utils::ASSET_LOCALIZE_ENTRY; } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD8_PC::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/PC/zonefile_cod8_pc.h b/libs/zonefile/PC/zonefile_cod8_pc.h index 5ba5f15..084a3f6 100644 --- a/libs/zonefile/PC/zonefile_cod8_pc.h +++ b/libs/zonefile/PC/zonefile_cod8_pc.h @@ -10,43 +10,7 @@ public: ~ZoneFile_COD8_PC(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD7_PC_H diff --git a/libs/zonefile/PC/zonefile_cod9_pc.cpp b/libs/zonefile/PC/zonefile_cod9_pc.cpp index a278b0a..200e984 100644 --- a/libs/zonefile/PC/zonefile_cod9_pc.cpp +++ b/libs/zonefile/PC/zonefile_cod9_pc.cpp @@ -15,1058 +15,47 @@ ZoneFile_COD9_PC::~ZoneFile_COD9_PC() } bool ZoneFile_COD9_PC::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::LittleEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD9_PC::pParseZoneHeader(QDataStream *aZoneFileStream) { - SetSize(pParseZoneSize(aZoneFileStream)); - pParseZoneUnknownsA(aZoneFileStream); - - SetTagCount(pParseZoneTagCount(aZoneFileStream)); - pParseZoneUnknownsB(aZoneFileStream); - - SetRecordCount(pParseZoneRecordCount(aZoneFileStream)); - - quint32 tagCount = GetTagCount(); - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD9_PC::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD9_PC::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD9_PC::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD9_PC::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD9_PC::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD9_PC::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD9_PC::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD9_PC::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD9_PC::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD9_PC::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD9_PC::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -void ZoneFile_COD9_PC::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD9_PC::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD9_PC::pParseAsset_Material(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); - - return Material(); -} - -Shader ZoneFile_COD9_PC::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD9_PC::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD9_PC::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD9_PC::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD9_PC::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_PC::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_PC::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_PC::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_PC::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_PC::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_PC::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_PC::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD9_PC::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD9_PC::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD9_PC::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_PC::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD9_PC::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD9_PC::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD9_PC::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_LOCAL_STRING; + return Utils::ASSET_LOCALIZE_ENTRY; } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD9_PC::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/PC/zonefile_cod9_pc.h b/libs/zonefile/PC/zonefile_cod9_pc.h index e71ac54..4f1f9c6 100644 --- a/libs/zonefile/PC/zonefile_cod9_pc.h +++ b/libs/zonefile/PC/zonefile_cod9_pc.h @@ -10,43 +10,7 @@ public: ~ZoneFile_COD9_PC(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD9_PC_H diff --git a/libs/zonefile/PS3/zonefile_cod10_ps3.cpp b/libs/zonefile/PS3/zonefile_cod10_ps3.cpp index 8b92f1b..96dd727 100644 --- a/libs/zonefile/PS3/zonefile_cod10_ps3.cpp +++ b/libs/zonefile/PS3/zonefile_cod10_ps3.cpp @@ -15,1058 +15,47 @@ ZoneFile_COD10_PS3::~ZoneFile_COD10_PS3() } bool ZoneFile_COD10_PS3::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::BigEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD10_PS3::pParseZoneHeader(QDataStream *aZoneFileStream) { - SetSize(pParseZoneSize(aZoneFileStream)); - pParseZoneUnknownsA(aZoneFileStream); - - SetTagCount(pParseZoneTagCount(aZoneFileStream)); - pParseZoneUnknownsB(aZoneFileStream); - - SetRecordCount(pParseZoneRecordCount(aZoneFileStream)); - - quint32 tagCount = GetTagCount(); - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD10_PS3::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD10_PS3::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD10_PS3::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD10_PS3::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD10_PS3::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD10_PS3::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD10_PS3::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD10_PS3::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD10_PS3::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD10_PS3::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD10_PS3::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -void ZoneFile_COD10_PS3::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD10_PS3::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD10_PS3::pParseAsset_Material(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); - - return Material(); -} - -Shader ZoneFile_COD10_PS3::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD10_PS3::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD10_PS3::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD10_PS3::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD10_PS3::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_PS3::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_PS3::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_PS3::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_PS3::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_PS3::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_PS3::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_PS3::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD10_PS3::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD10_PS3::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD10_PS3::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_PS3::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD10_PS3::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD10_PS3::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD10_PS3::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_LOCAL_STRING; + return Utils::ASSET_LOCALIZE_ENTRY; } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD10_PS3::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/PS3/zonefile_cod10_ps3.h b/libs/zonefile/PS3/zonefile_cod10_ps3.h index 90c07f8..91acb35 100644 --- a/libs/zonefile/PS3/zonefile_cod10_ps3.h +++ b/libs/zonefile/PS3/zonefile_cod10_ps3.h @@ -10,43 +10,6 @@ public: ~ZoneFile_COD10_PS3(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; -}; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override;}; #endif // ZONEFILE_COD10_PS3_H diff --git a/libs/zonefile/PS3/zonefile_cod11_ps3.cpp b/libs/zonefile/PS3/zonefile_cod11_ps3.cpp index 47f395a..a54e44a 100644 --- a/libs/zonefile/PS3/zonefile_cod11_ps3.cpp +++ b/libs/zonefile/PS3/zonefile_cod11_ps3.cpp @@ -15,1058 +15,47 @@ ZoneFile_COD11_PS3::~ZoneFile_COD11_PS3() } bool ZoneFile_COD11_PS3::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::BigEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD11_PS3::pParseZoneHeader(QDataStream *aZoneFileStream) { - SetSize(pParseZoneSize(aZoneFileStream)); - pParseZoneUnknownsA(aZoneFileStream); - - SetTagCount(pParseZoneTagCount(aZoneFileStream)); - pParseZoneUnknownsB(aZoneFileStream); - - SetRecordCount(pParseZoneRecordCount(aZoneFileStream)); - - quint32 tagCount = GetTagCount(); - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD11_PS3::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD11_PS3::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD11_PS3::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD11_PS3::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD11_PS3::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD11_PS3::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD11_PS3::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD11_PS3::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD11_PS3::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD11_PS3::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD11_PS3::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -void ZoneFile_COD11_PS3::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD11_PS3::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD11_PS3::pParseAsset_Material(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); - - return Material(); -} - -Shader ZoneFile_COD11_PS3::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD11_PS3::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD11_PS3::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD11_PS3::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD11_PS3::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_PS3::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_PS3::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_PS3::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_PS3::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_PS3::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_PS3::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_PS3::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD11_PS3::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD11_PS3::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD11_PS3::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD11_PS3::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD11_PS3::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD11_PS3::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD11_PS3::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_LOCAL_STRING; + return Utils::ASSET_LOCALIZE_ENTRY; } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD11_PS3::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/PS3/zonefile_cod11_ps3.h b/libs/zonefile/PS3/zonefile_cod11_ps3.h index a8c16f3..ddf57b1 100644 --- a/libs/zonefile/PS3/zonefile_cod11_ps3.h +++ b/libs/zonefile/PS3/zonefile_cod11_ps3.h @@ -10,43 +10,7 @@ public: ~ZoneFile_COD11_PS3(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD11_PS3_H diff --git a/libs/zonefile/PS3/zonefile_cod12_ps3.cpp b/libs/zonefile/PS3/zonefile_cod12_ps3.cpp index d764d52..1e3a50f 100644 --- a/libs/zonefile/PS3/zonefile_cod12_ps3.cpp +++ b/libs/zonefile/PS3/zonefile_cod12_ps3.cpp @@ -15,1058 +15,47 @@ ZoneFile_COD12_PS3::~ZoneFile_COD12_PS3() } bool ZoneFile_COD12_PS3::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::BigEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD12_PS3::pParseZoneHeader(QDataStream *aZoneFileStream) { - SetSize(pParseZoneSize(aZoneFileStream)); - pParseZoneUnknownsA(aZoneFileStream); - - SetTagCount(pParseZoneTagCount(aZoneFileStream)); - pParseZoneUnknownsB(aZoneFileStream); - - SetRecordCount(pParseZoneRecordCount(aZoneFileStream)); - - quint32 tagCount = GetTagCount(); - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD12_PS3::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD12_PS3::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD12_PS3::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD12_PS3::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD12_PS3::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD12_PS3::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD12_PS3::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD12_PS3::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD12_PS3::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD12_PS3::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD12_PS3::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -void ZoneFile_COD12_PS3::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD12_PS3::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD12_PS3::pParseAsset_Material(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); - - return Material(); -} - -Shader ZoneFile_COD12_PS3::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD12_PS3::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD12_PS3::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD12_PS3::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD12_PS3::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_PS3::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_PS3::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_PS3::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_PS3::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_PS3::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_PS3::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_PS3::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD12_PS3::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD12_PS3::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD12_PS3::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD12_PS3::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD12_PS3::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD12_PS3::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD12_PS3::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_LOCAL_STRING; + return Utils::ASSET_LOCALIZE_ENTRY; } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD12_PS3::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/PS3/zonefile_cod12_ps3.h b/libs/zonefile/PS3/zonefile_cod12_ps3.h index 98c1b09..e54f0db 100644 --- a/libs/zonefile/PS3/zonefile_cod12_ps3.h +++ b/libs/zonefile/PS3/zonefile_cod12_ps3.h @@ -10,43 +10,7 @@ public: ~ZoneFile_COD12_PS3(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD12_PS3_H diff --git a/libs/zonefile/PS3/zonefile_cod4_ps3.cpp b/libs/zonefile/PS3/zonefile_cod4_ps3.cpp index 9cf17c4..4140783 100644 --- a/libs/zonefile/PS3/zonefile_cod4_ps3.cpp +++ b/libs/zonefile/PS3/zonefile_cod4_ps3.cpp @@ -14,1112 +14,33 @@ ZoneFile_COD4_PS3::~ZoneFile_COD4_PS3() { } bool ZoneFile_COD4_PS3::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::BigEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD4_PS3::pParseZoneHeader(QDataStream *aZoneFileStream) { - SetSize(pParseZoneSize(aZoneFileStream)); - - aZoneFileStream->skipRawData(32); - - SetTagCount(pParseZoneTagCount(aZoneFileStream)); - pParseZoneUnknownsB(aZoneFileStream); - - SetRecordCount(pParseZoneRecordCount(aZoneFileStream) - 1); - - quint32 tagCount = GetTagCount(); - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD4_PS3::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD4_PS3::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD4_PS3::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD4_PS3::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD4_PS3::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD4_PS3::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD4_PS3::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i <= tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD4_PS3::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD4_PS3::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD4_PS3::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD4_PS3::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - if (result.path.contains(".bik")) { - qDebug() << "rawFileLength: " << result.length; - QByteArray bikData(result.length, Qt::Uninitialized); - aZoneFileStream->readRawData(bikData.data(), result.length); - - //QFile bikFile(QDir::currentPath() + "/" + rawFilePath.split('/').last()); - //qDebug() << bikFile.fileName(); - //if (!bikFile.open(QIODevice::WriteOnly)) { - // qWarning() << "Failed to open .bik file for writing!"; - // return; - //} - //qDebug() << QString("%1: %2").arg(rawFilePath).arg(bikFile.fileName()); - //bikFile.write(bikData); - } else { - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - } - return result; -} - -void ZoneFile_COD4_PS3::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD4_PS3::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD4_PS3::pParseAsset_Material(QDataStream *aZoneFileStream) { - aZoneFileStream->skipRawData(27 * 4); - - qint32 materialNamePtr; - *aZoneFileStream >> materialNamePtr; - if (materialNamePtr == -1) { - QString materialName; - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - } - - aZoneFileStream->skipRawData(3 * 4); - - qint32 compressionPtr, compression, unknownSectionPtr; - *aZoneFileStream >> compressionPtr; - if (compressionPtr == -1) { - *aZoneFileStream >> compression; - - *aZoneFileStream >> unknownSectionPtr; - if (unknownSectionPtr == -2) { - aZoneFileStream->skipRawData(6 * 4); - } - } - - qint32 imageNamePtr; - *aZoneFileStream >> imageNamePtr; - if (imageNamePtr == -1) { - QString imageName; - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - imageName += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - } - - QByteArray compressionData(4, Qt::Uninitialized); - QString compressionStr; - if (compressionPtr == -1) { - aZoneFileStream->skipRawData(2 * 4); - aZoneFileStream->readRawData(compressionData.data(), 4); - aZoneFileStream->skipRawData(4); - compressionStr = QString::fromUtf8(compressionData); - aZoneFileStream->skipRawData(4); - } - aZoneFileStream->skipRawData(4); - - // TODO: Fill out this material - return Material(); -} - -Shader ZoneFile_COD4_PS3::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD4_PS3::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD4_PS3::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD4_PS3::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - // TODO Reimplement proper sound parsing - return result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD4_PS3::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_PS3::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_PS3::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_PS3::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_PS3::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_PS3::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_PS3::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_PS3::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD4_PS3::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD4_PS3::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD4_PS3::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_PS3::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD4_PS3::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD4_PS3::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD4_PS3::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "00000003") { - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "00000002") { - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "00000007") { - return ASSET_MATERIAL; + return Utils::ASSET_MATERIAL; } else if (cleanedType == "00000009") { - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "0000000C") { - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } else if (cleanedType == "0000000E") { - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "0000000F") { - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "00000012") { - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "00000019") { - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "0000001B") { - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "00000018") { - return ASSET_SOUND; + return Utils::ASSET_SOUND; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD4_PS3::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/PS3/zonefile_cod4_ps3.h b/libs/zonefile/PS3/zonefile_cod4_ps3.h index 90033c2..e8179fe 100644 --- a/libs/zonefile/PS3/zonefile_cod4_ps3.h +++ b/libs/zonefile/PS3/zonefile_cod4_ps3.h @@ -12,43 +12,7 @@ public: ~ZoneFile_COD4_PS3(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -private: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD4_PS3_H diff --git a/libs/zonefile/PS3/zonefile_cod5_ps3.cpp b/libs/zonefile/PS3/zonefile_cod5_ps3.cpp index f97aa04..b39fe5e 100644 --- a/libs/zonefile/PS3/zonefile_cod5_ps3.cpp +++ b/libs/zonefile/PS3/zonefile_cod5_ps3.cpp @@ -14,1126 +14,51 @@ ZoneFile_COD5_PS3::~ZoneFile_COD5_PS3() { } bool ZoneFile_COD5_PS3::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::BigEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD5_PS3::pParseZoneHeader(QDataStream *aZoneFileStream) { - SetSize(pParseZoneSize(aZoneFileStream)); - pParseZoneUnknownsA(aZoneFileStream); - - SetTagCount(pParseZoneTagCount(aZoneFileStream)); - pParseZoneUnknownsB(aZoneFileStream); - - SetRecordCount(pParseZoneRecordCount(aZoneFileStream)); - - quint32 tagCount = GetTagCount(); - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD5_PS3::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD5_PS3::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD5_PS3::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD5_PS3::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD5_PS3::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD5_PS3::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD5_PS3::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD5_PS3::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD5_PS3::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD5_PS3::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD5_PS3::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - if (result.path.contains(".bik")) { - qDebug() << "rawFileLength: " << result.length; - QByteArray bikData(result.length, Qt::Uninitialized); - aZoneFileStream->readRawData(bikData.data(), result.length); - - //QFile bikFile(QDir::currentPath() + "/" + rawFilePath.split('/').last()); - //qDebug() << bikFile.fileName(); - //if (!bikFile.open(QIODevice::WriteOnly)) { - // qWarning() << "Failed to open .bik file for writing!"; - // return; - //} - //qDebug() << QString("%1: %2").arg(rawFilePath).arg(bikFile.fileName()); - //bikFile.write(bikData); - } else { - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - } - return result; -} - -void ZoneFile_COD5_PS3::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD5_PS3::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD5_PS3::pParseAsset_Material(QDataStream *aZoneFileStream) { - aZoneFileStream->skipRawData(27 * 4); - - qint32 materialNamePtr; - *aZoneFileStream >> materialNamePtr; - if (materialNamePtr == -1) { - QString materialName; - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - } - - aZoneFileStream->skipRawData(3 * 4); - - qint32 compressionPtr, compression, unknownSectionPtr; - *aZoneFileStream >> compressionPtr; - if (compressionPtr == -1) { - *aZoneFileStream >> compression; - - *aZoneFileStream >> unknownSectionPtr; - if (unknownSectionPtr == -2) { - aZoneFileStream->skipRawData(6 * 4); - } - } - - qint32 imageNamePtr; - *aZoneFileStream >> imageNamePtr; - if (imageNamePtr == -1) { - QString imageName; - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - imageName += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - } - - QByteArray compressionData(4, Qt::Uninitialized); - QString compressionStr; - if (compressionPtr == -1) { - aZoneFileStream->skipRawData(2 * 4); - aZoneFileStream->readRawData(compressionData.data(), 4); - aZoneFileStream->skipRawData(4); - compressionStr = QString::fromUtf8(compressionData); - aZoneFileStream->skipRawData(4); - } - aZoneFileStream->skipRawData(4); - - // TODO: Fill out this material - return Material(); -} - -Shader ZoneFile_COD5_PS3::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD5_PS3::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD5_PS3::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD5_PS3::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD5_PS3::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_PS3::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_PS3::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_PS3::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_PS3::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_PS3::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_PS3::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_PS3::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD5_PS3::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD5_PS3::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD5_PS3::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD5_PS3::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD5_PS3::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD5_PS3::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD5_PS3::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_SCRIPT_PARSE_TREE; + return Utils::ASSET_SCRIPT_PARSE_TREE; } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } else if (cleanedType == "01000000") { // physics preset PARTIALLY VERIFIED - return ASSET_PHYS_PRESET; + return Utils::ASSET_PHYSPRESET; } else if (cleanedType == "03000000") { // destructible def PARTIALLY VERIFIED - return ASSET_DESTRUCTIBLE; + return Utils::ASSET_DESTRUCTIBLE; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD5_PS3::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/PS3/zonefile_cod5_ps3.h b/libs/zonefile/PS3/zonefile_cod5_ps3.h index 62260e0..34760e7 100644 --- a/libs/zonefile/PS3/zonefile_cod5_ps3.h +++ b/libs/zonefile/PS3/zonefile_cod5_ps3.h @@ -12,43 +12,7 @@ public: ~ZoneFile_COD5_PS3(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -private: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD5_PS3_H diff --git a/libs/zonefile/PS3/zonefile_cod6_ps3.cpp b/libs/zonefile/PS3/zonefile_cod6_ps3.cpp index 21c7506..7604db3 100644 --- a/libs/zonefile/PS3/zonefile_cod6_ps3.cpp +++ b/libs/zonefile/PS3/zonefile_cod6_ps3.cpp @@ -14,1126 +14,51 @@ ZoneFile_COD6_PS3::~ZoneFile_COD6_PS3() { } bool ZoneFile_COD6_PS3::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::BigEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD6_PS3::pParseZoneHeader(QDataStream *aZoneFileStream) { - SetSize(pParseZoneSize(aZoneFileStream)); - pParseZoneUnknownsA(aZoneFileStream); - - SetTagCount(pParseZoneTagCount(aZoneFileStream)); - pParseZoneUnknownsB(aZoneFileStream); - - SetRecordCount(pParseZoneRecordCount(aZoneFileStream)); - - quint32 tagCount = GetTagCount(); - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD6_PS3::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD6_PS3::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD6_PS3::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD6_PS3::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD6_PS3::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD6_PS3::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD6_PS3::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD6_PS3::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD6_PS3::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD6_PS3::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD6_PS3::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - if (result.path.contains(".bik")) { - qDebug() << "rawFileLength: " << result.length; - QByteArray bikData(result.length, Qt::Uninitialized); - aZoneFileStream->readRawData(bikData.data(), result.length); - - //QFile bikFile(QDir::currentPath() + "/" + rawFilePath.split('/').last()); - //qDebug() << bikFile.fileName(); - //if (!bikFile.open(QIODevice::WriteOnly)) { - // qWarning() << "Failed to open .bik file for writing!"; - // return; - //} - //qDebug() << QString("%1: %2").arg(rawFilePath).arg(bikFile.fileName()); - //bikFile.write(bikData); - } else { - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - } - return result; -} - -void ZoneFile_COD6_PS3::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD6_PS3::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD6_PS3::pParseAsset_Material(QDataStream *aZoneFileStream) { - aZoneFileStream->skipRawData(27 * 4); - - qint32 materialNamePtr; - *aZoneFileStream >> materialNamePtr; - if (materialNamePtr == -1) { - QString materialName; - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - } - - aZoneFileStream->skipRawData(3 * 4); - - qint32 compressionPtr, compression, unknownSectionPtr; - *aZoneFileStream >> compressionPtr; - if (compressionPtr == -1) { - *aZoneFileStream >> compression; - - *aZoneFileStream >> unknownSectionPtr; - if (unknownSectionPtr == -2) { - aZoneFileStream->skipRawData(6 * 4); - } - } - - qint32 imageNamePtr; - *aZoneFileStream >> imageNamePtr; - if (imageNamePtr == -1) { - QString imageName; - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - imageName += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - } - - QByteArray compressionData(4, Qt::Uninitialized); - QString compressionStr; - if (compressionPtr == -1) { - aZoneFileStream->skipRawData(2 * 4); - aZoneFileStream->readRawData(compressionData.data(), 4); - aZoneFileStream->skipRawData(4); - compressionStr = QString::fromUtf8(compressionData); - aZoneFileStream->skipRawData(4); - } - aZoneFileStream->skipRawData(4); - - // TODO: Fill out this material - return Material(); -} - -Shader ZoneFile_COD6_PS3::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD6_PS3::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD6_PS3::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD6_PS3::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD6_PS3::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_PS3::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_PS3::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_PS3::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_PS3::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_PS3::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_PS3::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_PS3::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD6_PS3::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD6_PS3::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD6_PS3::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD6_PS3::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD6_PS3::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD6_PS3::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD6_PS3::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_SCRIPT_PARSE_TREE; + return Utils::ASSET_SCRIPT_PARSE_TREE; } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } else if (cleanedType == "01000000") { // physics preset PARTIALLY VERIFIED - return ASSET_PHYS_PRESET; + return Utils::ASSET_PHYSPRESET; } else if (cleanedType == "03000000") { // destructible def PARTIALLY VERIFIED - return ASSET_DESTRUCTIBLE; + return Utils::ASSET_DESTRUCTIBLE; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD6_PS3::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/PS3/zonefile_cod6_ps3.h b/libs/zonefile/PS3/zonefile_cod6_ps3.h index 4be12ec..4214c5a 100644 --- a/libs/zonefile/PS3/zonefile_cod6_ps3.h +++ b/libs/zonefile/PS3/zonefile_cod6_ps3.h @@ -12,43 +12,7 @@ public: ~ZoneFile_COD6_PS3(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -private: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD6_PS3_H diff --git a/libs/zonefile/PS3/zonefile_cod7_ps3.cpp b/libs/zonefile/PS3/zonefile_cod7_ps3.cpp index 9a4c6b1..5359205 100644 --- a/libs/zonefile/PS3/zonefile_cod7_ps3.cpp +++ b/libs/zonefile/PS3/zonefile_cod7_ps3.cpp @@ -15,1063 +15,47 @@ ZoneFile_COD7_PS3::~ZoneFile_COD7_PS3() } bool ZoneFile_COD7_PS3::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::BigEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - zoneFileStream.device()->seek(zoneFileStream.device()->pos() - 1); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD7_PS3::pParseZoneHeader(QDataStream *aZoneFileStream) { - quint32 size = pParseZoneSize(aZoneFileStream); - SetSize(size); - - pParseZoneUnknownsA(aZoneFileStream); - - quint32 tagCount = pParseZoneTagCount(aZoneFileStream); - SetTagCount(tagCount); - - pParseZoneUnknownsB(aZoneFileStream); - - quint32 recordCount = pParseZoneRecordCount(aZoneFileStream); - SetRecordCount(recordCount); - - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD7_PS3::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD7_PS3::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD7_PS3::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD7_PS3::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD7_PS3::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD7_PS3::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD7_PS3::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD7_PS3::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD7_PS3::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD7_PS3::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD7_PS3::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -void ZoneFile_COD7_PS3::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD7_PS3::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD7_PS3::pParseAsset_Material(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); - - return Material(); -} - -Shader ZoneFile_COD7_PS3::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD7_PS3::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD7_PS3::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD7_PS3::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD7_PS3::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_PS3::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_PS3::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_PS3::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_PS3::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_PS3::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_PS3::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_PS3::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD7_PS3::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD7_PS3::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD7_PS3::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_PS3::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD7_PS3::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD7_PS3::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD7_PS3::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_LOCAL_STRING; + return Utils::ASSET_LOCALIZE_ENTRY; } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD7_PS3::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/PS3/zonefile_cod7_ps3.h b/libs/zonefile/PS3/zonefile_cod7_ps3.h index 73ddd3e..fd403a6 100644 --- a/libs/zonefile/PS3/zonefile_cod7_ps3.h +++ b/libs/zonefile/PS3/zonefile_cod7_ps3.h @@ -10,43 +10,7 @@ public: ~ZoneFile_COD7_PS3(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD7_PS3_H diff --git a/libs/zonefile/PS3/zonefile_cod8_ps3.cpp b/libs/zonefile/PS3/zonefile_cod8_ps3.cpp index ec47ada..f2bf547 100644 --- a/libs/zonefile/PS3/zonefile_cod8_ps3.cpp +++ b/libs/zonefile/PS3/zonefile_cod8_ps3.cpp @@ -15,1063 +15,47 @@ ZoneFile_COD8_PS3::~ZoneFile_COD8_PS3() } bool ZoneFile_COD8_PS3::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::BigEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - zoneFileStream.device()->seek(zoneFileStream.device()->pos() - 1); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD8_PS3::pParseZoneHeader(QDataStream *aZoneFileStream) { - quint32 size = pParseZoneSize(aZoneFileStream); - SetSize(size); - - pParseZoneUnknownsA(aZoneFileStream); - - quint32 tagCount = pParseZoneTagCount(aZoneFileStream); - SetTagCount(tagCount); - - pParseZoneUnknownsB(aZoneFileStream); - - quint32 recordCount = pParseZoneRecordCount(aZoneFileStream); - SetRecordCount(recordCount); - - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD8_PS3::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD8_PS3::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD8_PS3::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD8_PS3::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD8_PS3::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD8_PS3::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD8_PS3::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD8_PS3::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD8_PS3::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD8_PS3::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD8_PS3::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -void ZoneFile_COD8_PS3::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD8_PS3::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD8_PS3::pParseAsset_Material(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); - - return Material(); -} - -Shader ZoneFile_COD8_PS3::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD8_PS3::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD8_PS3::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD8_PS3::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD8_PS3::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_PS3::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_PS3::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_PS3::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_PS3::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_PS3::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_PS3::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_PS3::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD8_PS3::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD8_PS3::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD8_PS3::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_PS3::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD8_PS3::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD8_PS3::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD8_PS3::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_LOCAL_STRING; + return Utils::ASSET_LOCALIZE_ENTRY; } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD8_PS3::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/PS3/zonefile_cod8_ps3.h b/libs/zonefile/PS3/zonefile_cod8_ps3.h index 5787d58..b6fb0fd 100644 --- a/libs/zonefile/PS3/zonefile_cod8_ps3.h +++ b/libs/zonefile/PS3/zonefile_cod8_ps3.h @@ -10,43 +10,7 @@ public: ~ZoneFile_COD8_PS3(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD8_PS3_H diff --git a/libs/zonefile/PS3/zonefile_cod9_ps3.cpp b/libs/zonefile/PS3/zonefile_cod9_ps3.cpp index abe6096..12ef987 100644 --- a/libs/zonefile/PS3/zonefile_cod9_ps3.cpp +++ b/libs/zonefile/PS3/zonefile_cod9_ps3.cpp @@ -15,1058 +15,47 @@ ZoneFile_COD9_PS3::~ZoneFile_COD9_PS3() } bool ZoneFile_COD9_PS3::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::BigEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD9_PS3::pParseZoneHeader(QDataStream *aZoneFileStream) { - SetSize(pParseZoneSize(aZoneFileStream)); - pParseZoneUnknownsA(aZoneFileStream); - - SetTagCount(pParseZoneTagCount(aZoneFileStream)); - pParseZoneUnknownsB(aZoneFileStream); - - SetRecordCount(pParseZoneRecordCount(aZoneFileStream)); - - quint32 tagCount = GetTagCount(); - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD9_PS3::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD9_PS3::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD9_PS3::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD9_PS3::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD9_PS3::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD9_PS3::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD9_PS3::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD9_PS3::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD9_PS3::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD9_PS3::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD9_PS3::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -void ZoneFile_COD9_PS3::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD9_PS3::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD9_PS3::pParseAsset_Material(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); - - return Material(); -} - -Shader ZoneFile_COD9_PS3::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD9_PS3::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD9_PS3::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD9_PS3::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD9_PS3::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_PS3::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_PS3::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_PS3::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_PS3::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_PS3::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_PS3::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_PS3::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD9_PS3::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD9_PS3::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD9_PS3::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_PS3::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD9_PS3::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD9_PS3::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD9_PS3::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_LOCAL_STRING; + return Utils::ASSET_LOCALIZE_ENTRY; } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD9_PS3::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/PS3/zonefile_cod9_ps3.h b/libs/zonefile/PS3/zonefile_cod9_ps3.h index cba7420..63c46bc 100644 --- a/libs/zonefile/PS3/zonefile_cod9_ps3.h +++ b/libs/zonefile/PS3/zonefile_cod9_ps3.h @@ -10,43 +10,7 @@ public: ~ZoneFile_COD9_PS3(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD9_PS3_H diff --git a/libs/zonefile/Wii/zonefile_cod4_wii.cpp b/libs/zonefile/Wii/zonefile_cod4_wii.cpp index d3d043f..0af01a7 100644 --- a/libs/zonefile/Wii/zonefile_cod4_wii.cpp +++ b/libs/zonefile/Wii/zonefile_cod4_wii.cpp @@ -15,1063 +15,47 @@ ZoneFile_COD4_Wii::~ZoneFile_COD4_Wii() } bool ZoneFile_COD4_Wii::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::BigEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD4_Wii::pParseZoneHeader(QDataStream *aZoneFileStream) { - quint32 size = pParseZoneSize(aZoneFileStream); - SetSize(size); - - aZoneFileStream->skipRawData(36); - - quint32 tagCount = pParseZoneTagCount(aZoneFileStream); - SetTagCount(tagCount - 1); - - pParseZoneUnknownsB(aZoneFileStream); - - quint32 recordCount = pParseZoneRecordCount(aZoneFileStream); - SetRecordCount(recordCount); - - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD4_Wii::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 40; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD4_Wii::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD4_Wii::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD4_Wii::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD4_Wii::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD4_Wii::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD4_Wii::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - *aZoneFileStream >> zoneTagChar; - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD4_Wii::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i < recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD4_Wii::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD4_Wii::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD4_Wii::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -void ZoneFile_COD4_Wii::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD4_Wii::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD4_Wii::pParseAsset_Material(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); - - return Material(); -} - -Shader ZoneFile_COD4_Wii::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD4_Wii::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD4_Wii::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD4_Wii::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD4_Wii::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_Wii::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_Wii::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_Wii::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_Wii::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_Wii::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_Wii::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_Wii::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD4_Wii::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD4_Wii::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD4_Wii::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD4_Wii::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD4_Wii::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD4_Wii::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD4_Wii::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_LOCAL_STRING; + return Utils::ASSET_LOCALIZE_ENTRY; } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD4_Wii::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/Wii/zonefile_cod4_wii.h b/libs/zonefile/Wii/zonefile_cod4_wii.h index 5f7d588..ad1f426 100644 --- a/libs/zonefile/Wii/zonefile_cod4_wii.h +++ b/libs/zonefile/Wii/zonefile_cod4_wii.h @@ -10,43 +10,7 @@ public: ~ZoneFile_COD4_Wii(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD4_WII_H diff --git a/libs/zonefile/Wii/zonefile_cod7_wii.cpp b/libs/zonefile/Wii/zonefile_cod7_wii.cpp index 19da359..465f3c4 100644 --- a/libs/zonefile/Wii/zonefile_cod7_wii.cpp +++ b/libs/zonefile/Wii/zonefile_cod7_wii.cpp @@ -15,1063 +15,48 @@ ZoneFile_COD7_Wii::~ZoneFile_COD7_Wii() } bool ZoneFile_COD7_Wii::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::BigEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - zoneFileStream.device()->seek(zoneFileStream.device()->pos() - 1); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD7_Wii::pParseZoneHeader(QDataStream *aZoneFileStream) { - quint32 size = pParseZoneSize(aZoneFileStream); - SetSize(size); - aZoneFileStream->skipRawData(36); - - quint32 tagCount = pParseZoneTagCount(aZoneFileStream); - SetTagCount(tagCount - 1); - - pParseZoneUnknownsB(aZoneFileStream); - - quint32 recordCount = pParseZoneRecordCount(aZoneFileStream); - SetRecordCount(recordCount); - - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD7_Wii::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD7_Wii::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD7_Wii::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD7_Wii::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD7_Wii::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD7_Wii::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD7_Wii::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD7_Wii::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD7_Wii::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD7_Wii::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD7_Wii::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -void ZoneFile_COD7_Wii::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD7_Wii::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD7_Wii::pParseAsset_Material(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); - - return Material(); -} - -Shader ZoneFile_COD7_Wii::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD7_Wii::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD7_Wii::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD7_Wii::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD7_Wii::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_Wii::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_Wii::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_Wii::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_Wii::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_Wii::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_Wii::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_Wii::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD7_Wii::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD7_Wii::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD7_Wii::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD7_Wii::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD7_Wii::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD7_Wii::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD7_Wii::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_LOCAL_STRING; + return Utils::ASSET_LOCALIZE_ENTRY; } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD7_Wii::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/Wii/zonefile_cod7_wii.h b/libs/zonefile/Wii/zonefile_cod7_wii.h index da140df..ccf6db2 100644 --- a/libs/zonefile/Wii/zonefile_cod7_wii.h +++ b/libs/zonefile/Wii/zonefile_cod7_wii.h @@ -10,43 +10,7 @@ public: ~ZoneFile_COD7_Wii(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD7_WII_H diff --git a/libs/zonefile/Wii/zonefile_cod8_wii.cpp b/libs/zonefile/Wii/zonefile_cod8_wii.cpp index 2585e96..ed42eb5 100644 --- a/libs/zonefile/Wii/zonefile_cod8_wii.cpp +++ b/libs/zonefile/Wii/zonefile_cod8_wii.cpp @@ -15,1063 +15,47 @@ ZoneFile_COD8_Wii::~ZoneFile_COD8_Wii() } bool ZoneFile_COD8_Wii::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::BigEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - zoneFileStream.device()->seek(zoneFileStream.device()->pos() - 1); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD8_Wii::pParseZoneHeader(QDataStream *aZoneFileStream) { - quint32 size = pParseZoneSize(aZoneFileStream); - SetSize(size); - - aZoneFileStream->skipRawData(36); - - quint32 tagCount = pParseZoneTagCount(aZoneFileStream); - SetTagCount(tagCount - 1); - - pParseZoneUnknownsB(aZoneFileStream); - - quint32 recordCount = pParseZoneRecordCount(aZoneFileStream); - SetRecordCount(recordCount); - - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD8_Wii::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD8_Wii::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD8_Wii::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD8_Wii::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD8_Wii::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD8_Wii::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD8_Wii::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD8_Wii::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD8_Wii::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD8_Wii::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD8_Wii::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -void ZoneFile_COD8_Wii::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD8_Wii::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD8_Wii::pParseAsset_Material(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); - - return Material(); -} - -Shader ZoneFile_COD8_Wii::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD8_Wii::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD8_Wii::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD8_Wii::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD8_Wii::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_Wii::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_Wii::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_Wii::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_Wii::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_Wii::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_Wii::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_Wii::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD8_Wii::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD8_Wii::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD8_Wii::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD8_Wii::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD8_Wii::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD8_Wii::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD8_Wii::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_LOCAL_STRING; + return Utils::ASSET_LOCALIZE_ENTRY; } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD8_Wii::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/Wii/zonefile_cod8_wii.h b/libs/zonefile/Wii/zonefile_cod8_wii.h index 14284e0..dd520c0 100644 --- a/libs/zonefile/Wii/zonefile_cod8_wii.h +++ b/libs/zonefile/Wii/zonefile_cod8_wii.h @@ -10,43 +10,7 @@ public: ~ZoneFile_COD8_Wii(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD8_WII_H diff --git a/libs/zonefile/WiiU/zonefile_cod10_wiiu.cpp b/libs/zonefile/WiiU/zonefile_cod10_wiiu.cpp index 8ec25a4..299f1e8 100644 --- a/libs/zonefile/WiiU/zonefile_cod10_wiiu.cpp +++ b/libs/zonefile/WiiU/zonefile_cod10_wiiu.cpp @@ -15,1058 +15,47 @@ ZoneFile_COD10_WiiU::~ZoneFile_COD10_WiiU() } bool ZoneFile_COD10_WiiU::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::BigEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD10_WiiU::pParseZoneHeader(QDataStream *aZoneFileStream) { - SetSize(pParseZoneSize(aZoneFileStream)); - pParseZoneUnknownsA(aZoneFileStream); - - SetTagCount(pParseZoneTagCount(aZoneFileStream)); - pParseZoneUnknownsB(aZoneFileStream); - - SetRecordCount(pParseZoneRecordCount(aZoneFileStream)); - - quint32 tagCount = GetTagCount(); - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD10_WiiU::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD10_WiiU::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD10_WiiU::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD10_WiiU::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD10_WiiU::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD10_WiiU::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD10_WiiU::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD10_WiiU::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD10_WiiU::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD10_WiiU::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD10_WiiU::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -void ZoneFile_COD10_WiiU::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD10_WiiU::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD10_WiiU::pParseAsset_Material(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); - - return Material(); -} - -Shader ZoneFile_COD10_WiiU::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD10_WiiU::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD10_WiiU::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD10_WiiU::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD10_WiiU::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_WiiU::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_WiiU::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_WiiU::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_WiiU::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_WiiU::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_WiiU::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_WiiU::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD10_WiiU::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD10_WiiU::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD10_WiiU::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD10_WiiU::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD10_WiiU::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD10_WiiU::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD10_WiiU::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_LOCAL_STRING; + return Utils::ASSET_LOCALIZE_ENTRY; } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD10_WiiU::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/WiiU/zonefile_cod10_wiiu.h b/libs/zonefile/WiiU/zonefile_cod10_wiiu.h index b51d706..2283fa2 100644 --- a/libs/zonefile/WiiU/zonefile_cod10_wiiu.h +++ b/libs/zonefile/WiiU/zonefile_cod10_wiiu.h @@ -10,43 +10,7 @@ public: ~ZoneFile_COD10_WiiU(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD10_WIIU_H diff --git a/libs/zonefile/WiiU/zonefile_cod9_wiiu.cpp b/libs/zonefile/WiiU/zonefile_cod9_wiiu.cpp index 100c0c6..e8d705c 100644 --- a/libs/zonefile/WiiU/zonefile_cod9_wiiu.cpp +++ b/libs/zonefile/WiiU/zonefile_cod9_wiiu.cpp @@ -15,1058 +15,47 @@ ZoneFile_COD9_WiiU::~ZoneFile_COD9_WiiU() } bool ZoneFile_COD9_WiiU::Load(const QByteArray aFileData) { - // Open zone file as little endian stream - QDataStream zoneFileStream(aFileData); - zoneFileStream.setByteOrder(QDataStream::BigEndian); - - // Parse data from zone file header - pParseZoneHeader(&zoneFileStream); - SetRecords(pParseZoneIndex(&zoneFileStream, GetRecordCount())); - SetAssetMap(pParseAssets(&zoneFileStream, GetRecords())); - return true; } -void ZoneFile_COD9_WiiU::pParseZoneHeader(QDataStream *aZoneFileStream) { - SetSize(pParseZoneSize(aZoneFileStream)); - pParseZoneUnknownsA(aZoneFileStream); - - SetTagCount(pParseZoneTagCount(aZoneFileStream)); - pParseZoneUnknownsB(aZoneFileStream); - - SetRecordCount(pParseZoneRecordCount(aZoneFileStream)); - - quint32 tagCount = GetTagCount(); - if (tagCount) { - pParseZoneUnknownsC(aZoneFileStream); - SetTags(pParseZoneTags(aZoneFileStream, tagCount)); - } else { - aZoneFileStream->skipRawData(4); - } -} - -quint32 ZoneFile_COD9_WiiU::pParseZoneSize(QDataStream *aZoneFileStream) { - quint32 zoneFileSize; - *aZoneFileStream >> zoneFileSize; - if (zoneFileSize <= 0) { - qDebug() << "Tried to open empty zone file!"; - exit(-1); - } - zoneFileSize += 36; - return zoneFileSize; -} - -/* - ParseZoneUnknownsA() - - Parses the 1st section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD9_WiiU::pParseZoneUnknownsA(QDataStream *aZoneFileStream) { - // Byte 4-7, 8-11, 12-15: unknown - QByteArray unknown1(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown1.data(), 4); - - QByteArray unknown2(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown2.data(), 4); - - QByteArray unknown3(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown3.data(), 4); - - // Byte 16-19, 20-23: empty/unknown - QByteArray unknown4(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown4.data(), 4); - - QByteArray unknown5(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown5.data(), 4); - - // Byte 24-27: somehow related to the filesize, but smaller value - QByteArray unknown6(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown6.data(), 4); - - // Byte 28-31, 32-35: unknown - QByteArray unknown7(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown7.data(), 4); - - QByteArray unknown8(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown8.data(), 4); -} - -/* - ParseZoneTagCount() - - Parses the number of string tags in the zone index -*/ -quint32 ZoneFile_COD9_WiiU::pParseZoneTagCount(QDataStream *aZoneFileStream) { - quint32 tagCount; - *aZoneFileStream >> tagCount; - return tagCount; -} - -/* - ParseZoneRecordCount() - - Parses the number of records in the zone index -*/ -quint32 ZoneFile_COD9_WiiU::pParseZoneRecordCount(QDataStream *aZoneFileStream) { - quint32 recordCount; - *aZoneFileStream >> recordCount; - return recordCount; -} - -/* - ParseZoneUnknownsB() - - Parses the 2nd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD9_WiiU::pParseZoneUnknownsB(QDataStream *aZoneFileStream) { - // Byte 44-47: Unknown/empty? - QByteArray unknown9(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown9.data(), 4); -} - -/* - pParseZoneUnknownsC() - - Parses the 3rd section of unknowns as hex vals and uint32s -*/ -void ZoneFile_COD9_WiiU::pParseZoneUnknownsC(QDataStream *aZoneFileStream) { - // Byte 40-43: Unknown/empty? - QByteArray unknown10(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown10.data(), 4); - - // Byte 44-47: Unknown/empty? - QByteArray unknown11(4, Qt::Uninitialized); - aZoneFileStream->readRawData(unknown11.data(), 4); -} - -/* - ParseZoneTags() - - Parses the string tags ate the start of zone file -*/ -QStringList ZoneFile_COD9_WiiU::pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) { - QStringList tags; - - // Byte 48-51: Repeated separators? ÿÿÿÿ x i - aZoneFileStream->skipRawData(4 * (tagCount - 1)); - - // Parse tags/strings before index - QString zoneTag; - char zoneTagChar; - for (quint32 i = 0; i < tagCount; i++) { - *aZoneFileStream >> zoneTagChar; - while (zoneTagChar != 0) { - zoneTag += zoneTagChar; - *aZoneFileStream >> zoneTagChar; - } - if (!zoneTag.isEmpty()) { tags << zoneTag; } - zoneTag.clear(); - } - return tags; -} - -/* - ParseZoneIndex() - - Parse the binary zone index data and populate table -*/ -QStringList ZoneFile_COD9_WiiU::pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) { - QStringList result; - - // Don't parse if no records - if (!recordCount) { return result; } - - if (aZoneFileStream->device()->peek(4).toHex().contains("ffff")) { - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 2); - } - - // Parse index & map found asset types - for (quint32 i = 0; i <= recordCount; i++) { - // Skip record start - QByteArray rawAssetType(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rawAssetType.data(), 4); - result << rawAssetType.toHex(); - - // Skip separator - aZoneFileStream->skipRawData(4); - } - return result; -} - -AssetMap ZoneFile_COD9_WiiU::pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) { - AssetMap result; - - aZoneFileStream->device()->seek(aZoneFileStream->device()->pos() - 8); - - for (int i = 0; i < assetOrder.size(); i++) { - const QString typeHex = assetOrder[i]; - const AssetType typeStr = AssetStrToEnum(typeHex); - - if (typeStr == ASSET_LOCAL_STRING) { // localized string asset - result.localStrings << pParseAsset_LocalString(aZoneFileStream); - } else if (typeStr == ASSET_RAW_FILE) { // gsc - auto rawFile = pParseAsset_RawFile(aZoneFileStream); - if (rawFile.length) { - result.rawFiles << rawFile; - } - } else if (typeStr == ASSET_PHYS_PRESET) { // physpreset - pParseAsset_PhysPreset(aZoneFileStream); - } else if (typeStr == ASSET_MODEL) { // xmodel - result.models << pParseAsset_Model(aZoneFileStream); - } else if (typeStr == ASSET_MATERIAL) { // material - pParseAsset_Material(aZoneFileStream); - } else if (typeStr == ASSET_SHADER) { // pixelshader - pParseAsset_Shader(aZoneFileStream); - } else if (typeStr == ASSET_TECH_SET) { // techset include - result.techSets << pParseAsset_TechSet(aZoneFileStream); - } else if (typeStr == ASSET_IMAGE) { // image - result.images << pParseAsset_Image(aZoneFileStream); - } else if (typeStr == ASSET_SOUND) { // loaded_sound - result.sounds << pParseAsset_Sound(aZoneFileStream); - } else if (typeStr == ASSET_COLLISION_MAP) { // col_map_mp - pParseAsset_ColMapMP(aZoneFileStream); - } else if (typeStr == ASSET_MP_MAP) { // game_map_sp - pParseAsset_GameMapSP(aZoneFileStream); - } else if (typeStr == ASSET_SP_MAP) { // game_map_mp - pParseAsset_GameMapMP(aZoneFileStream); - } else if (typeStr == ASSET_LIGHT_DEF) { // lightdef - pParseAsset_LightDef(aZoneFileStream); - } else if (typeStr == ASSET_UI_MAP) { // ui_map - pParseAsset_UIMap(aZoneFileStream); - } else if (typeStr == ASSET_SND_DRIVER_GLOBALS) { // snddriverglobals - pParseAsset_SNDDriverGlobals(aZoneFileStream); - } else if (typeStr == ASSET_AI_TYPE) { // aitype - pParseAsset_AIType(aZoneFileStream); - } else if (typeStr == ASSET_EFFECT) { // aitype - pParseAsset_FX(aZoneFileStream); - } else if (typeStr == ASSET_ANIMATION) { // aitype - result.animations << pParseAsset_Animation(aZoneFileStream); - } else if (typeStr == ASSET_STRING_TABLE) { // string_table - result.stringTables << pParseAsset_StringTable(aZoneFileStream); - } else if (typeStr == ASSET_MENU) { // string_table - result.menuFiles << pParseAsset_MenuFile(aZoneFileStream); - } else if (typeStr == ASSET_WEAPON) { // string_table - pParseAsset_Weapon(aZoneFileStream); - } else if (typeStr == ASSET_D3DBSP) { // string_table - pParseAsset_D3DBSP(aZoneFileStream); - } - } - return result; -} - -LocalString ZoneFile_COD9_WiiU::pParseAsset_LocalString(QDataStream *aZoneFileStream) { - LocalString result; - - quint32 stringPtr, aliasPtr; - *aZoneFileStream >> stringPtr >> aliasPtr; - if (stringPtr == 4294967295) { - // Parse local string asset contents - QString localStr; - char localStrChar; - *aZoneFileStream >> localStrChar; - while (localStrChar != 0) { - result.string += localStrChar; - *aZoneFileStream >> localStrChar; - } - } else { - result.string = "String Ptr: " + QString::number(stringPtr); - } - - if (aliasPtr == 4294967295) { - // Parse rawfile name - QString aliasName; - char aliasNameChar; - *aZoneFileStream >> aliasNameChar; - while (aliasNameChar != 0) { - result.alias += aliasNameChar; - *aZoneFileStream >> aliasNameChar; - } - } else { - result.string = "Alias Ptr: " + QString::number(aliasPtr); - } - - return result; -} - -RawFile ZoneFile_COD9_WiiU::pParseAsset_RawFile(QDataStream *aZoneFileStream) { - RawFile result; - - // Skip start separator FF FF FF FF (pointer?) - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.length; - - // Skip unknown 4 byte data - aZoneFileStream->skipRawData(4); - - // Parse rawfile path - char scriptPathChar; - *aZoneFileStream >> scriptPathChar; - while (scriptPathChar != 0) { - result.path += scriptPathChar; - *aZoneFileStream >> scriptPathChar; - } - result.path.replace(",", ""); - const QStringList pathParts = result.path.split('/'); - if (pathParts.size() == 0) { - qDebug() << "Failed to parse ff path! " << result.path; - exit(-1); - } - - // Parse gsc contents - char rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - while (rawFileContentsChar != 0 && rawFileContentsChar != -1) { - result.contents += rawFileContentsChar; - *aZoneFileStream >> rawFileContentsChar; - } - return result; -} - -void ZoneFile_COD9_WiiU::pParseAsset_PhysPreset(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Model ZoneFile_COD9_WiiU::pParseAsset_Model(QDataStream *aZoneFileStream) { - Model result; - - *aZoneFileStream >> result.namePtr >> result.tagCount >> result.rootTagCount - >> result.surfCount >> result.unknownCount >> result.boneNamePtr - >> result.parentListPtr >> result.quatsPtr >> result.transPtr - >> result.partClassPtr >> result.baseMatPtr - >> result.surfsPtr >> result.materialHandlesPtr; - - // Parse XModelLodInfo - for (int i = 1; i <= 4; i++) { - quint32 intDist; - *aZoneFileStream >> intDist; - - std::memcpy(&result.lodInfo[i].dist, &intDist, sizeof(result.lodInfo[i].dist)); - *aZoneFileStream >> result.lodInfo[i].numsurfs >> result.lodInfo[i].surfIndex; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.lodInfo[i].partBits[0] - >> result.lodInfo[i].partBits[1] - >> result.lodInfo[i].partBits[2] - >> result.lodInfo[i].partBits[3]; - } - - *aZoneFileStream >> result.collSurfsPtr >> result.numCollSurfs >> result.contents >> result.boneInfoPtr; - - quint32 intRadius, intMins[3], intMaxs[3]; - *aZoneFileStream >> intRadius >> intMins[0] >> intMins[1] - >> intMins[2] >> intMaxs[0] >> intMaxs[1] >> intMaxs[2]; - - std::memcpy(&result.radius, &intRadius, sizeof(result.radius)); - - std::memcpy(&result.mins[0], &intMins[0], sizeof(result.mins[0])); - std::memcpy(&result.mins[1], &intMins[1], sizeof(result.mins[1])); - std::memcpy(&result.mins[2], &intMins[2], sizeof(result.mins[2])); - - std::memcpy(&result.maxs[0], &intMaxs[0], sizeof(result.maxs[0])); - std::memcpy(&result.maxs[1], &intMaxs[1], sizeof(result.maxs[2])); - std::memcpy(&result.maxs[2], &intMaxs[2], sizeof(result.maxs[3])); - - *aZoneFileStream >> result.numLods >> result.collLod >> result.streamInfoPtr - >> result.memUsage >> result.flags >> result.physPresetPtr >> result.physGeomsPtr; - - // Parse model name - char modelNameChar; - *aZoneFileStream >> modelNameChar; - while (modelNameChar == 0) { - *aZoneFileStream >> modelNameChar; - } - while (modelNameChar != 0) { - result.modelName += modelNameChar; - *aZoneFileStream >> modelNameChar; - } - return result; -} - -Material ZoneFile_COD9_WiiU::pParseAsset_Material(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); - - return Material(); -} - -Shader ZoneFile_COD9_WiiU::pParseAsset_Shader(QDataStream *aZoneFileStream) { - Shader result = Shader(); - - quint8 minorVersion, majorVersion; - *aZoneFileStream >> minorVersion >> majorVersion; - - quint32 magic; - *aZoneFileStream >> magic; - - // Verify .fxc magic - if (magic != 65534 && magic != 65535) { return result; } - - SHADER_TYPE type = SHADER_NONE; - quint16 rawShaderType; - *aZoneFileStream >> rawShaderType; - if (rawShaderType == 65535) { // Pixel shader - type = SHADER_PIXEL; - } else if (rawShaderType == 65534) { // Vertex shader - type = SHADER_VERTEX; - } - Q_UNUSED(type); - - while (true) { - quint32 instructionToken; - *aZoneFileStream >> instructionToken; - - SHADER_OPCODE opCode = (SHADER_OPCODE)(instructionToken & 0xffff); - - int size; - if (opCode == OPCODE_End) { - break; - } else if (opCode == OPCODE_Comment) { - size = (int)((instructionToken >> 16) & 0x7FFF); - } else { - size = (int)((instructionToken >> 24) & 0x0f); - } - Q_UNUSED(size); - } - - - return result; -} - -TechSet ZoneFile_COD9_WiiU::pParseAsset_TechSet(QDataStream *aZoneFileStream) { - TechSet result; - - for (int i = 1; i <= 62; i++) { - quint32 ptr; - *aZoneFileStream >> ptr; - - result.pointers << ptr; - } - qDebug() << aZoneFileStream->device()->pos(); - - // Parse techset name - char techSetNameChar; - *aZoneFileStream >> techSetNameChar; - while (techSetNameChar != 0) { - result.name += techSetNameChar; - *aZoneFileStream >> techSetNameChar; - } - result.name.replace(",", ""); - - return result; -} - -Image ZoneFile_COD9_WiiU::pParseAsset_Image(QDataStream *aZoneFileStream) { - Image result; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknowna >> result.unknownb - >> result.unknownc >> result.unknownd - >> result.unknowne >> result.unknownf - >> result.unknowng; - - aZoneFileStream->skipRawData(15 * 4); - *aZoneFileStream >> result.unknownh >> result.unknowni; - - aZoneFileStream->skipRawData(4); - *aZoneFileStream >> result.unknownj; - - aZoneFileStream->skipRawData(4); - - char materialNameChar; - *aZoneFileStream >> materialNameChar; - while (materialNameChar != 0) { - result.materialName += materialNameChar; - *aZoneFileStream >> materialNameChar; - } - result.materialName.replace(",", ""); - - if (result.unknowna) { - *aZoneFileStream >> result.unknownk; - *aZoneFileStream >> result.unknownl; - *aZoneFileStream >> result.unknownm; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown1; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.unknown2 >> result.unknown3 - >> result.size1 >> result.size2 - >> result.unknown4 >> result.unknown5; - - aZoneFileStream->skipRawData(4); - - char imageNameChar; - *aZoneFileStream >> imageNameChar; - while (imageNameChar != 0) { - result.name += imageNameChar; - *aZoneFileStream >> imageNameChar; - } - - *aZoneFileStream >> result.unknown6 >> result.unknown7; - - QByteArray compressionData(8, Qt::Uninitialized); - aZoneFileStream->readRawData(compressionData.data(), 8); - if (compressionData.contains("DXT1")) { - result.compression = COMPRESSION_DXT1; - } else if (compressionData.contains("DXT3")) { - result.compression = COMPRESSION_DXT3; - } else if (compressionData.contains("DXT5")) { - result.compression = COMPRESSION_DXT5; - } else { - result.compression = COMPRESSION_NONE; - } - - *aZoneFileStream >> result.unknown8 >> result.unknown9; - } - - return result; -} - -SoundAsset ZoneFile_COD9_WiiU::pParseAsset_Sound(QDataStream *aZoneFileStream) { - SoundAsset result; - - qDebug() << aZoneFileStream->device()->pos(); - - QByteArray rootNamePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(rootNamePtr.data(), 4); - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream >> result.count; - - if (rootNamePtr.toHex() == "ffffffff") { - // Read in sound file name - char soundNameChar; - *aZoneFileStream >> soundNameChar; - while (soundNameChar != 0) { - result.name += soundNameChar; - *aZoneFileStream >> soundNameChar; - } - } - - int tagCount = 0; - int resultCount = 0; - for (quint32 i = 0; i < result.count; i++) { - aZoneFileStream->skipRawData(12); - - QByteArray tagPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(tagPtr.data(), 4); - - if (tagPtr.toHex() == "ffffffff") { - tagCount++; - } - aZoneFileStream->skipRawData(4); - - QByteArray pathPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pathPtr.data(), 4); - - if (pathPtr.toHex() == "ffffffff") { - resultCount++; - } - - aZoneFileStream->skipRawData(160); - } - - for (int i = 0; i < tagCount; i++) { - // Read in tag? - QString tag; - char tagChar; - *aZoneFileStream >> tagChar; - while (tagChar != 0) { - tag += tagChar; - *aZoneFileStream >> tagChar; - } - } - - for (int i = 0; i < resultCount; i++) { - Sound sound; - - if (aZoneFileStream->device()->peek(12).toHex().contains("ffffffff00000000")) { - aZoneFileStream->skipRawData(12); - } - - aZoneFileStream->skipRawData(8); - - QByteArray aliasPtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(aliasPtr.data(), 4); - - QByteArray namePtr(4, Qt::Uninitialized); - aZoneFileStream->readRawData(namePtr.data(), 4); - - *aZoneFileStream >> sound.dataLength; - - if (aliasPtr.toHex() == "ffffffff") { - // Read in sound alias name - char soundAliasChar; - *aZoneFileStream >> soundAliasChar; - while (soundAliasChar != 0) { - sound.alias += soundAliasChar; - *aZoneFileStream >> soundAliasChar; - } - } - - if (aZoneFileStream->device()->peek(4) == "RIFF") { - sound.path = sound.alias; - sound.alias = ""; - } else if (namePtr.toHex() == "ffffffff") { - // Read in sound file path - char soundPathChar; - *aZoneFileStream >> soundPathChar; - while (soundPathChar != 0) { - sound.path += soundPathChar; - *aZoneFileStream >> soundPathChar; - } - sound.path.replace(",", ""); - } - - if (sound.dataLength) { - QByteArray data(sound.dataLength, Qt::Uninitialized); - aZoneFileStream->readRawData(data.data(), sound.dataLength); - sound.data = data; - } - result.sounds.append(sound); - } - - return result; -} - -void ZoneFile_COD9_WiiU::pParseAsset_ColMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_WiiU::pParseAsset_GameMapSP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_WiiU::pParseAsset_GameMapMP(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_WiiU::pParseAsset_LightDef(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_WiiU::pParseAsset_UIMap(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_WiiU::pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_WiiU::pParseAsset_AIType(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_WiiU::pParseAsset_FX(QDataStream *aZoneFileStream) { - Q_UNUSED(aZoneFileStream); -} - -Animation ZoneFile_COD9_WiiU::pParseAsset_Animation(QDataStream *aZoneFileStream) { - Animation result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.dataByteCount - >> result.dataShortCount - >> result.dataIntCount - >> result.randomDataByteCount - >> result.randomDataIntCount - >> result.numframes - >> result.isLooped - >> result.isDelta - >> result.noneRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.twoDRotatedBoneCount - >> result.normalRotatedBoneCount - >> result.normalTranslatedBoneCount - >> result.preciseTranslatedBoneCount - >> result.staticTranslatedBoneCount - >> result.noneTranslatedBoneCount - >> result.totalBoneCount - >> result.otherBoneCount1 - >> result.otherBoneCount2 - >> result.notifyCount - >> result.assetType - >> result.pad - >> result.randomDataShortCount - >> result.indexCount - >> result.frameRate - >> result.frequency - >> result.boneIDsPtr - >> result.dataBytePtr - >> result.dataShortPtr - >> result.dataIntPtr - >> result.randomDataShortPtr - >> result.randomDataBytePtr - >> result.randomDataIntPtr - >> result.longIndiciesPtr - >> result.notificationsPtr - >> result.deltaPartsPtr; - - // Read in x_anim file name - QString xAnimName; - char xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - while (xAnimNameChar != 0) { - result.name += xAnimNameChar; - *aZoneFileStream >> xAnimNameChar; - } - - // Parse x_anim index header - QVector sectionLengths; - for (int i = 0; i < result.numframes; i++) { - quint8 sectionlength; - *aZoneFileStream >> sectionlength; - sectionLengths.push_back(sectionlength); - // Skip padding - aZoneFileStream->skipRawData(1); - } - // Skip unknown section - aZoneFileStream->skipRawData(2 * 8); - - return result; -} - -MenuFile ZoneFile_COD9_WiiU::pParseAsset_MenuFile(QDataStream *aZoneFileStream) { - //MENU_FILE - MenuFile result; - - aZoneFileStream->skipRawData(4); // Separator - - // Parse menu def count - *aZoneFileStream >> result.menuCount; - - // Clearly misparsed, never have this much - if (result.menuCount > 1000) { - qDebug() << "Failure reported when parsing menu file."; - return result; - } - for (uint i = 0; i < result.menuCount; i++) { - Menu menu; - - aZoneFileStream->skipRawData(4); // Separator - - // Read in x_anim file name - char menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - while (menuFilepathChar != 0) { - menu.filePath += menuFilepathChar; - *aZoneFileStream >> menuFilepathChar; - } - aZoneFileStream->skipRawData(4); // Separator - - *aZoneFileStream >> menu.menuNamePtr; - - float menuRectX, menuRectY, menuRectWidth, menuRectHeight; - *aZoneFileStream >> menuRectX >> menuRectY >> menuRectWidth >> menuRectHeight; - menu.rect = QRectF(menuRectX, menuRectY, menuRectWidth, menuRectHeight); - - quint32 hAlignInt, vAlignInt; - *aZoneFileStream >> hAlignInt >> vAlignInt; - menu.hAlign = (MENU_H_ALIGNMENT)hAlignInt; - menu.vAlign = (MENU_V_ALIGNMENT)vAlignInt; - - float rectClientX, rectClientY, rectClientWidth, rectClientHeight; - *aZoneFileStream >> rectClientX >> rectClientY >> rectClientWidth >> rectClientHeight; - menu.clientRect = QRectF(rectClientX, rectClientY, rectClientWidth, rectClientHeight); - - quint32 hClientAlignInt, vClientAlignInt, styleInt, borderInt; - *aZoneFileStream >> hClientAlignInt >> vClientAlignInt >> menu.groupPtr - >> styleInt >> borderInt >> menu.ownerDraw >> menu.ownerDrawFlags - >> menu.borderSize >> menu.staticFlags >> menu.dynamicFlags >> menu.nextTime; - menu.hClientAlign = (MENU_H_ALIGNMENT)hClientAlignInt; - menu.vClientAlign = (MENU_V_ALIGNMENT)vClientAlignInt; - menu.style = (MENU_WINDOW_STYLE)styleInt; - menu.border = (MENU_WINDOW_BORDER)borderInt; - - float foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA, - backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA, - borderColorR, borderColorG, borderColorB, borderColorA, - outlineColorR, outlineColorG, outlineColorB, outlineColorA; - *aZoneFileStream >> foregroundColorR >> foregroundColorG >> foregroundColorB >> foregroundColorA - >> backgroundColorR >> backgroundColorG >> backgroundColorB >> backgroundColorA - >> borderColorR >> borderColorG >> borderColorB >> borderColorA - >> outlineColorR >> outlineColorG >> outlineColorB >> outlineColorA; - - menu.foregroundColor = QColor(foregroundColorR, foregroundColorG, foregroundColorB, foregroundColorA); - menu.backgroundColor = QColor(backgroundColorR, backgroundColorG, backgroundColorB, backgroundColorA); - menu.borderColor = QColor(borderColorR, borderColorG, borderColorB, borderColorA); - menu.outlineColor = QColor(outlineColorR, outlineColorG, outlineColorB, outlineColorA); - - *aZoneFileStream >> menu.materialPtr >> menu.fontPtr >> menu.fullScreen >> menu.itemCount - >> menu.fontIndex >> menu.cursorItem >> menu.fadeCycle >> menu.fadeClamp - >> menu.fadeAmount >> menu.fadeInAmount >> menu.blurRadius >> menu.onOpenPtr - >> menu.onFocusPtr >> menu.onClosePtr >> menu.onESCPtr >> menu.onKeyPtr - >> menu.visibleExpCount >> menu.expEntryPtr >> menu.allowedBindingPtr - >> menu.soundNamePtr >> menu.imageTrack; - - float focusColorR, focusColorG, focusColorB, focusColorA, - disabledColorR, disabledColorG, disabledColorB, disabledColorA; - *aZoneFileStream >> focusColorR >> focusColorG >> focusColorB >> focusColorA - >> disabledColorR >> disabledColorG >> disabledColorB >> disabledColorA; - menu.focusColor = QColor(focusColorR, focusColorG, focusColorB, focusColorA); - menu.disabledColor = QColor(disabledColorR, disabledColorG, disabledColorB, disabledColorA); - - *aZoneFileStream >> menu.rectXExpCount >> menu.rectXExpPtr >> menu.rectYExpCount >> menu.rectYExpPtr; - - aZoneFileStream->skipRawData(4); // Separator - - char menuDefNameChar; - int menuDefNameLen = 0; - *aZoneFileStream >> menuDefNameChar; - while (menuDefNameChar != 0 && menuDefNameLen < 30) { - menuDefNameLen++; - menu.name += menuDefNameChar; - *aZoneFileStream >> menuDefNameChar; - } - - char defStringChar; - int defStringLen = 0; - *aZoneFileStream >> defStringChar; - while (defStringChar != 0 && defStringLen < 30) { - defStringLen++; - menu.definition += defStringChar; - *aZoneFileStream >> defStringChar; - } - aZoneFileStream->skipRawData(4 * 10); - - *aZoneFileStream >> menu.itemWindowDefNamePtr; - - float itemRectX, itemRectY, itemRectWidth, itemRectHeight; - *aZoneFileStream >> itemRectX >> itemRectY >> itemRectWidth >> itemRectHeight; - menu.itemRect = QRectF(itemRectX, itemRectY, itemRectWidth, itemRectHeight); - - *aZoneFileStream >> menu.itemHAlignment >> menu.itemVAlignment >> menu.itemGroupPtr - >> menu.itemWindowStyle >> menu.itemWindowBorder >> menu.itemOwnerDraw - >> menu.itemOwnerDrawFlags >> menu.itemBorderSize >> menu.itemStaticFlags - >> menu.itemDynamicFlags >> menu.itemNextTime; - - float itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA, - itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA, - itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA, - itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA; - *aZoneFileStream >> itemForegroundColorR >> itemForegroundColorG >> itemForegroundColorB >> itemForegroundColorA - >> itemBackgroundColorR >> itemBackgroundColorG >> itemBackgroundColorB >> itemBackgroundColorA - >> itemBorderColorR >> itemBorderColorG >> itemBorderColorB >> itemBorderColorA - >> itemOutlineColorR >> itemOutlineColorG >> itemOutlineColorB >> itemOutlineColorA; - - menu.itemForegroundColor = QColor(itemForegroundColorR, itemForegroundColorG, itemForegroundColorB, itemForegroundColorA); - menu.itemBackgroundColor = QColor(itemBackgroundColorR, itemBackgroundColorG, itemBackgroundColorB, itemBackgroundColorA); - menu.itemBorderColor = QColor(itemBorderColorR, itemBorderColorG, itemBorderColorB, itemBorderColorA); - menu.itemOutlineColor = QColor(itemOutlineColorR, itemOutlineColorG, itemOutlineColorB, itemOutlineColorA); - - *aZoneFileStream >> menu.itemMaterialPtr; - - float itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight; - *aZoneFileStream >> itemTextRectX >> itemTextRectY >> itemTextRectWidth >> itemTextRectHeight; - menu.itemTextRect = QRectF(itemTextRectX, itemTextRectY, itemTextRectWidth, itemTextRectHeight); - - quint32 hItemTextAlignInt, vItemTextAlignInt, itemType, fontTypeInt, textStyleInt; - *aZoneFileStream >> hItemTextAlignInt >> vItemTextAlignInt >> itemType >> menu.dataType - >> menu.alignment >> fontTypeInt >> menu.textAlignMode >> menu.textalignx >> menu.textaligny - >> menu.textscale >> textStyleInt >> menu.gameMsgWindowIndex >> menu.gameMsgWindowMode - >> menu.testPtr >> menu.textSavegameInfo >> menu.parentPtr; - menu.itemText_hAlign = (MENU_H_ALIGNMENT)hItemTextAlignInt; - menu.itemText_vAlign = (MENU_V_ALIGNMENT)vItemTextAlignInt; - menu.itemType = (MENU_ITEM_TYPE)itemType; - menu.fontEnum = (MENU_FONT_TYPE)fontTypeInt; - menu.textStyle = (MENU_ITEM_TEXTSTYLE)textStyleInt; - - *aZoneFileStream >> menu.mouseEnterText >> menu.mouseExitText >> menu.mouseEnter >> menu.mouseExit - >> menu.action >> menu.onAccept >> menu.onFocus >> menu.leaveFocus >> menu.dvar >> menu.dvarTest - >> menu.keyHandlerPtr >> menu.enableDvarPtr >> menu.dvarFlags >> menu.focusSoundPtr - >> menu.special >> menu.cursorPos; - - // itemDefData_t typeData; - - // listBoxDef_s *listBox; - - *aZoneFileStream >> menu.startPos >> menu.endPos >> menu.drawPadding; - - *aZoneFileStream >> menu.elementWidth >> menu.elementHeight; - - *aZoneFileStream >> menu.elementStyle >> menu.numColumns; - - //columnInfo_s columnInfo[16]; - - *aZoneFileStream >> menu.doubleClickPtr; - - - *aZoneFileStream >> menu.notselectable >> menu.noScrollBars >> menu.usePaging; - - float itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA, - itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA, - itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA; - *aZoneFileStream >> itemSelectBorderColorR >> itemSelectBorderColorG >> itemSelectBorderColorB >> itemSelectBorderColorA - >> itemDisableColorR >> itemDisableColorG >> itemDisableColorB >> itemDisableColorA - >> itemFocusColorR >> itemFocusColorG >> itemFocusColorB >> itemFocusColorA; - menu.itemSelectBorderColor = QColor(itemSelectBorderColorR, itemSelectBorderColorG, itemSelectBorderColorB, itemSelectBorderColorA); - menu.itemDisableColor = QColor(itemDisableColorR, itemDisableColorG, itemDisableColorB, itemDisableColorA); - menu.itemFocusColor = QColor(itemFocusColorR, itemFocusColorG, itemFocusColorB, itemFocusColorA); - - *aZoneFileStream >> menu.selectIconPtr >> menu.backgroundItemListboxPtr >> menu.highlightTexturePtr; - - // editFieldDef_s *editField; - - *aZoneFileStream >> menu.minVal >> menu.maxVal >> menu.defVal >> menu.range >> menu.maxChars - >> menu.maxCharsGotoNext >> menu.maxPaintChars >> menu.paintOffset; - - // multiDef_s *multi; - - for (int i = 0; i < 32; i++) { - quint32 dvarList; - *aZoneFileStream >> dvarList; - menu.dvarListPtrs.push_back(dvarList); - } - - for (int i = 0; i < 32; i++) { - quint32 dvarStr; - *aZoneFileStream >> dvarStr; - menu.dvarStrPtrs.push_back(dvarStr); - } - - for (int i = 0; i < 32; i++) { - float dvarValue; - *aZoneFileStream >> dvarValue; - menu.dvarValues.push_back(dvarValue); - } - - *aZoneFileStream >> menu.count >> menu.strDef >> menu.enumDvarNamePtr; - aZoneFileStream->skipRawData(4); - //>> menu.dataPtr - *aZoneFileStream >> menu.itemImageTrack; - - qDebug() << aZoneFileStream->device()->pos(); - - //statement_s visibleExp; - //statement_s textExp; - //statement_s materialExp; - //statement_s rectXExp; - //statement_s rectYExp; - //statement_s rectWExp; - //statement_s rectHExp; - //statement_s foreColorAExp; - result.menuDefs << menu; - } - return result; -} - -void ZoneFile_COD9_WiiU::pParseAsset_Weapon(QDataStream *aZoneFileStream) { - //WEAPON_FILE - Q_UNUSED(aZoneFileStream); -} - -void ZoneFile_COD9_WiiU::pParseAsset_D3DBSP(QDataStream *aZoneFileStream) { - //D3DBSP_DUMP - Q_UNUSED(aZoneFileStream); -} - -StringTable ZoneFile_COD9_WiiU::pParseAsset_StringTable(QDataStream *aZoneFileStream) { - StringTable result; - - aZoneFileStream->skipRawData(4); - - *aZoneFileStream - >> result.columnCount - >> result.rowCount; - - // Todo fix this - result.columnCount = 0; - result.rowCount = 0; - - aZoneFileStream->skipRawData(4); - - QString stringTableName; - char stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - while (stringTableNameChar != 0) { - result.name += stringTableNameChar; - *aZoneFileStream >> stringTableNameChar; - } - - for (quint32 i = 0; i < result.rowCount; i++) { - QByteArray pointerData(4, Qt::Uninitialized); - aZoneFileStream->readRawData(pointerData.data(), 4); - result.tablePointers.push_back(pointerData.toHex()); - - aZoneFileStream->skipRawData(4); - } - - for (const QString &pointerAddr : result.tablePointers) { - QString leadingContent = ""; - if (pointerAddr == "FFFFFFFF") { - char leadingContentChar; - *aZoneFileStream >> leadingContentChar; - while (leadingContentChar != 0) { - leadingContent += leadingContentChar; - *aZoneFileStream >> leadingContentChar; - } - } else { - leadingContent = pointerAddr; - } - - QString content; - char contentChar; - *aZoneFileStream >> contentChar; - while (contentChar != 0) { - content += contentChar; - *aZoneFileStream >> contentChar; - } - result.content[leadingContent] = content; - } - return result; -} - -AssetType ZoneFile_COD9_WiiU::AssetStrToEnum(const QString aAssetType) { +Utils::AssetType ZoneFile_COD9_WiiU::AssetStrToEnum(const QString aAssetType) { const QString cleanedType = aAssetType.toUpper(); if (cleanedType == "17000000") { // localized string PARTIALLY VERIFIED - return ASSET_LOCAL_STRING; + return Utils::ASSET_LOCALIZE_ENTRY; } else if (cleanedType == "20000000") { // raw_file PARTIALLY VERIFIED - return ASSET_RAW_FILE; + return Utils::ASSET_RAWFILE; } else if (cleanedType == "1A000000") { // fx PARTIALLY VERIFIED - return ASSET_EFFECT; + return Utils::ASSET_FX; } else if (cleanedType == "09000000") { // loaded_sound PARTIALLY VERIFIED - return ASSET_SOUND; + return Utils::ASSET_SOUND; } else if (cleanedType == "04000000") { // x_anim PARTIALLY VERIFIED - return ASSET_ANIMATION; + return Utils::ASSET_Animation; } else if (cleanedType == "0C000000") { // collision_map PARTIALLY VERIFIED - return ASSET_COLLISION_MAP; + return Utils::ASSET_COLLISION_MAP; } else if (cleanedType == "21000000") { // string_table PARTIALLY VERIFIED - return ASSET_STRING_TABLE; + return Utils::ASSET_STRINGTABLE; } else if (cleanedType == "15000000") { // menu_file PARTIALLY VERIFIED - return ASSET_MENU; + return Utils::ASSET_MENU; } else if (cleanedType == "07000000") { // tech set PARTIALLY VERIFIED - return ASSET_TECH_SET; + return Utils::ASSET_TECHNIQUE_SET; } else if (cleanedType == "18000000") { // weapon PARTIALLY VERIFIED - return ASSET_WEAPON; + return Utils::ASSET_WEAPON; } else if (cleanedType == "11000000") { // gfx map PARTIALLY VERIFIED - return ASSET_GFX_MAP; + return Utils::ASSET_GFX_MAP; } else if (cleanedType == "12000000") { // light_def PARTIALLY VERIFIED - return ASSET_LIGHT_DEF; + return Utils::ASSET_LIGHT_DEF; } else if (cleanedType == "14000000") { // font PARTIALLY VERIFIED - return ASSET_FONT; + return Utils::ASSET_FONT; } else if (cleanedType == "05000000") { // xmodel PARTIALLY VERIFIED - return ASSET_MODEL; + return Utils::ASSET_XMODEL; } else if (cleanedType == "0D000000") { // d3dbsp PARTIALLY VERIFIED - return ASSET_D3DBSP; + return Utils::ASSET_D3DBSP; } else if (cleanedType == "06000000") { // image PARTIALLY VERIFIED - return ASSET_IMAGE; + return Utils::ASSET_IMAGE; } else if (cleanedType == "0E000000") { // game map sp PARTIALLY VERIFIED - return ASSET_GAME_MAP_SP; + return Utils::ASSET_GAME_MAP_SP; } else if (cleanedType == "0B000000") { // col map sp PARTIALLY VERIFIED - return ASSET_COL_MAP_SP; + return Utils::ASSET_COL_MAP_SP; } - return ASSET_NONE; -} - -QByteArray ZoneFile_COD9_WiiU::GetBinaryData() { - QByteArray result; - - return result; + return Utils::ASSET_NONE; } diff --git a/libs/zonefile/WiiU/zonefile_cod9_wiiu.h b/libs/zonefile/WiiU/zonefile_cod9_wiiu.h index a69625b..0a9b5cc 100644 --- a/libs/zonefile/WiiU/zonefile_cod9_wiiu.h +++ b/libs/zonefile/WiiU/zonefile_cod9_wiiu.h @@ -10,43 +10,7 @@ public: ~ZoneFile_COD9_WiiU(); bool Load(const QByteArray aFileData) override; - AssetType AssetStrToEnum(const QString aAssetType) override; - - QByteArray GetBinaryData() override; - -protected: - void pParseZoneHeader(QDataStream *aZoneFileStream) override; - quint32 pParseZoneSize(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsA(QDataStream *aZoneFileStream) override; - quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) override; - quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsB(QDataStream *aZoneFileStream) override; - void pParseZoneUnknownsC(QDataStream *aZoneFileStream) override; - QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) override; - QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) override; - AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) override; - LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) override; - RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) override; - void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) override; - Model pParseAsset_Model(QDataStream *aZoneFileStream) override; - Material pParseAsset_Material(QDataStream *aZoneFileStream) override; - Shader pParseAsset_Shader(QDataStream *aZoneFileStream) override; - TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) override; - Image pParseAsset_Image(QDataStream *aZoneFileStream) override; - SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) override; - void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) override; - void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) override; - void pParseAsset_LightDef(QDataStream *aZoneFileStream) override; - void pParseAsset_UIMap(QDataStream *aZoneFileStream) override; - void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) override; - void pParseAsset_AIType(QDataStream *aZoneFileStream) override; - void pParseAsset_FX(QDataStream *aZoneFileStream) override; - Animation pParseAsset_Animation(QDataStream *aZoneFileStream) override; - MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) override; - void pParseAsset_Weapon(QDataStream *aZoneFileStream) override; - void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) override; - StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) override; + Utils::AssetType AssetStrToEnum(const QString aAssetType) override; }; #endif // ZONEFILE_COD9_H diff --git a/libs/zonefile/zonefile.cpp b/libs/zonefile/zonefile.cpp index ded7694..c52fb21 100644 --- a/libs/zonefile/zonefile.cpp +++ b/libs/zonefile/zonefile.cpp @@ -1,6 +1,4 @@ #include "zonefile.h" -#include "utils.h" -#include "logmanager.h" #include #include @@ -44,357 +42,6 @@ ZoneFile &ZoneFile::operator=(const ZoneFile &other) { return *this; } -QString ZoneFile::AssetEnumToStr(const AssetType aAssetType) -{ - if (aAssetType == ASSET_LOCAL_STRING) { - return "LOCAL_STRING"; - } else if (aAssetType == ASSET_RAW_FILE) { - return "RAW_FILE"; - } else if (aAssetType == ASSET_SCRIPT_PARSE_TREE) { - return "GSC_FILE"; - } else if (aAssetType == ASSET_EFFECT) { - return "EFFECT"; - } else if (aAssetType == ASSET_SOUND) { - return "SOUND"; - } else if (aAssetType == ASSET_ANIMATION) { - return "ANIMATION"; - } else if (aAssetType == ASSET_COLLISION_MAP) { - return "COLLISION_MAP"; - } else if (aAssetType == ASSET_STRING_TABLE) { - return "STRING_TABLE"; - } else if (aAssetType == ASSET_MENU) { - return "MENU"; - } else if (aAssetType == ASSET_TECH_SET) { - return "TECH_SET"; - } else if (aAssetType == ASSET_WEAPON) { - return "WEAPON"; - } else if (aAssetType == ASSET_GFX_MAP) { - return "GFX_MAP"; - } else if (aAssetType == ASSET_LIGHT_DEF) { - return "LIGHT_DEF"; - } else if (aAssetType == ASSET_FONT) { - return "FONT"; - } else if (aAssetType == ASSET_MODEL) { - return "MODEL"; - } else if (aAssetType == ASSET_D3DBSP) { - return "D3DBSP"; - } else if (aAssetType == ASSET_IMAGE) { - return "IMAGE"; - } else if (aAssetType == ASSET_GAME_MAP_SP) { - return "GAME_MAP_SP"; - } else if (aAssetType == ASSET_COL_MAP_SP) { - return "COL_MAP_SP"; - } else if (aAssetType == ASSET_COL_MAP_SP) { - return "COL_MAP_SP"; - } else if (aAssetType == ASSET_UI_MAP) { - return "UI_MAP"; - } else if (aAssetType == ASSET_DESTRUCTIBLE) { - return "DESTRUCTIBLE"; - } else if (aAssetType == ASSET_MATERIAL) { - return "MATERIAL"; - } else if (aAssetType == ASSET_PHYS_PRESET) { - return "PHYS_PRESET"; - } else if (aAssetType == ASSET_COMPUTE_SHADER_SET) { - return "COMPUTE_SHADER_SET"; - } else if (aAssetType == ASSET_STRUCTURED_TABLE) { - return "STRUCTURED_TABLE"; - } else if (aAssetType == ASSET_LEADERBOARD_DEF) { - return "LEADERBOARD_DEF"; - } else if (aAssetType == ASSET_DDL) { - return "DDL"; - } else if (aAssetType == ASSET_SCRIPT_PARSE_TREE) { - return "SCRIPT_PARSE_TREE"; - } else if (aAssetType == ASSET_KEY_VALUE_PAIRS) { - return "KEY_VALUE_PAIRS"; - } else if (aAssetType == ASSET_SCRIPT_BUNDLE) { - return "SCRIPT_BUNDLE"; - } else if (aAssetType == ASSET_SCRIPT_BUNDLE_LIST) { - return "SCRIPT_BUNDLE_LIST"; - } else if (aAssetType == ASSET_LIGHT_DEF) { - return "LIGHT_DEF"; - } else if (aAssetType == ASSET_BIT_FIELD) { - return "BIT_FIELD"; - } else if (aAssetType == ASSET_MAP_TABLE) { - return "MAP_TABLE"; - } else if (aAssetType == ASSET_MAP_TABLE_LOADING_IMAGES) { - return "MAP_TABLE_LOADING_IMAGES"; - } else if (aAssetType == ASSET_SURFACE_SOUND_DEF) { - return "SURFACE_SOUND_DEF"; - } else if (aAssetType == ASSET_SURFACE_FX_TABLE) { - return "SURFACE_FX_TABLE"; - } else if (aAssetType == ASSET_RUMBLE) { - return "RUMBLE"; - } else if (aAssetType == ASSET_AIM_TABLE) { - return "AIM_TABLE"; - } else if (aAssetType == ASSET_MEDAL) { - return "MEDAL"; - } else if (aAssetType == ASSET_MEDAL_TABLE) { - return "MEDAL_TABLE"; - } else if (aAssetType == ASSET_OBJECTIVE) { - return "OBJECTIVE"; - } else if (aAssetType == ASSET_OBJECTIVE_LIST) { - return "OBJECTIVE_LIST"; - } else if (aAssetType == ASSET_LASER) { - return "LASER"; - } else if (aAssetType == ASSET_BEAM) { - return "BEAM"; - } else if (aAssetType == ASSET_STREAMER_HINT) { - return "STREAMER_HINT"; - } else if (aAssetType == ASSET_ANIM_SELECTOR_TABLE) { - return "ANIM_SELECTOR_TABLE"; - } else if (aAssetType == ASSET_ANIM_MAPPING_TABLE) { - return "ANIM_MAPPING_TABLE"; - } else if (aAssetType == ASSET_ANIM_STATE_MACHINE) { - return "ANIM_STATE_MACHINE"; - } else if (aAssetType == ASSET_BEHAVIOR_TREE) { - return "BEHAVIOR_TREE"; - } else if (aAssetType == ASSET_BEHAVIOR_STATE_MACHINE) { - return "BEHAVIOR_STATE_MACHINE"; - } else if (aAssetType == ASSET_FOOTSTEP_TABLE) { - return "FOOTSTEP_TABLE"; - } else if (aAssetType == ASSET_ENTITY_FX_IMPACTS) { - return "ENTITY_FX_IMPACTS"; - } else if (aAssetType == ASSET_ENTITY_SOUND_IMPACTS) { - return "ENTITY_SOUND_IMPACTS"; - } else if (aAssetType == ASSET_VEHICLE_FX_DEF) { - return "VEHICLE_FX_DEF"; - } else if (aAssetType == ASSET_VEHICLE_SOUND_DEF) { - return "VEHICLE_SOUND_DEF"; - } else if (aAssetType == ASSET_VEHICLE) { - return "VEHICLE"; - } else if (aAssetType == ASSET_VEHICLE_TRACER) { - return "VEHICLE_TRACER"; - } else if (aAssetType == ASSET_PLAYER_SOUNDS_TABLE) { - return "PLAYER_SOUNDS_TABLE"; - } else if (aAssetType == ASSET_PLAYER_FX_TABLE) { - return "PLAYER_FX_TABLE"; - } else if (aAssetType == ASSET_SHARED_WEAPON_SOUNDS) { - return "SHARED_WEAPON_SOUNDS"; - } else if (aAssetType == ASSET_ATTACHMENT) { - return "ATTACHMENT"; - } else if (aAssetType == ASSET_ATTACHMENT_UNIQUE) { - return "ATTACHMENT_UNIQUE"; - } else if (aAssetType == ASSET_WEAPON_CAMO) { - return "WEAPON_CAMO"; - } else if (aAssetType == ASSET_CUSTOMIZATION_TABLE) { - return "CUSTOMIZATION_TABLE"; - } else if (aAssetType == ASSET_CUSTOMIZATION_TABLE_FEIMAGES) { - return "CUSTOMIZATION_TABLE_FEIMAGES"; - } else if (aAssetType == ASSET_CUSTOMIZATION_TABLE_COLOR) { - return "CUSTOMIZATION_TABLE_COLOR"; - } else if (aAssetType == ASSET_PHYS_CONSTRAINTS) { - return "PHYS_CONSTRAINTS"; - } else if (aAssetType == ASSET_DESTRUCTIBLE_DEF) { - return "DESTRUCTIBLE_DEF"; - } else if (aAssetType == ASSET_MODEL_MESH) { - return "MODEL_MESH"; - } else if (aAssetType == ASSET_S_ANIM) { - return "S_ANIM"; - } else if (aAssetType == ASSET_SOUND) { - return "SOUND"; - } else if (aAssetType == ASSET_FONT_ICON) { - return "FONT_ICON"; - } else if (aAssetType == ASSET_SHOCK_FILE) { - return "SHOCK_FILE"; - } else if (aAssetType == ASSET_FAST_FILE) { - return "FAST_FILE"; - } else if (aAssetType == ASSET_ZONE_FILE) { - return "ZONE_FILE"; - } else if (aAssetType == ASSET_SOUND_DRIVER_GLOBALS) { - return "SOUND_DRIVER_GLOBALS"; - } - return "UNKNOWN"; -} -QIcon ZoneFile::AssetTypeToIcon(const AssetType aAssetType) { - QString assetCode; - const QStringList parts = AssetEnumToStr(aAssetType).split('_'); - foreach (const QString part, parts) { - assetCode.append(part[0]); - } - if (parts.size() == 1) { - assetCode.append(parts[0][1]); - } - return Utils::CreateAssetIcon(assetCode); - - if (aAssetType == ASSET_NONE) { - return Utils::CreateAssetIcon("NO"); - } else if (aAssetType == ASSET_RAW_FILE) { - return Utils::CreateAssetIcon("RAW"); - } else if (aAssetType == ASSET_SCRIPT_PARSE_TREE) { - return Utils::CreateAssetIcon("PT"); - } else if (aAssetType == ASSET_EFFECT) { - return Utils::CreateAssetIcon("EF"); - } else if (aAssetType == ASSET_SOUND) { - return Utils::CreateAssetIcon("SN"); - } else if (aAssetType == ASSET_ANIMATION) { - return Utils::CreateAssetIcon("AN"); - } else if (aAssetType == ASSET_COLLISION_MAP) { - return Utils::CreateAssetIcon("CM"); - } else if (aAssetType == ASSET_STRING_TABLE) { - return Utils::CreateAssetIcon("ST"); - } else if (aAssetType == ASSET_MENU) { - return Utils::CreateAssetIcon("MN"); - } else if (aAssetType == ASSET_TECH_SET) { - return Utils::CreateAssetIcon("TS"); - } else if (aAssetType == ASSET_WEAPON) { - return Utils::CreateAssetIcon("WP"); - } else if (aAssetType == ASSET_GFX_MAP) { - return Utils::CreateAssetIcon("GFM"); - } else if (aAssetType == ASSET_LIGHT_DEF) { - return Utils::CreateAssetIcon("LDF"); - } else if (aAssetType == ASSET_FONT) { - return Utils::CreateAssetIcon("FN"); - } else if (aAssetType == ASSET_MODEL) { - return Utils::CreateAssetIcon("MD"); - } else if (aAssetType == ASSET_D3DBSP) { - return Utils::CreateAssetIcon("BSP"); - } else if (aAssetType == ASSET_IMAGE) { - return Utils::CreateAssetIcon("IM"); - } else if (aAssetType == ASSET_GAME_MAP_SP) { - return Utils::CreateAssetIcon("GMS"); - } else if (aAssetType == ASSET_COL_MAP_SP) { - return Utils::CreateAssetIcon("CMS"); - } else if (aAssetType == ASSET_PHYS_PRESET) { - return Utils::CreateAssetIcon("PP"); - } else if (aAssetType == ASSET_DESTRUCTIBLE) { - return Utils::CreateAssetIcon("DE"); - } else if (aAssetType == ASSET_LOCAL_STRING) { - return Utils::CreateAssetIcon("LS"); - } else if (aAssetType == ASSET_SHADER) { - return Utils::CreateAssetIcon("SH"); - } else if (aAssetType == ASSET_MP_MAP) { - return Utils::CreateAssetIcon("MM"); - } else if (aAssetType == ASSET_SP_MAP) { - return Utils::CreateAssetIcon("SM"); - } else if (aAssetType == ASSET_UI_MAP) { - return Utils::CreateAssetIcon("UM"); - } else if (aAssetType == ASSET_SND_DRIVER_GLOBALS) { - return Utils::CreateAssetIcon("DG"); - } else if (aAssetType == ASSET_AI_TYPE) { - return Utils::CreateAssetIcon("AT"); - } else if (aAssetType == ASSET_MATERIAL) { - return Utils::CreateAssetIcon("MT"); - } else if (aAssetType == ASSET_COMPUTE_SHADER_SET) { - return Utils::CreateAssetIcon("CSH"); - } else if (aAssetType == ASSET_LIGHT_DESCRIPTION) { - return Utils::CreateAssetIcon("LDS"); - } else if (aAssetType == ASSET_BIT_FIELD) { - return Utils::CreateAssetIcon("BF"); - } else if (aAssetType == ASSET_STRUCTURED_TABLE) { - return Utils::CreateAssetIcon("SDT"); - } else if (aAssetType == ASSET_LEADERBOARD_DEF) { - return Utils::CreateAssetIcon("LBD"); - } else if (aAssetType == ASSET_DDL) { - return Utils::CreateAssetIcon("DDL"); - } else if (aAssetType == ASSET_KEY_VALUE_PAIRS) { - return Utils::CreateAssetIcon("KV"); - } else if (aAssetType == ASSET_SCRIPT_BUNDLE) { - return Utils::CreateAssetIcon("SB"); - } else if (aAssetType == ASSET_SCRIPT_BUNDLE_LIST) { - return Utils::CreateAssetIcon("SBL"); - } else if (aAssetType == ASSET_MAP_TABLE) { - return Utils::CreateAssetIcon("MT"); - } else if (aAssetType == ASSET_MAP_TABLE_LOADING_IMAGES) { - return Utils::CreateAssetIcon("LI"); - } else if (aAssetType == ASSET_SURFACE_SOUND_DEF) { - return Utils::CreateAssetIcon("SSD"); - } else if (aAssetType == ASSET_SURFACE_FX_TABLE) { - return Utils::CreateAssetIcon("FT"); - } else if (aAssetType == ASSET_RUMBLE) { - return Utils::CreateAssetIcon("RM"); - } else if (aAssetType == ASSET_AIM_TABLE) { - return Utils::CreateAssetIcon("AMT"); - } else if (aAssetType == ASSET_MEDAL) { - return Utils::CreateAssetIcon("ME"); - } else if (aAssetType == ASSET_MEDAL_TABLE) { - return Utils::CreateAssetIcon("MET"); - } else if (aAssetType == ASSET_OBJECTIVE) { - return Utils::CreateAssetIcon("OB"); - } else if (aAssetType == ASSET_OBJECTIVE_LIST) { - return Utils::CreateAssetIcon("OBL"); - } else if (aAssetType == ASSET_LASER) { - return Utils::CreateAssetIcon("LS"); - } else if (aAssetType == ASSET_BEAM) { - return Utils::CreateAssetIcon("BM"); - } else if (aAssetType == ASSET_STREAMER_HINT) { - return Utils::CreateAssetIcon("SH"); - } else if (aAssetType == ASSET_ANIM_SELECTOR_TABLE) { - return Utils::CreateAssetIcon("AST"); - } else if (aAssetType == ASSET_ANIM_MAPPING_TABLE) { - return Utils::CreateAssetIcon("AMP"); - } else if (aAssetType == ASSET_ANIM_STATE_MACHINE) { - return Utils::CreateAssetIcon("ASM"); - } else if (aAssetType == ASSET_BEHAVIOR_TREE) { - return Utils::CreateAssetIcon("BT"); - } else if (aAssetType == ASSET_BEHAVIOR_STATE_MACHINE) { - return Utils::CreateAssetIcon("BSM"); - } else if (aAssetType == ASSET_FOOTSTEP_TABLE) { - return Utils::CreateAssetIcon("FT"); - } else if (aAssetType == ASSET_ENTITY_FX_IMPACTS) { - return Utils::CreateAssetIcon("FI"); - } else if (aAssetType == ASSET_ENTITY_SOUND_IMPACTS) { - return Utils::CreateAssetIcon("SI"); - } else if (aAssetType == ASSET_VEHICLE_FX_DEF) { - return Utils::CreateAssetIcon("FD"); - } else if (aAssetType == ASSET_VEHICLE_SOUND_DEF) { - return Utils::CreateAssetIcon("SDD"); - } else if (aAssetType == ASSET_VEHICLE) { - return Utils::CreateAssetIcon("VE"); - } else if (aAssetType == ASSET_VEHICLE_TRACER) { - return Utils::CreateAssetIcon("VT"); - } else if (aAssetType == ASSET_PLAYER_SOUNDS_TABLE) { - return Utils::CreateAssetIcon("SDT"); - } else if (aAssetType == ASSET_PLAYER_FX_TABLE) { - return Utils::CreateAssetIcon("FXT"); - } else if (aAssetType == ASSET_SHARED_WEAPON_SOUNDS) { - return Utils::CreateAssetIcon("SWS"); - } else if (aAssetType == ASSET_ATTACHMENT) { - return Utils::CreateAssetIcon("AT"); - } else if (aAssetType == ASSET_ATTACHMENT_UNIQUE) { - return Utils::CreateAssetIcon("AU"); - } else if (aAssetType == ASSET_WEAPON_CAMO) { - return Utils::CreateAssetIcon("WPC"); - } else if (aAssetType == ASSET_CUSTOMIZATION_TABLE) { - return Utils::CreateAssetIcon("CT"); - } else if (aAssetType == ASSET_CUSTOMIZATION_TABLE_FEIMAGES) { - return Utils::CreateAssetIcon("CI"); - } else if (aAssetType == ASSET_CUSTOMIZATION_TABLE_COLOR) { - return Utils::CreateAssetIcon("CC"); - } else if (aAssetType == ASSET_PHYS_CONSTRAINTS) { - return Utils::CreateAssetIcon("PC"); - } else if (aAssetType == ASSET_DESTRUCTIBLE_DEF) { - return Utils::CreateAssetIcon("DD"); - } else if (aAssetType == ASSET_MODEL_MESH) { - return Utils::CreateAssetIcon("MM"); - } else if (aAssetType == ASSET_S_ANIM) { - return Utils::CreateAssetIcon("SA"); - } else if (aAssetType == ASSET_FONT_ICON) { - return Utils::CreateAssetIcon("FI"); - } else if (aAssetType == ASSET_CG_MEDIA_TABLE) { - return Utils::CreateAssetIcon("MT"); - } else if (aAssetType == ASSET_SHOCK_FILE) { - return Utils::CreateAssetIcon("SF"); - } else if (aAssetType == ASSET_FAST_FILE) { - return Utils::CreateAssetIcon("FF"); - } else if (aAssetType == ASSET_ZONE_FILE) { - return Utils::CreateAssetIcon("ZF"); - } else if (aAssetType == ASSET_SOUND_DRIVER_GLOBALS) { - return Utils::CreateAssetIcon("SDG"); - } - return QIcon(); -} - -bool ZoneFile::SaveZoneFile(const QString aZoneFilePath) { - QFile zoneFile(aZoneFilePath); - if (!zoneFile.open(QIODevice::WriteOnly)) { - LogManager::instance().addEntry("Failed to write zone file! " + zoneFile.errorString()); - return false; - } - zoneFile.write(GetBinaryData()); - zoneFile.close(); - return true; -} - QString ZoneFile::GetStem() { return mStem; } @@ -424,7 +71,7 @@ QStringList ZoneFile::GetRecords() { } AssetMap ZoneFile::GetAssetMap() { - return mAssetMap; + return mAssetMap; } void ZoneFile::SetStem(const QString aStem) { @@ -452,6 +99,6 @@ void ZoneFile::SetRecords(const QStringList aRecords) { } void ZoneFile::SetAssetMap(const AssetMap aAssetMap) { - mAssetMap = aAssetMap; + mAssetMap = aAssetMap; } diff --git a/libs/zonefile/zonefile.h b/libs/zonefile/zonefile.h index 9d6ac53..df08c11 100644 --- a/libs/zonefile/zonefile.h +++ b/libs/zonefile/zonefile.h @@ -1,10 +1,11 @@ #ifndef ZONEFILE_H #define ZONEFILE_H -#include "asset_structs.h" -#include "qicon.h" +#include "assetmap.h" +#include "utils.h" #include +#include class ZoneFile { @@ -15,12 +16,10 @@ public: ZoneFile &operator=(const ZoneFile &other); virtual bool Load(const QByteArray aFileData) = 0; - virtual AssetType AssetStrToEnum(const QString aAssetType) = 0; - static QString AssetEnumToStr(const AssetType aAssetType); - static QIcon AssetTypeToIcon(const AssetType aAssetType); - - virtual QByteArray GetBinaryData() = 0; - virtual bool SaveZoneFile(const QString aZoneFilePath); + virtual Utils::AssetType AssetStrToEnum(const QString aAssetType) = 0; + virtual QByteArray GetBinaryData() { + return {}; + } QString GetStem(); QString GetBaseStem(); @@ -39,40 +38,6 @@ public: void SetRecords(const QStringList aRecords); void SetAssetMap(const AssetMap aAssetMap); -private slots: - virtual void pParseZoneHeader(QDataStream *aZoneFileStream) = 0; - virtual quint32 pParseZoneSize(QDataStream *aZoneFileStream) = 0; - virtual void pParseZoneUnknownsA(QDataStream *aZoneFileStream) = 0; - virtual quint32 pParseZoneTagCount(QDataStream *aZoneFileStream) = 0; - virtual quint32 pParseZoneRecordCount(QDataStream *aZoneFileStream) = 0; - virtual void pParseZoneUnknownsB(QDataStream *aZoneFileStream) = 0; - virtual void pParseZoneUnknownsC(QDataStream *aZoneFileStream) = 0; - virtual QStringList pParseZoneTags(QDataStream *aZoneFileStream, quint32 tagCount) = 0; - virtual QStringList pParseZoneIndex(QDataStream *aZoneFileStream, quint32 recordCount) = 0; - virtual AssetMap pParseAssets(QDataStream *aZoneFileStream, QStringList assetOrder) = 0; - virtual LocalString pParseAsset_LocalString(QDataStream *aZoneFileStream) = 0; - virtual RawFile pParseAsset_RawFile(QDataStream *aZoneFileStream) = 0; - virtual void pParseAsset_PhysPreset(QDataStream *aZoneFileStream) = 0; - virtual Model pParseAsset_Model(QDataStream *aZoneFileStream) = 0; - virtual Material pParseAsset_Material(QDataStream *aZoneFileStream) = 0; - virtual Shader pParseAsset_Shader(QDataStream *aZoneFileStream) = 0; - virtual TechSet pParseAsset_TechSet(QDataStream *aZoneFileStream) = 0; - virtual Image pParseAsset_Image(QDataStream *aZoneFileStream) = 0; - virtual SoundAsset pParseAsset_Sound(QDataStream *aZoneFileStream) = 0; - virtual void pParseAsset_ColMapMP(QDataStream *aZoneFileStream) = 0; - virtual void pParseAsset_GameMapSP(QDataStream *aZoneFileStream) = 0; - virtual void pParseAsset_GameMapMP(QDataStream *aZoneFileStream) = 0; - virtual void pParseAsset_LightDef(QDataStream *aZoneFileStream) = 0; - virtual void pParseAsset_UIMap(QDataStream *aZoneFileStream) = 0; - virtual void pParseAsset_SNDDriverGlobals(QDataStream *aZoneFileStream) = 0; - virtual void pParseAsset_AIType(QDataStream *aZoneFileStream) = 0; - virtual void pParseAsset_FX(QDataStream *aZoneFileStream) = 0; - virtual Animation pParseAsset_Animation(QDataStream *aZoneFileStream) = 0; - virtual MenuFile pParseAsset_MenuFile(QDataStream *aZoneFileStream) = 0; - virtual void pParseAsset_Weapon(QDataStream *aZoneFileStream) = 0; - virtual void pParseAsset_D3DBSP(QDataStream *aZoneFileStream) = 0; - virtual StringTable pParseAsset_StringTable(QDataStream *aZoneFileStream) = 0; - private: QString mStem; quint32 mSize; diff --git a/libs/zonefile/zonefile.pro b/libs/zonefile/zonefile.pro index b296b04..208f5a1 100644 --- a/libs/zonefile/zonefile.pro +++ b/libs/zonefile/zonefile.pro @@ -87,12 +87,14 @@ HEADERS += \ WiiU/zonefile_cod10_wiiu.h LIBS += \ - -L$$OUT_PWD/../libs/core -lcore + -L$$OUT_PWD/../ -lcore -lassets INCLUDEPATH += \ $$PWD/../core \ + $$PWD/../assets DEPENDPATH += \ - $$PWD/../core + $$PWD/../core \ + $$PWD/../assets DESTDIR = $$OUT_PWD/../