public static BflytFile.PatchResult PatchAnimations(SARCExt.SarcData sarc, AnimFilePatch[] files) { if (files == null) { return(BflytFile.PatchResult.OK); } uint TargetVersion = 0; foreach (var p in files) { if (!sarc.Files.ContainsKey(p.FileName)) { continue; //return BflytFile.PatchResult.Fail; Don't be so strict as older firmwares may not have all the animations (?) } if (TargetVersion == 0) { Bflan b = new Bflan(sarc.Files[p.FileName]); TargetVersion = b.Version; } var n = BflanSerializer.FromJson(p.AnimJson); n.Version = TargetVersion; n.byteOrder = Syroot.BinaryData.ByteOrder.LittleEndian; sarc.Files[p.FileName] = n.WriteFile(); } return(BflytFile.PatchResult.OK); }
public static PatchTemplate DetectSarc(SARCExt.SarcData sarc, IEnumerable <PatchTemplate> Templates) { bool SzsHasKey(string key) => sarc.Files.ContainsKey(key); if (!SzsHasKey(@"timg/__Combined.bntx")) { return(null); } foreach (var p in Templates) { if (!SzsHasKey(p.MainLayoutName)) { continue; } bool isTarget = true; foreach (string s in p.SecondaryLayouts) { if (!SzsHasKey(s)) { isTarget = false; break; } } if (!isTarget) { continue; } foreach (string s in p.FnameIdentifier) { if (!SzsHasKey(s)) { isTarget = false; break; } } if (!isTarget) { continue; } foreach (string s in p.FnameNotIdentifier) { if (SzsHasKey(s)) { isTarget = false; break; } } if (!isTarget) { continue; } return(p); } return(null); }
public static BflytFile.PatchResult PatchBntx(SARCExt.SarcData sarc, DDSEncoder.DDSLoadResult DDS, PatchTemplate targetPatch) { QuickBntx q = new QuickBntx(new BinaryDataReader(new MemoryStream(sarc.Files[@"timg/__Combined.bntx"]))); if (q.Rlt.Length != 0x80) { return(BflytFile.PatchResult.Fail); } q.ReplaceTex(targetPatch.MaintextureName, DDS); DDS = null; sarc.Files[@"timg/__Combined.bntx"] = null; sarc.Files[@"timg/__Combined.bntx"] = q.Write(); return(BflytFile.PatchResult.OK); }
public bool IsCompatible(SARCExt.SarcData szs) { for (int i = 0; i < Files.Length; i++) { if (!szs.Files.ContainsKey(Files[i].FileName)) { return(false); } //string TargetFileAsString = ASCIIEncoding.ASCII.GetString(szs.Files[Files[i].FileName]); //for (int j = 0; j < Files[i].Patches.Length; j++) // if (!TargetFileAsString.Contains(Files[i].Patches[j].PaneName)) // return false; } return(true); }
public static PatchTemplate GetFor(SARCExt.SarcData sarc) { bool SzsHasKey(string key) => sarc.Files.ContainsKey(key); if (!SzsHasKey(@"timg/__Combined.bntx")) { return(null); } var t = Templates.Where(x => x.FnameIdentifier.All(SzsHasKey) && !x.FnameNotIdentifier.Any(SzsHasKey)); return(t.FirstOrDefault()); }
public static Firmware Detect(string nxPartName, SARCExt.SarcData sarc) { if (FirmwareInfo.ContainsKey(nxPartName)) { var t = FirmwareInfo[nxPartName].Where(x => (x.MustContain?.All(y => sarc.Files.ContainsKey(y)) ?? true) && (x.MustNotContain?.All(y => !sarc.Files.ContainsKey(y)) ?? true) ); if (t.Any()) { return(t.First().Version); } } return(Firmware.Invariant); }
public static BflytFile.PatchResult PatchBntxTexture(SARCExt.SarcData sarc, byte[] DDS, string texName, uint TexFlag = 0xFFFFFFFF) { QuickBntx q = new QuickBntx(new BinaryDataReader(new MemoryStream(sarc.Files[@"timg/__Combined.bntx"]))); if (q.Rlt.Length != 0x80) { return(BflytFile.PatchResult.Fail); } q.ReplaceTex(texName, DDS); if (TexFlag != 0xFFFFFFFF) { q.Textures.Where(x => x.Name == texName).First().ChannelTypes = (int)TexFlag; } sarc.Files[@"timg/__Combined.bntx"] = null; sarc.Files[@"timg/__Combined.bntx"] = q.Write(); return(BflytFile.PatchResult.OK); }
public static BflytFile.PatchResult PatchLayouts(SARCExt.SarcData sarc, LayoutFilePatch[] Files) { foreach (var p in Files) { if (!sarc.Files.ContainsKey(p.FileName)) { return(BflytFile.PatchResult.Fail); } var target = new BflytFile(sarc.Files[p.FileName]); var res = target.ApplyLayoutPatch(p.Patches); if (res != BflytFile.PatchResult.OK) { return(res); } sarc.Files[p.FileName] = target.SaveFile(); } return(BflytFile.PatchResult.OK); }
public static BflytFile.PatchResult PatchBgLayouts(SARCExt.SarcData sarc, PatchTemplate template) { BflytFile BflytFromSzs(string name) => new BflytFile(sarc.Files[name]); BflytFile MainFile = BflytFromSzs(template.MainLayoutName); var res = MainFile.PatchBgLayout(template); if (res == BflytFile.PatchResult.OK) { sarc.Files[template.MainLayoutName] = MainFile.SaveFile(); foreach (var f in template.SecondaryLayouts) { BflytFile curTarget = BflytFromSzs(f); curTarget.PatchTextureName(template.MaintextureName, template.SecondaryTexReplace); sarc.Files[f] = curTarget.SaveFile(); } } return(res); }
public static BflytFile.PatchResult PatchBgLayouts(SARCExt.SarcData sarc, PatchTemplate template) { BflytFile BflytFromSzs(string name) => new BflytFile(sarc.Files[name]); var layouts = sarc.Files.Keys.Where(x => x.StartsWith("blyt/") && x.EndsWith(".bflyt") && x != template.MainLayoutName).ToArray(); foreach (var f in layouts) { BflytFile curTarget = BflytFromSzs(f); if (curTarget.PatchTextureName(template.MaintextureName, template.SecondaryTexReplace)) { sarc.Files[f] = curTarget.SaveFile(); } } BflytFile MainFile = BflytFromSzs(template.MainLayoutName); var res = MainFile.PatchBgLayout(template); sarc.Files[template.MainLayoutName] = MainFile.SaveFile(); return(res); }
public static BflytFile.PatchResult PatchLayouts(SARCExt.SarcData sarc, LayoutPatch Patch, bool FixFor8, bool AddAnimations = false) { List <LayoutFilePatch> Files = new List <LayoutFilePatch>(); Files.AddRange(Patch.Files); if (FixFor8 && !Patch.Ready8X) { var extra = NewFirmFixes.GetFix(Patch.PatchName); if (extra != null) { Files.AddRange(extra); } } foreach (var p in Files) { if (!sarc.Files.ContainsKey(p.FileName)) { return(BflytFile.PatchResult.Fail); } var target = new BflytFile(sarc.Files[p.FileName]); var res = target.ApplyLayoutPatch(p.Patches); if (res != BflytFile.PatchResult.OK) { return(res); } if (AddAnimations) { res = target.AddGroupNames(p.AddGroups); if (res != BflytFile.PatchResult.OK) { return(res); } } sarc.Files[p.FileName] = target.SaveFile(); } return(BflytFile.PatchResult.OK); }
public CachedModel(ResFile bfres, string textureArc) { bool loadTextures = !Properties.Settings.Default.DoNotLoadTextures; if (loadTextures && textureArc != null && File.Exists(Program.TryGetPathViaProject("ObjectData", textureArc + ".szs")) /*&& textureArc != "SingleModeBossSharedTextures" && textureArc != "SingleModeSharedTextures"*/) { if (!texArcCache.ContainsKey(textureArc)) { SARCExt.SarcData objArc = SARCExt.SARC.UnpackRamN(YAZ0.Decompress(Program.TryGetPathViaProject("ObjectData", textureArc + ".szs"))); Dictionary <string, int> arc = new Dictionary <string, int>(); texArcCache.Add(textureArc, arc); foreach (KeyValuePair <string, TextureShared> textureEntry in new ResFile(new MemoryStream(objArc.Files[textureArc + ".bfres"])).Textures) { arc.Add(textureEntry.Key, UploadTexture(textureEntry.Value)); } } } else if (loadTextures && textureArc != null) { var filePath = Program.TryGetPathViaProject("ObjectData", textureArc); if (Directory.Exists(filePath)) { if (!texArcCache.ContainsKey(textureArc)) { Dictionary <string, int> arc = new Dictionary <string, int>(); var filePaths = Directory.GetFiles(filePath); texArcCache.Add(textureArc, arc); foreach (string fileName in filePaths) { var image = new System.Drawing.Bitmap(fileName); int texID = GL.GenTexture(); GL.BindTexture(TextureTarget.Texture2D, texID); System.Drawing.Imaging.BitmapData data = image.LockBits(new System.Drawing.Rectangle(0, 0, image.Width, image.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0); image.UnlockBits(data); image.Dispose(); GL.GenerateMipmap(GenerateMipmapTarget.Texture2D); arc.Add(System.IO.Path.GetFileNameWithoutExtension(fileName), texID); //var imageForm = new System.Windows.Forms.Form(); //imageForm.BackgroundImage = image; //imageForm.Show(); } } } } Model mdl = bfres.Models[0]; vaos = new VertexArrayObject[mdl.Shapes.Count]; indexBufferLengths = new int[mdl.Shapes.Count]; textures = new int[mdl.Shapes.Count]; wrapModes = new (int, int)[mdl.Shapes.Count];