private static void ChangeNormandyPaintings() { //BioA_Nor_230 // BioT_NorHenMT Painting01_Diff // BioT_NorHenMT Painting02_Diff // Both square var nor230F = MERFileSystem.GetPackageFile("BioA_Nor_230.pcc"); if (nor230F != null && File.Exists(nor230F)) { var nor230P = MEPackageHandler.OpenMEPackage(nor230F); var painting1 = nor230P.FindExport("BioT_NorHenMT.Painting01_Diff"); var painting2 = nor230P.FindExport("BioT_NorHenMT.Painting02_Diff"); if (painting1 != null && painting2 != null) { var assets = TFCBuilder.ListTextureAssets("Kasumi.NormandyPaintings").Select(x => $"Kasumi.NormandyPaintings.{x}").ToList(); assets.Shuffle(); RTexture2D r2d = new RTexture2D() { AllowedTextureAssetNames = assets, LODGroup = new EnumProperty(new NameReference("TEXTUREGROUP_Environment", 1025), "TextureGroup", MEGame.ME2, "LODGroup"), // A bit higher quality }; TFCBuilder.InstallTexture(r2d, painting1, assets.PullFirstItem()); TFCBuilder.InstallTexture(r2d, painting2, assets.PullFirstItem()); MERFileSystem.SavePackage(nor230P); } } }
private static void InstallARArtTextures(List <int> uindexes, List <string> assets, IMEPackage artGalleryP, string loggingName) { if (uindexes == null) { return; // This set is not installed } while (uindexes.Any()) { if (!assets.Any()) { Debug.WriteLine($"Not enough assets for {loggingName}! Need {uindexes.Count} more!"); return; } var uIndex = uindexes.PullFirstItem(); var asset = assets.PullFirstItem(); var texExport = artGalleryP.GetUExport(uIndex); RTexture2D r2d = new RTexture2D() { LODGroup = new EnumProperty(new NameReference("TEXTUREGROUP_Environment", 1025), "TextureGroup", MEGame.ME2, "LODGroup"), // A bit higher quality AllowedTextureAssetNames = new List <string>() { asset }, TextureInstancedFullPath = texExport.InstancedFullPath // don't think this is used but just leave it here anyways. }; TFCBuilder.InstallTexture(r2d, texExport, asset); } }
private static void InstallBorger() { var endGame3F = MERFileSystem.GetPackageFile("BioP_EndGm3.pcc"); if (endGame3F != null && File.Exists(endGame3F)) { var biopEndGm3 = MEPackageHandler.OpenMEPackage(endGame3F); var packageBin = MERUtilities.GetEmbeddedStaticFilesBinaryFile("Delux2go_Edmonton_Burger.pcc"); var burgerPackage = MEPackageHandler.OpenMEPackageFromStream(new MemoryStream(packageBin)); // 1. Add the burger package var burgerMDL = PackageTools.PortExportIntoPackage(biopEndGm3, burgerPackage.FindExport("Edmonton_Burger_Delux2go.Burger_MDL")); // 2. Link up the textures TFCBuilder.RandomizeExport(biopEndGm3.FindExport("Edmonton_Burger_Delux2go.Textures.Burger_Diff"), null); TFCBuilder.RandomizeExport(biopEndGm3.FindExport("Edmonton_Burger_Delux2go.Textures.Burger_Norm"), null); TFCBuilder.RandomizeExport(biopEndGm3.FindExport("Edmonton_Burger_Delux2go.Textures.Burger_Spec"), null); // 3. Convert the collector base into lunch or possibly early dinner // It's early dinner cause that thing will keep you full all night long biopEndGm3.GetUExport(11276).WriteProperty(new ObjectProperty(burgerMDL.UIndex, "SkeletalMesh")); biopEndGm3.GetUExport(11282).WriteProperty(new ObjectProperty(burgerMDL.UIndex, "SkeletalMesh")); MERFileSystem.SavePackage(biopEndGm3); } }
private static void RandomizeArtGallery() { var wideAssets = TFCBuilder.ListTextureAssets("Kasumi.ArtGallery.wide").Select(x => $"Kasumi.ArtGallery.wide.{x}").ToList(); var tallAssets = TFCBuilder.ListTextureAssets("Kasumi.ArtGallery.tall").Select(x => $"Kasumi.ArtGallery.tall.{x}").ToList(); wideAssets.Shuffle(); tallAssets.Shuffle(); var artyGallery = GetKasumiArtGallerySetup(); foreach (var kagf in artyGallery) { var artGalleryF = MERFileSystem.GetPackageFile(kagf.PackageName); if (artGalleryF != null && File.Exists(artGalleryF)) { var artGalleryP = MEPackageHandler.OpenMEPackage(artGalleryF); // Rename instances so they're memory unique so we have a few more paintings if (kagf.RenameMemoryInstances) { if (kagf.TallTextureUIndexes != null) { foreach (var uindex in kagf.TallTextureUIndexes) { if (!artGalleryP.GetUExport(uindex).IsTexture()) { Debugger.Break(); } artGalleryP.GetUExport(uindex).ObjectName = $"ME2R_T_KASUMIPAINTING{ThreadSafeRandom.Next(15000)}"; } } // Rename mats so they're also unique if (kagf.WideTextureUIndexes != null) { foreach (var uindex in kagf.WideTextureUIndexes) { if (!artGalleryP.GetUExport(uindex).IsTexture()) { Debugger.Break(); } artGalleryP.GetUExport(uindex).ObjectName = $"ME2R_W_KASUMIPAINTING{ThreadSafeRandom.Next(15000)}"; } } if (kagf.MaterialUIndexes != null) { foreach (var uindex in kagf.MaterialUIndexes) { var exp = artGalleryP.GetUExport(uindex); if (!exp.ClassName.Contains("Material")) { Debugger.Break(); } artGalleryP.GetUExport(uindex).ObjectName = $"ME2R_PAINTMAT_KASUMI{ThreadSafeRandom.Next(15000)}"; } } } InstallARArtTextures(kagf.WideTextureUIndexes, wideAssets, artGalleryP, "Wide"); InstallARArtTextures(kagf.TallTextureUIndexes, tallAssets, artGalleryP, "Tall"); MERFileSystem.SavePackage(artGalleryP); } } }
public static void SetupME2Textures() { var options = new List <RTexture2D> { new RTexture2D { // The orange datapad you see everyone holding TextureInstancedFullPath = "BioApl_Dec_DataPad01.Materials.Datapad01_Screen", AllowedTextureAssetNames = new List <string> { "DatapadScreens.Datapad01_Screen.map.bin", "DatapadScreens.Datapad01_Screen.monsterplan.bin", "DatapadScreens.Datapad01_Screen.sizebounty.bin", "DatapadScreens.Datapad01_Screen.thisisfine.bin", } }, new RTexture2D { // The end-of-game datapad texture TextureInstancedFullPath = "BioVFX_Env_End.Textures.Reaper_Display", AllowedTextureAssetNames = new List <string> { "DatapadScreens.Reaper_Display.fishdog_foodshack.bin", } }, new RTexture2D { // The graphs that scroll by (H_Graphs) TextureInstancedFullPath = "BioVFX_Env_Hologram.Textures.H_Graphs", LODGroup = new EnumProperty(new NameReference("TEXTUREGROUP_VFX", 513), "TextureGroup", MEGame.ME2, "LODGroup"), // A bit higher quality AllowedTextureAssetNames = new List <string> { "HoloScreens.H_Graphs.pizzaonion.bin", "HoloScreens.H_Graphs.brandamazon.bin", }, PreMountTexture = true }, new RTexture2D { // The graphs that scroll by, line and bar rchargs (H_Graphs3_5) TextureInstancedFullPath = "BioVFX_Env_Hologram.Textures.H_Graphs2", LODGroup = new EnumProperty(new NameReference("TEXTUREGROUP_VFX", 513), "TextureGroup", MEGame.ME2, "LODGroup"), // A bit higher quality AllowedTextureAssetNames = new List <string> { "HoloScreens.H_Graphs2.neonbolt.bin", }, PreMountTexture = false // Texture isn't used anywhere before DLC mount }, new RTexture2D { // The graphs that scroll by, line and bar rchargs (H_Graphs3_5) TextureInstancedFullPath = "BioVFX_Env_Hologram.Textures.H_Graphs3_5", LODGroup = new EnumProperty(new NameReference("TEXTUREGROUP_VFX", 513), "TextureGroup", MEGame.ME2, "LODGroup"), // A bit higher quality AllowedTextureAssetNames = new List <string> { "HoloScreens.H_Graphs3_5.sonicburger.bin", }, PreMountTexture = false // Texture isn't used anywhere before DLC mount }, new RTexture2D { // Vertically scrolling text (1) TextureInstancedFullPath = "BioVFX_Env_Hologram.Textures.H_texts", LODGroup = new EnumProperty(new NameReference("TEXTUREGROUP_VFX", 513), "TextureGroup", MEGame.ME2, "LODGroup"), // A bit higher quality AllowedTextureAssetNames = new List <string> { "HoloScreens.H_texts.sourdough.bin", "HoloScreens.H_texts.newspaper.bin", }, PreMountTexture = true }, new RTexture2D { // Vertically scrolling text (2) TextureInstancedFullPath = "BioVFX_Env_Hologram.Textures.H_texts_2", LODGroup = new EnumProperty(new NameReference("TEXTUREGROUP_VFX", 513), "TextureGroup", MEGame.ME2, "LODGroup"), // A bit higher quality AllowedTextureAssetNames = new List <string> { "HoloScreens.H_texts_2.vim.bin", }, PreMountTexture = true }, new RTexture2D { // Vertically scrolling text (2) TextureInstancedFullPath = "BioVFX_Env_Hologram.Textures.H_texts_3", // purposely lower res than others. LODGroup = new EnumProperty(new NameReference("TEXTUREGROUP_VFX", 513), "TextureGroup", MEGame.ME2, "LODGroup"), // A bit higher quality AllowedTextureAssetNames = new List <string> { "HoloScreens.H_texts_3.visualstudio.bin", }, PreMountTexture = false }, new RTexture2D { // The picture frame that archer holds up in Overlord DLC act 2 start TextureInstancedFullPath = "BioVFX_Env_UNC_Pack01.Textures.archer_photograph", LODGroup = new EnumProperty(new NameReference("TEXTUREGROUP_VFX", 513), "TextureGroup", MEGame.ME2, "LODGroup"), // A bit higher quality AllowedTextureAssetNames = new List <string> { "PictureFrames.scarymiranda.bin", "PictureFrames.creepyshep.bin", "PictureFrames.hungryillusiveman.bin", "PictureFrames.monkaanderson.bin", "PictureFrames.longfaceudina.bin", } }, new RTexture2D() { // The picture shown on the screen in the beginning of overlord DLC TextureInstancedFullPath = "BioVFX_Env_UNC_Pack01.Textures.UNC_1_Dish_Display", LODGroup = new EnumProperty(new NameReference("TEXTUREGROUP_Promotional", 0), "TextureGroup", MEGame.ME2, "LODGroup"), // A bit higher quality AllowedTextureAssetNames = new List <string> { "Overlord.satimg1.bin", } }, new RTexture2D() { // Liara Love Interest Pic (Only if no romance is chosen) TextureInstancedFullPath = "BioVFX_Env_Hologram.Textures.Liara_1", LODGroup = new EnumProperty(new NameReference("TEXTUREGROUP_VFX", 513), "TextureGroup", MEGame.ME2, "LODGroup"), // A bit higher quality AllowedTextureAssetNames = new List <string> { "PictureFrames.LoveInterests.steak.bin", } }, #region LOTSB new RTexture2D() { // Liara Diploma TextureInstancedFullPath = "BioS_Exp1Apt.APT_LIARADIP", LODGroup = new EnumProperty(new NameReference("TEXTUREGROUP_VFX", 513), "TextureGroup", MEGame.ME2, "LODGroup"), // A bit higher quality AllowedTextureAssetNames = new List <string> { "LOTSB.LiaraDiploma.diploma.bin", } }, new RTexture2D() { // ILOS painting TextureInstancedFullPath = "BioS_Exp1Apt.APT_ILOSPAINTING", AllowedTextureAssetNames = new List <string> { "LOTSB.Painting.edge.bin", "LOTSB.Painting.me1stylesp.bin", "LOTSB.Painting.outsidethecity.bin", "LOTSB.Painting.thesource.bin", } }, new RTexture2D() { // What picture frame shep picks up turns into TextureInstancedFullPath = "BioS_Exp1Apt.APT_PROTHDIG", LODGroup = new EnumProperty(new NameReference("TEXTUREGROUP_Environment", 513), "TextureGroup", MEGame.ME2, "LODGroup"), // A bit higher quality AllowedTextureAssetNames = new List <string> { "LOTSB.PictureFrame.digsite.bin", } }, new RTexture2D() { // Picture frame shep picks up TextureInstancedFullPath = "BioS_Exp1Apt.NRM_SR1", LODGroup = new EnumProperty(new NameReference("TEXTUREGROUP_Environment", 513), "TextureGroup", MEGame.ME2, "LODGroup"), // A bit higher quality AllowedTextureAssetNames = new List <string> { "LOTSB.PictureFrame.garage.bin", } }, #endregion #region Burger new RTexture2D() { TextureInstancedFullPath = "Edmonton_Burger_Delux2go.Textures.Burger_Norm", AllowedTextureAssetNames = new List <string> { "Burger.Norm.bin", } }, new RTexture2D() { TextureInstancedFullPath = "Edmonton_Burger_Delux2go.Textures.Burger_Spec", AllowedTextureAssetNames = new List <string> { "Burger.Spec.bin", } }, new RTexture2D() { TextureInstancedFullPath = "Edmonton_Burger_Delux2go.Textures.Burger_Diff", AllowedTextureAssetNames = new List <string> { "Burger.Diff.bin", } }, new RTexture2D() { TextureInstancedFullPath = "BioAPL_Dec_PlatesCup_Ceramic.Materials.Plates_NotUgly_Norm", LODGroup = new EnumProperty(new NameReference("TEXTUREGROUP_APL", 513), "TextureGroup", MEGame.ME2, "LODGroup"), // A bit higher quality AllowedTextureAssetNames = new List <string> { "Burger.Plates_Norm.bin", } }, new RTexture2D() { TextureInstancedFullPath = "BioAPL_Dec_PlatesCup_Ceramic.Materials.Plates_NotUgly_Diff", LODGroup = new EnumProperty(new NameReference("TEXTUREGROUP_APL", 1025), "TextureGroup", MEGame.ME2, "LODGroup"), // A bit higher quality AllowedTextureAssetNames = new List <string> { "Burger.Plates_Diff.bin", } }, #endregion }; // Start the new TFC TFCBuilder.StartNewTFCs(options); }
public static bool PortPawnIntoPackage(PortablePawn pawn, IMEPackage targetPackage) { if (IsPawnAssetInPackageAlready(pawn, targetPackage)) { return(true); // Pawn asset to port in already ported in } IMEPackage pawnPackage = null; if (pawn.IsCorrectedPackage) { // DEBUG //if (pawn.PackageFilename == "BioPawn_Collector_Batarian.pcc") //{ // pawnPackage = MEPackageHandler.OpenMEPackage(@"C:\Users\mgame\source\repos\ME2Randomizer\ME2Randomizer\staticfiles\binary\correctedpawns\" + pawn.PackageFilename); //} //else //{ var correctedPawnData = MERUtilities.GetEmbeddedStaticFilesBinaryFile($"correctedpawns.{pawn.PackageFilename}"); pawnPackage = MEPackageHandler.OpenMEPackageFromStream(new MemoryStream(correctedPawnData)); //} } else { var pF = MERFileSystem.GetPackageFile(pawn.PackageFilename); if (pF != null) { pawnPackage = MERFileSystem.OpenMEPackage(pF); } else { Debug.WriteLine("Pawn package not found: {pawn.PackageFilename}"); } } if (pawnPackage != null) { PackageTools.PortExportIntoPackage(targetPackage, pawnPackage.FindExport(pawn.AssetToPortIn), useMemorySafeImport: !pawn.IsCorrectedPackage); // Ensure the assets are too as they may not be directly referenced except in the level instance foreach (var asset in pawn.AssetPaths) { if (targetPackage.FindExport(asset) == null) { PackageTools.PortExportIntoPackage(targetPackage, pawnPackage.FindExport(asset), useMemorySafeImport: !pawn.IsCorrectedPackage); } } if (pawn.TextureUpdates != null) { foreach (var tu in pawn.TextureUpdates) { var targetTextureExp = targetPackage.FindExport(tu.TextureInstancedFullPath); TFCBuilder.InstallTexture(tu, targetTextureExp); } } return(true); } return(false); }