This version is outdated by a newer approved version.
This version (2017/02/26 01:23) is a draft.
Approvals: 0/1The Previously approved version (2017/02/01 18:48) is available.

Approvals: 0/1The Previously approved version (2017/02/01 18:48) is available.

This is an old revision of the document!
Table of Contents
TR1
struct tr1_savegame // 10675 bytes { uint8_t SaveName[75]; // ASCII C string; null-terminated (there is always random data after \0, it is ignored); for accents see String Array section of TOMBPC.DAT page uint32_t SaveNumber; // game clips it to 16 bits uint8_t Unknown2[15]; // First level use block 0, second use block 1... so that at the end of the game, // it sums up everything and/or checks if you found all secrets, etc struct { uint16_t Header; // Always 0x3E8 uint16_t Ammo_Magnums; // 65,535 means unlimited uint16_t Ammo_Uzis; uint16_t Ammo_Shotgun; uint8_t SmallMedipacks; // 255 means unlimited uint8_t LargeMedipacks; uint8_t NumScionPieces; /* 0 None * 1 Climbing * 2 ? * 3 Single shot.? * 4 Combat? */ uint8_t HandStatus; /* 0 None * 1 Pistols * 2 Magnums * 3 Uzis * 4 Shotgun */ uint8_t Weapon; // current held weapon /* 00000001 Level unlocked * 00000010 Pistols * 00000100 Magnums * 00001000 Uzis * 00010000 Shotgun * 00100000 Midas Hand */ uint8_t Weapons; uint8_t Unknown2; } LevelInitData[21]; // for the 21 levels (315 bytes) uint32_t ElapsedTime; // in game ticks (1/30th of a second), so divide by 30 for time in seconds uint32_t Kills; uint16_t SecretsFound; uint16_t LevelNumber; // First level = 1 uint8_t NumPickups; uint8_t UnlimitedAmmo; // Enabled = 1 uint8_t HasItem141; // From decompiled game source. uint8_t HasItem142; // Strangely, those (unknown) items aren't present in any official TR1 level uint8_t Puzzle[4]; uint8_t Keys[4]; uint8_t Pickup; // the pickup item uint8_t LevelInitDataCRC; // not implemented, always 0 // 10240 bytes starting from now uint8_t RoomsAreSwapped; uint8_t FlipFlags[10]; // = (FlipFlag & 0xFF00) >> 8 uint16_t CameraFlagsZoneIndexes[CameraCount]; // items block here todo #pragma pack(push, 8) struct { ITEM *Item; int16_t ItemID; int16_t HandStatus; WEAPONID CurrentWeapon; int16_t NextWeapon; int16_t ClimbFallSpeedOverride; int16_t UnderwaterState; int16_t Unknown1; int16_t CollisionFrame; int16_t CollisionAxis; int16_t Air; int16_t SwimToDiveKeypressDuration; int16_t DeadTime; int16_t UnderwaterCurrentStrength; int16_t Unknown2; VERTEX4 *WallPosition; #pragma pack(push, 1) struct MeshTree { int32_t replacedMeshesBits; MESH_HEADER *meshes[15]; } LaraMeshTree; #pragma pack(pop) ITEM *Enemy; VERTEX2YX EnemyLookRot; int16_t YRotationSpeed; int16_t MovementAngle; VERTEX2YXZ HeadRotation; VERTEX2YXZ TorsoRotation; AimInfo AimInfoLeft; AimInfo AimInfoRight; AMMO PistolAmmo; AMMO MagnumAmmo; AMMO UziAmmo; AMMO ShotgunAmmo; struct RoutePlanner { BoxNode *node; uint16_t head; uint16_t tail; uint16_t search_number; int16_t blockMask; int16_t stepHeight; int16_t dropHeight; int16_t flyHeight; int16_t zone_count; int16_t destinationBox; uint16_t searchOverride; VERTEX4 searchTarget; } AiInfo; } Lara; // 236 bytes #pragma pack(pop) int32_t PostFxFunc; // this is usually 0xFFFFFFFF (and the last in the file) so you can align it to that (replace the items blocks above by a filler block) so that Lara is aligned to PostFxFunc int32_t AnimFxTime; }; enum WEAPONID : int16_t { None = 0, Pistols = 1, Autopistols = 2, Uzis = 3, Shotgun = 4, }; struct VERTEX2 { int16_t X; int16_t Y; int16_t Z; }; struct VERTEX2YX { int16_t Y; int16_t X; }; struct VERTEX2YXZ { int16_t Y; int16_t X; int16_t Z; }; struct VERTEX4 { int32_t X; int32_t Y; int32_t Z; }; struct AMMO { int32_t Ammo; int32_t Hits; int32_t Misses; }; #pragma pack(push, 8) struct AimInfo { ANIM_FRAME *WeaponAnimData; int16_t Frame?; int16_t Aiming; VERTEX2YXZ AimRotation; int16_t ShootTimeout; }; #pragma pack(pop)
The
xxxxCount
values are available in the table below.
Identifications
Levels
ID | Level | Filename | Cameras | Items | Secrets | Puzzle | Key | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 1 | 2 | 3 | 4 | ||||||
0 | Lara's Home | GYM | 1 | 1 | 0 | ||||||||
1 | Caves | LEVEL1 | 2 | 60 | 3 | ||||||||
2 | City of Vilcabamba | LEVEL2 | 6 | 95 | 3 | Gold Idol | Silver Key | ||||||
3 | Lost Valley | LEVEL3A | 6 | 64 | 5 | Machine Cog | |||||||
4 | Tomb of Qualopec | LEVEL3B | 10 | 77 | 3 | ||||||||
5 | St. Francis' Folly | LEVEL4 | 14 | 107 | 4 | Neptune Key | Atlas Key | Damocles Key | Thor Key | ||||
6 | Colosseum | LEVEL5 | 10 | 86 | 3 | Rusty Key | |||||||
7 | Palace Midas | LEVEL6 | 7 | 136 | 3 | Gold Bar | |||||||
8 | The Cistern | LEVEL7A | 7 | 112 | 3 | Gold Key | Silver Key | Rusty Key | |||||
9 | Tomb of Tihocan | LEVEL7B | 15 | 88 | 2 | Gold Key | Rusty Key | Rusty Key | |||||
10 | City of Khamoon | LEVEL8A | 3 | 93 | 3 | Saphire Key | |||||||
11 | Obelisk of Khamoon | LEVEL8B | 8 | 103 | 3 | Eye of Horus | Scarab | Seal of Anubis | Ankh | Saphire Key | |||
12 | Sanctuary of the Scion | LEVEL8C | 12 | 74 | 1 | Ankh | Scarab | Gold Key | |||||
13 | Natla's Mines | LEVEL10A | 15 | 101 | 3 | Fuse | Pyramid Key | ||||||
14 | Atlantis | LEVEL10B | 6 | 192 | 3 | ||||||||
15 | The Great Pyramid | LEVEL10C | 2 | 129 | 3 | ||||||||
16 | Cut Scene 1 | CUT1 | 1 | 3 | N/A | ||||||||
17 | Cut Scene 2 | CUT2 | 0 | 1 | |||||||||
18 | Cut Scene 3 | CUT3 | 0 | 4 | |||||||||
19 | Cut Scene 4 | CUT4 | 0 | 6 | |||||||||
20 | Title | TITLE | 0 | 1 | |||||||||
21 | Current Position | CURRENT |
The level “Current Position” (ID 21) seems to have been used internally during the development of the game, and its purposes are unknown. Its file “
CURRENT.PHD
” isn't present in any of the official releases. TODO: Check in the betas.