Skip to content

Commit b404013

Browse files
Improve YNCP writing. (#46)
1 parent e0f523e commit b404013

10 files changed

Lines changed: 137 additions & 60 deletions

File tree

Source/SharpNeedle/Framework/Ninja/Csd/Cast.cs

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,15 +102,54 @@ public void Write(BinaryObjectWriter writer, Family? family)
102102
writer.Write(BottomRight);
103103

104104
writer.Write(Field2C);
105-
writer.WriteObjectOffset(Info);
105+
106+
// Info is written after the sprite indices, despite appearing in the struct earlier.
107+
long infoOffset = writer.Position;
108+
writer.OffsetHandler.RegisterOffsetPosition(infoOffset);
109+
writer.WriteOffsetValue(0);
110+
106111
writer.Write(InheritanceFlags);
107112
writer.Write(MaterialFlags);
108113

109114
writer.Write(SpriteIndices.Length);
110-
writer.WriteArrayOffset(SpriteIndices);
115+
writer.WriteOffset(() =>
116+
{
117+
writer.WriteArray(SpriteIndices);
118+
119+
long offset = writer.Position;
120+
using (SeekToken token = writer.At(infoOffset, SeekOrigin.Begin))
121+
{
122+
writer.WriteOffsetValue(writer.OffsetHandler.CalculateOffset(offset, writer.OffsetHandler.OffsetOrigin));
123+
}
124+
125+
writer.WriteObject(Info);
126+
});
127+
128+
if (Text != null)
129+
{
130+
writer.WriteOffset(() =>
131+
{
132+
writer.WriteString(StringBinaryFormat.NullTerminated, Text);
133+
writer.Write<byte>(0);
134+
});
135+
}
136+
else
137+
{
138+
writer.WriteOffsetValue(0);
139+
}
111140

112-
writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Text);
113-
writer.WriteStringOffset(StringBinaryFormat.NullTerminated, FontName);
141+
if (FontName != null)
142+
{
143+
writer.WriteOffset(() =>
144+
{
145+
writer.WriteString(StringBinaryFormat.NullTerminated, FontName);
146+
writer.Write<byte>(0);
147+
});
148+
}
149+
else
150+
{
151+
writer.WriteOffsetValue(0);
152+
}
114153

115154
writer.Write(FontKerning);
116155

Source/SharpNeedle/Framework/Ninja/Csd/CastInfo.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ public struct CastInfo : IBinarySerializable
1515
public Color<byte> GradientBottomLeft;
1616
public Color<byte> GradientTopRight;
1717
public Color<byte> GradientBottomRight;
18-
public uint Field30;
19-
public uint Field34;
20-
public uint Field38;
18+
public uint UserData0;
19+
public uint UserData1;
20+
public uint UserData2;
2121

2222
public void Read(BinaryObjectReader reader)
2323
{
@@ -34,9 +34,9 @@ public void Read(BinaryObjectReader reader)
3434
Unsafe.As<Color<byte>, uint>(ref GradientTopRight) = reader.Read<uint>();
3535
Unsafe.As<Color<byte>, uint>(ref GradientBottomRight) = reader.Read<uint>();
3636

37-
Field30 = reader.Read<uint>();
38-
Field34 = reader.Read<uint>();
39-
Field38 = reader.Read<uint>();
37+
UserData0 = reader.Read<uint>();
38+
UserData1 = reader.Read<uint>();
39+
UserData2 = reader.Read<uint>();
4040
}
4141

4242
public void Write(BinaryObjectWriter writer)
@@ -54,8 +54,8 @@ public void Write(BinaryObjectWriter writer)
5454
writer.Write(Unsafe.As<Color<byte>, uint>(ref GradientTopRight));
5555
writer.Write(Unsafe.As<Color<byte>, uint>(ref GradientBottomRight));
5656

57-
writer.Write(Field30);
58-
writer.Write(Field34);
59-
writer.Write(Field38);
57+
writer.Write(UserData0);
58+
writer.Write(UserData1);
59+
writer.Write(UserData2);
6060
}
6161
}

