struct TR2Savegame { 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 int32_t saveNumber; // 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. // For simplicity, this includes the tile menu as a level. struct { uint16_t ammoPistols; // Always 0x3E8 (1000) uint16_t ammoAutoPistols; // 65,535 means unlimited uint16_t ammoUzis; uint16_t ammoShotgun; uint16_t ammoM16; uint16_t ammoGrenade; uint16_t ammoHarpoon; uint8_t smallMedipacks; // 255 means unlimited uint8_t largeMedipacks; uint8_t unknown; uint8_t flares; uint8_t unknown2[1]; /* 0 None * 1 Pistols * 2 Automatic pistols * 3 Uzis * 4 Shotgun * 5 M16 * 6 Grenade launcher * 7 Harpoon gun */ uint8_t weapon; // equipped weapon /* 00000001 Level unlocked * 00000010 Pistols * 00000100 Automatic pistols * 00001000 Uzis * 00010000 Shotgun * 00100000 M16 * 01000000 Grenade launcher * 10000000 Harpoon gun */ uint16_t flags; uint8_t unknown3[2]; uint32_t levelTime; // in game ticks uint32_t weaponHits; uint32_t weaponShots; uint32_t travelledDistance; uint16_t kills; uint8_t secretBits; uint8_t healthPacksUsed; // Divide by 2 for value. Large medipack = 1; Small = 0.5 } levelInitData[24]; uint32_t elapsedTime; // in game ticks (1/30th of a second), so divide by 30 for time in seconds uint32_t ammoUsed; uint32_t hits; uint32_t distanceTraveled; // Divide by 445.023 for value in meters uint32_t kills; /* 00000001 Bronze * 00000010 Jade * 00000100 Gold */ uint8_t secrets; uint8_t healthPacksUsed; // Divide by 2 for value. Large medipack = 1; Small = 0.5 uint16_t levelNumber; // First level = 1 uint8_t unlimitedAmmo; // Enabled = 1 uint8_t numPickups[2]; uint8_t puzzle[4]; // Corresponds to TOMBPC.DAT Puzzle & Keys entries uint8_t keys[4]; uint32_t roomsAreFlipped; uint8_t flipStates[10]; uint16_t trackFlags[64]; uint8_t cameraFlags[]; // size depends on number of cameras in level uint8_t itemData[]; // item-specific savegame data, needs to be studied uint16_t laraObjectNumber; // item id of lara uint16_t laraHandStatus; uint16_t laraWeapon1; uint16_t laraWeapon2; uint16_t laraWeapon3; uint16_t laraFallspeedOverride; uint16_t laraWaterState; uint8_t unknown7[4]; uint16_t laraStumbleFrame; uint16_t laraStumbleDir; uint16_t laraAirTime; // in game ticks uint8_t unknown8[4]; uint16_t laraUnderwaterSpeed; uint16_t stumbleTimeout; uint16_t flareTimer; uint16_t currentVehicleId; uint16_t currentWeaponItemId; uint16_t weaponObjectNumberLeftHand; uint16_t weaponFrame; uint16_t weaponFlags; uint32_t distanceToWaterSurface; Vector3_32 travelDistancePrevPos; // position of previous frame to calculate distance uint8_t unknown10[8]; uint32_t laraMeshPtrs[15]; uint32_t firingAtEnemy; Vector2_16 aimAngles; uint16_t turnSpeed; uint16_t moveAngle; VectorYXZ_16 headRot; VectorYXZ_16 torsoRot struct WeaponAnimData { uint32_t animFrame; // pointer to anim frame data uint16_t frame; uint16_t animId; uint16_t canShoot; VectorXY_16 aimAngles; uint8_t unknown[2]; uint16_t shooting; }; WeaponAnimData weaponAnimRight; WeaponAnimData weaponAnimLeft; uint32_t pistolsAmmo; uint32_t magnumsAmmo; uint32_t uziAmmo; uint32_t shotgunAmmo; uint32_t harpoonAmmo; uint32_t grenadeLauncherAmmo; uint32_t m16Ammo; uint32_t unknown11; uint32_t laraItemPtr; uint32_t gameEffectsPtr; uint16_t firstFreeEffect; uint16_t firstFreeItem; uint16_t firstActiveItem; uint16_t lastEffect; uint16_t bodyListHead; // for "clear bodies" floordata if(weapon1 != -1) { // data about this weapon uint16_t weaponObjectId; uint16_t weaponAnimNumber; uint16_t weaponFrame; uint16_t weaponAnimState; uint16_t goalAnimState; } uint32_t currentFlipEffect; uint32_t flipEffectDuration; uint32_t unknown12; uint32_t activeFlares; struct FlareInfo { int32_t x, y, z; int16_t rotX, rotY, rotZ; uint16_t room; uint16_t speed; uint16_t fallspeed; uint32_t unknown; }; FlareInfo flareInfos[numFlares]; // remainder is unused uint8_t readToEOF[]; };
The levelNumber
field is used for determining what level the game should load when opening the savegame.
ID | Level | Puzzle | Key | ||||||
---|---|---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 1 | 2 | 3 | 4 | ||
1 | The Great Wall | Guardhouse Key | Rusty Key | ||||||
2 | Venice | Boathouse Key | Steel Key | Iron Key | |||||
3 | Bartoli's Hideout | Library Key | Detonator Key | ||||||
4 | Opera House | Relay Box | Circuit Board | Ornate Key | |||||
5 | Offshore Rig | Red Pass Card | Yellow Pass Card | Green Pass Card | |||||
6 | Diving Area | Machine Chip | Red Pass Card | Blue Pass Card | |||||
7 | 40 Fathoms | ||||||||
8 | Wreck of the Maria Doria | Circuit Breaker | Rest Room Key | Rusty Key | Cabin Key | ||||
9 | Living Quarters | Theatre Key | Rusty Key | ||||||
10 | The Deck | The Seraph | Stern Key | Storage Key | Cabin Key | ||||
11 | Tibetan Foothills | The Seraph | Drawbridge Key | Hut Key | |||||
12 | Barkhang Monastery | Prayer Wheels | Gemstones | The Seraph | Strongroom Key | Trapdoor Key | Rooftops Key | Main Hall Key | |
13 | Catacombs of the Talion | Tibetan Mask | |||||||
14 | Ice Palace | Tibetan Mask | Gong Hammer | ||||||
15 | Temple of Xian | The Dragon Seal | Gold Key | Silver Key | Main Chamber Key | ||||
16 | Floating Islands | Mystic Plaque | Mystic Plaque | ||||||
17 | The Dragon's Lair | Mystic Plaque | Dagger of Xian | ||||||
18 | Home Sweet Home | Dagger of Xian | Gun Cupboard Key | ||||||
19 | Venice (demo) | Boathouse Key | Steel Key | Iron Key | |||||
20 | Wreck of the Maria Doria (demo) | Circuit Breaker | Rest Room Key | Rusty Key | Cabin Key | ||||
21 | Tibetan Foothills (demo) | The Seraph | Drawbridge Key | Hut Key | |||||
Golden Mask levels | |||||||||
1 | The Cold War | Guardroom Key | Shaft 'B' Key | ||||||
2 | Fool's Gold | Circuit Board | CardKey 1 | CardKey 2 | |||||
3 | Furnace of the Gods | Mask Of Tornarsuk | Gold Nugget | ||||||
4 | Kingdom | Mask Of Tornarsuk | |||||||
5 | Nightmare In Vegas | Elevator Junction | Door Circuit | Hotel Key |