Open Source Tomb Raider Engine
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

tombraider.bfft 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  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. // ########## General data structures ##########
  9. // Rectangular faces
  10. struct face4_t {
  11. // These are indices into the appropriate vertex list
  12. unsigned 16 little vertices[4];
  13. /*
  14. * Index into the object texture list (for textured objects)
  15. * or into the 8 or 16bit palette (for colored object).
  16. * When coloring is used, texture contains two indices:
  17. * (texture & 0x00FF) = index into 8bit palette
  18. * ((texture & 0xFF00) >> 8) = index into 16bit palette
  19. */
  20. unsigned 16 little texture;
  21. summary vertices[0], " - ", vertices[1], " - ", vertices[2], " - ", vertices[3];
  22. }
  23. // Triangular faces
  24. struct face3_t {
  25. // See face4_t for a description of the elements
  26. unsigned 16 little vertices[3];
  27. unsigned 16 little texture;
  28. summary vertices[0], " - ", vertices[1], " - ", vertices[2];
  29. }
  30. struct vertex_t {
  31. // These coordinates are relative!
  32. signed 16 little x;
  33. signed 16 little y;
  34. signed 16 little z;
  35. summary "X: ", x, " Y: ", y, " Z: ", z;
  36. }
  37. // ########## Room data structures ##########
  38. struct room_vertex_t {
  39. /*
  40. * Position of this vertex, relative to the x/z coordinates
  41. * of the room this vertex is a part of.
  42. */
  43. vertex_t vertex;
  44. /*
  45. * Room lighting is internal vertex lighting, except for except
  46. * for necessarily external sources like flares.
  47. * Room ambient lights and point sources are ignored.
  48. */
  49. signed 16 little lighting1;
  50. // TR1 lacks these attributes
  51. if (TRversion > 1) {
  52. /*
  53. * A set of flags for special rendering effects:
  54. * 0x8000 - Has something to do with water surfaces
  55. * 0x4000 - Underwater lighting modulation and movement,
  56. * if viewed from above the water surface.
  57. * 0x2000 - Water/Quicksand surface movement
  58. * 0x0010 - Normal
  59. */
  60. unsigned 16 little attributes;
  61. // Almost always equal to lighting1
  62. signed 16 little lighting2;
  63. }
  64. summary summaryof(vertex);
  65. }
  66. struct room_sprite_t {
  67. // Index into the vertex list of the current room
  68. signed 16 little vertex;
  69. // Index into the sprite texture list
  70. signed 16 little texture;
  71. summary vertex, "-", texture;
  72. }
  73. struct room_door_t {
  74. // Which room this portal leads to
  75. unsigned 16 little adjoiningRoom;
  76. /*
  77. * Which way the portal faces (points away from adjacent room,
  78. * to be seen though it must point toward the viewpoint)
  79. */
  80. vertex_t normal;
  81. // The corners of this portal (right-hand rule applies wrt normal)
  82. vertex_t vertices[4];
  83. summary "To: ", adjoiningRoom;
  84. }
  85. struct room_sector_t {
  86. unsigned 16 little floorDataIndex;
  87. unsigned 16 little boxIndex;
  88. unsigned 8 little roomBelow;
  89. signed 8 little floor;
  90. unsigned 8 little roomAbove;
  91. signed 8 little ceiling;
  92. summary "Be.: ", roomBelow, " Ab.: ", roomAbove;
  93. }
  94. struct room_light_t {
  95. signed 32 little x;
  96. signed 32 little y;
  97. signed 32 little z;
  98. unsigned 16 little intensity1;
  99. if (TRversion > 1)
  100. unsigned 16 little intensity2;
  101. unsigned 32 little fade1;
  102. if (TRversion > 1)
  103. unsigned 32 little fade2;
  104. summary "X: ", x, " Y: ", y, " Z: ", z;
  105. }
  106. struct room_mesh_t {
  107. unsigned 32 little x;
  108. unsigned 32 little y;
  109. unsigned 32 little z;
  110. unsigned 16 little rotation;
  111. unsigned 16 little intensity1;
  112. if (TRversion > 1)
  113. unsigned 16 little intensity2;
  114. unsigned 16 little objectID;
  115. summary "ID: ", objectID, " X: ", x, " Y: ", y, " Z: ", z;
  116. }
  117. struct room_t {
  118. // Room Header
  119. signed 32 little x;
  120. signed 32 little z;
  121. signed 32 little yBottom;
  122. signed 32 little yTop;
  123. unsigned 32 little numDataToFollow;
  124. unsigned 16 little numVertices;
  125. room_vertex_t vertices[numVertices];
  126. unsigned 16 little numRectangles;
  127. face4_t rectangles[numRectangles];
  128. unsigned 16 little numTriangles;
  129. face3_t triangles[numTriangles];
  130. unsigned 16 little numSprites;
  131. room_sprite_t sprites[numSprites];
  132. unsigned 16 little numDoors;
  133. room_door_t doors[numDoors];
  134. unsigned 16 little numZSector;
  135. unsigned 16 little numXSector;
  136. room_sector_t sectorData[numZSector * numXSector];
  137. signed 16 little intensity1;
  138. if (TRversion > 1)
  139. signed 16 little intensity2;
  140. if (TRversion == 2)
  141. signed 16 little lightMode;
  142. unsigned 16 little numLights;
  143. room_light_t lights[numLights];
  144. unsigned 16 little numStaticMeshes;
  145. room_mesh_t staticMeshes[numStaticMeshes];
  146. signed 16 little alternateRoom;
  147. unsigned 16 little flags;
  148. if (TRversion == 3)
  149. unsigned 24 little roomLightColor;
  150. summary "X: ", x, " Ybot: ", yBottom, " Ytop: ", yTop, " Z: ", z;
  151. }
  152. // ########## Actor data structures ##########
  153. struct animation_t {
  154. unsigned 32 little frameOffset;
  155. unsigned 8 little frameRate;
  156. unsigned 8 little frameSize;
  157. unsigned 16 little stateID;
  158. skip unknown[8];
  159. unsigned 16 little frameStart;
  160. unsigned 16 little frameEnd;
  161. unsigned 16 little nextAnimation;
  162. unsigned 16 little nextFrame;
  163. unsigned 16 little numStateChanges;
  164. unsigned 16 little stateChangeOffset;
  165. unsigned 16 little numAnimCommands;
  166. unsigned 16 little animCommandOffset;
  167. summary "State: ", stateID, " To: ", nextAnimation, "-", nextFrame;
  168. }
  169. struct state_change_t {
  170. unsigned 16 little stateID;
  171. unsigned 16 little numAnimDispatches;
  172. unsigned 16 little animDispatchOffset;
  173. summary "State: ", stateID;
  174. }
  175. struct anim_dispatch_t {
  176. signed 16 little low;
  177. signed 16 little high;
  178. signed 16 little nextAnimation;
  179. signed 16 little nextFrame;
  180. summary low, "-", high, " To: ", nextAnimation, "-", nextFrame;
  181. }
  182. struct moveable_t {
  183. unsigned 32 little objectID;
  184. unsigned 16 little numMeshes;
  185. unsigned 16 little startingMesh;
  186. unsigned 32 little meshTree;
  187. unsigned 32 little frameOffset;
  188. unsigned 16 little animation;
  189. summary "ID: ", objectID, " Anim: ", animation;
  190. }
  191. // ########## Other data structures ##########
  192. struct static_mesh_t {
  193. unsigned 32 little objectID;
  194. unsigned 16 little mesh;
  195. vertex_t boundingBox[4];
  196. unsigned 16 little flags;
  197. summary "ID: ", objectID;
  198. }
  199. struct object_texture_vert_t {
  200. unsigned 8 little xCoordinate;
  201. unsigned 8 little xPixel;
  202. unsigned 8 little yCoordinate;
  203. unsigned 8 little yPixel;
  204. summary xCoordinate, "-", yCoordinate, ", ", xPixel, "-", yPixel;
  205. }
  206. struct object_texture_t {
  207. unsigned 16 little attribute;
  208. unsigned 16 little tile;
  209. object_texture_vert_t vertices[4];
  210. summary "Tile: ", tile;
  211. }
  212. struct sprite_texture_t {
  213. unsigned 16 little tile;
  214. unsigned 8 little x;
  215. unsigned 8 little y;
  216. unsigned 16 little width;
  217. unsigned 16 little height;
  218. signed 16 little leftSide;
  219. signed 16 little topSide;
  220. signed 16 little rightSide;
  221. signed 16 little bottomSide;
  222. summary x, "-", y, ", ", width, "-", height;
  223. }
  224. struct sprite_sequence_t {
  225. signed 32 little objectID;
  226. signed 16 little negativeLength;
  227. signed 16 little offset;
  228. summary "ID: ", objectID;
  229. }
  230. struct camera_t {
  231. signed 32 little x;
  232. signed 32 little y;
  233. signed 32 little z;
  234. signed 16 little room;
  235. unsigned 16 little unknown;
  236. summary "X: ", x, " Y: ", y, " Z: ", z;
  237. }
  238. struct sound_source_t {
  239. signed 32 little x;
  240. signed 32 little y;
  241. signed 32 little z;
  242. unsigned 16 little soundID;
  243. unsigned 16 little flags;
  244. summary "X: ", x, " Y: ", y, " Z: ", z;
  245. }
  246. struct box_t {
  247. if (TRversion > 1) {
  248. /*
  249. * In TR2 & TR3, these values are based on sectors,
  250. * so they need to be scaled (* 1024 units)
  251. */
  252. unsigned 8 little zMin;
  253. unsigned 8 little zMax;
  254. unsigned 8 little xMin;
  255. unsigned 8 little xMax;
  256. } else {
  257. // In TR1 there is no scaling
  258. signed 32 little zMin;
  259. signed 32 little zMax;
  260. signed 32 little xMin;
  261. signed 32 little xMax;
  262. }
  263. // Y value (no scaling)
  264. signed 16 little trueFloor;
  265. /*
  266. * Index into overlaps. The high bit is sometimes set,
  267. * this occurs in front of swinging doors and the like
  268. */
  269. signed 16 little overlapIndex;
  270. summary "X: ", xMin, "-", xMax, " Z: ", zMin, "-", zMax;
  271. }
  272. struct item_t {
  273. signed 16 little objectID;
  274. signed 16 little room;
  275. signed 32 little x;
  276. signed 32 little y;
  277. signed 32 little z;
  278. signed 16 little angle;
  279. signed 16 little intensity1;
  280. if (TRversion > 1)
  281. signed 16 little intensity2;
  282. unsigned 16 little flags;
  283. summary "ID: ", objectID, " X: ", x, " Y: ", y, " Z: ", z;
  284. }
  285. struct cinematic_frame_t {
  286. signed 16 little rotY;
  287. signed 16 little rotZ;
  288. signed 16 little rotZ2;
  289. signed 16 little posZ;
  290. signed 16 little posY;
  291. signed 16 little posX;
  292. signed 16 little unknown;
  293. signed 16 little rotX;
  294. }
  295. struct sound_details_t {
  296. signed 16 little sample;
  297. signed 16 little volume;
  298. signed 16 little unknown1;
  299. signed 16 little unknown2;
  300. summary "Sample: ", sample, ", Vol: ", volume * 100 / 32767, "%";
  301. }
  302. // ########## Main file layout ##########
  303. struct main {
  304. unsigned 32 little version;
  305. if (version == 0x20) {
  306. notify "Tomb Raider 1 file detected...";
  307. const TRversion = 1;
  308. } else if (version == 0x2D) {
  309. notify "Tomb Raider 2 file detected...";
  310. const TRversion = 2;
  311. } else if ((version == 0xFF080038) || (version == 0xFF180038)) {
  312. notify "Tomb Raider 3 file detected...";
  313. const TRversion = 3;
  314. } else if ((version == 0xFFFFFFF0) || (version == 0x00345254)) {
  315. die "Tomb Raider 4 file detected but not supported!";
  316. } else {
  317. die "Unknown version number found!";
  318. }
  319. // TR2 & TR3 have their 8 & 16bit palettes here
  320. if (TRversion > 1)
  321. skip palettes[256 * 7];
  322. // 8bit textures
  323. unsigned 32 little numTextiles;
  324. skip textiles[256 * 256 * numTextiles];
  325. // TR1 does not have any 16bit textures
  326. if (TRversion > 1)
  327. skip textiles16[256 * 256 * numTextiles * 2];
  328. unsigned 32 little unused;
  329. unsigned 16 little numRooms;
  330. room_t rooms[numRooms];
  331. unsigned 32 little numFloorData;
  332. skip floorData[numFloorData * 2];
  333. unsigned 32 little numMeshData;
  334. skip meshData[numMeshData * 2];
  335. unsigned 32 little numMeshPointers;
  336. unsigned 32 little meshPointers[numMeshPointers];
  337. unsigned 32 little numAnimations;
  338. animation_t animations[numAnimations];
  339. unsigned 32 little numStateChanges;
  340. state_change_t stateChanges[numStateChanges];
  341. unsigned 32 little numAnimDispatches;
  342. anim_dispatch_t animDispatches[numAnimDispatches];
  343. unsigned 32 little numAnimCommands;
  344. signed 16 little animCommands[numAnimCommands];
  345. unsigned 32 little numMeshTrees;
  346. signed 32 little meshTrees[numMeshTrees];
  347. unsigned 32 little numFrames;
  348. skip frames[numFrames * 2];
  349. unsigned 32 little numMoveables;
  350. moveable_t moveables[numMoveables];
  351. unsigned 32 little numStaticMeshes;
  352. static_mesh_t staticMeshes[numStaticMeshes];
  353. // TR1 & TR2 have their object textures placed here
  354. if (TRversion < 3) {
  355. unsigned 32 little numObjectTextures;
  356. object_texture_t objectTextures[numObjectTextures];
  357. }
  358. unsigned 32 little numSpriteTextures;
  359. sprite_texture_t spriteTextures[numSpriteTextures];
  360. unsigned 32 little numSpriteSequences;
  361. sprite_sequence_t spriteSequences[numSpriteSequences];
  362. unsigned 32 little numCameras;
  363. camera_t cameras[numCameras];
  364. unsigned 32 little numSoundSources;
  365. sound_source_t soundSources[numSoundSources];
  366. unsigned 32 little numBoxes;
  367. box_t boxes[numBoxes];
  368. unsigned 32 little numOverlaps;
  369. skip overlaps[numOverlaps * 2];
  370. // TR1 has 6 bytes per zone entry, TR2 & TR3 have 10
  371. if (TRversion > 1)
  372. skip zones[numBoxes * 10 * 2];
  373. else
  374. skip zones[numBoxes * 6 * 2];
  375. unsigned 32 little numAnimatedTextures;
  376. skip animatedTextures[numAnimatedTextures * 2];
  377. // TR3 has its object textures placed here
  378. if (TRversion == 3) {
  379. unsigned 32 little numObjectTextures;
  380. object_texture_t objectTextures[numObjectTextures];
  381. }
  382. unsigned 32 little numItems;
  383. item_t items[numItems];
  384. skip lightMap[32 * 256];
  385. // TR1 places its 8bit palette here
  386. if (TRversion == 1)
  387. skip palette[256 * 3];
  388. unsigned 16 little numCinematicFrames;
  389. cinematic_frame_t cinematicFrames[numCinematicFrames];
  390. unsigned 16 little numDemoData;
  391. skip demoData[numDemoData];
  392. // TR1s sound map has 256 entries, TR2 & TR3 have 370
  393. if (TRversion > 1)
  394. signed 16 little soundMap[370];
  395. else
  396. signed 16 little soundMap[256];
  397. unsigned 32 little numSoundDetails;
  398. sound_details_t soundDetails[numSoundDetails];
  399. // TR1 has the sample data embedded here (WAV files)
  400. if (TRversion == 1) {
  401. unsigned 32 little numWAVSamples;
  402. skip wavSamples[numWAVSamples];
  403. }
  404. unsigned 32 little numSampleIndices;
  405. unsigned 32 little sampleIndices[numSampleIndices];
  406. }