Open Source Tomb Raider Engine
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

tombraider.bfft 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. /*
  2. * tombraider.bfft - Tomb Raider 1 - 3 Level File Format Description
  3. * 2014, Thomas Buck <xythobuz@xythobuz.de>
  4. *
  5. * Based on the TR Rosetta Stone (http://www.tnlc.com/eep/tr/TRosettaStone.html)
  6. * Developed for Binspector (https://github.com/binspector/binspector)
  7. */
  8. struct face4_t {
  9. unsigned 16 little vertices[4];
  10. unsigned 16 little texture;
  11. }
  12. struct face3_t {
  13. unsigned 16 little vertices[3];
  14. unsigned 16 little texture;
  15. }
  16. struct vertex_t {
  17. signed 16 little x;
  18. signed 16 little y;
  19. signed 16 little z;
  20. summary "X: ", x, " Y: ", y, " Z: ", z;
  21. }
  22. struct room_vertex_t {
  23. vertex_t vertex;
  24. signed 16 little lighting1;
  25. if (TRversion > 1) {
  26. unsigned 16 little attributes;
  27. signed 16 little lighting2;
  28. }
  29. }
  30. struct room_sprite_t {
  31. signed 16 little vertex;
  32. signed 16 little texture;
  33. }
  34. struct room_door_t {
  35. unsigned 16 little adjoiningRoom;
  36. vertex_t normal;
  37. vertex_t vertices[4];
  38. summary "To: ", adjoiningRoom;
  39. }
  40. struct room_sector_t {
  41. unsigned 16 little floorDataIndex;
  42. unsigned 16 little boxIndex;
  43. unsigned 8 little roomBelow;
  44. signed 8 little floor;
  45. unsigned 8 little roomAbove;
  46. signed 8 little ceiling;
  47. summary "Be.: ", roomBelow, " Ab.: ", roomAbove;
  48. }
  49. struct room_light_t {
  50. signed 32 little x;
  51. signed 32 little y;
  52. signed 32 little z;
  53. unsigned 16 little intensity1;
  54. if (TRversion > 1)
  55. unsigned 16 little intensity2;
  56. unsigned 32 little fade1;
  57. if (TRversion > 1)
  58. unsigned 32 little fade2;
  59. summary "X: ", x, " Y: ", y, " Z: ", z;
  60. }
  61. struct room_mesh_t {
  62. unsigned 32 little x;
  63. unsigned 32 little y;
  64. unsigned 32 little z;
  65. unsigned 16 little rotation;
  66. unsigned 16 little intensity1;
  67. if (TRversion > 1)
  68. unsigned 16 little intensity2;
  69. unsigned 16 little objectID;
  70. summary "ID: ", objectID, " X: ", x, " Y: ", y, " Z: ", z;
  71. }
  72. struct room_t {
  73. // Room Header
  74. signed 32 little x;
  75. signed 32 little z;
  76. signed 32 little yBottom;
  77. signed 32 little yTop;
  78. unsigned 32 little numDataToFollow;
  79. unsigned 16 little numVertices;
  80. room_vertex_t vertices[numVertices];
  81. unsigned 16 little numRectangles;
  82. face4_t rectangles[numRectangles];
  83. unsigned 16 little numTriangles;
  84. face3_t triangles[numTriangles];
  85. unsigned 16 little numSprites;
  86. room_sprite_t sprites[numSprites];
  87. unsigned 16 little numDoors;
  88. room_door_t doors[numDoors];
  89. unsigned 16 little numZSector;
  90. unsigned 16 little numXSector;
  91. room_sector_t sectorData[numZSector * numXSector];
  92. signed 16 little intensity1;
  93. if (TRversion > 1)
  94. signed 16 little intensity2;
  95. if (TRversion == 2)
  96. signed 16 little lightMode;
  97. unsigned 16 little numLights;
  98. room_light_t lights[numLights];
  99. unsigned 16 little numStaticMeshes;
  100. room_mesh_t staticMeshes[numStaticMeshes];
  101. signed 16 little alternateRoom;
  102. unsigned 16 little flags;
  103. if (TRversion == 3)
  104. unsigned 24 little roomLightColor;
  105. summary "X: ", x, " Ybot: ", yBottom, " Ytop: ", yTop, " Z: ", z;
  106. }
  107. struct animation_t {
  108. unsigned 32 little frameOffset;
  109. unsigned 8 little frameRate;
  110. unsigned 8 little frameSize;
  111. unsigned 16 little stateID;
  112. skip unknown[8];
  113. unsigned 16 little frameStart;
  114. unsigned 16 little frameEnd;
  115. unsigned 16 little nextAnimation;
  116. unsigned 16 little nextFrame;
  117. unsigned 16 little numStateChanges;
  118. unsigned 16 little stateChangeOffset;
  119. unsigned 16 little numAnimCommands;
  120. unsigned 16 little animCommandOffset;
  121. summary "State: ", stateID, " To: ", nextAnimation, "-", nextFrame;
  122. }
  123. struct state_change_t {
  124. unsigned 16 little stateID;
  125. unsigned 16 little numAnimDispatches;
  126. unsigned 16 little animDispatchOffset;
  127. summary "State: ", stateID;
  128. }
  129. struct anim_dispatch_t {
  130. signed 16 little low;
  131. signed 16 little high;
  132. signed 16 little nextAnimation;
  133. signed 16 little nextFrame;
  134. summary low, "-", high, " To: ", nextAnimation, "-", nextFrame;
  135. }
  136. struct moveable_t {
  137. unsigned 32 little objectID;
  138. unsigned 16 little numMeshes;
  139. unsigned 16 little startingMesh;
  140. unsigned 32 little meshTree;
  141. unsigned 32 little frameOffset;
  142. unsigned 16 little animation;
  143. summary "ID: ", objectID, " Anim: ", animation;
  144. }
  145. struct static_mesh_t {
  146. unsigned 32 little objectID;
  147. unsigned 16 little mesh;
  148. vertex_t boundingBox[4];
  149. unsigned 16 little flags;
  150. summary "ID: ", objectID;
  151. }
  152. struct object_texture_vert_t {
  153. unsigned 8 little xCoordinate;
  154. unsigned 8 little xPixel;
  155. unsigned 8 little yCoordinate;
  156. unsigned 8 little yPixel;
  157. summary xCoordinate, "-", yCoordinate, ", ", xPixel, "-", yPixel;
  158. }
  159. struct object_texture_t {
  160. unsigned 16 little attribute;
  161. unsigned 16 little tile;
  162. object_texture_vert_t vertices[4];
  163. summary "Tile: ", tile;
  164. }
  165. struct sprite_texture_t {
  166. unsigned 16 little tile;
  167. unsigned 8 little x;
  168. unsigned 8 little y;
  169. unsigned 16 little width;
  170. unsigned 16 little height;
  171. signed 16 little leftSide;
  172. signed 16 little topSide;
  173. signed 16 little rightSide;
  174. signed 16 little bottomSide;
  175. summary x, "-", y, ", ", width, "-", height;
  176. }
  177. struct sprite_sequence_t {
  178. signed 32 little objectID;
  179. signed 16 little negativeLength;
  180. signed 16 little offset;
  181. summary "ID: ", objectID;
  182. }
  183. struct camera_t {
  184. signed 32 little x;
  185. signed 32 little y;
  186. signed 32 little z;
  187. signed 16 little room;
  188. unsigned 16 little unknown;
  189. summary "X: ", x, " Y: ", y, " Z: ", z;
  190. }
  191. struct sound_source_t {
  192. signed 32 little x;
  193. signed 32 little y;
  194. signed 32 little z;
  195. unsigned 16 little soundID;
  196. unsigned 16 little flags;
  197. summary "X: ", x, " Y: ", y, " Z: ", z;
  198. }
  199. struct box_t {
  200. if (TRversion > 1) {
  201. unsigned 8 little zMin;
  202. unsigned 8 little zMax;
  203. unsigned 8 little xMin;
  204. unsigned 8 little xMax;
  205. } else {
  206. signed 32 little zMin;
  207. signed 32 little zMax;
  208. signed 32 little xMin;
  209. signed 32 little xMax;
  210. }
  211. signed 16 little trueFloor;
  212. signed 16 little overlapIndex;
  213. summary "X: ", xMin, "-", xMax, " Z: ", zMin, "-", zMax;
  214. }
  215. struct item_t {
  216. signed 16 little objectID;
  217. signed 16 little room;
  218. signed 32 little x;
  219. signed 32 little y;
  220. signed 32 little z;
  221. signed 16 little angle;
  222. signed 16 little intensity1;
  223. if (TRversion > 1)
  224. signed 16 little intensity2;
  225. unsigned 16 little flags;
  226. summary "ID: ", objectID, " X: ", x, " Y: ", y, " Z: ", z;
  227. }
  228. struct cinematic_frame_t {
  229. signed 16 little rotY;
  230. signed 16 little rotZ;
  231. signed 16 little rotZ2;
  232. signed 16 little posZ;
  233. signed 16 little posY;
  234. signed 16 little posX;
  235. signed 16 little unknown;
  236. signed 16 little rotX;
  237. }
  238. struct sound_details_t {
  239. signed 16 little sample;
  240. signed 16 little volume;
  241. signed 16 little unknown1;
  242. signed 16 little unknown2;
  243. summary sample, " - ", volume;
  244. }
  245. struct main {
  246. unsigned 32 little version;
  247. if (version == 0x20) {
  248. notify "Tomb Raider 1 file detected...";
  249. const TRversion = 1;
  250. } else if (version == 0x2D) {
  251. notify "Tomb Raider 2 file detected...";
  252. const TRversion = 2;
  253. } else if ((version == 0xFF080038) || (version == 0xFF180038)) {
  254. notify "Tomb Raider 3 file detected...";
  255. const TRversion = 3;
  256. } else if ((version == 0xFFFFFFF0) || (version == 0x00345254)) {
  257. die "Tomb Raider 4 file detected but not supported!";
  258. } else {
  259. die "Unknown version number found!";
  260. }
  261. if (TRversion > 1)
  262. skip palettes[256 * 7];
  263. unsigned 32 little numTextiles;
  264. skip textiles[256 * 256 * numTextiles];
  265. if (TRversion > 1)
  266. skip textiles16[256 * 256 * numTextiles * 2];
  267. unsigned 32 little unused;
  268. unsigned 16 little numRooms;
  269. room_t rooms[numRooms];
  270. unsigned 32 little numFloorData;
  271. skip floorData[numFloorData * 2];
  272. unsigned 32 little numMeshData;
  273. skip meshData[numMeshData * 2];
  274. unsigned 32 little numMeshPointers;
  275. unsigned 32 little meshPointers[numMeshPointers];
  276. unsigned 32 little numAnimations;
  277. animation_t animations[numAnimations];
  278. unsigned 32 little numStateChanges;
  279. state_change_t stateChanges[numStateChanges];
  280. unsigned 32 little numAnimDispatches;
  281. anim_dispatch_t animDispatches[numAnimDispatches];
  282. unsigned 32 little numAnimCommands;
  283. signed 16 little animCommands[numAnimCommands];
  284. unsigned 32 little numMeshTrees;
  285. signed 32 little meshTrees[numMeshTrees];
  286. unsigned 32 little numFrames;
  287. skip frames[numFrames * 2];
  288. unsigned 32 little numMoveables;
  289. moveable_t moveables[numMoveables];
  290. unsigned 32 little numStaticMeshes;
  291. static_mesh_t staticMeshes[numStaticMeshes];
  292. if (TRversion < 3) {
  293. unsigned 32 little numObjectTextures;
  294. object_texture_t objectTextures[numObjectTextures];
  295. }
  296. unsigned 32 little numSpriteTextures;
  297. sprite_texture_t spriteTextures[numSpriteTextures];
  298. unsigned 32 little numSpriteSequences;
  299. sprite_sequence_t spriteSequences[numSpriteSequences];
  300. unsigned 32 little numCameras;
  301. camera_t cameras[numCameras];
  302. unsigned 32 little numSoundSources;
  303. sound_source_t soundSources[numSoundSources];
  304. unsigned 32 little numBoxes;
  305. box_t boxes[numBoxes];
  306. unsigned 32 little numOverlaps;
  307. skip overlaps[numOverlaps * 2];
  308. if (TRversion > 1)
  309. skip zones[numBoxes * 10 * 2];
  310. else
  311. skip zones[numBoxes * 6 * 2];
  312. unsigned 32 little numAnimatedTextures;
  313. skip animatedTextures[numAnimatedTextures * 2];
  314. if (TRversion == 3) {
  315. unsigned 32 little numObjectTextures;
  316. object_texture_t objectTextures[numObjectTextures];
  317. }
  318. unsigned 32 little numItems;
  319. item_t items[numItems];
  320. skip lightMap[32 * 256];
  321. if (TRversion == 1)
  322. skip palette[256 * 3];
  323. unsigned 16 little numCinematicFrames;
  324. cinematic_frame_t cinematicFrames[numCinematicFrames];
  325. unsigned 16 little numDemoData;
  326. skip demoData[numDemoData];
  327. if (TRversion > 1)
  328. skip soundMap[370 * 2];
  329. else
  330. skip soundMap[256 * 2];
  331. unsigned 32 little numSoundDetails;
  332. sound_details_t soundDetails[numSoundDetails];
  333. if (TRversion == 1) {
  334. unsigned 32 little numSamples;
  335. skip samples[numSamples];
  336. }
  337. unsigned 32 little numSampleIndices;
  338. skip sampleIndices[numSampleIndices * 4];
  339. }