Source/SharpNeedle/Framework/Ninja/Csd/CastInfoTable.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,11 @@ public void Write(BinaryObjectWriter writer)
3535
{
3636
foreach ((string? Name, int FamilyIdx, int CastIdx) in this)
3737
{
38-
writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name);
38+
writer.WriteOffset(() =>
39+
{
40+
writer.WriteString(StringBinaryFormat.NullTerminated, Name);
41+
writer.Write<byte>(0);
42+
});
3943
writer.Write(FamilyIdx);
4044
writer.Write(CastIdx);
4145
}

Source/SharpNeedle/Framework/Ninja/Csd/CsdDictionary.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,13 @@ public void Read(BinaryObjectReader reader)
237237

238238
public void Write(BinaryObjectWriter writer)
239239
{
240-
writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name);
240+
string? name = Name;
241+
242+
writer.WriteOffset(() =>
243+
{
244+
writer.WriteString(StringBinaryFormat.NullTerminated, name);
245+
writer.Write<byte>(0);
246+
});
241247
writer.Write(ref Index);
242248
}
243249

Source/SharpNeedle/Framework/Ninja/Csd/Motions/CastMotion.cs

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -66,26 +66,32 @@ public void Write(BinaryObjectWriter writer)
6666
public void ReadExtended(BinaryObjectReader reader)
6767
{
6868
reader.ReadOffset(() =>
69-
{
70-
foreach (KeyFrameList list in this)
69+
reader.ReadOffset(() =>
7170
{
72-
list.ReadExtended(reader);
73-
}
74-
});
71+
foreach (KeyFrameList list in this)
72+
{
73+
list.ReadExtended(reader);
74+
}
75+
}));
7576
}
7677

7778
public void WriteExtended(BinaryObjectWriter writer)
7879
{
7980
writer.WriteOffset(() =>
80-
{
81-
if (Count == 0)
82-
{
83-
writer.WriteOffsetValue(0);
81+
{
82+
if (Count != 0)
83+
{
84+
writer.WriteOffset(() =>
85+
{
86+
foreach (KeyFrameList list in this)
87+
{
88+
list.WriteExtended(writer);
89+
}
90+
});
8491
}
85-
86-
foreach (KeyFrameList list in this)
92+
else
8793
{
88-
list.WriteExtended(writer);
94+
writer.WriteOffsetValue(0);
8995
}
9096
});
9197
}

Source/SharpNeedle/Framework/Ninja/Csd/Motions/FamilyMotion.cs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -70,25 +70,25 @@ public void Write(BinaryObjectWriter writer)
7070

7171
public void ReadExtended(BinaryObjectReader reader)
7272
{
73-
int unused = reader.Read<int>();
74-
reader.ReadOffset(() => reader.ReadOffset(() => reader.ReadOffset(() =>
73+
reader.ReadOffset(() =>
74+
reader.ReadOffset(() =>
75+
{
76+
foreach (CastMotion motion in CastMotions)
7577
{
76-
foreach (CastMotion motion in CastMotions)
77-
{
78-
motion.ReadExtended(reader);
79-
}
80-
})));
78+
motion.ReadExtended(reader);
79+
}
80+
}));
8181
}
8282

8383
public void WriteExtended(BinaryObjectWriter writer)
8484
{
85-
writer.Write(0);
86-
writer.WriteOffset(() => writer.WriteOffset(() => writer.WriteOffset(() =>
85+
writer.WriteOffset(() =>
86+
writer.WriteOffset(() =>
87+
{
88+
foreach (CastMotion motion in CastMotions)
8789
{
88-
foreach (CastMotion motion in CastMotions)
89-
{
90-
motion.WriteExtended(writer);
91-
}
92-
})));
90+
motion.WriteExtended(writer);
91+
}
92+
}));
9393
}
9494
}

