Open Source Tomb Raider Engine
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TR4-Notes.html 23KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473
  1. <!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en"><html><head>
  2. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  3. <meta name="Author" content="Turbo Pascal">
  4. <meta name="GENERATOR" content="Mozilla/4.6 [en] (Win95; I) [Netscape]">
  5. <title>TR4 File format notes.</title></head>
  6. <body>
  7. <hr width="100%">
  8. <blockquote>
  9. <blockquote>
  10. <blockquote>
  11. <blockquote>
  12. <h1>
  13. <font color="#cc33cc">TR4 FILE FORMAT NOTES</font></h1>
  14. <b><font color="#000000">        
  15. Recopilation notes from some peoples</font></b>
  16. <br><b><font color="#000000">                                 
  17. 12-21-01</font></b>
  18. <br><b><font color="#000000">              
  19. </font><font color="#ff0000">Last Updated January-02-2002</font></b></blockquote>
  20. </blockquote>
  21. </blockquote>
  22. </blockquote>
  23. <hr width="100%">
  24. <p>Hi, This is my own recopilation about Tr4 file format notes from some
  25. peoples, this is not a complete byte-per-byte walktroug because the TR4
  26. file format is almost the like the TR3 files, so once you have your TR3
  27. reader working then  read the notes below to help you to known what
  28. you have to change/add to your Tr3 fileformat for be able to read/write
  29. TR4 levels.
  30. </p><p>The more important thing is that TR4 files are in compressed way, the
  31. method used is called ZLIB, and you can found on internet (search the word
  32. Zlib) a Zlib.dll and a Zlib.H file that will let you descompress zlib compressed
  33. data in your program.
  34. </p><p>For uncompress each chunk data, you will found in the file:
  35. </p><p><i>uncompressed_size</i> : 4 bytes telling you how long the data is
  36. when is uncompressed, so you have to alloc a memory buffer
  37. <br>                                
  38. with  this size where to store the chunk once uncompressed.
  39. </p><p><i>Compressed_size</i>    : 4 bytes telling you how long
  40. the data is when is compressed.
  41. </p><p>Next come the compressed data, read compressed_size bytes data, and
  42. then use your zlib rutine to uncompress the chunk and store the data in
  43. your allocated buffer.
  44. </p><p><b><i>Turbo Pascal, 12-21-01.</i></b>
  45. </p><p>
  46. </p><hr width="100%">
  47. <p><b><u>Note #1,  By Yuri Zhivago</u></b>
  48. </p><p>I don't have it in a nice neat form like the TRosettaStone;  in
  49. fact,  it's been so long now, I'm not at all sure where my notes on
  50. it are.
  51. </p><p>If you have the TRueView source, you have everything I know - TR2IO.C  
  52. is where all of the TR4 I/O occurs.  Search for "TombRaider_4" in 
  53. TR2IO.C to see the places where TR4 is different from the other versions.
  54. </p><p>Having written that, I just dug out my notes as of about five months 
  55. ago;  they're not current, but between these notes and the TR2IO.C
  56. source,  you should be able to figure things out...
  57. </p><p>--- TR4 Notes (written to myself):
  58. </p><p>The .TR4 format is similar to TR3, except (note that this list of exceptions
  59. is not intended to be complete at this point):
  60. </p><p>    *   The level data is zlib compressed (obviously)
  61. </p><p>   *     There is no 8-bit palette, nor
  62. are there any 8-bit textures,
  63. <br>        and LightMap is not present.
  64. </p><p>  *     Lara now comprises two ObjectIDs and
  65. two sets of meshes, one
  66. <br>        for most of her body and
  67. the other for her joints;
  68. <br>        this appears to be how she
  69. is "skinned."  All other
  70. <br>        meshes that I have observed
  71. are "normal" (e.g. are
  72. <br>        not "skinned" in this manner).
  73. </p><p>   *    struct tr2_room_light is now 46 bytes
  74. (no clues yet)
  75. </p><p>   *     struct tr2_animation has 8 extra
  76. bytes immediately
  77. <br>        before .FrameStart (no clues
  78. yet)
  79. </p><p>   *    Three bytes ("SPR") appear immediately
  80. before NumSpriteTextures
  81. </p><p>   *    struct tr2_sound_source is now 40 bytes
  82. (no clues yet)
  83. </p><p>   *    Between SoundSources and NumBoxes is
  84. a new element:
  85. <br>           bitu32
  86. NumXYZ
  87. <br>           struct
  88. { bitu8 unknown[16]; } XYZ[NumXYZ];
  89. </p><p><i><font color="#ff0000">Before SoundSources is a new field for Flyby_Camera
  90. data</font></i>
  91. <br><i><font color="#ff0000">bitu32 Number_of_FBCameras</font></i>
  92. <br><i><font color="#ff0000">followed by data for each camera. Data field
  93. is 40 bytes.</font></i>
  94. <br><i><font color="#ff0000">[Yury had previously stated NumXYZ as a new
  95. field incorrectly.</font></i>
  96. <br><i><font color="#ff0000">His NumXYZ field was the SoundSources in normal
  97. structure format],</font></i>
  98. <br><i><font color="#ff0000">    -Note from Roy Godbold.</font></i>
  99. </p><p>        Four bytes ("TEX\0") appear
  100. immediately before NumObjectTextures
  101. </p><p>        struct tr2_object_texture
  102. is now 38 bytes.  The .Tile
  103. <br>        field is now bitu32, not
  104. bitu16;  the other 16 new bytes
  105. <br>        appear after the texture
  106. vertices (no clues yet)
  107. </p><p>        It appears that SoundMap
  108. is either larger or variable-length,
  109. <br>        although I'm not yet certain
  110. how the length would be inferred
  111. <br>        (there does not appear to
  112. be a NumSoundMap field).  This causes
  113. <br>        my parser to behave erratically,
  114. so I currently stop parsing at
  115. <br>        SoundMap.
  116. </p><p><i><font color="#ff0000">Soundmap is a fixed 740 bytes  long, the
  117. problem was that  the num_cinematic fields is now 4 bytes long and
  118. the cinematic records is now 24 bytes long, so Yury was reading  incorrect
  119. that structure causing a later problem  in his reader.</font></i>
  120. <br><i><font color="#ff0000">    -Note from Turbo Pascal</font></i>
  121. </p><p>      .PAK files are also zlib compressed; 
  122. the first four bytes of
  123. <br>      the file are the uncompressed size,
  124. while the compressed size
  125. <br>      is inferred as the file length - 4. 
  126. The logo files decompress
  127. <br>      to 512*256*24bits bitmaps.
  128. </p><p>      There is an unused level, JOBY1B.TR4,
  129. that looks like an abandoned
  130. <br>      effort - the only mesh is Lara, and
  131. there is a fair amount of
  132. <br>      landscape, but nothing to do, really...
  133. </p><p>      Things I've observed using the viewer:
  134. </p><p>        TR3-style alpha transparency
  135. doesn't work (water, rays of
  136. <br>           light,
  137. etc.) - in fact, it's completely wrong (there are
  138. <br>           cases
  139. where unintended transparency occurs).  This could
  140. <br>           conceivably
  141. be a bug in my viewer, but it works perfectly
  142. <br>           for all
  143. the TR3 levels, so I'm guessing there was a change.
  144. <br>           All the
  145. TR4 transparencies show up as opaque greyscale.
  146. </p><p>        AnimatedTextures don't seem
  147. to work;  in fact, I don't think
  148. <br>           they are
  149. actually used (my level dumping routine is broken
  150. <br>           at the
  151. moment, so I can't verify this, but a few judicious
  152. <br>           printf()s
  153. lead me to believe that this is the case.)
  154. </p><p><i><font color="#ff0000">Animated textures work exactly in the same
  155. way that TR1-Tr3, i don;t known what problem Yury had with this structure.</font></i>
  156. <br><i><font color="#ff0000">   -Note From Turbo Pascal</font></i>
  157. </p><p>        While every other mesh/staticmesh
  158. works, pickups appear to be
  159. <br>           sunk into
  160. the floor (or whatever they're on top of).  In
  161. <br>           fact,
  162. they appear to be Y-centered at floor (or table) level.
  163. <br>        TR4 has a number of new
  164. (and cool) lighting and particle effects;
  165. <br>           interestingly,
  166. my viewer renders these as meshes.  There
  167. <br>           must be
  168. some interesting FloorData or hardcoded magic going
  169. <br>           on...
  170. <br>        Ropes do not appear as items
  171. or staticmeshes;  at present, my
  172. <br>           viewer
  173. can't find them at all.  They may be related to the
  174. <br>           new NumZZZ
  175. elements, although I have no evidence of that.
  176. <br>        I see the continuation of
  177. a trend that I first saw in TR3, that
  178. <br>           being
  179. the existence of detached rooms.  TR3 has a number of
  180. <br>           levels
  181. that have a cube off in space somewhere, which appears
  182. <br>           to me
  183. to be a "practice area" (to test out textures, etc.).
  184. <br>           In addition,
  185. at least one TR3 level (MINES.TR4) contains a
  186. <br>           completely
  187. detached "room" that actually appears in the
  188. <br>           level
  189. (when the submersible is lowered).  TR4 has quite a few
  190. <br>           detached
  191. areas that appear in the levels;  not only do they
  192. <br>           appear,
  193. but Lara enters and exits them.  The FloorData
  194. <br>           presumably
  195. now contains some "teleportation" code.  I assume
  196. <br>           that this
  197. is to avoid the "five-dimensional space" issues
  198. <br>           that can
  199. occur in densely overlapping areas.
  200. <br>        The mirrored rooms are interesting; 
  201. they really are mirror-imaged
  202. <br>           rooms
  203. that are bisected by two translucent planes that create
  204. <br>           the illusion
  205. of a mirror.  Again, I assume that there is some
  206. <br>           special
  207. FloorData that indicates one of these rooms and its centre
  208. <br>           plane; 
  209. that way, all the engine has to do is render Lara
  210. <br>           in mirror-image
  211. about that plane while following the normal
  212. <br>           FloorData
  213. rules.  Quite clever, really...
  214. <br>      --- end notes
  215. </p><p>      Good luck.
  216. </p><p>      Yuri Zhivago
  217. </p><p>
  218. </p><hr width="100%">
  219. <p><b><u>Note #2,  By Roy Godbold</u></b>
  220. <br> 
  221. </p><p>*******************************************************
  222. <br>      TR4 Possible File Format
  223. <br>rgbold March '01
  224. </p><p>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  225. </p><p>---------------
  226. <br>Dword = 4 bytes
  227. <br>Int  = 2 bytes
  228. <br>--------------
  229. </p><p>Dword "TR4",0
  230. <br>Int   number of RoomTextures?
  231. <br>Int   number of OtherTextures?
  232. <br>Int   number of BumpMapTextures?
  233. <br>Dword UncompressedSize1
  234. <br>Dword CompressedSize1
  235. <br>TextureBlock1
  236. <br>Dword UncompressedSize2
  237. <br>Dword CompressedSize2
  238. <br>TextureBlock2
  239. <br>Dword UncompressedSize3
  240. <br>Dword CompressedSize3
  241. <br>TextureBlock3
  242. <br>Dword UncompressedSize4
  243. <br>Dword CompressedSize4
  244. <br>Rest_level_Block3    //The whole level data is in compressed
  245. mode in this block.
  246. </p><p>/// Once the level data is uncompressed then read the level as TR3 except 
  247. where noted
  248. </p><p>NOTES:
  249. <br>Texture needs to be masked with 0xfff (high 4 bits are flags)  
  250. //the textureID on each rectangle/triangle face.
  251. </p><p>Room Lights now 46 bytes:
  252. </p><p>TR4_RoomLight //
  253. <br>  //Follows a D3D light structure, I think, could be wrong
  254. </p><p>  Dword Xposition  // world coords
  255. <br>  Dword Yposition  // world coords
  256. <br>  Dword Zposition  // world coords
  257. <br>  TR2_Color        // three
  258. bytes rgb values
  259. <br>  bitu8 LightType  // same as D3D (i.e. 2 is for spotlight)
  260. <br>  bitu8 unknown    // always 0xff?
  261. <br>  byte  Intensity
  262. <br>  float In
  263. <br>  float Out
  264. <br>  float Length
  265. <br>  float Cutoff
  266. <br>  floats X,Y,Z    //direction??
  267. <br> 
  268. </p><p>Before SoundSources is a new field for Flyby_Camera data
  269. <br>bitu32 Number_of_FBCameras
  270. <br>followed by data for each camera. Data field is 40 bytes.
  271. <br>[Yury had previously stated NumXYZ as a new field incorrectly.
  272. <br>His NumXYZ field was the SoundSources in normal structure format]
  273. <br> 
  274. </p><p>Cinematic Frames now 24 bytes
  275. <br>* the field num_cinematic_frames is 4 bytes long for tr4-tr5
  276. <br>vice 2 bytes for tr1-tr3.
  277. </p><p>There are no colored rectangles or triangles in mesh data.
  278. <br>Mesh Rectangles and Triangles now
  279. <br>  MeshRects: v0,v1,v2,v3,texture,int unknown
  280. <br>  MeshTris:  v0,v1,v2,texture,int unknown
  281. <br>Texture Objects now preceeded by TEX/0 (4bytes)
  282. <br>Object Textures now 38 bytes vice 20
  283. <br>Tile is now a bitu32 vice bitu16 seems need to mask with 0xff as other
  284. <br>       bits are flags. Seems bit15 set
  285. means triangle.
  286. <br>In the texture coords now 0 is used for low value vice 1
  287. <br>The extra 16 bytes are at the end of ObjectTexture structure
  288. </p><p>Attributes using 1 or 2 for transparent. 2 used for 2 sided textures
  289. <br>              
  290. (water surface,etc)
  291. <br> 
  292. </p><p>Animation now 40 vice 32 bytes. extra 8 seem to be zero right before
  293. <br>/after the old 8 unknowns
  294. </p><p>"SPR"  3 byte ascii before sprite textures
  295. </p><p>There are no 8bit or 16 bit palettes (no colored rects or tris)
  296. <br>No lightmap
  297. <br>No 8bit textures
  298. </p><p>TR4 are 4 zlib compresed chunks, 3 for textures and 1 for rest level.
  299. <br>Following level data are Riff Wave Formats.
  300. <br>Lara 2 meshes , skin and joints.
  301. </p><p>
  302. </p><hr width="100%">
  303. <p><b>Note # 3 From Michiel:</b>
  304. </p><p>Go to trwad.tripod.com/download/TR5Manuel.htm for a small list from
  305. the OCB codes from TR5 objects. These codes set the password in the keypads,
  306. laser types and enemie opening animations.
  307. </p><p>These codes are includes in the item structure from TR4&amp;5 and replaces
  308. the old intensity2 from TR2&amp;3 data files.
  309. <br>This means TR4&amp;5 don't have 2 intensity values, but only one.
  310. <br>The size of the structure is still the same.
  311. </p><p>-------------------------------------------
  312. </p><p>There are no cinematic frames in TR4&amp;5. Instead of that, there is
  313. the following structure:
  314. </p><p>long NumAIData
  315. </p><p>followed by the following data for each object
  316. </p><p>int ObjectID ; the objectID from the AI object (AI_FOLLOW is 402)
  317. <br>int Room
  318. <br>long X
  319. <br>long Y
  320. <br>long Z
  321. <br>int OCB
  322. <br>int Flags ; The trigger flags (button 1-5, first button has value 2)
  323. <br>long Angle ; rotation
  324. </p><p>It's directly after the item data
  325. <br>---------------------------------------------------------------------
  326. </p><p>The underwater Current, like the doc sais, is not located in the fully
  327. in the floordata structure. The largest part is hidden in th tr2_camera
  328. structure. The floordata points to this structure. The difference ith a
  329. normal camera is that the room number is strenght of the current. The unknown
  330. int after this seems to be 0 for a camera, 1 for a fixed camera and for
  331. a current object it is different for every object.
  332. <br> 
  333. </p><p>
  334. </p><hr width="100%">
  335. <p><b>Note #4 From E. POPOV</b><b></b>
  336. </p><p>Here's my compilation of docs I have about TR4 file format augmented
  337. with infos I found when coding the TR4 support in TrViewer. I sent the
  338. HTML version to TP and I will add it to my web site.
  339. </p><p>Note: it's a lot better when seen in HTML format !,  <a href="http://www.geocities.com/cyber_delphi/articles/TR4format.htm">Look
  340. from here!</a>
  341. </p><p>
  342. </p><hr width="100%">
  343. <br><b>Notes #5 By Baloneyman</b>
  344. <p>This was lying around
  345. </p><p>////////////////////////////////////////////////////////////////////////////
  346. <br>//TR4 Room_Light
  347. <br>// EXAMPLE FOR SPOT LIGHT TYPE //
  348. </p><p>002A0000 ~ X world position dword
  349. <br>80FDFFFF ~ Y world position dword
  350. <br>007E0000 ~ Z world position dword
  351. <br>F0E0D0 ~ rgb colour byte[3]
  352. <br>02 ~ light type byte 0= sun, 1= light, 2= spot, 3= shadow,
  353. <br>FF ~ constant byte
  354. <br>13 ~ intensity byte [ 0-31 max (8 = .25) ]
  355. <br>B28F703F ~ in cosine float
  356. <br>CA03683F ~ out cosine float
  357. <br>00000045 ~ len float in 1024 units
  358. <br>00009F45 ~ cut float in 1024 units
  359. </p><p>//last 3 floats specify a directional vector
  360. </p><p>D91E7F3E ~ cosX * sinY (float)
  361. <br>411884BE ~ sinX (float)
  362. <br>E1F76E3F ~ cosX * cosY (float)
  363. </p><p>////////////////////////////////////////////////////////////////////////////
  364. </p><p>Sun -uses position of ff,ff,8 always
  365. <br>uses intensity
  366. <br>uses X and Y for directional vector
  367. </p><p>Light - uses position
  368. <br>uses intensity
  369. <br>uses OUT in 1024 units
  370. <br>uses IN in 1024 units
  371. </p><p>Spot - uses all fields as above
  372. </p><p>Shadow - uses position
  373. <br>uses intensity as -1 to 0 ( -.50 = 16 )
  374. <br>uses OUT in 1024 units
  375. <br>uses IN in 1024 units
  376. <br> 
  377. </p><p>///////////////////////////////////////////////////////////////////////////
  378. </p><p>// TR4LIGHT structure (46 bytes)
  379. </p><p>typedef struct
  380. <br>{
  381. </p><p>//        The first 3 values represent
  382. the position of the light in XYZ world coordinates
  383. <br>// NOTE: the SUN type light does not have a position and uses -1, -1,
  384. 8 for the XYZ.
  385. </p><p>long LightXposition
  386. <br>long LightYposition
  387. <br>long LightZposition
  388. <br> 
  389. </p><p>//        The next 3 bytes specify
  390. the RGB color values for the light
  391. </p><p>unsigned char LightRed
  392. <br>unsigned char LightGreen
  393. <br>unsigned char LightBlue
  394. </p><p>//        The next byte specifies
  395. the type of light. 0=sun, 1=light, 2=spot, 3=shadow
  396. <br>// NOTE: the 'effect' type light is not really a light but just changes
  397. the
  398. <br>// the vertex lighting.
  399. </p><p>char LightType
  400. </p><p>//        The following byte is a
  401. constant -1. Not used.
  402. </p><p>char LightConstant
  403. </p><p>//        The next byte is for the
  404. Intensity of the light.
  405. <br>// All lights but the 'shadow' type uses 0 minimum to 31 maximum. i.e.
  406. a value
  407. <br>// of .25 would be represented by 8.
  408. <br>//        NOTE: the shadow type
  409. light uses values of -1 to 0. a -.50 value would
  410. <br>// be represented by 16.
  411. </p><p>char LightIntensity
  412. </p><p>//        For the 'light' and 'shadow'
  413. type lights the following 2 floats
  414. <br>// represent the OUT and IN (falloff and hotspot) values in TR units
  415. (1024 = 1 sector)
  416. <br>//        For the 'spot' type light
  417. represent the cosine of the angle.
  418. <br>//        The 'sun' type light does
  419. not use these values.
  420. </p><p>float LightIN
  421. <br>float LightOUT
  422. </p><p>//        The following two floats
  423. are used only by the 'spot' type light
  424. <br>//        and represent the values
  425. in TR units (1024 = 1 sector)
  426. </p><p>float LEN
  427. <br>float CUT
  428. <br> 
  429. </p><p>//        The final 3 floats are
  430. used only by the 'sun' and 'spot' type lights.
  431. <br>//        They describe the directional
  432. vector of the light.
  433. <br>//        This can be obtained by
  434. :
  435. <br>//                       
  436. if both x and y        x = cosX * sinY
  437. <br>//                                               
  438. y = sinX
  439. <br>//                                               
  440. z = cosX * cosY
  441. <br>//
  442. <br>//                       
  443. if only x               
  444. x = 0
  445. <br>//                                               
  446. y = sinX
  447. <br>//                                               
  448. z = cosX
  449. <br>//
  450. <br>//                       
  451. if only y               
  452. x = sinY
  453. <br>//                                               
  454. y = 0
  455. <br>//                                               
  456. z = cosY
  457. </p><p>float LightDirectionVectorX
  458. <br>float LightDirectionVectorY
  459. <br>float LightDirectionVectorZ
  460. </p><p>} TR4LIGHT;
  461. </p><p>///////////////////////////////////////////////////////////////////////////
  462. <br>
  463. </p><hr width="100%">
  464. <br> 
  465. <br> 
  466. <br> 
  467. <!-- text below generated by server. PLEASE REMOVE -->
  468. <script language="JavaScript">var PUpage="76001067"; var PUprop="geocities"; </script><script language="JavaScript" src="tr4notes_files/pu2geo.js"></script><script language="JavaScript" src="tr4notes_files/ygNSLib9.js"></script><script language="JavaScript">var yvnContents='http://us.toto.geo.yahoo.com/toto?s=76001067&l=NE&b=0&t=1010070001';yvnR='us';yfnEA(0);</script><script language="JavaScript" src="tr4notes_files/toto.js"></script><map name="ym0"><area shape="rect" coords="2,2,84,14" href="http://geocities.yahoo.com/" target="_new"><area shape="rect" coords="87,2,101,14" href="http://us.geocities.yahoo.com/v/adsq.html" target="_new"><area shape="rect" coords="2,2,84,14" href="http://geocities.yahoo.com/" target="_new"><area shape="rect" coords="104,2,118,14" href="http://www.geocities.com/cyber_delphi/articles/tr4notes.html" onclick="javascript: yfnOC(2);return false" onmouseover="window.status='Expand';return true" onmouseout="window.status='';return true"><area shape="rect" coords="2,2,84,14" href="http://geocities.yahoo.com/" target="_new"><area shape="rect" coords="121,2,135,14" href="http://www.geocities.com/cyber_delphi/articles/tr4notes.html" onclick="javascript: yfnOC(-1);return false" onmouseover="window.status='Hide';return true" onmouseout="window.status='';return true"></map><map name="ym1"><area shape="rect" coords="2,2,84,14" href="http://geocities.yahoo.com/" target="_new"><area shape="rect" coords="87,2,101,14" href="http://us.geocities.yahoo.com/v/adsq.html" target="_new"><area shape="rect" coords="2,2,84,14" href="http://geocities.yahoo.com/" target="_new"><area shape="rect" coords="104,2,118,14" href="http://www.geocities.com/cyber_delphi/articles/tr4notes.html" onclick="javascript: yfnOC(2);return false" onmouseover="window.status='Expand';return true" onmouseout="window.status='';return true"><area shape="rect" coords="2,2,84,14" href="http://geocities.yahoo.com/" target="_new"><area shape="rect" coords="121,2,135,14" href="http://www.geocities.com/cyber_delphi/articles/tr4notes.html" onclick="javascript: yfnOC(0);return false" onmouseover="window.status='Minimize';return true" onmouseout="window.status='';return true"></map><map name="ym2"><area shape="rect" coords="2,2,84,14" href="http://geocities.yahoo.com/" target="_new"><area shape="rect" coords="87,2,101,14" href="http://us.geocities.yahoo.com/v/adsq.html" target="_new"><area shape="rect" coords="2,2,84,14" href="http://geocities.yahoo.com/" target="_new"><area shape="rect" coords="121,2,135,14" href="http://www.geocities.com/cyber_delphi/articles/tr4notes.html" onclick="javascript: yfnOC(0);return false" onmouseover="window.status='Minimize';return true" onmouseout="window.status='';return true"></map><layer pagey="0" pagex="0" visibility="hidden" name="yl0"><table border="2" cellpadding="0" cellspacing="0"><tbody><tr><td valign="top" bgcolor="#ffffff"><table border="0" cellpadding="0" cellspacing="0" width="138"><tbody><tr><td valign="top"><img usemap="#ym0" id="bottomImage" alt="nav" src="tr4notes_files/geoup.gif" width="138" height="17" border="0"></td></tr><tr><td align="center" valign="top" bgcolor="#ffffcc"><a href="http://www.geocities.com/cyber_delphi/articles/tr4notes.html" onclick="javascript: yfnOC(2);return false" onmouseover="window.status='Expand';return true" onmouseout="window.status='';return true"><font face="Arial" size="-2" color="Blue">undefined</font></a></td></tr></tbody></table></td></tr></tbody></table></layer><layer pagey="0" pagex="0" visibility="hidden" name="yl1"><table border="2" cellpadding="0" cellspacing="0"><tbody><tr><td valign="top" bgcolor="#ffffff"><table border="0" cellpadding="0" cellspacing="0" width="138"><tbody><tr><td valign="top"><img usemap="#ym1" id="bottomImage" alt="nav" src="tr4notes_files/geomid.gif" width="138" height="17" border="0"></td></tr><tr><td align="center" valign="top"><a href="http://www.geocities.com/cyber_delphi/articles/tr4notes.html" onclick="javascript: yfnOC(2);return false" onmouseover="window.status='Expand';return true" onmouseout="window.status='';return true">undefined</a></td></tr><tr><td align="center"><a href="http://www.geocities.com/cyber_delphi/articles/tr4notes.html" onclick="javascript: yfnOC(2);return false" onmouseover="window.status='Expand';return true" onmouseout="window.status='';return true"><font face="Arial" size="-2" color="Blue">More...</font></a></td></tr></tbody></table></td></tr></tbody></table></layer><layer pagey="0" pagex="0" visibility="hidden" name="yl2"><table border="2" cellpadding="0" cellspacing="0"><tbody><tr><td valign="top" bgcolor="#ffffff"><table border="0" cellpadding="0" cellspacing="0" width="138"><tbody><tr><td valign="top"><img usemap="#ym2" id="bottomImage" alt="nav" src="tr4notes_files/geodown.gif" width="138" height="17" border="0"></td></tr><tr><td align="center" valign="top">undefined</td></tr><tr><td align="center"><a href="http://www.geocities.com/cyber_delphi/articles/tr4notes.html" onclick="javascript: yfnOC(0);return false" onmouseover="window.status='Minimize';return true" onmouseout="window.status='';return true"><font face="Arial" size="-2" color="Blue">[Close]</font></a></td></tr></tbody></table></td></tr></tbody></table></layer><script language="JavaScript" src="tr4notes_files/mc.js"></script><script language="JavaScript" src="tr4notes_files/geov2.js"></script><script language="javascript">geovisit();</script><img border="0" src="tr4notes_files/visit.gif"><noscript><img src="http://visit.geocities.com/visit.gif?1010070001" border=0 width=1 height=1></noscript>
  469. <img src="tr4notes_files/serv.gif" alt="1" width="1" height="1">
  470. </body></html>