123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473 |
- <!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en"><html><head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <meta name="Author" content="Turbo Pascal">
- <meta name="GENERATOR" content="Mozilla/4.6 [en] (Win95; I) [Netscape]">
- <title>TR4 File format notes.</title></head>
-
- <body>
-
- <hr width="100%">
- <blockquote>
- <blockquote>
- <blockquote>
- <blockquote>
- <h1>
- <font color="#cc33cc">TR4 FILE FORMAT NOTES</font></h1>
- <b><font color="#000000">
- Recopilation notes from some peoples</font></b>
- <br><b><font color="#000000">
- 12-21-01</font></b>
- <br><b><font color="#000000">
- </font><font color="#ff0000">Last Updated January-02-2002</font></b></blockquote>
- </blockquote>
- </blockquote>
- </blockquote>
-
- <hr width="100%">
- <p>Hi, This is my own recopilation about Tr4 file format notes from some
- peoples, this is not a complete byte-per-byte walktroug because the TR4
- file format is almost the like the TR3 files, so once you have your TR3
- reader working then read the notes below to help you to known what
- you have to change/add to your Tr3 fileformat for be able to read/write
- TR4 levels.
- </p><p>The more important thing is that TR4 files are in compressed way, the
- method used is called ZLIB, and you can found on internet (search the word
- Zlib) a Zlib.dll and a Zlib.H file that will let you descompress zlib compressed
- data in your program.
- </p><p>For uncompress each chunk data, you will found in the file:
- </p><p><i>uncompressed_size</i> : 4 bytes telling you how long the data is
- when is uncompressed, so you have to alloc a memory buffer
- <br>
- with this size where to store the chunk once uncompressed.
- </p><p><i>Compressed_size</i> : 4 bytes telling you how long
- the data is when is compressed.
- </p><p>Next come the compressed data, read compressed_size bytes data, and
- then use your zlib rutine to uncompress the chunk and store the data in
- your allocated buffer.
- </p><p><b><i>Turbo Pascal, 12-21-01.</i></b>
- </p><p>
- </p><hr width="100%">
- <p><b><u>Note #1, By Yuri Zhivago</u></b>
- </p><p>I don't have it in a nice neat form like the TRosettaStone; in
- fact, it's been so long now, I'm not at all sure where my notes on
- it are.
- </p><p>If you have the TRueView source, you have everything I know - TR2IO.C
- is where all of the TR4 I/O occurs. Search for "TombRaider_4" in
- TR2IO.C to see the places where TR4 is different from the other versions.
- </p><p>Having written that, I just dug out my notes as of about five months
- ago; they're not current, but between these notes and the TR2IO.C
- source, you should be able to figure things out...
- </p><p>--- TR4 Notes (written to myself):
- </p><p>The .TR4 format is similar to TR3, except (note that this list of exceptions
- is not intended to be complete at this point):
- </p><p> * The level data is zlib compressed (obviously)
- </p><p> * There is no 8-bit palette, nor
- are there any 8-bit textures,
- <br> and LightMap is not present.
- </p><p> * Lara now comprises two ObjectIDs and
- two sets of meshes, one
- <br> for most of her body and
- the other for her joints;
- <br> this appears to be how she
- is "skinned." All other
- <br> meshes that I have observed
- are "normal" (e.g. are
- <br> not "skinned" in this manner).
- </p><p> * struct tr2_room_light is now 46 bytes
- (no clues yet)
- </p><p> * struct tr2_animation has 8 extra
- bytes immediately
- <br> before .FrameStart (no clues
- yet)
- </p><p> * Three bytes ("SPR") appear immediately
- before NumSpriteTextures
- </p><p> * struct tr2_sound_source is now 40 bytes
- (no clues yet)
- </p><p> * Between SoundSources and NumBoxes is
- a new element:
- <br> bitu32
- NumXYZ
- <br> struct
- { bitu8 unknown[16]; } XYZ[NumXYZ];
- </p><p><i><font color="#ff0000">Before SoundSources is a new field for Flyby_Camera
- data</font></i>
- <br><i><font color="#ff0000">bitu32 Number_of_FBCameras</font></i>
- <br><i><font color="#ff0000">followed by data for each camera. Data field
- is 40 bytes.</font></i>
- <br><i><font color="#ff0000">[Yury had previously stated NumXYZ as a new
- field incorrectly.</font></i>
- <br><i><font color="#ff0000">His NumXYZ field was the SoundSources in normal
- structure format],</font></i>
- <br><i><font color="#ff0000"> -Note from Roy Godbold.</font></i>
- </p><p> Four bytes ("TEX\0") appear
- immediately before NumObjectTextures
- </p><p> struct tr2_object_texture
- is now 38 bytes. The .Tile
- <br> field is now bitu32, not
- bitu16; the other 16 new bytes
- <br> appear after the texture
- vertices (no clues yet)
- </p><p> It appears that SoundMap
- is either larger or variable-length,
- <br> although I'm not yet certain
- how the length would be inferred
- <br> (there does not appear to
- be a NumSoundMap field). This causes
- <br> my parser to behave erratically,
- so I currently stop parsing at
- <br> SoundMap.
- </p><p><i><font color="#ff0000">Soundmap is a fixed 740 bytes long, the
- problem was that the num_cinematic fields is now 4 bytes long and
- the cinematic records is now 24 bytes long, so Yury was reading incorrect
- that structure causing a later problem in his reader.</font></i>
- <br><i><font color="#ff0000"> -Note from Turbo Pascal</font></i>
- </p><p> .PAK files are also zlib compressed;
- the first four bytes of
- <br> the file are the uncompressed size,
- while the compressed size
- <br> is inferred as the file length - 4.
- The logo files decompress
- <br> to 512*256*24bits bitmaps.
- </p><p> There is an unused level, JOBY1B.TR4,
- that looks like an abandoned
- <br> effort - the only mesh is Lara, and
- there is a fair amount of
- <br> landscape, but nothing to do, really...
- </p><p> Things I've observed using the viewer:
- </p><p> TR3-style alpha transparency
- doesn't work (water, rays of
- <br> light,
- etc.) - in fact, it's completely wrong (there are
- <br> cases
- where unintended transparency occurs). This could
- <br> conceivably
- be a bug in my viewer, but it works perfectly
- <br> for all
- the TR3 levels, so I'm guessing there was a change.
- <br> All the
- TR4 transparencies show up as opaque greyscale.
- </p><p> AnimatedTextures don't seem
- to work; in fact, I don't think
- <br> they are
- actually used (my level dumping routine is broken
- <br> at the
- moment, so I can't verify this, but a few judicious
- <br> printf()s
- lead me to believe that this is the case.)
- </p><p><i><font color="#ff0000">Animated textures work exactly in the same
- way that TR1-Tr3, i don;t known what problem Yury had with this structure.</font></i>
- <br><i><font color="#ff0000"> -Note From Turbo Pascal</font></i>
- </p><p> While every other mesh/staticmesh
- works, pickups appear to be
- <br> sunk into
- the floor (or whatever they're on top of). In
- <br> fact,
- they appear to be Y-centered at floor (or table) level.
- <br> TR4 has a number of new
- (and cool) lighting and particle effects;
- <br> interestingly,
- my viewer renders these as meshes. There
- <br> must be
- some interesting FloorData or hardcoded magic going
- <br> on...
- <br> Ropes do not appear as items
- or staticmeshes; at present, my
- <br> viewer
- can't find them at all. They may be related to the
- <br> new NumZZZ
- elements, although I have no evidence of that.
- <br> I see the continuation of
- a trend that I first saw in TR3, that
- <br> being
- the existence of detached rooms. TR3 has a number of
- <br> levels
- that have a cube off in space somewhere, which appears
- <br> to me
- to be a "practice area" (to test out textures, etc.).
- <br> In addition,
- at least one TR3 level (MINES.TR4) contains a
- <br> completely
- detached "room" that actually appears in the
- <br> level
- (when the submersible is lowered). TR4 has quite a few
- <br> detached
- areas that appear in the levels; not only do they
- <br> appear,
- but Lara enters and exits them. The FloorData
- <br> presumably
- now contains some "teleportation" code. I assume
- <br> that this
- is to avoid the "five-dimensional space" issues
- <br> that can
- occur in densely overlapping areas.
- <br> The mirrored rooms are interesting;
- they really are mirror-imaged
- <br> rooms
- that are bisected by two translucent planes that create
- <br> the illusion
- of a mirror. Again, I assume that there is some
- <br> special
- FloorData that indicates one of these rooms and its centre
- <br> plane;
- that way, all the engine has to do is render Lara
- <br> in mirror-image
- about that plane while following the normal
- <br> FloorData
- rules. Quite clever, really...
- <br> --- end notes
- </p><p> Good luck.
- </p><p> Yuri Zhivago
- </p><p>
- </p><hr width="100%">
- <p><b><u>Note #2, By Roy Godbold</u></b>
- <br>
- </p><p>*******************************************************
- <br> TR4 Possible File Format
- <br>rgbold March '01
- </p><p>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- </p><p>---------------
- <br>Dword = 4 bytes
- <br>Int = 2 bytes
- <br>--------------
- </p><p>Dword "TR4",0
- <br>Int number of RoomTextures?
- <br>Int number of OtherTextures?
- <br>Int number of BumpMapTextures?
- <br>Dword UncompressedSize1
- <br>Dword CompressedSize1
- <br>TextureBlock1
- <br>Dword UncompressedSize2
- <br>Dword CompressedSize2
- <br>TextureBlock2
- <br>Dword UncompressedSize3
- <br>Dword CompressedSize3
- <br>TextureBlock3
- <br>Dword UncompressedSize4
- <br>Dword CompressedSize4
- <br>Rest_level_Block3 //The whole level data is in compressed
- mode in this block.
- </p><p>/// Once the level data is uncompressed then read the level as TR3 except
- where noted
- </p><p>NOTES:
- <br>Texture needs to be masked with 0xfff (high 4 bits are flags)
- //the textureID on each rectangle/triangle face.
- </p><p>Room Lights now 46 bytes:
- </p><p>TR4_RoomLight //
- <br> //Follows a D3D light structure, I think, could be wrong
- </p><p> Dword Xposition // world coords
- <br> Dword Yposition // world coords
- <br> Dword Zposition // world coords
- <br> TR2_Color // three
- bytes rgb values
- <br> bitu8 LightType // same as D3D (i.e. 2 is for spotlight)
- <br> bitu8 unknown // always 0xff?
- <br> byte Intensity
- <br> float In
- <br> float Out
- <br> float Length
- <br> float Cutoff
- <br> floats X,Y,Z //direction??
- <br>
- </p><p>Before SoundSources is a new field for Flyby_Camera data
- <br>bitu32 Number_of_FBCameras
- <br>followed by data for each camera. Data field is 40 bytes.
- <br>[Yury had previously stated NumXYZ as a new field incorrectly.
- <br>His NumXYZ field was the SoundSources in normal structure format]
- <br>
- </p><p>Cinematic Frames now 24 bytes
- <br>* the field num_cinematic_frames is 4 bytes long for tr4-tr5
- <br>vice 2 bytes for tr1-tr3.
- </p><p>There are no colored rectangles or triangles in mesh data.
- <br>Mesh Rectangles and Triangles now
- <br> MeshRects: v0,v1,v2,v3,texture,int unknown
- <br> MeshTris: v0,v1,v2,texture,int unknown
- <br>Texture Objects now preceeded by TEX/0 (4bytes)
- <br>Object Textures now 38 bytes vice 20
- <br>Tile is now a bitu32 vice bitu16 seems need to mask with 0xff as other
- <br> bits are flags. Seems bit15 set
- means triangle.
- <br>In the texture coords now 0 is used for low value vice 1
- <br>The extra 16 bytes are at the end of ObjectTexture structure
- </p><p>Attributes using 1 or 2 for transparent. 2 used for 2 sided textures
- <br>
- (water surface,etc)
- <br>
- </p><p>Animation now 40 vice 32 bytes. extra 8 seem to be zero right before
- <br>/after the old 8 unknowns
- </p><p>"SPR" 3 byte ascii before sprite textures
- </p><p>There are no 8bit or 16 bit palettes (no colored rects or tris)
- <br>No lightmap
- <br>No 8bit textures
- </p><p>TR4 are 4 zlib compresed chunks, 3 for textures and 1 for rest level.
- <br>Following level data are Riff Wave Formats.
- <br>Lara 2 meshes , skin and joints.
- </p><p>
- </p><hr width="100%">
- <p><b>Note # 3 From Michiel:</b>
- </p><p>Go to trwad.tripod.com/download/TR5Manuel.htm for a small list from
- the OCB codes from TR5 objects. These codes set the password in the keypads,
- laser types and enemie opening animations.
- </p><p>These codes are includes in the item structure from TR4&5 and replaces
- the old intensity2 from TR2&3 data files.
- <br>This means TR4&5 don't have 2 intensity values, but only one.
- <br>The size of the structure is still the same.
- </p><p>-------------------------------------------
- </p><p>There are no cinematic frames in TR4&5. Instead of that, there is
- the following structure:
- </p><p>long NumAIData
- </p><p>followed by the following data for each object
- </p><p>int ObjectID ; the objectID from the AI object (AI_FOLLOW is 402)
- <br>int Room
- <br>long X
- <br>long Y
- <br>long Z
- <br>int OCB
- <br>int Flags ; The trigger flags (button 1-5, first button has value 2)
- <br>long Angle ; rotation
- </p><p>It's directly after the item data
- <br>---------------------------------------------------------------------
- </p><p>The underwater Current, like the doc sais, is not located in the fully
- in the floordata structure. The largest part is hidden in th tr2_camera
- structure. The floordata points to this structure. The difference ith a
- normal camera is that the room number is strenght of the current. The unknown
- int after this seems to be 0 for a camera, 1 for a fixed camera and for
- a current object it is different for every object.
- <br>
- </p><p>
- </p><hr width="100%">
- <p><b>Note #4 From E. POPOV</b><b></b>
- </p><p>Here's my compilation of docs I have about TR4 file format augmented
- with infos I found when coding the TR4 support in TrViewer. I sent the
- HTML version to TP and I will add it to my web site.
- </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
- from here!</a>
- </p><p>
- </p><hr width="100%">
- <br><b>Notes #5 By Baloneyman</b>
- <p>This was lying around
- </p><p>////////////////////////////////////////////////////////////////////////////
- <br>//TR4 Room_Light
- <br>// EXAMPLE FOR SPOT LIGHT TYPE //
- </p><p>002A0000 ~ X world position dword
- <br>80FDFFFF ~ Y world position dword
- <br>007E0000 ~ Z world position dword
- <br>F0E0D0 ~ rgb colour byte[3]
- <br>02 ~ light type byte 0= sun, 1= light, 2= spot, 3= shadow,
- <br>FF ~ constant byte
- <br>13 ~ intensity byte [ 0-31 max (8 = .25) ]
- <br>B28F703F ~ in cosine float
- <br>CA03683F ~ out cosine float
- <br>00000045 ~ len float in 1024 units
- <br>00009F45 ~ cut float in 1024 units
- </p><p>//last 3 floats specify a directional vector
- </p><p>D91E7F3E ~ cosX * sinY (float)
- <br>411884BE ~ sinX (float)
- <br>E1F76E3F ~ cosX * cosY (float)
- </p><p>////////////////////////////////////////////////////////////////////////////
- </p><p>Sun -uses position of ff,ff,8 always
- <br>uses intensity
- <br>uses X and Y for directional vector
- </p><p>Light - uses position
- <br>uses intensity
- <br>uses OUT in 1024 units
- <br>uses IN in 1024 units
- </p><p>Spot - uses all fields as above
- </p><p>Shadow - uses position
- <br>uses intensity as -1 to 0 ( -.50 = 16 )
- <br>uses OUT in 1024 units
- <br>uses IN in 1024 units
- <br>
- </p><p>///////////////////////////////////////////////////////////////////////////
- </p><p>// TR4LIGHT structure (46 bytes)
- </p><p>typedef struct
- <br>{
- </p><p>// The first 3 values represent
- the position of the light in XYZ world coordinates
- <br>// NOTE: the SUN type light does not have a position and uses -1, -1,
- 8 for the XYZ.
- </p><p>long LightXposition
- <br>long LightYposition
- <br>long LightZposition
- <br>
- </p><p>// The next 3 bytes specify
- the RGB color values for the light
- </p><p>unsigned char LightRed
- <br>unsigned char LightGreen
- <br>unsigned char LightBlue
- </p><p>// The next byte specifies
- the type of light. 0=sun, 1=light, 2=spot, 3=shadow
- <br>// NOTE: the 'effect' type light is not really a light but just changes
- the
- <br>// the vertex lighting.
- </p><p>char LightType
- </p><p>// The following byte is a
- constant -1. Not used.
- </p><p>char LightConstant
- </p><p>// The next byte is for the
- Intensity of the light.
- <br>// All lights but the 'shadow' type uses 0 minimum to 31 maximum. i.e.
- a value
- <br>// of .25 would be represented by 8.
- <br>// NOTE: the shadow type
- light uses values of -1 to 0. a -.50 value would
- <br>// be represented by 16.
- </p><p>char LightIntensity
- </p><p>// For the 'light' and 'shadow'
- type lights the following 2 floats
- <br>// represent the OUT and IN (falloff and hotspot) values in TR units
- (1024 = 1 sector)
- <br>// For the 'spot' type light
- represent the cosine of the angle.
- <br>// The 'sun' type light does
- not use these values.
- </p><p>float LightIN
- <br>float LightOUT
- </p><p>// The following two floats
- are used only by the 'spot' type light
- <br>// and represent the values
- in TR units (1024 = 1 sector)
- </p><p>float LEN
- <br>float CUT
- <br>
- </p><p>// The final 3 floats are
- used only by the 'sun' and 'spot' type lights.
- <br>// They describe the directional
- vector of the light.
- <br>// This can be obtained by
- :
- <br>//
- if both x and y x = cosX * sinY
- <br>//
- y = sinX
- <br>//
- z = cosX * cosY
- <br>//
- <br>//
- if only x
- x = 0
- <br>//
- y = sinX
- <br>//
- z = cosX
- <br>//
- <br>//
- if only y
- x = sinY
- <br>//
- y = 0
- <br>//
- z = cosY
- </p><p>float LightDirectionVectorX
- <br>float LightDirectionVectorY
- <br>float LightDirectionVectorZ
- </p><p>} TR4LIGHT;
- </p><p>///////////////////////////////////////////////////////////////////////////
- <br>
- </p><hr width="100%">
- <br>
- <br>
- <br>
- <!-- text below generated by server. PLEASE REMOVE -->
- <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>
- <img src="tr4notes_files/serv.gif" alt="1" width="1" height="1">
- </body></html>
|