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