home *** CD-ROM | disk | FTP | other *** search
/ Xentax forum attachments archive / xentax.7z / 17316 / bdo.7z / bdo.hsl
Encoding:
Text File  |  2020-01-10  |  5.2 KB  |  197 lines

  1.  
  2. // Black Desert Online file structure definition
  3. // Copyright 2020 TNT
  4.  
  5. // Released under CC Attribution 4.0 license
  6. // https://creativecommons.org/licenses/by/4.0/
  7.  
  8.  
  9. #include "standard-types.hsl"
  10. #pragma maxarray(65536)
  11.  
  12. #pragma enumsize(2)
  13. #pragma enumsign("unsigned")
  14. typedef enum BDO_FILETYPE
  15. {
  16.     BDO_FT_UNKNOWN = 0,
  17.     BDO_MODEL_FILE_PAC = 259,
  18.     BDO_ANIMATION_FILE_PAA = 514,
  19.     BDO_SKELETON_FILE_PAB = 769,
  20. } BDO_FILETYPE;
  21.  
  22. typedef struct BDO_ANIMATION_BONE_SCALE_KEYFRAME
  23. {
  24.     halffloat hfScaleKeyframe;
  25.     halffloat hfScaleX;
  26.     halffloat hfScaleY;
  27.     halffloat hfScaleZ;
  28. } BDO_ANIM_BONE_SCALE_KF;
  29.  
  30. typedef struct BDO_ANIMATION_BONE_ROTATION_KEYFRAME
  31. {
  32.     halffloat hfRotationKeyframe;
  33.     halffloat hfRotationX;
  34.     halffloat hfRotationY;
  35.     halffloat hfRotationZ;
  36.     halffloat hfRotationW;
  37. } BDO_ANIM_BONE_ROTATION_KF;
  38.  
  39. typedef struct BDO_ANIMATION_BONE_TRANSLATION_KEYFRAME
  40. {
  41.     halffloat hfTranslationKeyframe;
  42.     halffloat hfTranslationX;
  43.     halffloat hfTranslationY;
  44.     halffloat hfTranslationZ;
  45. } BDO_ANIM_BONE_POS_KF;
  46.  
  47. typedef struct BDO_ANIMATION_BONE
  48. {
  49.     DWORD dwBoneHash;
  50.     USHORT uwKeyframeScaleCount;
  51.     struct BDO_ANIMATION_BONE_SCALE_KEYFRAME sScalingKeyframes[uwKeyframeScaleCount];
  52.     USHORT uwKeyframeRotationCount;
  53.     struct BDO_ANIMATION_BONE_ROTATION_KEYFRAME sRotationKeyframes[uwKeyframeRotationCount];
  54.     USHORT uwKeyframeTranslationCount;
  55.     struct BDO_ANIMATION_BONE_TRANSLATION_KEYFRAME sTranslationKeyframes[uwKeyframeTranslationCount];
  56. } BDO_ANIM_BONE;
  57.  
  58. typedef struct BDO_SKELE_BONE_QUATERNION
  59. {
  60.     FLOAT x;
  61.     FLOAT y;
  62.     FLOAT z;
  63.     FLOAT w;
  64. } BDO_QUAT;
  65.  
  66. typedef struct BDO_SKELE_BONE_MATRIX
  67. {
  68.     BDO_QUAT row1;
  69.     BDO_QUAT row2;
  70.     BDO_QUAT row3;
  71.     BDO_QUAT row4;
  72. } BDO_MATRIX;
  73.  
  74. typedef struct BDO_SKELE_BONE_DEFINITION
  75. {
  76.     DWORD dwBoneHash;
  77.     UBYTE ubBoneNameLen;
  78.     CHAR cBoneName[ubBoneNameLen];
  79.     LONG dwBoneParent;
  80.     BDO_MATRIX mBoneMatrix;
  81.     BDO_MATRIX mBoneMatrixInverse;
  82.     BDO_MATRIX mBoneLocalMatrix;
  83.     BDO_MATRIX mBoneLocalMatrixInverse;
  84.     FLOAT fBoneScaleX;
  85.     FLOAT fBoneScaleY;
  86.     FLOAT fBoneScaleZ;
  87.     FLOAT fBoneRotQuatX;
  88.     FLOAT fBoneRotQuatY;
  89.     FLOAT fBoneRotQuatZ;
  90.     FLOAT fBoneRotQuatW;
  91.     FLOAT fBonePositionW;
  92.     FLOAT fBonePositionY;
  93.     FLOAT fBonePositionZ;
  94.     halffloat hfNoise1;
  95. } BDO_SKELE_BONE;
  96.  
  97. typedef struct BDO_HEADER {
  98.     DWORD dwMagic;
  99.     BDO_FILETYPE uwVersion;
  100.     
  101.     __verify(dwMagic == 0x20524150);
  102.     
  103.     switch (uwVersion)
  104.     {
  105.         case BDO_MODEL_FILE_PAC:
  106.             BYTE bNoise1[10];
  107.             UBYTE ubBoneCount;
  108.             DWORD dwBoneHash[ubBoneCount];
  109.             //UBYTE ubUsedBoneCount;
  110.             //UBYTE ubUsedBones[ubUsedBoneCount];
  111.             //DWORD dwTotalVertices;
  112.             //DWORD dwTotalFaces;
  113.             //USHORT usMeshCount;
  114.  
  115.             break;
  116.         
  117.         case BDO_ANIMATION_FILE_PAA:
  118.             BYTE bNoise1[10];
  119.             USHORT ubBoneCount;
  120.             FLOAT fDuration;
  121.             DWORD wMiscCount;
  122.             struct BDO_ANIMATION_BONE sBones[ubBoneCount];
  123.             break;
  124.         
  125.         case BDO_SKELETON_FILE_PAB:
  126.             BYTE bNoise1[10];
  127.             USHORT ubBoneCount;
  128.             struct BDO_SKELE_BONE_DEFINITION sBones[ubBoneCount];
  129.             break;
  130.         
  131.         default:
  132.             break;
  133.     };
  134. } BDO_HEADER;
  135.  
  136. typedef struct BDO_MODEL_USEDBONES {
  137.     UBYTE ubBoneCount;
  138.     UBYTE ubUsedBones[ubBoneCount];
  139. } BDO_MODEL_USEDBONES;
  140.  
  141. typedef struct BDO_MODEL_MESHINFO {
  142.     DWORD dwTotalVertices;
  143.     DWORD dwTotalFaces;
  144.     USHORT usMeshCount;
  145.     UBYTE ubMeshNameLen;
  146. } BDO_MODEL_MESHINFO;
  147.  
  148.  
  149.  
  150. function ParseBDO
  151. {
  152.     // Move to beginning
  153.     __setCaretPos(0);
  154.     
  155.     UWord uwVersion = __getUWordAt(4);
  156.     UQWord pos = 0;
  157.     
  158.     pos = __addStructureAt(0, "BDO_HEADER", "");
  159.     
  160.     __setCaretPos(16);
  161.     
  162.     switch (uwVersion)
  163.     {
  164.         case 259:   // pac ? 0x0103
  165.             // Model file
  166.             // For whatever reason, my version of Hex Workshop doesn't align the bytes correctly when parsing the file in the
  167.             // struct definition above, so I wrote spaghetti code here to get around said hiccup.
  168.             UByte ubBoneCount = __getUByteAt(16);
  169.             __setCaretPos(17);
  170.             for (UByte u = 0; u < ubBoneCount; u++)
  171.             {
  172.                 __setCaretPos(__getCaretPos() + 4);
  173.             };
  174.             pos = __addStructureAt(__getCaretPos(), "BDO_MODEL_USEDBONES", "");
  175.             UByte ubUsedBoneCount = __getUByteAt(__getCaretPos());
  176.             __setCaretPos(__getCaretPos() + 1);
  177.             for (u = 0; u < ubUsedBoneCount; u++)
  178.             {
  179.                 __setCaretPos(__getCaretPos() + 1);
  180.             };
  181.             pos = __addStructureAt(__getCaretPos(), "BDO_MODEL_MESHINFO", "");
  182.             __setCaretPos(__getCaretPos() + 16);
  183.             break;
  184.         
  185.         case 514:    // paa ? 0x0202
  186.             // Animation file, no additional work needed here
  187.             break;
  188.         
  189.         case 769:   // pab ? 0x0301
  190.             // Skeleton file, no additional work needed here
  191.             break;
  192.         
  193.         default:
  194.             break;
  195.     };
  196. };
  197.