diff --git a/Exporters/ExportSound.cpp b/Exporters/ExportSound.cpp index 04287636..19cf61b6 100644 --- a/Exporters/ExportSound.cpp +++ b/Exporters/ExportSound.cpp @@ -7,7 +7,7 @@ #include "Exporters.h" -#define XMA_EXPORT 1 +bool GXmaExport = true; static void SaveSound(const UObject *Obj, void *Data, int DataSize, const char *DefExt) @@ -28,7 +28,7 @@ static void SaveSound(const UObject *Obj, void *Data, int DataSize, const char * else if (!memcmp(Data, "FSB4", 4)) ext = "fsb"; // FMOD sound bank else if (!memcmp(Data, "MSFC", 4)) - ext = "mp3"; // PS3 MP3 codec + ext = "msf"; // PS3 MP3 codec FArchive *Ar = CreateExportArchive(Obj, EFileArchiveOptions::Default, "%s.%s", Obj->Name, ext); if (Ar) @@ -39,8 +39,6 @@ static void SaveSound(const UObject *Obj, void *Data, int DataSize, const char * } -#if XMA_EXPORT - static void WriteRiffHeader(FArchive &Ar, int FileLength) { assert(!Ar.IsLoading); @@ -198,12 +196,10 @@ static bool SaveXMASound(const UObject *Obj, void *Data, int DataSize, const cha return true; } -#endif // XMA_EXPORT - void ExportSound(const USound *Snd) { - SaveSound(Snd, (void*)&Snd->RawData[0], Snd->RawData.Num(), "unk"); + SaveSound(Snd, (void*)&Snd->RawData[0], Snd->RawData.Num(), Snd->FileType); } @@ -228,10 +224,9 @@ void ExportSoundNodeWave(const USoundNodeWave *Snd) { bulk = &Snd->CompressedXbox360Data; ext = "x360audio"; -#if XMA_EXPORT - if (SaveXMASound(Snd, bulk->BulkData, bulk->ElementCount, "xma")) return; + + if (GXmaExport && SaveXMASound(Snd, bulk->BulkData, bulk->ElementCount, "xma")) return; // else - detect format by data tags, like for PC -#endif } else if (Snd->CompressedPS3Data.ElementCount) { diff --git a/Exporters/Exporters.h b/Exporters/Exporters.h index 2272240c..8fbf4e60 100644 --- a/Exporters/Exporters.h +++ b/Exporters/Exporters.h @@ -46,6 +46,7 @@ extern bool GUncook; extern bool GUseGroups; extern bool GDontOverwriteFiles; extern bool GDummyExport; +extern bool GXmaExport; // forwards class UObject; diff --git a/UmodelTool/SettingsDialog.cpp b/UmodelTool/SettingsDialog.cpp index fb1acf6e..e21f60b8 100644 --- a/UmodelTool/SettingsDialog.cpp +++ b/UmodelTool/SettingsDialog.cpp @@ -161,6 +161,10 @@ UIElement& UISettingsDialog::MakeExportOptions() ] + NewControl(UICheckbox, "Export compressed textures to dds format", &Opt.Export.ExportDdsTexture) ] + + NewControl(UIGroup, "Sound Export") + [ + NewControl(UICheckbox, "Export UE3 XMA as RIFF", &Opt.Export.ExportRiffXma) + ] + NewControl(UICheckbox, "Don't overwrite already exported files", &Opt.Export.DontOverwriteFiles) ; } diff --git a/UmodelTool/UmodelSettings.cpp b/UmodelTool/UmodelSettings.cpp index 0d0b8080..39aa1ebe 100644 --- a/UmodelTool/UmodelSettings.cpp +++ b/UmodelTool/UmodelSettings.cpp @@ -131,6 +131,7 @@ void CExportSettings::Reset() SaveUncooked = false; SaveGroups = false; DontOverwriteFiles = false; + ExportRiffXma = true; } void CExportSettings::Apply() @@ -149,6 +150,7 @@ void CExportSettings::Apply() GUncook = SaveUncooked; GUseGroups = SaveGroups; GDontOverwriteFiles = DontOverwriteFiles; + GXmaExport = ExportRiffXma; } void CSavePackagesSettings::SetPath(const char* path) diff --git a/UmodelTool/UmodelSettings.h b/UmodelTool/UmodelSettings.h index 6af56647..072506ec 100644 --- a/UmodelTool/UmodelSettings.h +++ b/UmodelTool/UmodelSettings.h @@ -80,6 +80,7 @@ struct CExportSettings bool SaveUncooked; bool SaveGroups; bool DontOverwriteFiles; + bool ExportRiffXma; BEGIN_PROP_TABLE PROP_STRING(ExportPath) @@ -91,6 +92,7 @@ struct CExportSettings PROP_BOOL(SaveUncooked) PROP_BOOL(SaveGroups) PROP_BOOL(DontOverwriteFiles) + PROP_BOOL(ExportRiffXma) END_PROP_TABLE CExportSettings() diff --git a/Unreal/FileSystem/GameFileSystem.cpp b/Unreal/FileSystem/GameFileSystem.cpp index f77fbead..c669727f 100644 --- a/Unreal/FileSystem/GameFileSystem.cpp +++ b/Unreal/FileSystem/GameFileSystem.cpp @@ -30,7 +30,7 @@ char GRootDirectory[MAX_PACKAGE_PATH]; static const char *PackageExtensions[] = { - "u", "ut2", "utx", "uax", "usx", "ukx", + "u", "ut2", "utx", "uax", "umx", "usx", "ukx", #if UNREAL3 "upk", "ut3", "xxx", "umap", "udk", "map", #endif diff --git a/Unreal/GameDatabase.cpp b/Unreal/GameDatabase.cpp index 4dbdeca1..8839711c 100644 --- a/Unreal/GameDatabase.cpp +++ b/Unreal/GameDatabase.cpp @@ -30,6 +30,9 @@ const GameInfo GListOfGames[] = { #if UNDYING G("Undying", undying, GAME_Undying), #endif + #if HP2 + G("Harry Potter and the Chamber of Secrets", hp2, GAME_HP2), + #endif #endif // UNREAL1 // Unreal Engine 2 diff --git a/Unreal/GameDefines.h b/Unreal/GameDefines.h index 3c5fe091..ad2110a4 100644 --- a/Unreal/GameDefines.h +++ b/Unreal/GameDefines.h @@ -33,6 +33,7 @@ #define DEUS_EX 1 #define RUNE 1 #define UNDYING 1 +#define HP2 1 #endif // requires UNREAL25 diff --git a/Unreal/UnCore.h b/Unreal/UnCore.h index f5b3c7f8..aca3924d 100644 --- a/Unreal/UnCore.h +++ b/Unreal/UnCore.h @@ -347,6 +347,7 @@ enum EGame GAME_UE1 = 0x0100000, GAME_Undying, + GAME_HP2, GAME_UE2 = 0x0200000, GAME_UT2, diff --git a/Unreal/UnSound.h b/Unreal/UnSound.h index 4d7f76bf..2953472a 100644 --- a/Unreal/UnSound.h +++ b/Unreal/UnSound.h @@ -7,8 +7,8 @@ class USound : public UObject { DECLARE_CLASS(USound, UObject); public: + FName FileType; float f2C; - FName f5C; TLazyArray RawData; void Serialize(FArchive &Ar) @@ -16,13 +16,47 @@ class USound : public UObject guard(USound::Serialize); Super::Serialize(Ar); - Ar << f5C; + Ar << FileType; #if UT2 || BATTLE_TERR || LOCO if ((Ar.Game == GAME_UT2 || Ar.Game == GAME_BattleTerr || Ar.Game == GAME_Loco) && Ar.ArLicenseeVer >= 2) Ar << f2C; #endif +#if HP2 + if (Ar.Game == GAME_HP2) + { + int CoreFlags; + float Duration; + int raw_NumSamples, raw_BitsPerSample, raw_NumChannels, raw_SampleRate; + + Ar << CoreFlags; + Ar << Duration; + + // These are used for raw EA-XA + Ar << raw_NumSamples << raw_BitsPerSample << raw_NumChannels << raw_SampleRate; + + appPrintf("USound %s: raw_NumSamples=%d, raw_BitsPerSample=%d, raw_NumChannels=%d, raw_SampleRate=%d\n", + Name, raw_NumSamples, raw_BitsPerSample, raw_NumChannels, raw_SampleRate); + + Ar << RawData; + + if (CoreFlags & 128) + { + TLazyArray LipSyncData; + Ar << LipSyncData; + } + return; + } +#endif + Ar << RawData; + // some hack to support more games ... + if (Ar.Tell() < Ar.GetStopper()) + { + appPrintf("USound %s: dropping %d bytes\n", Name, Ar.GetStopper() - Ar.Tell()); + DROP_REMAINING_DATA(Ar); + } + unguard; } }; @@ -245,7 +279,8 @@ class USoundWave : public UObject // actual parent is USoundBase #define REGISTER_SOUND_CLASSES \ - REGISTER_CLASS(USound) + REGISTER_CLASS(USound) \ + REGISTER_CLASS_ALIAS(USound, UMusic) #define REGISTER_SOUND_CLASSES_UE3 \ REGISTER_CLASS(USoundNodeWave)