From e09e39ad8a80a871e82acf084c51f174e6084d03 Mon Sep 17 00:00:00 2001 From: Anna Melashkina Date: Fri, 28 Nov 2025 23:16:15 +0200 Subject: [PATCH] fix: 3dc should parse tga --- src/Parsec/Shaiya/3dc/_3dc.cs | 20 ++++++++++++++---- tests/Parsec.Tests/Parsec.Tests.csproj | 3 +++ tests/Parsec.Tests/Shaiya/3DC/_3DCTests.cs | 1 + .../Parsec.Tests/Shaiya/3DC/mob_rend_01_a.3dc | Bin 0 -> 46592 bytes 4 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 tests/Parsec.Tests/Shaiya/3DC/mob_rend_01_a.3dc diff --git a/src/Parsec/Shaiya/3dc/_3dc.cs b/src/Parsec/Shaiya/3dc/_3dc.cs index 276bd795..a37f48df 100644 --- a/src/Parsec/Shaiya/3dc/_3dc.cs +++ b/src/Parsec/Shaiya/3dc/_3dc.cs @@ -13,6 +13,11 @@ namespace Parsec.Shaiya._3dc; /// public sealed class _3dc : FileBase { + /// + /// Some mob files store TGA name. + /// + public string Icon { get; set; } = ""; + /// /// List of bones linked to this 3d model. Although a model might be linked to a few bones (for example boots models), the /// 3DC file contains the definitions for all the bones in the whole skeleton. @@ -30,15 +35,17 @@ public sealed class _3dc : FileBase /// public List Faces { get; set; } = new(); + private const int Ep6Flag = 444; + [JsonIgnore] public override string Extension => "3DC"; protected override void Read(SBinaryReader binaryReader) { - var version = binaryReader.ReadInt32(); + var versionOrTGALength = binaryReader.ReadInt32(); Episode = Episode.EP5; - if (version == 444) + if (versionOrTGALength == Ep6Flag) { Episode = Episode.EP6; } @@ -46,6 +53,8 @@ protected override void Read(SBinaryReader binaryReader) // Vertex instances expect the episode to be set on the serialization options binaryReader.SerializationOptions.Episode = Episode; + if (versionOrTGALength > 0 && versionOrTGALength != Ep6Flag) + Icon = binaryReader.ReadString(versionOrTGALength); Bones = binaryReader.ReadList<_3dcBone>().ToList(); Vertices = binaryReader.ReadList<_3dcVertex>().ToList(); Faces = binaryReader.ReadList().ToList(); @@ -57,13 +66,16 @@ protected override void Write(SBinaryWriter binaryWriter) if (Episode >= Episode.EP6) { - version = 444; + version = Ep6Flag; } // Vertex instances expect the episode to be set on the serialization options binaryWriter.SerializationOptions.Episode = Episode; - binaryWriter.Write(version); + if (string.IsNullOrEmpty(Icon) || version == Ep6Flag) + binaryWriter.Write(version); + else + binaryWriter.Write(Icon); binaryWriter.Write(Bones.ToSerializable()); binaryWriter.Write(Vertices.ToSerializable()); binaryWriter.Write(Faces.ToSerializable()); diff --git a/tests/Parsec.Tests/Parsec.Tests.csproj b/tests/Parsec.Tests/Parsec.Tests.csproj index 3a3770d2..60c1afed 100644 --- a/tests/Parsec.Tests/Parsec.Tests.csproj +++ b/tests/Parsec.Tests/Parsec.Tests.csproj @@ -24,6 +24,9 @@ + + PreserveNewest + PreserveNewest diff --git a/tests/Parsec.Tests/Shaiya/3DC/_3DCTests.cs b/tests/Parsec.Tests/Shaiya/3DC/_3DCTests.cs index 1a09891a..a1ea154e 100644 --- a/tests/Parsec.Tests/Shaiya/3DC/_3DCTests.cs +++ b/tests/Parsec.Tests/Shaiya/3DC/_3DCTests.cs @@ -95,6 +95,7 @@ public void _3DCReadWriteEP6Test() [InlineData("vehicle_El_06.3DC")] [InlineData("WhiteWing.3DC")] [InlineData("Wing_01.3DC")] + [InlineData("mob_rend_01_a.3dc")] public void _3DCMultipleReadWriteTest(string fileName) { var filePath = $"Shaiya/3DC/{fileName}"; diff --git a/tests/Parsec.Tests/Shaiya/3DC/mob_rend_01_a.3dc b/tests/Parsec.Tests/Shaiya/3DC/mob_rend_01_a.3dc new file mode 100644 index 0000000000000000000000000000000000000000..64765acfba7ecec0e31cf362ea1854a232a183df GIT binary patch literal 46592 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 literal 0 HcmV?d00001