@@ -122,14 +122,14 @@ void CClientIFP::ReadIFPVersion2( bool anp3)
122122 pAnimationHierarchy->SetNumSequences ( AnimationNode.TotalObjects );
123123 pAnimationHierarchy->SetAnimationBlockID ( 0 );
124124
125- const unsigned short TotalSequences = IFP_TOTAL_SEQUENCES + pAnimationHierarchy->GetNumSequences ( );
125+ const unsigned short TotalSequences = cIFPSequences + pAnimationHierarchy->GetNumSequences ( );
126126 ifpAnimation.pSequencesMemory = ( char * ) operator new ( 12 * TotalSequences + 4 ); // Allocate memory for sequences ( 12 * seq_count + 4 )
127127
128128 pAnimationHierarchy->SetSequences ( reinterpret_cast < CAnimBlendSequenceSAInterface * > ( ifpAnimation.pSequencesMemory + 4 ) );
129129
130- std::map < std::string, _CAnimBlendSequence > MapOfSequences;
130+ std::map < std::string, CAnimBlendSequenceSAInterface > MapOfSequences;
131131
132- unsigned short TotalUnknownSequences = 0 ;
132+ WORD wUnknownSequences = 0 ;
133133
134134 bool bFirstSeq = true ;
135135 for (size_t SequenceIndex = 0 ; SequenceIndex < pAnimationHierarchy->GetNumSequences ( ); SequenceIndex++)
@@ -138,40 +138,18 @@ void CClientIFP::ReadIFPVersion2( bool anp3)
138138
139139 readBuffer < Object >(&ObjectNode);
140140
141- std::string BoneName = convertStringToMapKey (ObjectNode.Name );
142- std::string CorrectBoneName;
143-
144- bool bUnknownSequence = false ;
145- if (ObjectNode.BoneID == -1 )
146- {
147- ObjectNode.BoneID = getBoneIDFromName (BoneName);
148- if (ObjectNode.BoneID == -1 )
149- {
150- bUnknownSequence = true ;
151- }
141+ std::string strCorrectBoneName;
142+ ParseSequenceObject ( ObjectNode, strCorrectBoneName );
152143
153- CorrectBoneName = getCorrectBoneNameFromName (BoneName);
154- }
155- else
156- {
157- CorrectBoneName = getCorrectBoneNameFromID (ObjectNode.BoneID );
158- if (CorrectBoneName == " Unknown" )
159- {
160- CorrectBoneName = getCorrectBoneNameFromName (BoneName);
161- }
162- }
163-
164- memset (ObjectNode.Name , 0 , sizeof (Object::Name));
165- strncpy (ObjectNode.Name , CorrectBoneName.c_str (), CorrectBoneName.size () +1 );
166-
167-
168144 CAnimBlendSequenceSAInterface AnimationSequence;
169145 CAnimBlendSequenceSAInterface * pAnimationSequenceInterface = &AnimationSequence;
146+
147+ bool bUnknownSequence = ObjectNode.BoneID == -1 ;
170148 if (bUnknownSequence)
171149 {
172- size_t UnkownSequenceIndex = IFP_TOTAL_SEQUENCES + TotalUnknownSequences ;
150+ size_t UnkownSequenceIndex = cIFPSequences + wUnknownSequences ;
173151 pAnimationSequenceInterface = pAnimationHierarchy->GetSequence ( UnkownSequenceIndex );
174- TotalUnknownSequences ++;
152+ wUnknownSequences ++;
175153 }
176154
177155 std::unique_ptr < CAnimBlendSequence > pAnimationSequence = pAnimManager->GetCustomAnimBlendSequence ( pAnimationSequenceInterface );
@@ -225,36 +203,17 @@ void CClientIFP::ReadIFPVersion2( bool anp3)
225203
226204 if ( !bUnknownSequence )
227205 {
228- _CAnimBlendSequence * pAnimSequenceInterface = (_CAnimBlendSequence*)pAnimationSequence->GetInterface ();
229- MapOfSequences [ CorrectBoneName ] = (_CAnimBlendSequence)*pAnimSequenceInterface;
206+ MapOfSequences [ strCorrectBoneName ] = *pAnimationSequence->GetInterface ();
230207 }
231208 }
232209 }
233210
234- std::map < std::string, _CAnimBlendSequence >::iterator it;
235- for (size_t SequenceIndex = 0 ; SequenceIndex < IFP_TOTAL_SEQUENCES; SequenceIndex++)
236- {
237- std::string BoneName = BoneNames[SequenceIndex];
238- DWORD BoneID = BoneIds[SequenceIndex];
239-
240- CAnimBlendSequenceSAInterface * pAnimationSequenceInterface = pAnimationHierarchy->GetSequence ( SequenceIndex );
211+ CopySequencesWithDummies ( pAnimManager, pAnimationHierarchy, MapOfSequences );
241212
242- it = MapOfSequences.find (BoneName);
243- if (it != MapOfSequences.end ())
244- {
245- memcpy ( pAnimationSequenceInterface, &it->second , sizeof ( CAnimBlendSequenceSAInterface ) );
246- }
247- else
248- {
249- std::unique_ptr < CAnimBlendSequence > pAnimationSequence = pAnimManager->GetCustomAnimBlendSequence ( pAnimationSequenceInterface );
250- InsertAnimationDummySequence ( pAnimationSequence, BoneName, BoneID );
251- }
252- }
253-
254- *(DWORD *)ifpAnimation.pSequencesMemory = IFP_TOTAL_SEQUENCES + TotalUnknownSequences;
213+ *(DWORD *)ifpAnimation.pSequencesMemory = cIFPSequences + wUnknownSequences;
255214
256215 // This order is very important. As we need support for all 32 bones, we must change the total sequences count
257- pAnimationHierarchy->SetNumSequences ( IFP_TOTAL_SEQUENCES + TotalUnknownSequences );
216+ pAnimationHierarchy->SetNumSequences ( cIFPSequences + wUnknownSequences );
258217
259218 if ( !pAnimationHierarchy->isRunningCompressed ( ) )
260219 {
@@ -265,16 +224,39 @@ void CClientIFP::ReadIFPVersion2( bool anp3)
265224 }
266225}
267226
227+ void CClientIFP::CopySequencesWithDummies ( CAnimManager * pAnimManager, std::unique_ptr < CAnimBlendHierarchy > & pAnimationHierarchy, std::map < std::string, CAnimBlendSequenceSAInterface > & mapOfSequences )
228+ {
229+ std::map < std::string, CAnimBlendSequenceSAInterface >::iterator it;
230+ for (size_t SequenceIndex = 0 ; SequenceIndex < cIFPSequences; SequenceIndex++)
231+ {
232+ std::string BoneName = BoneNames[SequenceIndex];
233+ DWORD BoneID = BoneIds[SequenceIndex];
234+
235+ CAnimBlendSequenceSAInterface * pAnimationSequenceInterface = pAnimationHierarchy->GetSequence ( SequenceIndex );
236+
237+ it = mapOfSequences.find (BoneName);
238+ if (it != mapOfSequences.end ())
239+ {
240+ memcpy ( pAnimationSequenceInterface, &it->second , sizeof ( CAnimBlendSequenceSAInterface ) );
241+ }
242+ else
243+ {
244+ std::unique_ptr < CAnimBlendSequence > pAnimationSequence = pAnimManager->GetCustomAnimBlendSequence ( pAnimationSequenceInterface );
245+ InsertAnimationDummySequence ( pAnimationSequence, BoneName, BoneID );
246+ }
247+ }
248+ }
249+
268250void CClientIFP::ReadIFPVersion1 ( )
269251{
270252 /* uint32_t OffsetEOF;
271253
272254 readBuffer < uint32_t > ( &OffsetEOF );
273- ROUNDSIZE (OffsetEOF);
255+ RoundSize (OffsetEOF);
274256
275257 IFP_INFO Info;
276258 readBytes ( &Info, sizeof ( IFP_BASE ) );
277- ROUNDSIZE (Info.Base.Size);
259+ RoundSize (Info.Base.Size);
278260
279261 readBytes(&Info.Entries, Info.Base.Size);
280262
@@ -291,7 +273,7 @@ void CClientIFP::ReadIFPVersion1 ( )
291273
292274 IFP_NAME Name;
293275 readBuffer < IFP_NAME > ( &Name );
294- ROUNDSIZE ( Name.Base.Size );
276+ RoundSize ( Name.Base.Size );
295277
296278 char AnimationName [ 24 ];
297279 readCString (AnimationName, Name.Base.Size);
@@ -309,8 +291,8 @@ void CClientIFP::ReadIFPVersion1 ( )
309291
310292 IFP_DGAN Dgan;
311293 readBytes ( &Dgan, sizeof ( IFP_BASE ) * 2 );
312- ROUNDSIZE ( Dgan.Base.Size );
313- ROUNDSIZE ( Dgan.Info.Base.Size );
294+ RoundSize ( Dgan.Base.Size );
295+ RoundSize ( Dgan.Info.Base.Size );
314296
315297 //ofs << "going to read Dgan.Info.Entries | Dgan.Info.Base.Size : " << Dgan.Info.Base.Size << std::endl;
316298
@@ -322,23 +304,23 @@ void CClientIFP::ReadIFPVersion1 ( )
322304 pAnimHierarchy->m_nAnimBlockId = 0;
323305 pAnimHierarchy->field_B = 0;
324306
325- const unsigned short TotalSequences = IFP_TOTAL_SEQUENCES + pAnimHierarchy->m_nSeqCount;
307+ const unsigned short TotalSequences = cIFPSequences + pAnimHierarchy->m_nSeqCount;
326308 ifpAnimation.pSequencesMemory = ( char * ) operator new ( 12 * TotalSequences + 4 ); // Allocate memory for sequences ( 12 * seq_count + 4 )
327309
328310 pAnimHierarchy->m_pSequences = ( _CAnimBlendSequence * )( ifpAnimation.pSequencesMemory+ 4 );
329311
330312 std::map < std::string, _CAnimBlendSequence > MapOfSequences;
331313
332- unsigned short TotalUnknownSequences = 0;
314+ unsigned short wUnknownSequences = 0;
333315 for (size_t SequenceIndex = 0; SequenceIndex < pAnimHierarchy->m_nSeqCount; SequenceIndex++)
334316 {
335317 IFP_CPAN Cpan;
336318 readBuffer < IFP_CPAN > ( &Cpan );
337- ROUNDSIZE ( Cpan.Base.Size );
319+ RoundSize ( Cpan.Base.Size );
338320
339321 IFP_ANIM Anim;
340322 readBytes ( &Anim, sizeof ( IFP_BASE ) );
341- ROUNDSIZE ( Anim.Base.Size );
323+ RoundSize ( Anim.Base.Size );
342324
343325 readBytes ( &Anim.Name, Anim.Base.Size );
344326
@@ -381,7 +363,7 @@ void CClientIFP::ReadIFPVersion1 ( )
381363 _CAnimBlendSequence * pUnkownSequence = nullptr;
382364 if (bUnknownSequence)
383365 {
384- size_t UnkownSequenceIndex = IFP_TOTAL_SEQUENCES + TotalUnknownSequences ;
366+ size_t UnkownSequenceIndex = cIFPSequences + wUnknownSequences ;
385367 pUnkownSequence = (_CAnimBlendSequence*)((BYTE*)pAnimHierarchy->m_pSequences + (sizeof(_CAnimBlendSequence) * UnkownSequenceIndex));
386368
387369 _CAnimBlendSequence_Constructor ( pUnkownSequence );
@@ -390,7 +372,7 @@ void CClientIFP::ReadIFPVersion1 ( )
390372
391373 OLD__CAnimBlendSequence_SetBoneTag ( pUnkownSequence, BoneID );
392374
393- TotalUnknownSequences ++;
375+ wUnknownSequences ++;
394376 }
395377 else
396378 {
@@ -444,7 +426,7 @@ void CClientIFP::ReadIFPVersion1 ( )
444426 }
445427
446428 std::map < std::string, _CAnimBlendSequence >::iterator it;
447- for (size_t SequenceIndex = 0; SequenceIndex < IFP_TOTAL_SEQUENCES ; SequenceIndex++)
429+ for (size_t SequenceIndex = 0; SequenceIndex < cIFPSequences ; SequenceIndex++)
448430 {
449431 std::string BoneName = BoneNames[SequenceIndex];
450432 DWORD BoneID = BoneIds[SequenceIndex];
@@ -464,10 +446,10 @@ void CClientIFP::ReadIFPVersion1 ( )
464446 }
465447 }
466448
467- *(DWORD *)ifpAnimation.pSequencesMemory = IFP_TOTAL_SEQUENCES + TotalUnknownSequences ;
449+ *(DWORD *)ifpAnimation.pSequencesMemory = cIFPSequences + wUnknownSequences ;
468450
469451 // This order is very important. As we need support for all 32 bones, we must change the total sequences count
470- pAnimHierarchy->m_nSeqCount = IFP_TOTAL_SEQUENCES + TotalUnknownSequences ;
452+ pAnimHierarchy->m_nSeqCount = cIFPSequences + wUnknownSequences ;
471453
472454 //ofs << std::endl << std::endl;
473455
@@ -572,7 +554,7 @@ std::string CClientIFP::convertStringToMapKey (char * String)
572554 return ConvertedString;
573555}
574556
575- IFP_FrameType CClientIFP::getFrameTypeFromFourCC ( char * FourCC )
557+ CClientIFP:: IFP_FrameType CClientIFP::getFrameTypeFromFourCC ( char * FourCC )
576558{
577559 if (strncmp (FourCC, " KRTS" , 4 ) == 0 )
578560 {
@@ -1087,6 +1069,35 @@ std::string CClientIFP::getCorrectBoneNameFromName(std::string const& BoneName)
10871069 return BoneName;
10881070}
10891071
1072+ constexpr void CClientIFP::RoundSize ( uint32_t & u32Size )
1073+ {
1074+ if ( u32Size & 3 )
1075+ {
1076+ u32Size += 4 - ( u32Size & 3 );
1077+ }
1078+ }
1079+
1080+ void CClientIFP::ParseSequenceObject ( Object & ObjectNode, std::string & CorrectBoneName )
1081+ {
1082+ std::string BoneName = convertStringToMapKey ( ObjectNode.Name );
1083+
1084+ if (ObjectNode.BoneID == -1 )
1085+ {
1086+ ObjectNode.BoneID = getBoneIDFromName ( BoneName );
1087+ CorrectBoneName = getCorrectBoneNameFromName ( BoneName );
1088+ }
1089+ else
1090+ {
1091+ CorrectBoneName = getCorrectBoneNameFromID ( ObjectNode.BoneID );
1092+ if ( CorrectBoneName == " Unknown" )
1093+ {
1094+ CorrectBoneName = getCorrectBoneNameFromName ( BoneName );
1095+ }
1096+ }
1097+
1098+ strncpy ( ObjectNode.Name , CorrectBoneName.c_str (), CorrectBoneName.size () +1 );
1099+ }
1100+
10901101CAnimBlendHierarchySAInterface * CClientIFP::GetAnimationHierarchy ( const SString & strAnimationName )
10911102{
10921103 for ( auto it = m_pVecAnimations->begin (); it != m_pVecAnimations->end (); ++it )
0 commit comments