diff --git a/Z64Utils/Z64/Z64ObjectAnalyzer.cs b/Z64Utils/Z64/Z64ObjectAnalyzer.cs
index 5fdcf04..45dcca9 100644
--- a/Z64Utils/Z64/Z64ObjectAnalyzer.cs
+++ b/Z64Utils/Z64/Z64ObjectAnalyzer.cs
@@ -338,14 +338,14 @@ namespace Z64
{
// Search for Skeleton Headers
// Structure: SS OO OO OO XX 00 00 00 [XX 00 00 00]
- for (int i = 0; i < data.Length - Z64Object.SkeletonHolder.HEADER_SIZE; i += 4)
+ for (int i = 0; i <= data.Length - Z64Object.SkeletonHolder.HEADER_SIZE; i += 4)
{
var segment = new SegmentedAddress(ArrayUtil.ReadUint32BE(data, i));
// check for segmentId match, check for valid segment offset,
// check for Limbs 0x4 alignment, check for nonzero limb count,
// check for zeroes in struct padding
if (segment.SegmentId == segmentId && segment.SegmentOff < data.Length &&
- (segment.SegmentOff % 4) == 0 && data[i+4] != 0 &&
+ (segment.SegmentOff % 4) == 0 && data[i+4] > 1 && // There should be no single-limb skeletons
data[i + 5] == 0 && data[i + 6] == 0 && data[i + 7] == 0)
{
if (!obj.IsOffsetFree(i))
@@ -377,7 +377,7 @@ namespace Z64
// check if nothing is already assumed to occupy that space,
// check if the number of dlists is equal to the actual number of non-null dlists,
// check struct padding
- if (i < data.Length - Z64Object.FlexSkeletonHolder.HEADER_SIZE && obj.IsOffsetFree(i + Z64Object.SkeletonHolder.HEADER_SIZE) &&
+ if (i <= data.Length - Z64Object.FlexSkeletonHolder.HEADER_SIZE && obj.IsOffsetFree(i + Z64Object.SkeletonHolder.HEADER_SIZE) &&
data[i + 8] == nNonNullDlists && data[i + 9] == 0 && data[i + 10] == 0 && data[i + 11] == 0)
{
obj.AddFlexSkeleton(off: i);
@@ -401,19 +401,24 @@ namespace Z64
if (frameCount > 0 &&
data[i + 2] == 0 && data[i + 3] == 0 && data[i + 14] == 0 && data[i + 15] == 0)
{
- if (!obj.IsOffsetFree(i))
+ if (!(obj.IsOffsetFree(i) && obj.IsOffsetFree(i + Z64Object.AnimationHolder.HEADER_SIZE)))
continue;
var frameDataSeg = new SegmentedAddress(ArrayUtil.ReadUint32BE(data, i+4));
var jointIndicesSeg = new SegmentedAddress(ArrayUtil.ReadUint32BE(data, i+8));
// check for segmentId match, check for valid segment offsets
if (frameDataSeg.SegmentId == segmentId && jointIndicesSeg.SegmentId == segmentId &&
- frameDataSeg.SegmentOff < data.Length && jointIndicesSeg.SegmentOff < data.Length)
+ frameDataSeg.SegmentOff < data.Length && jointIndicesSeg.SegmentOff < data.Length &&
+ jointIndicesSeg.SegmentOff > frameDataSeg.SegmentOff)
{
// Assumes these are all in order and end at the start of the next, which seems to be the case so far
int frameDataSize = (int)(jointIndicesSeg.SegmentOff - frameDataSeg.SegmentOff);
int jointIndicesSize = (int)(i - jointIndicesSeg.SegmentOff);
+ // Require at least one entry to be considered valid
+ if (frameDataSize < 2 || jointIndicesSize < Z64Object.AnimationJointIndicesHolder.ENTRY_SIZE)
+ continue;
+
// if not a multiple of 2, check for struct padding
if ((frameDataSize % 2) != 0)
{
diff --git a/Z64Utils/Z64Utils.csproj b/Z64Utils/Z64Utils.csproj
index 1c0b808..ad1e2cd 100644
--- a/Z64Utils/Z64Utils.csproj
+++ b/Z64Utils/Z64Utils.csproj
@@ -17,6 +17,7 @@
+