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;
                    }
                }
            }
        }
示例#2
0
        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);
        }