Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
 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);
 }
Exemplo n.º 5
0
        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());
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
 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);
 }
Exemplo n.º 9
0
        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);
        }
Exemplo n.º 10
0
        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);
        }
Exemplo n.º 11
0
        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);
        }
Exemplo n.º 12
0
            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];