private static void RandomizeAudio(IMEPackage package, int topLevelUIndex, bool female) { var audioToChange = package.Exports.Where(x => x.idxLink == topLevelUIndex && x.ClassName == "WwiseStream").ToList(); var audioSources = MERFileSystem.LoadedFiles.Keys.Where(x => x.Contains("_LOC_INT", StringComparison.InvariantCultureIgnoreCase) && x.Contains("Bio")).ToList(); foreach (var aExp in audioToChange) { bool installed = false; while (!installed) { var rAudioSourceF = audioSources.RandomElement(); var rAudioSourceP = MEPackageHandler.OpenMEPackage(MERFileSystem.GetPackageFile(rAudioSourceF)); var audioOptions = rAudioSourceP.Exports.Where(x => x.ClassName == "WwiseStream").ToList(); if (!audioOptions.Any()) { continue; } var audioChoice = audioOptions.RandomElement(); // Repoint the TLK to match what's going to be said var nTlk = WwiseTools.ExtractTLKIdFromExportName(audioChoice); var oTlk = WwiseTools.ExtractTLKIdFromExportName(aExp); if (nTlk != -1 && oTlk != -1 && !string.IsNullOrWhiteSpace(TLKHandler.TLKLookupByLang(nTlk, "INT"))) { TLKHandler.ReplaceString(oTlk, TLKHandler.TLKLookupByLang(nTlk, "INT")); WwiseTools.RepointWwiseStream(audioChoice, aExp); installed = true; } } } }
public static bool RandomizeMusic(ExportEntry export, RandomizationOption arg2) { if (!CanRandomize(export, out bool isSfxGame)) { return(false); } var wwiseInfo = ObjectBinary.From <WwiseEvent>(export); if (wwiseInfo.Links.Count == 1 && wwiseInfo.Links[0].WwiseStreams.Any()) { float newMaxDuration = 0; for (int i = 0; i < wwiseInfo.Links[0].WwiseStreams.Count; i++) { var wwiseStreamExp = export.FileRef.GetUExport(wwiseInfo.Links[0].WwiseStreams[i].value); if (wwiseStreamExp.DataSize > 0x98) { continue; // Very likely PCC stored } MusicStreamInfo newMusInfo = null; lock (syncObj) { newMusInfo = AvailableMusicPool.Any() ? AvailableMusicPool.PullFirstItem() : StaticMusicPool.RandomElement(); while (newMusInfo.Filename.Contains("DLC") && isSfxGame) { // SFXGame cannot use DLC audio AvailableMusicPool.Add(newMusInfo); newMusInfo = AvailableMusicPool.Any() ? AvailableMusicPool.PullFirstItem() : StaticMusicPool.RandomElement(); } } newMaxDuration = Math.Max(newMaxDuration, newMusInfo.DurationMs); WwiseTools.RepointWwiseStreamToInfo(newMusInfo, wwiseStreamExp); } // Update length of WwiseEvent export.WriteProperty(new FloatProperty(newMaxDuration, "DurationMilliseconds")); return(true); } return(false); }