diff --git a/File_Format_Library/FileFormats/Archives/U8.cs b/File_Format_Library/FileFormats/Archives/U8.cs index 88bbf79e..34046502 100644 --- a/File_Format_Library/FileFormats/Archives/U8.cs +++ b/File_Format_Library/FileFormats/Archives/U8.cs @@ -51,8 +51,9 @@ namespace FirstPlugin } public List nodes = new List(); + public List files = new List(); - public IEnumerable Files => null; + public IEnumerable Files => files; public IEnumerable Nodes => nodes; public void ClearFiles() { nodes.Clear(); } @@ -150,6 +151,7 @@ namespace FirstPlugin reader.SeekBegin(entry.nodeEntry.Setting1); entry.FileData = reader.ReadBytes((int)entry.nodeEntry.Setting2); + files.Add(entry); } } } @@ -166,6 +168,11 @@ namespace FirstPlugin public class FileEntry : ArchiveFileInfo { + public override bool OpenFileFormatOnLoad + { + get { return true; } + } + public NodeEntry nodeEntry; } diff --git a/File_Format_Library/FileFormats/Layout/CAFE/BFLYT.cs b/File_Format_Library/FileFormats/Layout/CAFE/BFLYT.cs index 83047391..56d2e257 100644 --- a/File_Format_Library/FileFormats/Layout/CAFE/BFLYT.cs +++ b/File_Format_Library/FileFormats/Layout/CAFE/BFLYT.cs @@ -14,7 +14,7 @@ using SharpYaml.Serialization; using FirstPlugin; using System.ComponentModel; -namespace LayoutBXLYT +namespace LayoutBXLYT.Cafe { public class BFLYT : IFileFormat, IEditorForm, IConvertableTextFormat { @@ -305,6 +305,8 @@ namespace LayoutBXLYT ushort sectionCount = reader.ReadUInt16(); reader.ReadUInt16(); //Padding + IsBigEndian = reader.ByteOrder == Syroot.BinaryData.ByteOrder.BigEndian; + bool setRoot = false; bool setGroupRoot = false; @@ -411,11 +413,17 @@ namespace LayoutBXLYT break; //If the section is not supported store the raw bytes default: - section.Data = reader.ReadBytes((int)SectionSize); + section.Data = reader.ReadBytes((int)SectionSize - 8); break; } + //Check if we reached the end or not + long endPos = reader.Position; + if (reader.Position < pos + SectionSize) + { + int size = (int)(endPos - pos); + section.Data = reader.ReadBytes(size); + } - section.Signature = Signature; section.SectionSize = SectionSize; reader.SeekBegin(pos + SectionSize); @@ -435,22 +443,112 @@ namespace LayoutBXLYT { Version = VersionMajor << 24 | VersionMinor << 16 | VersionMicro << 8 | VersionMicro2; + writer.SetByteOrder(true); writer.WriteSignature(Magic); writer.Write(ByteOrderMark); + writer.SetByteOrder(IsBigEndian); writer.Write(HeaderSize); writer.Write(Version); writer.Write(uint.MaxValue); //Reserve space for file size later writer.Write(ushort.MaxValue); //Reserve space for section count later writer.Seek(2); //padding + int sectionCount = 1; + + WriteSection(writer, "lyt1", LayoutInfo,() => LayoutInfo.Write(writer, this)); + + if (TextureList != null && TextureList.Textures.Count > 0) + { + WriteSection(writer, "txl1", TextureList,() => TextureList.Write(writer, this)); + sectionCount++; + } + if (FontList != null && FontList.Fonts.Count > 0) + { + WriteSection(writer, "fnl1", FontList,() => FontList.Write(writer, this)); + sectionCount++; + } + if (MaterialList != null && MaterialList.Materials.Count > 0) + { + WriteSection(writer, "mat1", MaterialList,() => MaterialList.Write(writer, this)); + sectionCount++; + } + + WritePanes(writer, RootPane, this, ref sectionCount); + WriteGroupPanes(writer, RootGroup, this, ref sectionCount); + + //Write the total section count + using (writer.TemporarySeek(0x10, System.IO.SeekOrigin.Begin)) + { + writer.Write((ushort)sectionCount); + } + //Write the total file size using (writer.TemporarySeek(0x0C, System.IO.SeekOrigin.Begin)) { writer.Write((uint)writer.BaseStream.Length); } } + + private void WritePanes(FileWriter writer, BasePane pane, BxlytHeader header, ref int sectionCount) + { + WriteSection(writer, pane.Signature, pane,() => pane.Write(writer, header)); + sectionCount++; + + if (pane.HasChildern) + { + sectionCount += 2; + + //Write start of children section + WriteSection(writer, "pas1", null); + + foreach (var child in pane.Childern) + WritePanes(writer, child, header, ref sectionCount); + + //Write pae1 of children section + WriteSection(writer, "pae1", null); + } + } + + private void WriteGroupPanes(FileWriter writer, BasePane pane, BxlytHeader header, ref int sectionCount) + { + WriteSection(writer, pane.Signature, pane, () => pane.Write(writer, header)); + sectionCount++; + + if (pane.HasChildern) + { + sectionCount += 2; + + //Write start of children section + WriteSection(writer, "grs1", null); + + foreach (var child in pane.Childern) + WriteGroupPanes(writer, child, header, ref sectionCount); + + //Write pae1 of children section + WriteSection(writer, "gre1", null); + } + } + + private void WriteSection(FileWriter writer, string magic, SectionCommon section, Action WriteMethod = null) + { + long startPos = writer.Position; + writer.WriteSignature(magic); + writer.Write(uint.MaxValue); + WriteMethod?.Invoke(); + if (section != null && section.Data != null) + writer.Write(section.Data); + + long endPos = writer.Position; + + using (writer.TemporarySeek(startPos + 4, System.IO.SeekOrigin.Begin)) + { + writer.Write((uint)(endPos - startPos)); + } + + } } + public class TexCoord { public Vector2F TopLeft { get; set; } @@ -469,6 +567,8 @@ namespace LayoutBXLYT public class TXT1 : PAN1 { + public override string Signature { get; } = "txt1"; + public TXT1() : base() { @@ -570,7 +670,7 @@ namespace LayoutBXLYT public override void Write(FileWriter writer, BxlytHeader header) { - long pos = writer.Position; + long pos = writer.Position - 8; base.Write(writer, header); writer.Write(TextLength); @@ -620,6 +720,8 @@ namespace LayoutBXLYT public class WND1 : PAN1 { + public override string Signature { get; } = "wnd1"; + public WND1() : base() { @@ -662,6 +764,8 @@ namespace LayoutBXLYT reader.SeekBegin(pos + contentOffset); Content = new WindowContent(reader); + reader.SeekBegin(pos + frameOffsetTbl); + var offsets = reader.ReadUInt32s(FrameCount); foreach (int offset in offsets) { @@ -672,7 +776,7 @@ namespace LayoutBXLYT public override void Write(FileWriter writer, BxlytHeader header) { - long pos = writer.Position; + long pos = writer.Position - 8; base.Write(writer, header); writer.Write(StretchLeft); @@ -685,7 +789,7 @@ namespace LayoutBXLYT writer.Write(FrameElementBottm); writer.Write(FrameCount); writer.Write(_flag); - writer.Seek(2); + writer.Write((ushort)0); long _ofsContentPos = writer.Position; writer.Write(0); @@ -693,6 +797,19 @@ namespace LayoutBXLYT writer.WriteUint32Offset(_ofsContentPos, pos); Content.Write(writer); + + if (WindowFrames.Count > 0) + { + writer.WriteUint32Offset(_ofsContentPos + 4, pos); + //Reserve space for frame offsets + long _ofsFramePos = writer.Position; + writer.Write(new uint[WindowFrames.Count]); + for (int i = 0; i < WindowFrames.Count; i++) + { + writer.WriteUint32Offset(_ofsFramePos + (i * 4), pos); + WindowFrames[i].Write(writer); + } + } } public class WindowContent @@ -768,6 +885,8 @@ namespace LayoutBXLYT public class BND1 : PAN1 { + public override string Signature { get; } = "bnd1"; + public BND1() : base() { @@ -786,6 +905,8 @@ namespace LayoutBXLYT public class GRP1 : BasePane { + public override string Signature { get; } = "grp1"; + public List Panes { get; set; } = new List(); public GRP1() : base() @@ -833,6 +954,8 @@ namespace LayoutBXLYT public class PRT1 : PAN1 { + public override string Signature { get; } = "prt1"; + public PRT1() : base() { @@ -851,6 +974,8 @@ namespace LayoutBXLYT public class PIC1 : PAN1 { + public override string Signature { get; } = "pic1"; + public TexCoord[] TexCoords { get; set; } public STColor8 ColorTopLeft { get; set; } @@ -890,10 +1015,10 @@ namespace LayoutBXLYT { ParentLayout = header; - ColorTopLeft = STColor8.FromBytes(reader.ReadBytes(4)); - ColorTopRight = STColor8.FromBytes(reader.ReadBytes(4)); - ColorBottomLeft = STColor8.FromBytes(reader.ReadBytes(4)); - ColorBottomRight = STColor8.FromBytes(reader.ReadBytes(4)); + ColorTopLeft = reader.ReadColor8RGBA(); + ColorTopRight = reader.ReadColor8RGBA(); + ColorBottomLeft = reader.ReadColor8RGBA(); + ColorBottomRight = reader.ReadColor8RGBA(); MaterialIndex = reader.ReadUInt16(); byte numUVs = reader.ReadByte(); reader.Seek(1); //padding @@ -914,17 +1039,28 @@ namespace LayoutBXLYT public override void Write(FileWriter writer, BxlytHeader header) { base.Write(writer, header); - writer.Write(ColorTopLeft.ToBytes()); - writer.Write(ColorTopRight.ToBytes()); - writer.Write(ColorBottomLeft.ToBytes()); - writer.Write(ColorBottomRight.ToBytes()); + writer.Write(ColorTopLeft); + writer.Write(ColorTopRight); + writer.Write(ColorBottomLeft); + writer.Write(ColorBottomRight); writer.Write(MaterialIndex); - writer.Write(TexCoords != null ? TexCoords.Length : 0); + writer.Write((byte)TexCoords.Length); + writer.Write((byte)0); + + for (int i = 0; i < TexCoords.Length; i++) + { + writer.Write(TexCoords[i].TopLeft); + writer.Write(TexCoords[i].TopRight); + writer.Write(TexCoords[i].BottomLeft); + writer.Write(TexCoords[i].BottomRight); + } } } public class PAN1 : BasePane { + public override string Signature { get; } = "pan1"; + private byte _flags1; private byte _flags2; @@ -1086,21 +1222,37 @@ namespace LayoutBXLYT public override void Write(FileWriter writer, BxlytHeader header) { + long pos = writer.Position - 8; + writer.Write((ushort)Materials.Count); writer.Seek(2); + + long _ofsPos = writer.Position; + //Fill empty spaces for offsets later + writer.Write(new uint[Materials.Count]); + + //Save offsets and strings + for (int i = 0; i < Materials.Count; i++) + { + writer.WriteUint32Offset(_ofsPos + (i * 4), pos); + Materials[i].Write(writer, header); + writer.Align(4); + } } } + //Thanks to shibbs for the material info + //https://github.com/shibbo/flyte/blob/master/flyte/lyt/common/MAT1.cs public class Material { [DisplayName("Name"), CategoryAttribute("General")] public string Name { get; set; } - [DisplayName("Fore Color"), CategoryAttribute("Color")] - public STColor8 ForeColor { get; set; } + [DisplayName("Black Color"), CategoryAttribute("Color")] + public STColor8 BlackColor { get; set; } - [DisplayName("Back Color"), CategoryAttribute("Color")] - public STColor8 BackColor { get; set; } + [DisplayName("White Color"), CategoryAttribute("Color")] + public STColor8 WhiteColor { get; set; } [DisplayName("Texture Maps"), CategoryAttribute("Texture")] public TextureRef[] TextureMaps { get; set; } @@ -1108,6 +1260,30 @@ namespace LayoutBXLYT [DisplayName("Texture Transforms"), CategoryAttribute("Texture")] public TextureTransform[] TextureTransforms { get; set; } + [DisplayName("Texture Coordinate Params"), CategoryAttribute("Texture")] + public TexCoordGen[] TexCoords { get; set; } + + [DisplayName("Tev Stages"), CategoryAttribute("Tev")] + public TevStage[] TevStages { get; set; } + + [DisplayName("Alpha Compare"), CategoryAttribute("Alpha")] + public AlphaCompare AlphaCompare { get; set; } + + [DisplayName("Blend Mode"), CategoryAttribute("Blend")] + public BlendMode BlendMode { get; set; } + + [DisplayName("Blend Mode Logic"), CategoryAttribute("Blend")] + public BlendMode BlendModeLogic { get; set; } + + [DisplayName("Indirect Parameter"), CategoryAttribute("Texture")] + public IndirectParameter IndParameter { get; set; } + + [DisplayName("Projection Texture Coord Parameters"), CategoryAttribute("Texture")] + public ProjectionTexGenParam[] ProjTexGenParams { get; set; } + + [DisplayName("Font Shadow Parameters"), CategoryAttribute("Font")] + public FontShadowParameter FontShadowParameter { get; set; } + private uint flags; private int unknown; @@ -1135,42 +1311,77 @@ namespace LayoutBXLYT { flags = reader.ReadUInt32(); unknown = reader.ReadInt32(); - ForeColor = STColor8.FromBytes(reader.ReadBytes(4)); - BackColor = STColor8.FromBytes(reader.ReadBytes(4)); + BlackColor = STColor8.FromBytes(reader.ReadBytes(4)); + WhiteColor = STColor8.FromBytes(reader.ReadBytes(4)); } else { - ForeColor = STColor8.FromBytes(reader.ReadBytes(4)); - BackColor = STColor8.FromBytes(reader.ReadBytes(4)); + BlackColor = STColor8.FromBytes(reader.ReadBytes(4)); + WhiteColor = STColor8.FromBytes(reader.ReadBytes(4)); flags = reader.ReadUInt32(); } uint texCount = Convert.ToUInt32(flags & 3); uint mtxCount = Convert.ToUInt32(flags >> 2) & 3; + uint texCoordGenCount = Convert.ToUInt32(flags >> 4) & 3; + uint tevStageCount = Convert.ToUInt32(flags >> 6) & 0x7; + var hasAlphaCompare = Convert.ToBoolean((flags >> 9) & 0x1); + var hasBlendMode = Convert.ToBoolean((flags >> 10) & 0x1); + var useTextureOnly = Convert.ToBoolean((flags >> 11) & 0x1); + var seperateBlendMode = Convert.ToBoolean((flags >> 12) & 0x1); + var hasIndParam = Convert.ToBoolean((flags >> 14) & 0x1); + var projTexGenParamCount = Convert.ToUInt32((flags >> 15) & 0x3); + var hasFontShadowParam = Convert.ToBoolean((flags >> 17) & 0x1); + var thresholdingAlphaInterpolation = Convert.ToBoolean((flags >> 18) & 0x1); TextureMaps = new TextureRef[texCount]; + TextureTransforms = new TextureTransform[mtxCount]; + TexCoords = new TexCoordGen[texCoordGenCount]; + TevStages = new TevStage[tevStageCount]; + ProjTexGenParams = new ProjectionTexGenParam[projTexGenParamCount]; + for (int i = 0; i < texCount; i++) TextureMaps[i] = new TextureRef(reader, header); - TextureTransforms = new TextureTransform[mtxCount]; for (int i = 0; i < mtxCount; i++) TextureTransforms[i] = new TextureTransform(reader); + + for (int i = 0; i < texCoordGenCount; i++) + TexCoords[i] = new TexCoordGen(reader, header); + + for (int i = 0; i < tevStageCount; i++) + TevStages[i] = new TevStage(reader, header); + + if (hasAlphaCompare) + AlphaCompare = new AlphaCompare(reader, header); + if (hasBlendMode) + BlendMode = new BlendMode(reader, header); + if (seperateBlendMode) + BlendModeLogic = new BlendMode(reader, header); + if (hasIndParam) + IndParameter = new IndirectParameter(reader, header); + + for (int i = 0; i < projTexGenParamCount; i++) + ProjTexGenParams[i] = new ProjectionTexGenParam(reader, header); + + if (hasFontShadowParam) + FontShadowParameter = new FontShadowParameter(reader, header); } - public void Write(FileWriter writer, Header header) + public void Write(FileWriter writer, BxlytHeader header) { writer.WriteString(Name, 0x1C); - if (header.Version == 0x8030000) + if (header.VersionMajor >= 8) { writer.Write(flags); writer.Write(unknown); - writer.Write(ForeColor); - writer.Write(BackColor); + writer.Write(BlackColor); + writer.Write(WhiteColor); } else { - writer.Write(ForeColor); - writer.Write(BackColor); + writer.Write(BlackColor); + writer.Write(WhiteColor); writer.Write(flags); } @@ -1179,88 +1390,27 @@ namespace LayoutBXLYT for (int i = 0; i < TextureTransforms.Length; i++) TextureTransforms[i].Write(writer); - } - } - public class TextureTransform - { - public Vector2F Translate; - public float Rotate; - public Vector2F Scale; + for (int i = 0; i < TexCoords.Length; i++) + TexCoords[i].Write(writer); - public TextureTransform() { } + for (int i = 0; i < TevStages.Length; i++) + TevStages[i].Write(writer); - public TextureTransform(FileReader reader) - { - Translate = reader.ReadVec2SY(); - Rotate = reader.ReadSingle(); - Scale = reader.ReadVec2SY(); - } + if (AlphaCompare != null) + AlphaCompare.Write(writer); + if (BlendMode != null) + BlendMode.Write(writer); + if (BlendModeLogic != null) + BlendModeLogic.Write(writer); + if (IndParameter != null) + IndParameter.Write(writer); - public void Write(FileWriter writer) - { - writer.Write(Translate); - writer.Write(Rotate); - writer.Write(Scale); - } - } + for (int i = 0; i < ProjTexGenParams.Length; i++) + ProjTexGenParams[i].Write(writer); - public class TextureRef - { - public string Name { get; set; } - public short ID; - byte flag1; - byte flag2; - - public WrapMode WrapModeU - { - get { return (WrapMode)(flag1 & 0x3); } - } - - public WrapMode WrapModeV - { - get { return (WrapMode)(flag2 & 0x3); } - } - - public FilterMode MinFilterMode - { - get { return (FilterMode)((flag1 >> 2) & 0x3); } - } - - public FilterMode MaxFilterMode - { - get { return (FilterMode)((flag2 >> 2) & 0x3); } - } - - public TextureRef() {} - - public TextureRef(FileReader reader, BFLYT.Header header) { - ID = reader.ReadInt16(); - flag1 = reader.ReadByte(); - flag2 = reader.ReadByte(); - - if (header.Textures.Count > 0 && ID != -1) - Name = header.Textures[ID]; - } - - public void Write(FileWriter writer) - { - writer.Write(ID); - writer.Write(flag1); - writer.Write(flag2); - } - - public enum FilterMode - { - Near = 0, - Linear = 1 - } - - public enum WrapMode - { - Clamp = 0, - Repeat = 1, - Mirror = 2 + if (FontShadowParameter != null) + FontShadowParameter.Write(writer); } } @@ -1399,7 +1549,8 @@ namespace LayoutBXLYT writer.Write(Height); writer.Write(MaxPartsWidth); writer.Write(MaxPartsHeight); - writer.Write(Name); + writer.WriteString(Name); + writer.Align(4); } } } diff --git a/File_Format_Library/FileFormats/Layout/CAFE/Materials/AlphaCompare.cs b/File_Format_Library/FileFormats/Layout/CAFE/Materials/AlphaCompare.cs new file mode 100644 index 00000000..884df6f0 --- /dev/null +++ b/File_Format_Library/FileFormats/Layout/CAFE/Materials/AlphaCompare.cs @@ -0,0 +1,24 @@ +using Toolbox.Library.IO; + +namespace LayoutBXLYT.Cafe +{ + public class AlphaCompare + { + public byte CompareMode; + public uint Value; + + public AlphaCompare(FileReader reader, BFLYT.Header header) + { + CompareMode = reader.ReadByte(); + reader.ReadBytes(0x3); + Value = reader.ReadUInt32(); + } + + public void Write(FileWriter writer) + { + writer.Write(CompareMode); + writer.Seek(3); + writer.Write(Value); + } + } +} diff --git a/File_Format_Library/FileFormats/Layout/CAFE/Materials/BlendMode.cs b/File_Format_Library/FileFormats/Layout/CAFE/Materials/BlendMode.cs new file mode 100644 index 00000000..f2b1a660 --- /dev/null +++ b/File_Format_Library/FileFormats/Layout/CAFE/Materials/BlendMode.cs @@ -0,0 +1,73 @@ +using Toolbox.Library.IO; + +namespace LayoutBXLYT.Cafe +{ + public class BlendMode + { + public GX2BlendOp BlendOp { get; set; } + public GX2BlendFactor SourceFactor { get; set; } + public GX2BlendFactor DestFactor { get; set; } + public GX2LogicOp LogicOp { get; set; } + + public BlendMode(FileReader reader, BFLYT.Header header) + { + BlendOp = (GX2BlendOp)reader.ReadByte(); + SourceFactor = (GX2BlendFactor)reader.ReadByte(); + DestFactor = (GX2BlendFactor)reader.ReadByte(); + LogicOp = (GX2LogicOp)reader.ReadByte(); + } + + public void Write(FileWriter writer) + { + writer.Write(BlendOp, false); + writer.Write(SourceFactor, false); + writer.Write(DestFactor, false); + writer.Write(LogicOp, false); + } + + public enum GX2BlendFactor : byte + { + Factor0 = 0, + Factor1 = 1, + DestColor = 2, + DestInvColor = 3, + SourceAlpha = 4, + SourceInvAlpha = 5, + DestAlpha = 6, + DestInvAlpha = 7, + SourceColor = 8, + SourceInvColor = 9 + } + + public enum GX2BlendOp : byte + { + Disable = 0, + Add = 1, + Subtract = 2, + ReverseSubtract = 3, + SelectMin = 4, + SelectMax = 5 + } + + public enum GX2LogicOp : byte + { + Disable = 0, + NoOp = 1, + Clear = 2, + Set = 3, + Copy = 4, + InvCopy = 5, + Inv = 6, + And = 7, + Nand = 8, + Or = 9, + Nor = 10, + Xor = 11, + Equiv = 12, + RevAnd = 13, + InvAd = 14, + RevOr = 15, + InvOr = 16 + } + } +} diff --git a/File_Format_Library/FileFormats/Layout/CAFE/Materials/FontShadowParameter.cs b/File_Format_Library/FileFormats/Layout/CAFE/Materials/FontShadowParameter.cs new file mode 100644 index 00000000..0ae632fa --- /dev/null +++ b/File_Format_Library/FileFormats/Layout/CAFE/Materials/FontShadowParameter.cs @@ -0,0 +1,23 @@ +using Toolbox.Library.IO; +using Toolbox.Library; + +namespace LayoutBXLYT.Cafe +{ + public class FontShadowParameter + { + public STColor8 BlackColor { get; set; } + public STColor8 WhiteColor { get; set; } + + public FontShadowParameter(FileReader reader, BFLYT.Header header) + { + BlackColor = reader.ReadColor8RGBA(); + WhiteColor = reader.ReadColor8RGBA(); + } + + public void Write(FileWriter writer) + { + writer.Write(BlackColor); + writer.Write(WhiteColor); + } + } +} diff --git a/File_Format_Library/FileFormats/Layout/CAFE/Materials/IndirectParameter.cs b/File_Format_Library/FileFormats/Layout/CAFE/Materials/IndirectParameter.cs new file mode 100644 index 00000000..2b87d79d --- /dev/null +++ b/File_Format_Library/FileFormats/Layout/CAFE/Materials/IndirectParameter.cs @@ -0,0 +1,25 @@ +using Toolbox.Library.IO; + +namespace LayoutBXLYT.Cafe +{ + public class IndirectParameter + { + public float Rotation { get; set; } + public float ScaleX { get; set; } + public float ScaleY { get; set; } + + public IndirectParameter(FileReader reader, BFLYT.Header header) + { + Rotation = reader.ReadSingle(); + ScaleX = reader.ReadSingle(); + ScaleY = reader.ReadSingle(); + } + + public void Write(FileWriter writer) + { + writer.Write(Rotation); + writer.Write(ScaleX); + writer.Write(ScaleY); + } + } +} diff --git a/File_Format_Library/FileFormats/Layout/CAFE/Materials/ProjectionTexGenParam.cs b/File_Format_Library/FileFormats/Layout/CAFE/Materials/ProjectionTexGenParam.cs new file mode 100644 index 00000000..4cae02e6 --- /dev/null +++ b/File_Format_Library/FileFormats/Layout/CAFE/Materials/ProjectionTexGenParam.cs @@ -0,0 +1,50 @@ +using Toolbox.Library.IO; +using System; + +namespace LayoutBXLYT.Cafe +{ + public class ProjectionTexGenParam + { + public float PosX { get; set; } + public float PosY { get; set; } + public float ScaleX { get; set; } + public float ScaleY { get; set; } + + public bool IsFittingLayoutSize + { + get { return Convert.ToBoolean(flags & 0x1); } + } + + public bool IsFittingPaneSize + { + get { return Convert.ToBoolean(flags & 0x2); } + } + + public bool IsAdjustPRojectionSR + { + get { return Convert.ToBoolean(flags & 0x3); } + } + + byte flags; + + public ProjectionTexGenParam(FileReader reader, BFLYT.Header header) + { + PosX = reader.ReadSingle(); + PosY = reader.ReadSingle(); + ScaleX = reader.ReadSingle(); + ScaleY = reader.ReadSingle(); + flags = reader.ReadByte(); + reader.Seek(3); + } + + public void Write(FileWriter writer) + { + writer.Write(PosX); + writer.Write(PosY); + writer.Write(ScaleX); + writer.Write(ScaleY); + writer.Write(flags); + writer.Seek(3); + } + } +} diff --git a/File_Format_Library/FileFormats/Layout/CAFE/Materials/TevStage.cs b/File_Format_Library/FileFormats/Layout/CAFE/Materials/TevStage.cs new file mode 100644 index 00000000..0c67e462 --- /dev/null +++ b/File_Format_Library/FileFormats/Layout/CAFE/Materials/TevStage.cs @@ -0,0 +1,25 @@ +using Toolbox.Library.IO; + +namespace LayoutBXLYT.Cafe +{ + public class TevStage + { + byte RGBMode; + byte AlphaMode; + ushort unk; + + public TevStage(FileReader reader, BFLYT.Header header) + { + RGBMode = reader.ReadByte(); + AlphaMode = reader.ReadByte(); + unk = reader.ReadUInt16(); + } + + public void Write(FileWriter writer) + { + writer.Write(RGBMode); + writer.Write(AlphaMode); + writer.Write(unk); + } + } +} diff --git a/File_Format_Library/FileFormats/Layout/CAFE/Materials/TexCoordGen.cs b/File_Format_Library/FileFormats/Layout/CAFE/Materials/TexCoordGen.cs new file mode 100644 index 00000000..837c88a9 --- /dev/null +++ b/File_Format_Library/FileFormats/Layout/CAFE/Materials/TexCoordGen.cs @@ -0,0 +1,41 @@ +using Toolbox.Library.IO; + +namespace LayoutBXLYT.Cafe +{ + public class TexCoordGen + { + public MatrixType GenType; + public TextureGenerationType Source; + + byte[] unkData; + + public TexCoordGen(FileReader reader, BFLYT.Header header) + { + GenType = reader.ReadEnum(false); + Source = reader.ReadEnum(false); + unkData = reader.ReadBytes(6); + } + + public void Write(FileWriter writer) + { + writer.Write(GenType, false); + writer.Write(Source, false); + writer.Write(unkData); + } + + public enum MatrixType : byte + { + Matrix2x4 = 0 + } + + public enum TextureGenerationType : byte + { + Tex0 = 0, + Tex1 = 1, + Tex2 = 2, + Ortho = 3, + PaneBased = 4, + PerspectiveProj = 5 + } + } +} diff --git a/File_Format_Library/FileFormats/Layout/CAFE/Materials/TextureRef.cs b/File_Format_Library/FileFormats/Layout/CAFE/Materials/TextureRef.cs new file mode 100644 index 00000000..f8354b6b --- /dev/null +++ b/File_Format_Library/FileFormats/Layout/CAFE/Materials/TextureRef.cs @@ -0,0 +1,64 @@ +using Toolbox.Library.IO; + +namespace LayoutBXLYT.Cafe +{ + public class TextureRef + { + public string Name { get; set; } + public short ID; + byte flag1; + byte flag2; + + public WrapMode WrapModeU + { + get { return (WrapMode)(flag1 & 0x3); } + } + + public WrapMode WrapModeV + { + get { return (WrapMode)(flag2 & 0x3); } + } + + public FilterMode MinFilterMode + { + get { return (FilterMode)((flag1 >> 2) & 0x3); } + } + + public FilterMode MaxFilterMode + { + get { return (FilterMode)((flag2 >> 2) & 0x3); } + } + + public TextureRef() { } + + public TextureRef(FileReader reader, BFLYT.Header header) + { + ID = reader.ReadInt16(); + flag1 = reader.ReadByte(); + flag2 = reader.ReadByte(); + + if (header.Textures.Count > 0 && ID != -1) + Name = header.Textures[ID]; + } + + public void Write(FileWriter writer) + { + writer.Write(ID); + writer.Write(flag1); + writer.Write(flag2); + } + + public enum FilterMode + { + Near = 0, + Linear = 1 + } + + public enum WrapMode + { + Clamp = 0, + Repeat = 1, + Mirror = 2 + } + } +} diff --git a/File_Format_Library/FileFormats/Layout/CAFE/Materials/TextureTransform.cs b/File_Format_Library/FileFormats/Layout/CAFE/Materials/TextureTransform.cs new file mode 100644 index 00000000..0537bc50 --- /dev/null +++ b/File_Format_Library/FileFormats/Layout/CAFE/Materials/TextureTransform.cs @@ -0,0 +1,28 @@ +using Toolbox.Library.IO; +using Syroot.Maths; + +namespace LayoutBXLYT.Cafe +{ + public class TextureTransform + { + public Vector2F Translate; + public float Rotate; + public Vector2F Scale; + + public TextureTransform() { } + + public TextureTransform(FileReader reader) + { + Translate = reader.ReadVec2SY(); + Rotate = reader.ReadSingle(); + Scale = reader.ReadVec2SY(); + } + + public void Write(FileWriter writer) + { + writer.Write(Translate); + writer.Write(Rotate); + writer.Write(Scale); + } + } +} diff --git a/File_Format_Library/FileFormats/Layout/CTR/BCLYT.cs b/File_Format_Library/FileFormats/Layout/CTR/BCLYT.cs index d6560b27..bfe0c200 100644 --- a/File_Format_Library/FileFormats/Layout/CTR/BCLYT.cs +++ b/File_Format_Library/FileFormats/Layout/CTR/BCLYT.cs @@ -203,6 +203,8 @@ namespace LayoutBXLYT public void Read(FileReader reader, BCLYT bclyt) { + IsBigEndian = reader.ByteOrder == Syroot.BinaryData.ByteOrder.BigEndian; + LayoutInfo = new LYT1(); TextureList = new TXL1(); MaterialList = new MAT1(); @@ -332,7 +334,6 @@ namespace LayoutBXLYT break; } - section.Signature = Signature; section.SectionSize = SectionSize; reader.SeekBegin(pos + SectionSize); @@ -352,6 +353,7 @@ namespace LayoutBXLYT { Version = VersionMajor << 24 | VersionMinor << 16 | VersionMicro << 8 | VersionMicro2; + writer.SetByteOrder(IsBigEndian); writer.WriteSignature(Magic); writer.Write(ByteOrderMark); writer.Write(HeaderSize); diff --git a/File_Format_Library/FileFormats/Layout/Common.cs b/File_Format_Library/FileFormats/Layout/Common.cs index 32cef1b7..73a25ad5 100644 --- a/File_Format_Library/FileFormats/Layout/Common.cs +++ b/File_Format_Library/FileFormats/Layout/Common.cs @@ -146,6 +146,8 @@ namespace LayoutBXLYT get { return FileInfo.FileName; } } + public bool IsBigEndian { get; set; } + internal IFileFormat FileInfo; public BasePane RootPane { get; set; } @@ -196,10 +198,11 @@ namespace LayoutBXLYT } } - public class SectionCommon + public class SectionCommon { - internal string Signature { get; set; } - internal uint SectionSize { get; set; } + public virtual string Signature { get; } + public uint SectionSize { get; set; } + public long StartPosition { get; set; } internal byte[] Data { get; set; } @@ -208,7 +211,7 @@ namespace LayoutBXLYT writer.WriteSignature(Signature); if (Data != null) { - writer.Write(Data.Length); + writer.Write(Data.Length + 8); writer.Write(Data); } } diff --git a/File_Format_Library/FileFormats/Layout/Rev/BRLYT.cs b/File_Format_Library/FileFormats/Layout/Rev/BRLYT.cs index fa3fb239..5721ddb2 100644 --- a/File_Format_Library/FileFormats/Layout/Rev/BRLYT.cs +++ b/File_Format_Library/FileFormats/Layout/Rev/BRLYT.cs @@ -114,11 +114,15 @@ namespace LayoutBXLYT { foreach (var file in IFileInfo.ArchiveParent.Files) { - if (Utils.GetExtension(file.FileName) == ".bclim") + if (Utils.GetExtension(file.FileName) == ".tpl") { - BCLIM bclim = (BCLIM)file.OpenFile(); - file.FileFormat = bclim; - textures.Add(bclim.FileName, bclim); + TPL tpl = (TPL)file.OpenFile(); + file.FileFormat = tpl; + foreach (var tex in tpl.IconTextureList) + { + if (!textures.ContainsKey(tex.Text)) + textures.Add(tex.Text, tex); + } } } } @@ -204,6 +208,8 @@ namespace LayoutBXLYT public void Read(FileReader reader, BRLYT brlyt) { + IsBigEndian = reader.ByteOrder == Syroot.BinaryData.ByteOrder.BigEndian; + LayoutInfo = new LYT1(); TextureList = new TXL1(); MaterialList = new MAT1(); @@ -333,7 +339,6 @@ namespace LayoutBXLYT break; } - section.Signature = Signature; section.SectionSize = SectionSize; reader.SeekBegin(pos + SectionSize); @@ -351,6 +356,7 @@ namespace LayoutBXLYT public void Write(FileWriter writer) { + writer.SetByteOrder(IsBigEndian); writer.WriteSignature(Magic); writer.Write(ByteOrderMark); writer.Write(HeaderSize); diff --git a/File_Format_Library/FileFormats/Texture/NUTEXB.cs b/File_Format_Library/FileFormats/Texture/NUTEXB.cs index 342397e9..c3f959b4 100644 --- a/File_Format_Library/FileFormats/Texture/NUTEXB.cs +++ b/File_Format_Library/FileFormats/Texture/NUTEXB.cs @@ -374,6 +374,7 @@ namespace FirstPlugin STFileSaver.SaveFileFormat(this, sfd.FileName); } } + public void Read(FileReader reader) { ImageKey = "Texture"; diff --git a/File_Format_Library/File_Format_Library.csproj b/File_Format_Library/File_Format_Library.csproj index c1bddd40..2ca44d67 100644 --- a/File_Format_Library/File_Format_Library.csproj +++ b/File_Format_Library/File_Format_Library.csproj @@ -293,6 +293,15 @@ + + + + + + + + + diff --git a/File_Format_Library/GUI/BFLYT/LayoutEditor.Designer.cs b/File_Format_Library/GUI/BFLYT/LayoutEditor.Designer.cs index cba865c7..d7186c99 100644 --- a/File_Format_Library/GUI/BFLYT/LayoutEditor.Designer.cs +++ b/File_Format_Library/GUI/BFLYT/LayoutEditor.Designer.cs @@ -42,6 +42,7 @@ this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.textureListToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.textConverterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); ((System.ComponentModel.ISupportInitialize)(this.backColorDisplay)).BeginInit(); this.stToolStrip1.SuspendLayout(); this.stMenuStrip1.SuspendLayout(); @@ -114,7 +115,8 @@ // this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.openToolStripMenuItem, - this.clearWorkspaceToolStripMenuItem}); + this.clearWorkspaceToolStripMenuItem, + this.saveToolStripMenuItem}); this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); this.fileToolStripMenuItem.Text = "File"; @@ -122,14 +124,14 @@ // openToolStripMenuItem // this.openToolStripMenuItem.Name = "openToolStripMenuItem"; - this.openToolStripMenuItem.Size = new System.Drawing.Size(127, 22); + this.openToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.openToolStripMenuItem.Text = "Open"; this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click); // // clearWorkspaceToolStripMenuItem // this.clearWorkspaceToolStripMenuItem.Name = "clearWorkspaceToolStripMenuItem"; - this.clearWorkspaceToolStripMenuItem.Size = new System.Drawing.Size(127, 22); + this.clearWorkspaceToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.clearWorkspaceToolStripMenuItem.Text = "Clear Files"; this.clearWorkspaceToolStripMenuItem.Click += new System.EventHandler(this.clearWorkspaceToolStripMenuItem_Click); // @@ -151,17 +153,24 @@ // textureListToolStripMenuItem // this.textureListToolStripMenuItem.Name = "textureListToolStripMenuItem"; - this.textureListToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.textureListToolStripMenuItem.Size = new System.Drawing.Size(150, 22); this.textureListToolStripMenuItem.Text = "Texture List"; this.textureListToolStripMenuItem.Click += new System.EventHandler(this.textureListToolStripMenuItem_Click); // // textConverterToolStripMenuItem // this.textConverterToolStripMenuItem.Name = "textConverterToolStripMenuItem"; - this.textConverterToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.textConverterToolStripMenuItem.Size = new System.Drawing.Size(150, 22); this.textConverterToolStripMenuItem.Text = "Text Converter"; this.textConverterToolStripMenuItem.Click += new System.EventHandler(this.textConverterToolStripMenuItem_Click); // + // saveToolStripMenuItem + // + this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; + this.saveToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.saveToolStripMenuItem.Text = "Save As"; + this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click); + // // LayoutEditor // this.AllowDrop = true; @@ -203,5 +212,6 @@ private System.Windows.Forms.ToolStripMenuItem clearWorkspaceToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem textConverterToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; } } diff --git a/File_Format_Library/GUI/BFLYT/LayoutEditor.cs b/File_Format_Library/GUI/BFLYT/LayoutEditor.cs index 1fbc4f3b..76edd80a 100644 --- a/File_Format_Library/GUI/BFLYT/LayoutEditor.cs +++ b/File_Format_Library/GUI/BFLYT/LayoutEditor.cs @@ -13,6 +13,7 @@ using WeifenLuo.WinFormsUI.ThemeVS2015; using Toolbox.Library.IO; using Toolbox.Library; using FirstPlugin; +using LayoutBXLYT.Cafe; namespace LayoutBXLYT { @@ -416,5 +417,20 @@ namespace LayoutBXLYT TextConverter.Show(dockPanel1, DockState.DockLeft); } } + + private void saveToolStripMenuItem_Click(object sender, EventArgs e) + { + if (ActiveLayout != null && ActiveLayout.FileInfo.CanSave) + { + SaveFileDialog sfd = new SaveFileDialog(); + sfd.Filter = Utils.GetAllFilters(ActiveLayout.FileInfo); + sfd.FileName = ActiveLayout.FileInfo.FileName; + + if (sfd.ShowDialog() == DialogResult.OK) + { + STFileSaver.SaveFileFormat(ActiveLayout.FileInfo, sfd.FileName); + } + } + } } } diff --git a/File_Format_Library/GUI/BFLYT/LayoutHierarchy.cs b/File_Format_Library/GUI/BFLYT/LayoutHierarchy.cs index 62bfb74e..e9eb651d 100644 --- a/File_Format_Library/GUI/BFLYT/LayoutHierarchy.cs +++ b/File_Format_Library/GUI/BFLYT/LayoutHierarchy.cs @@ -9,6 +9,7 @@ using System.Threading.Tasks; using System.Windows.Forms; using FirstPlugin; using Toolbox.Library.Forms; +using LayoutBXLYT.Cafe; namespace LayoutBXLYT { diff --git a/File_Format_Library/GUI/BFLYT/LayoutTextDocked.cs b/File_Format_Library/GUI/BFLYT/LayoutTextDocked.cs index c11ca5fb..0e8ac117 100644 --- a/File_Format_Library/GUI/BFLYT/LayoutTextDocked.cs +++ b/File_Format_Library/GUI/BFLYT/LayoutTextDocked.cs @@ -8,6 +8,7 @@ using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Toolbox.Library.Forms; +using LayoutBXLYT.Cafe; namespace LayoutBXLYT { diff --git a/File_Format_Library/GUI/BFLYT/LayoutViewer.cs b/File_Format_Library/GUI/BFLYT/LayoutViewer.cs index 1e0216b2..7246c3f9 100644 --- a/File_Format_Library/GUI/BFLYT/LayoutViewer.cs +++ b/File_Format_Library/GUI/BFLYT/LayoutViewer.cs @@ -12,6 +12,7 @@ using OpenTK; using Toolbox.Library; using Toolbox.Library.Rendering; using Toolbox.Library.IO; +using LayoutBXLYT.Cafe; namespace LayoutBXLYT { @@ -306,9 +307,9 @@ namespace LayoutBXLYT textureMap0 = mat.GetTexture(0); if (Textures.ContainsKey(textureMap0)) - { BindGLTexture(mat.TextureMaps[0], Textures[textureMap0]); - } + else + GL.BindTexture(TextureTarget.Texture2D, RenderTools.uvTestPattern.RenderableTex.TexID); TexCoords = new Vector2[] { pane.TexCoords[0].TopLeft.ToTKVector2(), @@ -354,7 +355,7 @@ namespace LayoutBXLYT } } - private static void BindGLTexture(BFLYT.TextureRef tex, STGenericTexture texture) + private static void BindGLTexture(TextureRef tex, STGenericTexture texture) { if (texture.RenderableTex == null || !texture.RenderableTex.GLInitialized) texture.LoadOpenGLTexture(); @@ -370,34 +371,34 @@ namespace LayoutBXLYT GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, ConvertMinFilterMode(tex.MinFilterMode)); } - private static int ConvertTextureWrap(BFLYT.TextureRef.WrapMode wrapMode) + private static int ConvertTextureWrap(TextureRef.WrapMode wrapMode) { switch (wrapMode) { - case BFLYT.TextureRef.WrapMode.Clamp: return (int)TextureWrapMode.Clamp; - case BFLYT.TextureRef.WrapMode.Mirror: return (int)TextureWrapMode.MirroredRepeat; - case BFLYT.TextureRef.WrapMode.Repeat: return (int)TextureWrapMode.Repeat; + case TextureRef.WrapMode.Clamp: return (int)TextureWrapMode.Clamp; + case TextureRef.WrapMode.Mirror: return (int)TextureWrapMode.MirroredRepeat; + case TextureRef.WrapMode.Repeat: return (int)TextureWrapMode.Repeat; default: return (int)TextureWrapMode.Clamp; } } - private static int ConvertMagFilterMode(BFLYT.TextureRef.FilterMode filterMode) + private static int ConvertMagFilterMode(TextureRef.FilterMode filterMode) { switch (filterMode) { - case BFLYT.TextureRef.FilterMode.Linear: return (int)TextureMagFilter.Linear; - case BFLYT.TextureRef.FilterMode.Near: return (int)TextureMagFilter.Nearest; - default: return (int)BFLYT.TextureRef.FilterMode.Linear; + case TextureRef.FilterMode.Linear: return (int)TextureMagFilter.Linear; + case TextureRef.FilterMode.Near: return (int)TextureMagFilter.Nearest; + default: return (int)TextureRef.FilterMode.Linear; } } - private static int ConvertMinFilterMode(BFLYT.TextureRef.FilterMode filterMode) + private static int ConvertMinFilterMode(TextureRef.FilterMode filterMode) { switch (filterMode) { - case BFLYT.TextureRef.FilterMode.Linear: return (int)TextureMinFilter.Linear; - case BFLYT.TextureRef.FilterMode.Near: return (int)TextureMinFilter.Nearest; - default: return (int)BFLYT.TextureRef.FilterMode.Linear; + case TextureRef.FilterMode.Linear: return (int)TextureMinFilter.Linear; + case TextureRef.FilterMode.Near: return (int)TextureMinFilter.Nearest; + default: return (int)TextureRef.FilterMode.Linear; } } diff --git a/File_Format_Library/Main.cs b/File_Format_Library/Main.cs index 3f302d6d..e3967a87 100644 --- a/File_Format_Library/Main.cs +++ b/File_Format_Library/Main.cs @@ -366,7 +366,7 @@ namespace FirstPlugin Formats.Add(typeof(CSAB)); Formats.Add(typeof(CMB)); Formats.Add(typeof(G1T)); - Formats.Add(typeof(LayoutBXLYT.BFLYT)); + Formats.Add(typeof(LayoutBXLYT.Cafe.BFLYT)); Formats.Add(typeof(LayoutBXLYT.BCLYT)); Formats.Add(typeof(LayoutBXLYT.BRLYT)); Formats.Add(typeof(ZSI)); diff --git a/Switch_Toolbox_Library/IO/Bits/Bit.cs b/Switch_Toolbox_Library/IO/Bits/Bit.cs new file mode 100644 index 00000000..ef3c9b9d --- /dev/null +++ b/Switch_Toolbox_Library/IO/Bits/Bit.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Toolbox.Library.IO +{ + class Bit + { + //From https://github.com/shibbo/flyte/blob/337383c01c50dff155e4b4e170d248118db0c0aa/flyte/utils/Bit.cs + public static uint ExtractBits(uint val, int numBits, int startBit) + { + uint mask = 0; + + for (int i = startBit; i < startBit + numBits; i++) + mask |= (0x80000000 >> i); + + return (val & mask) >> (32 - (startBit + numBits)); + } + } +} diff --git a/Switch_Toolbox_Library/IO/FileWriter.cs b/Switch_Toolbox_Library/IO/FileWriter.cs index acbc9569..61602e7b 100644 --- a/Switch_Toolbox_Library/IO/FileWriter.cs +++ b/Switch_Toolbox_Library/IO/FileWriter.cs @@ -97,7 +97,7 @@ namespace Toolbox.Library.IO { long pos = Position; WriteString(text); - Seek(pos + fixedSize); + SeekBegin(pos + fixedSize); } //Writes the total size of a section as a uint. @@ -117,7 +117,7 @@ namespace Toolbox.Library.IO long pos = Position; using (TemporarySeek(target, SeekOrigin.Begin)) { - Write((uint)pos - (uint)RelativeOffsetPosition); + Write((uint)(pos - RelativeOffsetPosition)); } } diff --git a/Switch_Toolbox_Library/Interfaces/FileFormatting/IArchiveFile.cs b/Switch_Toolbox_Library/Interfaces/FileFormatting/IArchiveFile.cs index 69af0c61..a8dbc13d 100644 --- a/Switch_Toolbox_Library/Interfaces/FileFormatting/IArchiveFile.cs +++ b/Switch_Toolbox_Library/Interfaces/FileFormatting/IArchiveFile.cs @@ -41,7 +41,7 @@ namespace Toolbox.Library { // Opens the file format automatically (may take longer to open the archive file) [Browsable(false)] - public bool OpenFileFormatOnLoad { get; set; } + public virtual bool OpenFileFormatOnLoad { get; set; } [Browsable(false)] // The source file. If an archive is in another archive, this is necessary to get the original path diff --git a/Switch_Toolbox_Library/Toolbox_Library.csproj b/Switch_Toolbox_Library/Toolbox_Library.csproj index f812f3e6..c4034f9e 100644 --- a/Switch_Toolbox_Library/Toolbox_Library.csproj +++ b/Switch_Toolbox_Library/Toolbox_Library.csproj @@ -300,6 +300,7 @@ + diff --git a/Toolbox/MainForm.cs b/Toolbox/MainForm.cs index ca66176c..6b689b63 100644 --- a/Toolbox/MainForm.cs +++ b/Toolbox/MainForm.cs @@ -993,7 +993,7 @@ namespace Toolbox private void MainForm_DragDrop(object sender, DragEventArgs e) { - if (!Runtime.EnableDragDrop) return; + if (!Runtime.EnableDragDrop) return; Cursor.Current = Cursors.WaitCursor; diff --git a/Toolbox/UpdateProgram.cs b/Toolbox/UpdateProgram.cs index e449b413..50e669e7 100644 --- a/Toolbox/UpdateProgram.cs +++ b/Toolbox/UpdateProgram.cs @@ -12,7 +12,7 @@ namespace Toolbox { public class UpdateProgram { - static Release[] releases; + static List Releases = new List(); public static bool CanUpdate = false; public static bool Downloaded = false; public static Release LatestRelease; @@ -28,7 +28,7 @@ namespace Toolbox GetReleases(client).Wait(); GetCommits(client).Wait(); - foreach (Release latest in releases) + foreach (Release latest in Releases) { Console.WriteLine( "The latest release is tagged at {0} and is named {1} commit {2} date {3}", @@ -56,6 +56,8 @@ namespace Toolbox } break; } + + Releases.Clear(); } catch (Exception ex) { @@ -117,10 +119,9 @@ namespace Toolbox static async Task GetReleases(GitHubClient client) { - List Releases = new List(); + Releases = new List(); foreach (Release r in await client.Repository.Release.GetAll("KillzXGaming", "Switch-Toolbox")) Releases.Add(r); - releases = Releases.ToArray(); } } } \ No newline at end of file