CAnimSetLoader: Make use of unsigned stream helpers where applicable

Same behavior, minus all of the implicit sign conversions.
This commit is contained in:
Lioncash 2020-06-18 19:08:35 -04:00
parent 36e005844f
commit cf0898792a

View File

@ -10,17 +10,17 @@ void CAnimSetLoader::LoadCorruptionCHAR(IInputStream& rCHAR)
SSetCharacter& rChar = pSet->mCharacters.emplace_back();
// Character Header
rChar.ID = rCHAR.ReadByte();
rChar.ID = rCHAR.ReadUByte();
rChar.Name = rCHAR.ReadString();
rChar.pModel = gpResourceStore->LoadResource<CModel>(rCHAR.ReadLongLong());
rChar.pSkin = gpResourceStore->LoadResource<CSkin>(rCHAR.ReadLongLong());
rChar.pModel = gpResourceStore->LoadResource<CModel>(rCHAR.ReadULongLong());
rChar.pSkin = gpResourceStore->LoadResource<CSkin>(rCHAR.ReadULongLong());
uint32 NumOverlays = rCHAR.ReadLong();
const uint32 NumOverlays = rCHAR.ReadULong();
for (uint32 iOverlay = 0; iOverlay < NumOverlays; iOverlay++)
{
SOverlayModel Overlay;
Overlay.Type = (EOverlayType) rCHAR.ReadLong();
Overlay.Type = static_cast<EOverlayType>(rCHAR.ReadULong());
Overlay.ModelID = CAssetID(rCHAR, EIDLength::k64Bit);
Overlay.SkinID = CAssetID(rCHAR, EIDLength::k64Bit);
rChar.OverlayModels.push_back(Overlay);
@ -36,7 +36,7 @@ void CAnimSetLoader::LoadCorruptionCHAR(IInputStream& rCHAR)
LoadParticleResourceData(rCHAR, &rChar, 10);
// Events
uint32 NumEventSets = rCHAR.ReadLong();
const uint32 NumEventSets = rCHAR.ReadULong();
for (uint32 iSet = 0; iSet < NumEventSets; iSet++)
{
@ -44,7 +44,7 @@ void CAnimSetLoader::LoadCorruptionCHAR(IInputStream& rCHAR)
}
// Animations
uint32 NumAnimations = rCHAR.ReadLong();
const uint32 NumAnimations = rCHAR.ReadULong();
for (uint32 AnimIdx = 0; AnimIdx < NumAnimations; AnimIdx++)
{
@ -55,21 +55,21 @@ void CAnimSetLoader::LoadCorruptionCHAR(IInputStream& rCHAR)
}
// Animation Bounds
uint32 NumAnimationBounds = rCHAR.ReadLong();
const uint32 NumAnimationBounds = rCHAR.ReadULong();
rCHAR.Skip(NumAnimationBounds * 0x20);
rCHAR.Skip(1);
// Bool Array
uint32 BoolArraySize = rCHAR.ReadLong();
const uint32 BoolArraySize = rCHAR.ReadULong();
rCHAR.Skip(BoolArraySize);
// Collision Primitives
uint32 NumPrimitiveSets = rCHAR.ReadLong();
const uint32 NumPrimitiveSets = rCHAR.ReadULong();
for (uint32 SetIdx = 0; SetIdx < NumPrimitiveSets; SetIdx++)
{
rCHAR.ReadString();
uint32 NumPrimitives = rCHAR.ReadLong();
const uint32 NumPrimitives = rCHAR.ReadULong();
for (uint32 PrimIdx = 0; PrimIdx < NumPrimitives; PrimIdx++)
{
@ -80,7 +80,7 @@ void CAnimSetLoader::LoadCorruptionCHAR(IInputStream& rCHAR)
}
// Sound Resources
uint32 NumSounds = rCHAR.ReadLong();
const uint32 NumSounds = rCHAR.ReadULong();
for (uint32 SoundIdx = 0; SoundIdx < NumSounds; SoundIdx++)
{
@ -94,7 +94,7 @@ void CAnimSetLoader::LoadCorruptionCHAR(IInputStream& rCHAR)
void CAnimSetLoader::LoadReturnsCHAR(IInputStream& rCHAR)
{
rCHAR.Skip(0x14);
uint8 Flag = rCHAR.ReadByte();
const uint8 Flag = rCHAR.ReadUByte();
rCHAR.Skip(1);
SSetCharacter& rChar = pSet->mCharacters.emplace_back();
@ -105,13 +105,13 @@ void CAnimSetLoader::LoadReturnsCHAR(IInputStream& rCHAR)
rChar.pSkeleton = gpResourceStore->LoadResource<CSkeleton>( rCHAR.ReadLongLong() );
rChar.CollisionPrimitivesID = rCHAR.ReadLongLong();
uint32 NumModels = rCHAR.ReadLong();
const uint32 NumModels = rCHAR.ReadULong();
for (uint32 ModelIdx = 0; ModelIdx < NumModels; ModelIdx++)
{
rCHAR.ReadString();
CAssetID ModelID(rCHAR, EGame::DKCReturns);
CAssetID SkinID(rCHAR, EGame::DKCReturns);
const CAssetID ModelID(rCHAR, EGame::DKCReturns);
const CAssetID SkinID(rCHAR, EGame::DKCReturns);
rCHAR.Skip(0x18);
if (ModelIdx == 0)
@ -127,19 +127,19 @@ void CAnimSetLoader::LoadReturnsCHAR(IInputStream& rCHAR)
}
// Animations
uint32 NumAnims = rCHAR.ReadLong();
const uint32 NumAnims = rCHAR.ReadULong();
for (uint32 AnimIdx = 0; AnimIdx < NumAnims; AnimIdx++)
{
TString AnimName = rCHAR.ReadString();
CAssetID AnimID(rCHAR, EGame::DKCReturns);
const CAssetID AnimID(rCHAR, EGame::DKCReturns);
rCHAR.Skip(0x25);
rChar.DKDependencies.push_back(AnimID);
// small hack - create a meta-anim for it so we can generate asset names for the ANIM files correctly
SAnimation Anim;
Anim.Name = AnimName;
Anim.pMetaAnim = std::make_unique<CMetaAnimPlay>(CAnimPrimitive(AnimID, AnimIdx, AnimName), 0.f, 0);
Anim.Name = std::move(AnimName);
pSet->mAnimations.push_back(std::move(Anim));
}
@ -148,23 +148,23 @@ void CAnimSetLoader::LoadReturnsCHAR(IInputStream& rCHAR)
return;
// Anim ID Map
if (Flag & 0x20)
if ((Flag & 0x20) != 0)
{
uint32 NumIDs = rCHAR.ReadLong();
rCHAR.Skip(NumIDs * 4);
}
// Transitions
if (Flag & 0x80)
if ((Flag & 0x80) != 0)
{
uint32 NumAdditiveAnims = rCHAR.ReadLong();
const uint32 NumAdditiveAnims = rCHAR.ReadULong();
rCHAR.Skip(NumAdditiveAnims * 0x10);
uint32 NumTransitionTypes = rCHAR.ReadLong();
const uint32 NumTransitionTypes = rCHAR.ReadULong();
for (uint32 TypeIdx = 0; TypeIdx < NumTransitionTypes; TypeIdx++)
{
uint16 Type = rCHAR.ReadShort();
const uint16 Type = rCHAR.ReadUShort();
switch (Type)
{
@ -178,52 +178,52 @@ void CAnimSetLoader::LoadReturnsCHAR(IInputStream& rCHAR)
rCHAR.Skip(0xC);
break;
default:
errorf("%s [0x%X]: Invalid transition type: %d", *rCHAR.GetSourceString(), rCHAR.Tell() - 2, Type);
errorf("%s [0x%X]: Invalid transition type: %u", *rCHAR.GetSourceString(), rCHAR.Tell() - 2, Type);
return;
}
}
uint32 NumFullTransitions = rCHAR.ReadLong();
const uint32 NumFullTransitions = rCHAR.ReadULong();
rCHAR.Skip(NumFullTransitions * 0xC);
uint32 NumHalfTransitions = rCHAR.ReadLong();
const uint32 NumHalfTransitions = rCHAR.ReadULong();
rCHAR.Skip(NumHalfTransitions * 0x8);
rCHAR.Skip(0x8);
}
// Transform Bits
if (Flag & 0x40)
if ((Flag & 0x40) != 0)
{
uint32 NumTransformBits = rCHAR.ReadLong();
const uint32 NumTransformBits = rCHAR.ReadULong();
rCHAR.Skip(NumTransformBits);
}
uint32 NumUnknown = rCHAR.ReadLong();
const uint32 NumUnknown = rCHAR.ReadULong();
rCHAR.Skip(NumUnknown * 4);
// Skel Joint Sets
uint32 NumSkelJointSets = rCHAR.ReadLong();
const uint32 NumSkelJointSets = rCHAR.ReadULong();
for (uint32 SetIdx = 0; SetIdx < NumSkelJointSets; SetIdx++)
{
rCHAR.Skip(4);
uint32 NumUnknown2 = rCHAR.ReadLong();
const uint32 NumUnknown2 = rCHAR.ReadULong();
rCHAR.Skip(0x20 + NumUnknown2);
}
// Resources
if (Flag & 0x10)
if ((Flag & 0x10) != 0)
{
// Don't need the extensions
uint32 NumExtensions = rCHAR.ReadLong();
const uint32 NumExtensions = rCHAR.ReadULong();
rCHAR.Skip(NumExtensions * 4);
uint32 NumResources = rCHAR.ReadLong();
const uint32 NumResources = rCHAR.ReadULong();
for (uint32 ResIdx = 0; ResIdx < NumResources; ResIdx++)
{
CAssetID ResID(rCHAR, EGame::DKCReturns);
const CAssetID ResID(rCHAR, EGame::DKCReturns);
rCHAR.Skip(3);
rChar.DKDependencies.push_back(ResID);
}
@ -235,35 +235,37 @@ void CAnimSetLoader::LoadReturnsCHAR(IInputStream& rCHAR)
void CAnimSetLoader::LoadPASDatabase(IInputStream& rPAS4)
{
// For now, just parse the data; don't store it
uint32 Magic = rPAS4.ReadLong();
uint32 AnimStateCount = rPAS4.ReadLong();
[[maybe_unused]] const uint32 Magic = rPAS4.ReadULong();
const uint32 AnimStateCount = rPAS4.ReadULong();
rPAS4.Seek(0x4, SEEK_CUR); // Skipping default anim state
ASSERT(Magic == FOURCC('PAS4'));
for (uint32 iState = 0; iState < AnimStateCount; iState++)
{
rPAS4.Seek(0x4, SEEK_CUR); // Skipping unknown value
uint32 ParmInfoCount = rPAS4.ReadLong();
uint32 AnimInfoCount = rPAS4.ReadLong();
const uint32 ParmInfoCount = rPAS4.ReadULong();
const uint32 AnimInfoCount = rPAS4.ReadULong();
uint32 Skip = 0;
for (uint32 iParm = 0; iParm < ParmInfoCount; iParm++)
{
uint32 Type = rPAS4.ReadLong();
const uint32 Type = rPAS4.ReadULong();
rPAS4.Seek(0x8, SEEK_CUR);
switch (Type) {
case 0: // Int32
case 1: // Uint32
case 2: // Real32
case 4: // Enum
rPAS4.Seek(0x8, SEEK_CUR);
Skip += 4;
break;
case 3: // Bool
rPAS4.Seek(0x2, SEEK_CUR);
Skip++;
break;
case 0: // Int32
case 1: // Uint32
case 2: // Real32
case 4: // Enum
rPAS4.Seek(0x8, SEEK_CUR);
Skip += 4;
break;
case 3: // Bool
rPAS4.Seek(0x2, SEEK_CUR);
Skip++;
break;
default:
break;
}
}
@ -274,45 +276,46 @@ void CAnimSetLoader::LoadPASDatabase(IInputStream& rPAS4)
void CAnimSetLoader::LoadParticleResourceData(IInputStream& rFile, SSetCharacter *pChar, uint16 CharVersion)
{
uint32 ParticleCount = rFile.ReadLong();
const uint32 ParticleCount = rFile.ReadULong();
pChar->GenericParticles.reserve(ParticleCount);
for (uint32 iPart = 0; iPart < ParticleCount; iPart++)
pChar->GenericParticles.push_back( CAssetID(rFile, mGame) );
pChar->GenericParticles.emplace_back(rFile, mGame);
uint32 SwooshCount = rFile.ReadLong();
const uint32 SwooshCount = rFile.ReadULong();
pChar->SwooshParticles.reserve(SwooshCount);
for (uint32 iSwoosh = 0; iSwoosh < SwooshCount; iSwoosh++)
pChar->SwooshParticles.push_back( CAssetID(rFile, mGame) );
pChar->SwooshParticles.emplace_back(rFile, mGame);
if (CharVersion >= 6 && mGame <= EGame::Echoes) rFile.Seek(0x4, SEEK_CUR);
uint32 ElectricCount = rFile.ReadLong();
const uint32 ElectricCount = rFile.ReadULong();
pChar->ElectricParticles.reserve(ElectricCount);
for (uint32 iElec = 0; iElec < ElectricCount; iElec++)
pChar->ElectricParticles.push_back( CAssetID(rFile, mGame) );
pChar->ElectricParticles.emplace_back(rFile, mGame);
if (mGame >= EGame::Echoes)
{
uint32 SpawnCount = rFile.ReadLong();
const uint32 SpawnCount = rFile.ReadULong();
pChar->SpawnParticles.reserve(SpawnCount);
for (uint32 iSpawn = 0; iSpawn < SpawnCount; iSpawn++)
pChar->SpawnParticles.push_back( CAssetID(rFile, mGame) );
pChar->SpawnParticles.emplace_back(rFile, mGame);
}
rFile.Seek(0x4, SEEK_CUR);
if (mGame >= EGame::Echoes) rFile.Seek(0x4, SEEK_CUR);
if (mGame >= EGame::Echoes)
rFile.Seek(0x4, SEEK_CUR);
}
void CAnimSetLoader::LoadAnimationSet(IInputStream& rANCS)
{
uint16 Version = rANCS.ReadShort();
const uint16 Version = rANCS.ReadUShort();
// Animations
uint32 NumAnims = rANCS.ReadLong();
const uint32 NumAnims = rANCS.ReadULong();
pSet->mAnimations.reserve(NumAnims);
for (uint32 iAnim = 0; iAnim < NumAnims; iAnim++)
@ -324,15 +327,15 @@ void CAnimSetLoader::LoadAnimationSet(IInputStream& rANCS)
}
// Transitions
uint32 NumTransitions = rANCS.ReadLong();
const uint32 NumTransitions = rANCS.ReadULong();
pSet->mTransitions.reserve(NumTransitions);
for (uint32 iTrans = 0; iTrans < NumTransitions; iTrans++)
{
STransition Trans;
Trans.Unknown = rANCS.ReadLong();
Trans.AnimIdA = rANCS.ReadLong();
Trans.AnimIdB = rANCS.ReadLong();
Trans.Unknown = rANCS.ReadULong();
Trans.AnimIdA = rANCS.ReadULong();
Trans.AnimIdB = rANCS.ReadULong();
Trans.pMetaTrans = gMetaTransFactory.LoadFromStream(rANCS, mGame);
pSet->mTransitions.push_back(std::move(Trans));
}
@ -340,16 +343,17 @@ void CAnimSetLoader::LoadAnimationSet(IInputStream& rANCS)
pSet->mpDefaultTransition = gMetaTransFactory.LoadFromStream(rANCS, mGame);
// Additive Animations
uint32 NumAdditive = rANCS.ReadLong();
const uint32 NumAdditive = rANCS.ReadULong();
pSet->mAdditiveAnims.reserve(NumAdditive);
for (uint32 iAdd = 0; iAdd < NumAdditive; iAdd++)
{
SAdditiveAnim Anim;
Anim.AnimID = rANCS.ReadLong();
Anim.FadeInTime = rANCS.ReadFloat();
Anim.FadeOutTime = rANCS.ReadFloat();
pSet->mAdditiveAnims.push_back(std::move(Anim));
const SAdditiveAnim Anim{
rANCS.ReadULong(),
rANCS.ReadFloat(),
rANCS.ReadFloat(),
};
pSet->mAdditiveAnims.push_back(Anim);
}
pSet->mDefaultAdditiveFadeIn = rANCS.ReadFloat();
@ -358,13 +362,13 @@ void CAnimSetLoader::LoadAnimationSet(IInputStream& rANCS)
// Half Transitions
if (Version > 2)
{
uint32 NumHalfTransitions = rANCS.ReadLong();
const uint32 NumHalfTransitions = rANCS.ReadULong();
pSet->mHalfTransitions.reserve(NumHalfTransitions);
for (uint32 iTrans = 0; iTrans < NumHalfTransitions; iTrans++)
{
SHalfTransition Trans;
Trans.AnimID = rANCS.ReadLong();
Trans.AnimID = rANCS.ReadULong();
Trans.pMetaTrans = gMetaTransFactory.LoadFromStream(rANCS, mGame);
pSet->mHalfTransitions.push_back(std::move(Trans));
}
@ -374,7 +378,7 @@ void CAnimSetLoader::LoadAnimationSet(IInputStream& rANCS)
// Events
if (mGame >= EGame::EchoesDemo)
{
uint32 EventDataCount = rANCS.ReadLong();
const uint32 EventDataCount = rANCS.ReadULong();
pSet->mAnimEvents.reserve(EventDataCount);
ASSERT(EventDataCount == NumAnims);
@ -406,7 +410,7 @@ void CAnimSetLoader::ProcessPrimitives()
{
CSourceAnimData *pAnimData = gpResourceStore->LoadResource<CSourceAnimData>( pSet->mCharacters[0].AnimDataID );
if (pAnimData)
if (pAnimData != nullptr)
pAnimData->GetUniquePrimitives(UniquePrimitives);
}
@ -496,9 +500,10 @@ void CAnimSetLoader::ProcessPrimitives()
// ************ STATIC ************
std::unique_ptr<CAnimSet> CAnimSetLoader::LoadANCS(IInputStream& rANCS, CResourceEntry *pEntry)
{
if (!rANCS.IsValid()) return nullptr;
if (!rANCS.IsValid())
return nullptr;
uint32 Magic = rANCS.ReadLong();
const uint32 Magic = rANCS.ReadULong();
if (Magic != 0x00010001)
{
errorf("%s: Invalid ANCS magic: 0x%08X", *rANCS.GetSourceString(), Magic);
@ -511,33 +516,35 @@ std::unique_ptr<CAnimSet> CAnimSetLoader::LoadANCS(IInputStream& rANCS, CResourc
Loader.pSet = ptr.get();
Loader.mGame = pEntry->Game();
uint32 NodeCount = rANCS.ReadLong();
const uint32 NodeCount = rANCS.ReadULong();
Loader.pSet->mCharacters.resize(NodeCount);
for (uint32 iNode = 0; iNode < NodeCount; iNode++)
{
SSetCharacter *pChar = &Loader.pSet->mCharacters[iNode];
pChar->ID = rANCS.ReadLong();
uint16 CharVersion = rANCS.ReadShort();
pChar->ID = rANCS.ReadULong();
const uint16 CharVersion = rANCS.ReadUShort();
if (iNode == 0 && Loader.mGame == EGame::Invalid)
{
Loader.mGame = (CharVersion == 0xA) ? EGame::Echoes : EGame::Prime;
}
pChar->Name = rANCS.ReadString();
pChar->pModel = gpResourceStore->LoadResource<CModel>(rANCS.ReadLong());
pChar->pSkin = gpResourceStore->LoadResource<CSkin>(rANCS.ReadLong());
pChar->pSkeleton = gpResourceStore->LoadResource<CSkeleton>(rANCS.ReadLong());
if (pChar->pModel) pChar->pModel->SetSkin(pChar->pSkin);
pChar->pModel = gpResourceStore->LoadResource<CModel>(rANCS.ReadULong());
pChar->pSkin = gpResourceStore->LoadResource<CSkin>(rANCS.ReadULong());
pChar->pSkeleton = gpResourceStore->LoadResource<CSkeleton>(rANCS.ReadULong());
if (pChar->pModel != nullptr)
pChar->pModel->SetSkin(pChar->pSkin);
// Unfortunately that's all that's actually supported at the moment. Hope to expand later.
// Since there's no size value I have to actually read the rest of the node to reach the next one
uint32 AnimCount = rANCS.ReadLong();
const uint32 AnimCount = rANCS.ReadULong();
for (uint32 iAnim = 0; iAnim < AnimCount; iAnim++)
{
rANCS.Seek(0x4, SEEK_CUR);
if (Loader.mGame == EGame::Prime) rANCS.Seek(0x1, SEEK_CUR);
if (Loader.mGame == EGame::Prime)
rANCS.Seek(0x1, SEEK_CUR);
rANCS.ReadString();
}
@ -547,28 +554,32 @@ std::unique_ptr<CAnimSet> CAnimSetLoader::LoadANCS(IInputStream& rANCS, CResourc
// Particles
Loader.LoadParticleResourceData(rANCS, pChar, CharVersion);
uint32 AnimCount2 = rANCS.ReadLong();
const uint32 AnimCount2 = rANCS.ReadULong();
for (uint32 iAnim = 0; iAnim < AnimCount2; iAnim++)
{
rANCS.ReadString();
rANCS.Seek(0x18, SEEK_CUR);
}
uint32 EffectGroupCount = rANCS.ReadLong();
const uint32 EffectGroupCount = rANCS.ReadULong();
for (uint32 iGrp = 0; iGrp < EffectGroupCount; iGrp++)
{
rANCS.ReadString();
uint32 EffectCount = rANCS.ReadLong();
const uint32 EffectCount = rANCS.ReadULong();
for (uint32 iEffect = 0; iEffect < EffectCount; iEffect++)
{
rANCS.ReadString();
rANCS.Seek(0x4, SEEK_CUR);
CAssetID ParticleID(rANCS, EIDLength::k32Bit);
if (ParticleID.IsValid()) pChar->EffectParticles.push_back(ParticleID);
const CAssetID ParticleID(rANCS, EIDLength::k32Bit);
if (ParticleID.IsValid())
pChar->EffectParticles.push_back(ParticleID);
if (Loader.mGame == EGame::Prime)
rANCS.ReadString();
if (Loader.mGame == EGame::Echoes)
rANCS.Seek(0x4, SEEK_CUR);
if (Loader.mGame == EGame::Prime) rANCS.ReadString();
if (Loader.mGame == EGame::Echoes) rANCS.Seek(0x4, SEEK_CUR);
rANCS.Seek(0xC, SEEK_CUR);
}
}
@ -579,19 +590,19 @@ std::unique_ptr<CAnimSet> CAnimSetLoader::LoadANCS(IInputStream& rANCS, CResourc
Overlay.SkinID = CAssetID(rANCS, EIDLength::k32Bit);
pChar->OverlayModels.push_back(Overlay);
uint32 AnimIndexCount = rANCS.ReadLong();
const uint32 AnimIndexCount = rANCS.ReadULong();
for (uint32 iAnim = 0; iAnim < AnimIndexCount; iAnim++)
{
uint32 AnimIndex = rANCS.ReadLong();
const uint32 AnimIndex = rANCS.ReadULong();
pChar->UsedAnimationIndices.insert(AnimIndex);
}
if (Loader.mGame == EGame::Echoes)
{
pChar->SpatialPrimitives = rANCS.ReadLong();
pChar->SpatialPrimitives = rANCS.ReadULong();
rANCS.Seek(0x1, SEEK_CUR);
uint32 UnknownCount2 = rANCS.ReadLong();
const uint32 UnknownCount2 = rANCS.ReadULong();
rANCS.Seek(UnknownCount2 * 0x1C, SEEK_CUR);
}
}
@ -609,7 +620,7 @@ std::unique_ptr<CAnimSet> CAnimSetLoader::LoadCHAR(IInputStream& rCHAR, CResourc
return nullptr;
CAnimSetLoader Loader;
uint8 Check = rCHAR.ReadByte();
const uint8 Check = rCHAR.ReadUByte();
if (Check == 0x5 || Check == 0x3)
{
@ -645,15 +656,15 @@ std::unique_ptr<CSourceAnimData> CAnimSetLoader::LoadSAND(IInputStream& rSAND, C
// We only care about the transitions right now
auto pData = std::make_unique<CSourceAnimData>(pEntry);
uint16 Unknown = rSAND.ReadShort(); // probably version
[[maybe_unused]] const uint16 Unknown = rSAND.ReadUShort(); // probably version
ASSERT(Unknown == 0);
// Transitions
uint32 NumTransitions = rSAND.ReadLong();
const uint32 NumTransitions = rSAND.ReadULong();
for (uint32 TransitionIdx = 0; TransitionIdx < NumTransitions; TransitionIdx++)
{
[[maybe_unused]] const uint8 UnkByte = rSAND.ReadByte();
[[maybe_unused]] const uint8 UnkByte = rSAND.ReadUByte();
ASSERT(UnkByte == 0);
CSourceAnimData::STransition Transition;
@ -664,11 +675,11 @@ std::unique_ptr<CSourceAnimData> CAnimSetLoader::LoadSAND(IInputStream& rSAND, C
}
// Half Transitions
uint32 NumHalfTransitions = rSAND.ReadLong();
const uint32 NumHalfTransitions = rSAND.ReadULong();
for (uint32 HalfIdx = 0; HalfIdx < NumHalfTransitions; HalfIdx++)
{
[[maybe_unused]] const uint8 UnkByte = rSAND.ReadByte();
[[maybe_unused]] const uint8 UnkByte = rSAND.ReadUByte();
ASSERT(UnkByte == 0);
CSourceAnimData::SHalfTransition HalfTrans;