• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

MeltyPlayer / MeltyTool / 21237956361

22 Jan 2026 06:03AM UTC coverage: 42.256% (+0.003%) from 42.253%
21237956361

push

github

MeltyPlayer
Used Shift-JIS when reading PLvPW names.

6867 of 18394 branches covered (37.33%)

Branch coverage included in aggregate %.

0 of 10 new or added lines in 3 files covered. (0.0%)

1 existing line in 1 file now uncovered.

29415 of 67468 relevant lines covered (43.6%)

64437.66 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/FinModelUtility/Libraries/Level5/Level5/src/schema/Res.cs
1
using fin.io;
2
using fin.schema;
3

4
using level5.decompression;
5

6
using schema.binary;
7
using schema.binary.attributes;
8

9
namespace level5.schema;
10

11
public sealed class Resource {
12
  public sealed class Material {
13
    public string Name { get; set; }
×
14
    public int Index { get; set; } = -1;
×
15
    public string TexName { get; set; }
×
16
  }
17

18
  public string ModelName { get; set; }
×
19

20
  Dictionary<uint, string> ResourceNames { get; set; } =
×
21
    new Dictionary<uint, string>();
×
22

23
  public List<string> TextureNames { get; } = [];
×
24

25
  public List<Material> Materials { get; } = [];
×
26

27
  public string GetResourceName(uint crc) {
×
28
    if (this.ResourceNames.ContainsKey(crc))
×
29
      return this.ResourceNames[crc];
×
30

31
    return "";
×
32
  }
×
33

34
  [Unknown]
35
  public Resource(IReadOnlyGenericFile file) {
×
36
    var data = file.ReadAllBytes();
×
37
    data = new Level5Decompressor().Decompress(data);
×
38
    using (var r = new SchemaBinaryReader(new MemoryStream(data),
×
39
                                          Endianness.LittleEndian)) {
×
40
      var magic = new string(r.ReadChars(6));
×
41
      if (magic != "CHRC00" && magic != "CHRN01")
×
42
        throw new FormatException("RES file is corrupt");
×
43

44
      // -----------------------
45
      var unknown0 = r.ReadInt16();
×
46
      var stringTableOffset = r.ReadInt16() << 2;
×
47
      var unknown1 = r.ReadInt16();
×
48
      var materialTableOffset = r.ReadInt16() << 2;
×
49
      var materialTableSectionCount = r.ReadInt16();
×
50
      var resourceNodeOffsets = r.ReadInt16() << 2;
×
51
      var resourceNodeCount = r.ReadInt16();
×
52

53
      r.Position = (uint)stringTableOffset;
×
54
      while (!r.Eof) {
×
NEW
55
        string mname = r.ReadStringNT(StringEncodingType.SHIFT_JIS);
×
56
        if (mname == "")
×
57
          break;
×
58
        if (!this.ResourceNames.ContainsKey(Crc32.Crc32C(mname)))
×
59
          this.ResourceNames.Add(Crc32.Crc32C(mname), mname);
×
60
      }
×
61

62
      r.Position = (uint)materialTableOffset;
×
63
      for (int i = 0; i < materialTableSectionCount; i++) {
×
64
        var offset = r.ReadInt16() << 2;
×
65
        var count = r.ReadInt16();
×
66
        var unknown = r.ReadInt16();
×
67
        var size = r.ReadInt16();
×
68

69
        if (unknown == 0x270F)
×
70
          continue;
×
71

72
        var temp = r.Position;
×
73
        for (int j = 0; j < count; j++) {
×
74
          r.Position = (uint)(offset + j * size);
×
75
          var key = r.ReadUInt32();
×
76
          string resourceName = (this.ResourceNames.ContainsKey(key)
×
77
              ? this.ResourceNames[key]
×
78
              : key.ToString("X"));
×
79
          //Console.WriteLine(resourceName + " " + unknown.ToString("X") + " " + size.ToString("X"));
80

81
          if (unknown is 0xDC or 0xE6) {
×
82
            // TODO: Default libs
83
            ;
×
84
          } else if (unknown == 0xF0) {
×
85
            this.TextureNames.Add(resourceName);
×
86
          } else if (unknown == 0x122) {
×
87
            Material mat = new Material();
×
88
            mat.Name = resourceName;
×
89
            r.Position += 12;
×
90
            key = r.ReadUInt32();
×
91
            resourceName = (this.ResourceNames.ContainsKey(key)
×
92
                ? this.ResourceNames[key]
×
93
                : key.ToString("X"));
×
94
            mat.TexName = resourceName;
×
95
            // Console.WriteLine(resourceName + " " + unknown.ToString("X") + " " + size.ToString("X"));
96
            this.Materials.Add(mat);
×
97
          } else {
×
98
            ;
×
99
          }
×
100
        }
×
101

102
        r.Position = temp;
×
103
      }
×
104

105
      r.Position = (uint)resourceNodeOffsets;
×
106
      for (int i = 0; i < resourceNodeCount; i++) {
×
107
        var offset = r.ReadInt16() << 2;
×
108
        var count = r.ReadInt16();
×
109
        var unknown = r.ReadInt16();
×
110
        var size = r.ReadInt16();
×
111

112
        if (unknown == 0x270F)
×
113
          continue;
×
114

115
        var temp = r.Position;
×
116
        r.Position = (uint)offset;
×
117
        for (int j = 0; j < count; j++) {
×
118
          var key = r.ReadUInt32();
×
119
          //Console.WriteLine((ResourceNames.ContainsKey(key) ? ResourceNames[key] : key.ToString("X")) + " " + unknown.ToString("X") + " " + size.ToString("X"));
120
          r.Position += (uint)(size - 4);
×
121
        }
×
122

123
        r.Position = temp;
×
124
      }
×
125
    }
×
126
  }
×
127
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc