Clone of PhatAC @ https://github.com/floaterxk/PhatAC

TurbineAnimationSet.cpp 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #include "StdAfx.h"
  2. #include "TurbineAnimationSet.h"
  3. TurbineAnimationSet::TurbineAnimationSet(DWORD dwID) : TurbineObject(dwID)
  4. {
  5. }
  6. TurbineAnimationSet::~TurbineAnimationSet()
  7. {
  8. }
  9. void TurbineAnimationSet::Initialize(BYTE *pbData, DWORD dwLength)
  10. {
  11. BYTE* pbGoodEnd = pbData + dwLength;
  12. DWORD dwFileID = *((DWORD *)pbData);
  13. pbData += sizeof(DWORD);
  14. pbData = InitializeCombatStances(pbData);
  15. pbData = InitializeAnimations(pbData);
  16. pbData = InitializeSequences(pbData);
  17. OutputDebugString(csprintf("GoodEnd: %08X Result: %08X\r\n", pbGoodEnd, pbData));
  18. }
  19. BYTE* TurbineAnimationSet::InitializeCombatStances(BYTE *pbData)
  20. {
  21. WORD wDefaultIndex = *((WORD *)pbData); pbData += 2;
  22. WORD wDefaultSeq = *((WORD *)pbData); pbData += 2;
  23. m_csDefault = CombatStance(wDefaultIndex, wDefaultSeq);
  24. DWORD dwStanceCount = *((DWORD *)pbData); pbData += 4;
  25. for (unsigned int i = 0; i < dwStanceCount; i++)
  26. {
  27. WORD wStanceIndex = *((WORD *)pbData); pbData += 2;
  28. WORD wStanceSeq = *((WORD *)pbData); pbData += 2;
  29. DWORD dwType = *((DWORD *)pbData); pbData += 4;
  30. m_mCombatStances[wStanceIndex] = CombatStance(wStanceIndex, wStanceSeq, dwType);
  31. }
  32. OutputDebugString(csprintf("EndS: %08X\r\n", pbData));
  33. return pbData;
  34. }
  35. BYTE* TurbineAnimationSet::InitializeAnimations(BYTE *pbData)
  36. {
  37. DWORD dwAnimCount = *((DWORD *)pbData); pbData += 4;
  38. for (unsigned int i = 0; i < dwAnimCount; i++)
  39. {
  40. WORD wIndex = *((WORD *)pbData); pbData += 2;
  41. WORD wStance = *((WORD *)pbData); pbData += 2;
  42. DWORD dwFlags = *((DWORD *)pbData); pbData += 4;
  43. DWORD dwAnimID = *((DWORD *)pbData); pbData += 4;
  44. DWORD dwStartFrame = *((DWORD *)pbData); pbData += 4;
  45. DWORD dwEndFrame = *((DWORD *)pbData); pbData += 4;
  46. float fSpeed = *((float *)pbData); pbData += 4;
  47. Vector vTranslate(0, 0, 0), vRotate(0, 0, 0);
  48. if (dwFlags & 0x10000) {
  49. vTranslate.x = *((float *)pbData); pbData += 4;
  50. vTranslate.y = *((float *)pbData); pbData += 4;
  51. vTranslate.z = *((float *)pbData); pbData += 4;
  52. }
  53. if (dwFlags & 0x20000) {
  54. vRotate.x = *((float *)pbData); pbData += 4;
  55. vRotate.y = *((float *)pbData); pbData += 4;
  56. vRotate.z = *((float *)pbData); pbData += 4;
  57. }
  58. m_mAnimations[wStance][wIndex] = AnimationEntry(dwAnimID, dwStartFrame, dwEndFrame, fSpeed, vTranslate, vRotate);
  59. }
  60. OutputDebugString(csprintf("End1: %08X\r\n", pbData));
  61. //Pivot Rotations? 100% guess.
  62. DWORD dwPivotCount = *((DWORD *)pbData); pbData += 4;
  63. for (unsigned int i = 0; i < dwPivotCount; i++)
  64. {
  65. WORD wIndex = *((WORD *)pbData); pbData += 2;
  66. WORD wStance = *((WORD *)pbData); pbData += 2;
  67. DWORD dwFlags = *((DWORD *)pbData); pbData += 4;
  68. Vector vTranslate(0, 0, 0), vRotate(0, 0, 0);
  69. if (dwFlags & 0x10000) {
  70. vTranslate.x = *((float *)pbData); pbData += 4;
  71. vTranslate.y = *((float *)pbData); pbData += 4;
  72. vTranslate.z = *((float *)pbData); pbData += 4;
  73. }
  74. if (dwFlags & 0x20000) {
  75. vRotate.x = *((float *)pbData); pbData += 4;
  76. vRotate.y = *((float *)pbData); pbData += 4;
  77. vRotate.z = *((float *)pbData); pbData += 4;
  78. }
  79. m_mPivotMotions[wStance][wIndex] = PivotMotionEntry(vTranslate, vRotate);
  80. }
  81. OutputDebugString(csprintf("End2: %08X\r\n", pbData));
  82. return pbData;
  83. }
  84. BYTE* TurbineAnimationSet::InitializeSequences(BYTE *pbData)
  85. {
  86. DWORD dwSequenceCount = *((DWORD *)pbData); pbData += 4;
  87. OutputDebugString(csprintf("SequenceCount: %08X\r\n", dwSequenceCount));
  88. for (unsigned int i = 0; i < dwSequenceCount; i++)
  89. {
  90. WORD wIndex = *((WORD *)pbData); pbData += 2;
  91. WORD wStance = *((WORD *)pbData); pbData += 2;
  92. DWORD dwTypes = *((DWORD *)pbData); pbData += 4;
  93. for (unsigned int j = 0; j < dwTypes; j++)
  94. {
  95. DWORD dwType = *((DWORD *)pbData); pbData += 4;
  96. DWORD dwNumAnims = *((DWORD *)pbData); pbData += 4;
  97. AnimationSequence& lSequence = m_mSequences[wStance][wIndex][dwType];
  98. lSequence.resize(dwNumAnims);
  99. for (unsigned int k = 0; k < dwNumAnims; k++)
  100. {
  101. DWORD dwAnimID = *((DWORD *)pbData); pbData += 4;
  102. DWORD dwStartFrame = *((DWORD *)pbData); pbData += 4;
  103. DWORD dwEndFrame = *((DWORD *)pbData); pbData += 4;
  104. float fSpeed = *((float *)pbData); pbData += 4;
  105. lSequence.push_back(AnimationEntry(dwAnimID, dwStartFrame, dwEndFrame, fSpeed));
  106. }
  107. }
  108. }
  109. OutputDebugString(csprintf("End3: %08X\r\n", pbData));
  110. return pbData;
  111. }
  112. AnimationEntry* TurbineAnimationSet::LookupAnimation(WORD wStance, WORD wIndex)
  113. {
  114. LOG(Temp, Normal, "LookupAnimation %04X %04X", wStance, wIndex);
  115. AnimationMap::iterator i = m_mAnimations.find(wStance);
  116. if (i == m_mAnimations.end())
  117. return NULL;
  118. std::map< WORD, AnimationEntry >::iterator j = i->second.find(wIndex);
  119. if (j == i->second.end())
  120. return NULL;
  121. return &j->second;
  122. }