Source/SharpNeedle/Framework/Ninja/Csd/Motions/KeyFrame.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
public class KeyFrame : IBinarySerializable
66
{
7-
public uint Frame { get; set; }
7+
public int Frame { get; set; }
88
public Union Value { get; set; }
99
public InterpolationType Interpolation { get; set; }
1010
public float InTangent { get; set; }
@@ -14,7 +14,7 @@ public class KeyFrame : IBinarySerializable
1414

1515
public void Read(BinaryObjectReader reader)
1616
{
17-
Frame = reader.Read<uint>();
17+
Frame = reader.Read<int>();
1818
Value = reader.Read<uint>();
1919
Interpolation = reader.Read<InterpolationType>();
2020
InTangent = reader.Read<float>();

Source/SharpNeedle/Framework/Ninja/Csd/Motions/KeyFrameList.cs

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,27 +25,39 @@ public void Write(BinaryObjectWriter writer)
2525

2626
public void ReadExtended(BinaryObjectReader reader)
2727
{
28-
reader.ReadOffset(() => reader.ReadOffset(() => reader.ReadOffset(() =>
28+
reader.ReadOffset(() =>
29+
reader.ReadOffset(() =>
30+
{
31+
foreach (KeyFrame frame in Frames)
2932
{
30-
foreach (KeyFrame frame in Frames)
33+
long offset = reader.ReadOffsetValue();
34+
if (offset != 0)
3135
{
32-
frame.Correction = reader.ReadValueOffset<AspectRatioCorrection>();
36+
frame.Correction = reader.ReadValueAtOffset<AspectRatioCorrection>(offset);
3337
}
34-
})));
38+
}
39+
}));
3540
}
3641

3742
public void WriteExtended(BinaryObjectWriter writer)
3843
{
39-
writer.WriteOffset(() => writer.WriteOffset(() => writer.WriteOffset(() =>
44+
writer.WriteOffset(() =>
45+
writer.WriteOffset(() =>
4046
{
4147
foreach (KeyFrame frame in Frames)
4248
{
43-
writer.WriteValueOffset(frame.Correction ?? default);
49+
if (frame.Correction.HasValue)
50+
{
51+
writer.WriteOffset(() => writer.Write(frame.Correction.Value));
52+
}
53+
else
54+
{
55+
writer.WriteOffsetValue(0);
56+
}
4457
}
45-
})));
58+
}));
4659
}
4760

48-
4961
public IEnumerator<KeyFrame> GetEnumerator()
5062
{
5163
return Frames.GetEnumerator();

Source/SharpNeedle/Framework/Ninja/Csd/Motions/Motion.cs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,21 +80,31 @@ public void ReadExtended(BinaryObjectReader reader)
8080
{
8181
reader.ReadOffset(() =>
8282
{
83-
foreach (FamilyMotion motion in FamilyMotions)
84-
{
85-
motion.ReadExtended(reader);
86-
}
83+
int unused = reader.Read<int>();
84+
85+
reader.ReadOffset(() =>
86+
{
87+
foreach (FamilyMotion motion in FamilyMotions)
88+
{
89+
motion.ReadExtended(reader);
90+
}
91+
});
8792
});
8893
}
8994

9095
public void WriteExtended(BinaryObjectWriter writer)
9196
{
9297
writer.WriteOffset(() =>
9398
{
94-
foreach (FamilyMotion motion in FamilyMotions)
95-
{
96-
motion.WriteExtended(writer);
97-
}
99+
writer.Write(0);
100+
101+
writer.WriteOffset(() =>
102+
{
103+
foreach (FamilyMotion motion in FamilyMotions)
104+
{
105+
motion.WriteExtended(writer);
106+
}
107+
});
98108
});
99109
}
100110
}

Source/SharpNeedle/Framework/Ninja/Csd/ProjectChunk.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public void Write(BinaryObjectWriter writer, ChunkBinaryOptions options)
3535
writer.Write(Field08);
3636
writer.Write(Field0C);
3737
writer.WriteObjectOffset(Root);
38-
writer.WriteStringOffset(StringBinaryFormat.NullTerminated, Name);
38+
writer.WriteOffset(() => writer.WriteString(StringBinaryFormat.NullTerminated, Name));
3939
writer.Write(TextureFormat);
4040
writer.WriteObjectOffset(Fonts);
4141
writer.Flush();

0 commit comments

Comments
 (0)