public void Read(FileReader reader, BFLYT bflyt) { PaneLookup.Clear(); LayoutInfo = new LYT1(); TextureList = new TXL1(); MaterialList = new MAT1(); FontList = new FNL1(); RootPane = new PAN1(); RootGroup = new GRP1(); UserData = new USD1(); FileInfo = bflyt; reader.SetByteOrder(true); reader.ReadSignature(4, Magic); ByteOrderMark = reader.ReadUInt16(); reader.CheckByteOrderMark(ByteOrderMark); HeaderSize = reader.ReadUInt16(); Version = reader.ReadUInt32(); SetVersionInfo(); uint FileSize = reader.ReadUInt32(); ushort sectionCount = reader.ReadUInt16(); reader.ReadUInt16(); //Padding IsBigEndian = reader.ByteOrder == Syroot.BinaryData.ByteOrder.BigEndian; if (!IsBigEndian) { if (VersionMajor == 3) { TextureManager.Platform = TextureManager.PlatformType.ThreeDS; } else { TextureManager.Platform = TextureManager.PlatformType.Switch; } } else { TextureManager.Platform = TextureManager.PlatformType.WiiU; } TextureManager.LayoutFile = this; bool setRoot = false; bool setGroupRoot = false; BasePane currentPane = null; BasePane parentPane = null; BasePane currentGroupPane = null; BasePane parentGroupPane = null; reader.SeekBegin(HeaderSize); for (int i = 0; i < sectionCount; i++) { long pos = reader.Position; string Signature = reader.ReadString(4, Encoding.ASCII); uint SectionSize = reader.ReadUInt32(); SectionCommon section = new SectionCommon(Signature); switch (Signature) { case "lyt1": LayoutInfo = new LYT1(reader); break; case "txl1": TextureList = new TXL1(reader, this); break; case "fnl1": FontList = new FNL1(reader, this); break; case "mat1": MaterialList = new MAT1(reader, this); break; case "pan1": var panel = new PAN1(reader, this); AddPaneToTable(panel); if (!setRoot) { RootPane = panel; setRoot = true; } SetPane(panel, parentPane); currentPane = panel; break; case "pic1": var picturePanel = new PIC1(reader, this); AddPaneToTable(picturePanel); SetPane(picturePanel, parentPane); currentPane = picturePanel; break; case "txt1": var textPanel = new TXT1(reader, this); AddPaneToTable(textPanel); SetPane(textPanel, parentPane); currentPane = textPanel; break; case "bnd1": var boundsPanel = new BND1(reader, this); AddPaneToTable(boundsPanel); SetPane(boundsPanel, parentPane); currentPane = boundsPanel; break; case "prt1": var partsPanel = new PRT1(reader, this); AddPaneToTable(partsPanel); SetPane(partsPanel, parentPane); currentPane = partsPanel; break; case "wnd1": var windowPanel = new WND1(reader, this); AddPaneToTable(windowPanel); SetPane(windowPanel, parentPane); currentPane = windowPanel; break; case "scr1": var scissorPane = new SCR1(reader, this); AddPaneToTable(scissorPane); SetPane(scissorPane, parentPane); currentPane = scissorPane; break; case "ali1": var alignmentPane = new ALI1(reader, this); AddPaneToTable(alignmentPane); SetPane(alignmentPane, parentPane); currentPane = alignmentPane; break; case "pas1": if (currentPane != null) { parentPane = currentPane; } break; case "pae1": if (parentPane != null) { currentPane = parentPane; } parentPane = currentPane.Parent; break; case "grp1": var groupPanel = new GRP1(reader, this); if (!setGroupRoot) { RootGroup = groupPanel; setGroupRoot = true; } SetPane(groupPanel, parentGroupPane); currentGroupPane = groupPanel; break; case "grs1": if (currentGroupPane != null) { parentGroupPane = currentGroupPane; } break; case "gre1": currentGroupPane = parentGroupPane; parentGroupPane = currentGroupPane.Parent; break; /* case "cnt1": * Container = new CNT1(reader, this); * break;*/ case "usd1": long dataPos = reader.Position; if (currentPane != null) { ((PAN1)currentPane).UserData = new USD1(reader, this); reader.SeekBegin(dataPos); ((PAN1)currentPane).UserData.Data = reader.ReadBytes((int)SectionSize - 8); } else { //User data before panes UserData = new USD1(reader, this); reader.SeekBegin(dataPos); UserData.Data = reader.ReadBytes((int)SectionSize - 8); } break; //If the section is not supported store the raw bytes default: section.Data = reader.ReadBytes((int)SectionSize - 8); UnknownSections.Add(section); Console.WriteLine("Unknown section!" + Signature); break; } section.SectionSize = SectionSize; reader.SeekBegin(pos + SectionSize); } }
public PartProperty(FileReader reader, Header header, long StartPosition) { Name = reader.ReadString(0x18, true); UsageFlag = reader.ReadByte(); BasicUsageFlag = reader.ReadByte(); MaterialUsageFlag = reader.ReadByte(); reader.ReadByte(); //padding uint userDataOffset = 0; uint propertyOffset = reader.ReadUInt32(); if (header.VersionMajor >= 8) { Unknown = reader.ReadUInt32(); } else { userDataOffset = reader.ReadUInt32(); } uint panelInfoOffset = reader.ReadUInt32(); long pos = reader.Position; if (propertyOffset != 0) { reader.SeekBegin(StartPosition + propertyOffset); long startPos = reader.Position; string signtature = reader.ReadString(4, Encoding.ASCII); uint sectionSize = reader.ReadUInt32(); Console.WriteLine($"signtature " + signtature); switch (signtature) { case "pic1": Property = new PIC1(reader, header); break; case "txt1": Property = new TXT1(reader, header); break; case "wnd1": Property = new WND1(reader, header); break; case "bnd1": Property = new BND1(reader, header); break; case "prt1": Property = new PRT1(reader, header); break; default: Console.WriteLine("Unknown section! " + signtature); break; } } Console.WriteLine($"userDataOffset {userDataOffset}"); if (userDataOffset != 0) { reader.SeekBegin(StartPosition + userDataOffset); reader.ReadUInt32(); //magic reader.ReadUInt32(); //section size UserData = new USD1(reader, header); } if (panelInfoOffset != 0) { reader.SeekBegin(StartPosition + panelInfoOffset); PaneInfo = reader.ReadBytes(52); } reader.SeekBegin(pos); }