mirror of
https://github.com/KillzXGaming/Switch-Toolbox
synced 2024-11-10 15:14:55 +00:00
More bflyt saving fixes
This commit is contained in:
parent
1b0eb20ce2
commit
2f1468a83f
3 changed files with 105 additions and 21 deletions
|
@ -539,12 +539,13 @@ namespace LayoutBXLYT.Cafe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void WriteSection(FileWriter writer, string magic, SectionCommon section, Action WriteMethod = null)
|
internal static void WriteSection(FileWriter writer, string magic, SectionCommon section, Action WriteMethod = null)
|
||||||
{
|
{
|
||||||
long startPos = writer.Position;
|
long startPos = writer.Position;
|
||||||
writer.WriteSignature(magic);
|
writer.WriteSignature(magic);
|
||||||
writer.Write(uint.MaxValue);
|
writer.Write(uint.MaxValue);
|
||||||
WriteMethod?.Invoke();
|
WriteMethod?.Invoke();
|
||||||
|
writer.Align(4);
|
||||||
|
|
||||||
long endPos = writer.Position;
|
long endPos = writer.Position;
|
||||||
|
|
||||||
|
@ -558,8 +559,35 @@ namespace LayoutBXLYT.Cafe
|
||||||
|
|
||||||
public class CNT1 : SectionCommon
|
public class CNT1 : SectionCommon
|
||||||
{
|
{
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
public CNT1(FileReader reader, Header header)
|
public CNT1(FileReader reader, Header header)
|
||||||
{
|
{
|
||||||
|
uint paneNamesOffset = 0;
|
||||||
|
uint paneCount = 0;
|
||||||
|
uint animCount = 0;
|
||||||
|
uint controlUserNameOffset = 0;
|
||||||
|
uint paneParamNamesOffset = 0;
|
||||||
|
uint animParamNamesOffset = 0;
|
||||||
|
|
||||||
|
if (header.VersionMajor < 3)
|
||||||
|
{
|
||||||
|
paneNamesOffset = reader.ReadUInt32();
|
||||||
|
paneCount = reader.ReadUInt32();
|
||||||
|
animCount = reader.ReadUInt32();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
controlUserNameOffset = reader.ReadUInt32();
|
||||||
|
paneNamesOffset = reader.ReadUInt32();
|
||||||
|
paneCount = reader.ReadUInt16();
|
||||||
|
animCount = reader.ReadUInt16();
|
||||||
|
paneParamNamesOffset = reader.ReadUInt32();
|
||||||
|
animParamNamesOffset = reader.ReadUInt32();
|
||||||
|
}
|
||||||
|
|
||||||
|
Name = reader.ReadZeroTerminatedString();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -641,6 +669,8 @@ namespace LayoutBXLYT.Cafe
|
||||||
|
|
||||||
public float ShadowItalic { get; set; }
|
public float ShadowItalic { get; set; }
|
||||||
|
|
||||||
|
public string TextBoxName { get; set; }
|
||||||
|
|
||||||
public bool PerCharTransform
|
public bool PerCharTransform
|
||||||
{
|
{
|
||||||
get { return (_flags & 0x10) != 0; }
|
get { return (_flags & 0x10) != 0; }
|
||||||
|
@ -657,10 +687,14 @@ namespace LayoutBXLYT.Cafe
|
||||||
set { _flags = value ? (byte)(_flags | 1) : unchecked((byte)(_flags & (~1))); }
|
set { _flags = value ? (byte)(_flags | 1) : unchecked((byte)(_flags & (~1))); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string FontName { get; set; }
|
||||||
|
|
||||||
private byte _flags;
|
private byte _flags;
|
||||||
|
|
||||||
public TXT1(FileReader reader, Header header) : base(reader)
|
public TXT1(FileReader reader, Header header) : base(reader)
|
||||||
{
|
{
|
||||||
|
long startPos = reader.Position - 84;
|
||||||
|
|
||||||
TextLength = reader.ReadUInt16();
|
TextLength = reader.ReadUInt16();
|
||||||
MaxTextLength = reader.ReadUInt16();
|
MaxTextLength = reader.ReadUInt16();
|
||||||
MaterialIndex = reader.ReadUInt16();
|
MaterialIndex = reader.ReadUInt16();
|
||||||
|
@ -676,16 +710,31 @@ namespace LayoutBXLYT.Cafe
|
||||||
FontSize = reader.ReadVec2SY();
|
FontSize = reader.ReadVec2SY();
|
||||||
CharacterSpace = reader.ReadSingle();
|
CharacterSpace = reader.ReadSingle();
|
||||||
LineSpace = reader.ReadSingle();
|
LineSpace = reader.ReadSingle();
|
||||||
|
uint nameOffset = reader.ReadUInt32();
|
||||||
ShadowXY = reader.ReadVec2SY();
|
ShadowXY = reader.ReadVec2SY();
|
||||||
ShadowXYSize = reader.ReadVec2SY();
|
ShadowXYSize = reader.ReadVec2SY();
|
||||||
ShadowForeColor = STColor8.FromBytes(reader.ReadBytes(4));
|
ShadowForeColor = STColor8.FromBytes(reader.ReadBytes(4));
|
||||||
ShadowBackColor = STColor8.FromBytes(reader.ReadBytes(4));
|
ShadowBackColor = STColor8.FromBytes(reader.ReadBytes(4));
|
||||||
ShadowItalic = reader.ReadSingle();
|
ShadowItalic = reader.ReadSingle();
|
||||||
|
|
||||||
if (RestrictedTextLengthEnabled)
|
if (FontIndex != ushort.MaxValue && header.FontList.Fonts.Count > 0)
|
||||||
Text = reader.ReadString(MaxTextLength);
|
FontName = header.FontList.Fonts[FontIndex];
|
||||||
else
|
|
||||||
Text = reader.ReadString(TextLength);
|
if (textOffset != 0)
|
||||||
|
{
|
||||||
|
reader.SeekBegin(startPos + textOffset);
|
||||||
|
|
||||||
|
if (RestrictedTextLengthEnabled)
|
||||||
|
Text = reader.ReadZeroTerminatedString(Encoding.Unicode);
|
||||||
|
else
|
||||||
|
Text = reader.ReadZeroTerminatedString(Encoding.Unicode);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nameOffset != 0)
|
||||||
|
{
|
||||||
|
reader.SeekBegin(startPos + nameOffset);
|
||||||
|
TextBoxName = reader.ReadZeroTerminatedString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Write(FileWriter writer, BxlytHeader header)
|
public override void Write(FileWriter writer, BxlytHeader header)
|
||||||
|
@ -709,17 +758,30 @@ namespace LayoutBXLYT.Cafe
|
||||||
writer.Write(FontSize);
|
writer.Write(FontSize);
|
||||||
writer.Write(CharacterSpace);
|
writer.Write(CharacterSpace);
|
||||||
writer.Write(LineSpace);
|
writer.Write(LineSpace);
|
||||||
|
long _ofsNamePos = writer.Position;
|
||||||
|
writer.Write(0);
|
||||||
writer.Write(ShadowXY);
|
writer.Write(ShadowXY);
|
||||||
writer.Write(ShadowXYSize);
|
writer.Write(ShadowXYSize);
|
||||||
writer.Write(ShadowForeColor.ToBytes());
|
writer.Write(ShadowForeColor.ToBytes());
|
||||||
writer.Write(ShadowBackColor.ToBytes());
|
writer.Write(ShadowBackColor.ToBytes());
|
||||||
writer.Write(ShadowItalic);
|
writer.Write(ShadowItalic);
|
||||||
|
|
||||||
writer.WriteUint32Offset(_ofsTextPos, pos);
|
if (Text != null)
|
||||||
if (RestrictedTextLengthEnabled)
|
{
|
||||||
writer.WriteString(Text, MaxTextLength);
|
writer.WriteUint32Offset(_ofsTextPos, pos);
|
||||||
else
|
if (RestrictedTextLengthEnabled)
|
||||||
writer.WriteString(Text, TextLength);
|
writer.WriteString(Text, MaxTextLength, Encoding.BigEndianUnicode);
|
||||||
|
else
|
||||||
|
writer.WriteString(Text, TextLength, Encoding.BigEndianUnicode);
|
||||||
|
|
||||||
|
writer.Align(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TextBoxName != null)
|
||||||
|
{
|
||||||
|
writer.WriteUint32Offset(_ofsNamePos, pos);
|
||||||
|
writer.WriteString(TextBoxName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum BorderType : byte
|
public enum BorderType : byte
|
||||||
|
@ -988,6 +1050,8 @@ namespace LayoutBXLYT.Cafe
|
||||||
|
|
||||||
public PRT1(FileReader reader, Header header) : base(reader)
|
public PRT1(FileReader reader, Header header) : base(reader)
|
||||||
{
|
{
|
||||||
|
StartPosition = reader.Position - 8;
|
||||||
|
|
||||||
uint properyCount = reader.ReadUInt32();
|
uint properyCount = reader.ReadUInt32();
|
||||||
MagnifyX = reader.ReadSingle();
|
MagnifyX = reader.ReadSingle();
|
||||||
MagnifyY = reader.ReadSingle();
|
MagnifyY = reader.ReadSingle();
|
||||||
|
@ -1029,6 +1093,8 @@ namespace LayoutBXLYT.Cafe
|
||||||
uint userDataOffset = reader.ReadUInt32();
|
uint userDataOffset = reader.ReadUInt32();
|
||||||
uint panelInfoOffset = reader.ReadUInt32();
|
uint panelInfoOffset = reader.ReadUInt32();
|
||||||
|
|
||||||
|
long pos = reader.Position;
|
||||||
|
|
||||||
if (propertyOffset != 0)
|
if (propertyOffset != 0)
|
||||||
{
|
{
|
||||||
reader.SeekBegin(prt1.StartPosition + propertyOffset);
|
reader.SeekBegin(prt1.StartPosition + propertyOffset);
|
||||||
|
@ -1066,6 +1132,8 @@ namespace LayoutBXLYT.Cafe
|
||||||
reader.SeekBegin(prt1.StartPosition + panelInfoOffset);
|
reader.SeekBegin(prt1.StartPosition + panelInfoOffset);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
reader.SeekBegin(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Write(FileWriter writer, BxlytHeader header, long startPos)
|
public void Write(FileWriter writer, BxlytHeader header, long startPos)
|
||||||
|
@ -1084,7 +1152,7 @@ namespace LayoutBXLYT.Cafe
|
||||||
if (Property != null)
|
if (Property != null)
|
||||||
{
|
{
|
||||||
writer.WriteUint32Offset(_ofsPos);
|
writer.WriteUint32Offset(_ofsPos);
|
||||||
Property.Write(writer, header);
|
Header.WriteSection(writer, Property.Signature, Property, () => Property.Write(writer, header));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1211,7 +1279,6 @@ namespace LayoutBXLYT.Cafe
|
||||||
|
|
||||||
writer.WriteUint32Offset(pos, pos);
|
writer.WriteUint32Offset(pos, pos);
|
||||||
writer.WriteString(Name);
|
writer.WriteString(Name);
|
||||||
writer.Align(4);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private int GetDataLength()
|
private int GetDataLength()
|
||||||
|
@ -1704,13 +1771,14 @@ namespace LayoutBXLYT.Cafe
|
||||||
for (int i = 0; i < offsets.Length; i++)
|
for (int i = 0; i < offsets.Length; i++)
|
||||||
{
|
{
|
||||||
reader.SeekBegin(offsets[i] + pos);
|
reader.SeekBegin(offsets[i] + pos);
|
||||||
|
Fonts.Add(reader.ReadZeroTerminatedString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Write(FileWriter writer, BxlytHeader header)
|
public override void Write(FileWriter writer, BxlytHeader header)
|
||||||
{
|
{
|
||||||
writer.Write((ushort)Fonts.Count);
|
writer.Write((ushort)Fonts.Count);
|
||||||
writer.Seek(2);
|
writer.Write((ushort)0);
|
||||||
|
|
||||||
//Fill empty spaces for offsets later
|
//Fill empty spaces for offsets later
|
||||||
long pos = writer.Position;
|
long pos = writer.Position;
|
||||||
|
@ -1754,7 +1822,7 @@ namespace LayoutBXLYT.Cafe
|
||||||
public override void Write(FileWriter writer, BxlytHeader header)
|
public override void Write(FileWriter writer, BxlytHeader header)
|
||||||
{
|
{
|
||||||
writer.Write((ushort)Textures.Count);
|
writer.Write((ushort)Textures.Count);
|
||||||
writer.Seek(2);
|
writer.Write((ushort)0);
|
||||||
|
|
||||||
//Fill empty spaces for offsets later
|
//Fill empty spaces for offsets later
|
||||||
long pos = writer.Position;
|
long pos = writer.Position;
|
||||||
|
@ -1818,7 +1886,6 @@ namespace LayoutBXLYT.Cafe
|
||||||
writer.Write(MaxPartsWidth);
|
writer.Write(MaxPartsWidth);
|
||||||
writer.Write(MaxPartsHeight);
|
writer.Write(MaxPartsHeight);
|
||||||
writer.WriteString(Name);
|
writer.WriteString(Name);
|
||||||
writer.Align(4);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -132,9 +132,26 @@ namespace Toolbox.Library.IO
|
||||||
return Names;
|
return Names;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string ReadZeroTerminatedString()
|
public string ReadZeroTerminatedString(Encoding encoding = null)
|
||||||
{
|
{
|
||||||
return ReadString(BinaryStringFormat.ZeroTerminated);
|
return ReadString(BinaryStringFormat.ZeroTerminated, encoding ?? Encoding);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string ReadUTF16String()
|
||||||
|
{
|
||||||
|
List<byte> chars = new List<byte>();
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
ushort val = ReadUInt16();
|
||||||
|
|
||||||
|
if (val == 0)
|
||||||
|
{
|
||||||
|
return Encoding.ASCII.GetString(chars.ToArray());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
chars.Add((byte)val); // casting to byte will remove the period, which is a part of UTF-16
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -71,9 +71,9 @@ namespace Toolbox.Library.IO
|
||||||
Write(Encoding.ASCII.GetBytes(value));
|
Write(Encoding.ASCII.GetBytes(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteString(string value)
|
public void WriteString(string value, Encoding encoding = null)
|
||||||
{
|
{
|
||||||
Write(value, BinaryStringFormat.ZeroTerminated);
|
Write(value, BinaryStringFormat.ZeroTerminated, encoding ?? Encoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteUint64Offset(long target)
|
public void WriteUint64Offset(long target)
|
||||||
|
@ -93,10 +93,10 @@ namespace Toolbox.Library.IO
|
||||||
ByteOrder = ByteOrder.LittleEndian;
|
ByteOrder = ByteOrder.LittleEndian;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteString(string text, uint fixedSize)
|
public void WriteString(string text, uint fixedSize, Encoding encoding = null)
|
||||||
{
|
{
|
||||||
long pos = Position;
|
long pos = Position;
|
||||||
WriteString(text);
|
WriteString(text, encoding);
|
||||||
SeekBegin(pos + fixedSize);
|
SeekBegin(pos + fixedSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue