game-strings: improve object naming layout

This commit is contained in:
Marcin Kurczewski 2025-01-16 17:34:00 +01:00
parent 4184b9a688
commit f7a21610ad
23 changed files with 1444 additions and 1402 deletions

View file

@ -1,8 +1,6 @@
{
// NOTE: bad changes to this file may result in crashes.
// Lines starting with double slashes are comments and are ignored.
// Refer to https://github.com/LostArtefacts/TRX/blob/stable/docs/tr1/GAMEFLOW.md
// for usage.
// For usage, refer to the documentation here:
// https://github.com/LostArtefacts/TRX/blob/stable/docs/GAME_STRINGS.md
"levels": [
// Level 0: Lara's Home
@ -13,16 +11,16 @@
// Level 2: City of Vilcabamba
{
"game_strings": {
"INV_ITEM_KEY_1": "Silver Key",
"INV_ITEM_PUZZLE_1": "Gold Idol"
"objects": {
"key_1": {"name": "Silver Key"},
"puzzle_1": {"name": "Gold Idol"},
},
},
// Level 3: Lost Valley
{
"game_strings": {
"INV_ITEM_PUZZLE_1": "Machine Cog"
"objects": {
"puzzle_1": {"name": "Machine Cog"},
},
},
@ -31,78 +29,78 @@
// Level 5: St. Francis' Folly
{
"game_strings": {
"INV_ITEM_KEY_1": "Neptune Key",
"INV_ITEM_KEY_2": "Atlas Key",
"INV_ITEM_KEY_3": "Damocles Key",
"INV_ITEM_KEY_4": "Thor Key"
"objects": {
"key_1": {"name": "Neptune Key"},
"key_2": {"name": "Atlas Key"},
"key_3": {"name": "Damocles Key"},
"key_4": {"name": "Thor Key"},
},
},
// Level 6: Colosseum
{
"game_strings": {
"INV_ITEM_KEY_1": "Rusty Key"
"objects": {
"key_1": {"name": "Rusty Key"},
},
},
// Level 7: Palace Midas
{
"game_strings": {
"INV_ITEM_PUZZLE_1": "Gold Bar"
"objects": {
"puzzle_1": {"name": "Gold Bar"},
},
},
// Level 8: The Cistern
{
"game_strings": {
"INV_ITEM_KEY_1": "Gold Key",
"INV_ITEM_KEY_2": "Silver Key",
"INV_ITEM_KEY_3": "Rusty Key"
"objects": {
"key_1": {"name": "Gold Key"},
"key_2": {"name": "Silver Key"},
"key_3": {"name": "Rusty Key"},
},
},
// Level 9: Tomb of Tihocan
{
"game_strings": {
"INV_ITEM_KEY_1": "Gold Key",
"INV_ITEM_KEY_2": "Rusty Key",
"INV_ITEM_KEY_3": "Rusty Key"
"objects": {
"key_1": {"name": "Gold Key"},
"key_2": {"name": "Rusty Key"},
"key_3": {"name": "Rusty Key"},
},
},
// Level 10: City of Khamoon
{
"game_strings": {
"INV_ITEM_KEY_1": "Sapphire Key"
"objects": {
"key_1": {"name": "Sapphire Key"},
},
},
// Level 11: Obelisk of Khamoon
{
"game_strings": {
"INV_ITEM_KEY_1": "Sapphire Key",
"INV_ITEM_PUZZLE_1": "Eye of Horus",
"INV_ITEM_PUZZLE_2": "Scarab",
"INV_ITEM_PUZZLE_3": "Seal of Anubis",
"INV_ITEM_PUZZLE_4": "Ankh"
"objects": {
"key_1": {"name": "Sapphire Key"},
"puzzle_1": {"name": "Eye of Horus"},
"puzzle_2": {"name": "Scarab"},
"puzzle_3": {"name": "Seal of Anubis"},
"puzzle_4": {"name": "Ankh"},
},
},
// Level 12: Sanctuary of the Scion
{
"game_strings": {
"INV_ITEM_KEY_1": "Gold Key",
"INV_ITEM_PUZZLE_1": "Ankh",
"INV_ITEM_PUZZLE_2": "Scarab"
"objects": {
"key_1": {"name": "Gold Key"},
"puzzle_1": {"name": "Ankh"},
"puzzle_2": {"name": "Scarab"},
},
},
// Level 13: Natla's Mines
{
"game_strings": {
"INV_ITEM_PUZZLE_1": "Fuse",
"INV_ITEM_PUZZLE_2": "Pyramid Key"
"objects": {
"puzzle_1": {"name": "Fuse"},
"puzzle_2": {"name": "Pyramid Key"},
},
},
@ -131,143 +129,172 @@
{},
],
"object_names": {
"O_LARA": "Lara",
"O_PISTOL_ANIM": "Pistols Animation",
"O_SHOTGUN_ANIM": "Shotgun Animation",
"O_MAGNUM_ANIM": "Magnums Animation",
"O_UZI_ANIM": "Uzis Animation",
"O_LARA_EXTRA": "Lara's Extra Animation",
"O_BACON_LARA": "Bacon Lara",
"O_WOLF": "Wolf",
"O_BEAR": "Bear",
"O_BAT": "Bat",
"O_CROCODILE": "Crocodile",
"O_ALLIGATOR": "Alligator",
"O_LION": "Lion",
"O_LIONESS": "Lioness",
"O_PUMA": "Puma",
"O_APE": "Ape",
"O_RAT": "Rat",
"O_VOLE": "Vole",
"O_TREX": "T-Rex",
"O_RAPTOR": "Raptor",
"O_WARRIOR_1": "Mutant 1",
"O_WARRIOR_2": "Mutant 2",
"O_WARRIOR_3": "Mutant 3",
"O_CENTAUR": "Centaur",
"O_MUMMY": "Mummy",
"O_DINO_WARRIOR": "Dino Mutant",
"O_FISH": "Mutant Fish",
"O_LARSON": "Larson",
"O_PIERRE": "Pierre",
"O_SKATEBOARD": "Skateboard",
"O_SKATEKID": "Skate Kid",
"O_COWBOY": "Cowboy",
"O_BALDY": "Baldy",
"O_NATLA": "Natla",
"O_TORSO": "Torso",
"O_FALLING_BLOCK": "Falling Block",
"O_PENDULUM": "Pendulum",
"O_SPIKES": "Spikes",
"O_ROLLING_BALL": "Boulder",
"O_DART": "Dart",
"O_DART_EMITTER": "Dart Emitter",
"O_DRAWBRIDGE": "Drawbridge",
"O_TEETH_TRAP": "Teeth Trap",
"O_DAMOCLES_SWORD": "Damocles Sword",
"O_THORS_HANDLE": "Thor's Hammer Handle",
"O_THORS_HEAD": "Thor's Hammer",
"O_LIGHTNING_EMITTER": "Lightning Emitter",
"O_MOVING_BAR": "Moving Bar",
"O_MOVABLE_BLOCK_1": "Push Block 1",
"O_MOVABLE_BLOCK_2": "Push Block 2",
"O_MOVABLE_BLOCK_3": "Push Block 3",
"O_MOVABLE_BLOCK_4": "Push Block 4",
"O_SLIDING_PILLAR": "Sliding Pillar",
"O_FALLING_CEILING_1": "Falling Ceiling 1",
"O_FALLING_CEILING_2": "Falling Ceiling 2",
"O_SWITCH_TYPE_1": "Switch 1",
"O_SWITCH_TYPE_2": "Switch 2",
"O_DOOR_TYPE_1": "Door 1",
"O_DOOR_TYPE_2": "Door 2",
"O_DOOR_TYPE_3": "Door 3",
"O_DOOR_TYPE_4": "Door 4",
"O_DOOR_TYPE_5": "Door 5",
"O_DOOR_TYPE_6": "Door 6",
"O_DOOR_TYPE_7": "Door 7",
"O_DOOR_TYPE_8": "Door 8",
"O_TRAPDOOR_1": "Trapdoor 1",
"O_TRAPDOOR_2": "Trapdoor 2",
"O_BIGTRAPDOOR": "Big Trapdoor",
"O_BRIDGE_FLAT": "Bridge Flat",
"O_BRIDGE_TILT_1": "Bridge Tilt 1",
"O_BRIDGE_TILT_2": "Bridge Tilt 2",
"O_COG_1": "Cog 1",
"O_COG_2": "Cog 2",
"O_COG_3": "Cog 3",
"O_PLAYER_1": "Cutscene Actor 1",
"O_PLAYER_2": "Cutscene Actor 2",
"O_PLAYER_3": "Cutscene Actor 3",
"O_PLAYER_4": "Cutscene Actor 4",
"O_MAP_CLOSED": "Map Closed",
"O_SAVEGAME_ITEM": "Savegame Crystal",
"O_GAMMA_OPTION": "Gamma",
"O_PUZZLE_HOLE_1": "Puzzle Hole 1 (Empty)",
"O_PUZZLE_HOLE_2": "Puzzle Hole 2 (Empty)",
"O_PUZZLE_HOLE_3": "Puzzle Hole 3 (Empty)",
"O_PUZZLE_HOLE_4": "Puzzle Hole 4 (Empty)",
"O_PUZZLE_DONE_1": "Puzzle Hole 1 (Done)",
"O_PUZZLE_DONE_2": "Puzzle Hole 2 (Done)",
"O_PUZZLE_DONE_3": "Puzzle Hole 3 (Done)",
"O_PUZZLE_DONE_4": "Puzzle Hole 4 (Done)",
"O_MIDAS_TOUCH": "Midas Hand",
"O_KEY_HOLE_1": "Keyhole 1",
"O_KEY_HOLE_2": "Keyhole 1",
"O_KEY_HOLE_3": "Keyhole 1",
"O_KEY_HOLE_4": "Keyhole 1",
"O_SCION_HOLDER": "Scion Holder",
"O_EXPLOSION_1": "Explosion 1",
"O_EXPLOSION_2": "Explosion 2",
"O_SPLASH_1": "Splash 1",
"O_SPLASH_2": "Splash 2",
"O_BUBBLES_1": "Bubbles 1",
"O_BUBBLES_2": "Bubbles 2",
"O_BUBBLE_EMITTER": "Bubbles Emitter",
"O_BLOOD_1": "Blood 1",
"O_BLOOD_2": "Blood 2",
"O_DART_EFFECT": "Dart Effect",
"O_STATUE": "Statue",
"O_PORTACABIN": "Portable Cabin",
"O_PODS": "Pod",
"O_RICOCHET_1": "Ricochet",
"O_TWINKLE": "Sparkles",
"O_GUN_FLASH": "Gun Flash",
"O_DUST": "Dust",
"O_BODY_PART": "Body Part",
"O_CAMERA_TARGET": "Camera Target",
"O_WATERFALL": "Waterfall Mist",
"O_MISSILE_1": "Missile 1",
"O_MISSILE_2": "Missile 2",
"O_MISSILE_3": "Missile 3",
"O_MISSILE_4": "Missile 4",
"O_MISSILE_5": "Missile 5",
"O_EMBER": "Ember",
"O_EMBER_EMITTER": "Ember Emitter",
"O_FLAME": "Flame",
"O_FLAME_EMITTER": "Flame Emitter",
"O_LAVA_WEDGE": "Lava Wedge",
"O_BIG_POD": "Big Pod",
"O_BOAT": "Boat",
"O_EARTHQUAKE": "Earthquake",
"O_SKYBOX": "Skybox",
"O_PICKUP_AID": "Pickup Aid",
"O_TEMP_7": "Temp 7",
"O_TEMP_8": "Temp 8",
"O_TEMP_9": "Temp 9",
"O_TEMP_10": "Temp 10",
"O_HAIR": "Lara's Braid",
"O_ALPHABET": "Alphabet",
"objects": {
"small_medipack": {"name": "Small Medi Pack"},
"large_medipack": {"name": "Large Medi Pack"},
"pistols": {"name": "Pistols"},
"shotgun": {"name": "Shotgun"},
"magnums": {"name": "Magnums"},
"uzis": {"name": "Uzis"},
"pistol_ammo": {"name": "Pistol Clips"},
"shotgun_ammo": {"name": "Shotgun Shells"},
"magnums_ammo": {"name": "Magnum Clips"},
"uzis_ammo": {"name": "Uzi Clips"},
"grenade": {"name": "Grenade"},
"key_1": {"name": "Key 1"},
"key_2": {"name": "Key 2"},
"key_3": {"name": "Key 3"},
"key_4": {"name": "Key 4"},
"puzzle_1": {"name": "Puzzle Item 1"},
"puzzle_2": {"name": "Puzzle Item 2"},
"puzzle_3": {"name": "Puzzle Item 3"},
"puzzle_4": {"name": "Puzzle Item 4"},
"pickup_1": {"name": "Pickup Item 1"},
"pickup_2": {"name": "Pickup Item 2"},
"lead_bar": {"name": "Lead Bar"},
"scion": {"name": "Scion"},
"compass": {"name": "Compass"},
"passport": {"name": "Game"},
"photo": {"name": "Lara's Home"},
"graphics": {"name": "Detail Levels"},
"controls": {"name": "Controls"},
"sound": {"name": "Sound"},
"gamma": {"name": "Gamma"},
"map": {"name": "Map"},
"lara": {"name": "Lara"},
"pistol_anim": {"name": "Pistols Animation"},
"shotgun_anim": {"name": "Shotgun Animation"},
"magnum_anim": {"name": "Magnums Animation"},
"uzi_anim": {"name": "Uzis Animation"},
"lara_extra": {"name": "Lara's Extra Animation"},
"bacon_lara": {"name": "Bacon Lara"},
"wolf": {"name": "Wolf"},
"bear": {"name": "Bear"},
"bat": {"name": "Bat"},
"crocodile": {"name": "Crocodile"},
"alligator": {"name": "Alligator"},
"lion": {"name": "Lion"},
"lioness": {"name": "Lioness"},
"puma": {"name": "Puma"},
"ape": {"name": "Ape"},
"rat": {"name": "Rat"},
"vole": {"name": "Vole"},
"trex": {"name": "T-Rex"},
"raptor": {"name": "Raptor"},
"mutant_1": {"name": "Mutant 1"},
"mutant_2": {"name": "Mutant 2"},
"mutant_3": {"name": "Mutant 3"},
"centaur": {"name": "Centaur"},
"mummy": {"name": "Mummy"},
"dino_mutant": {"name": "Dino Mutant"},
"fish_mutant": {"name": "Mutant Fish"},
"larson": {"name": "Larson"},
"pierre": {"name": "Pierre"},
"skateboard": {"name": "Skateboard"},
"skate_kid": {"name": "Skate Kid"},
"cowboy": {"name": "Cowboy"},
"baldy": {"name": "Baldy"},
"natla": {"name": "Natla"},
"torso": {"name": "Torso"},
"falling_block": {"name": "Falling Block"},
"pendulum": {"name": "Pendulum"},
"spikes": {"name": "Spikes"},
"rolling_ball": {"name": "Boulder"},
"dart": {"name": "Dart"},
"dart_emitter": {"name": "Dart Emitter"},
"drawbridge": {"name": "Drawbridge"},
"teeth_trap": {"name": "Teeth Trap"},
"damocles_sword": {"name": "Damocles Sword"},
"thors_handle": {"name": "Thor's Hammer Handle"},
"thors_head": {"name": "Thor's Hammer"},
"lightning_emitter": {"name": "Lightning Emitter"},
"moving_bar": {"name": "Moving Bar"},
"movable_block_1": {"name": "Push Block 1"},
"movable_block_2": {"name": "Push Block 2"},
"movable_block_3": {"name": "Push Block 3"},
"movable_block_4": {"name": "Push Block 4"},
"sliding_pillar": {"name": "Sliding Pillar"},
"falling_ceiling_1": {"name": "Falling Ceiling 1"},
"falling_ceiling_2": {"name": "Falling Ceiling 2"},
"switch_1": {"name": "Switch 1"},
"switch_2": {"name": "Switch 2"},
"door_1": {"name": "Door 1"},
"door_2": {"name": "Door 2"},
"door_3": {"name": "Door 3"},
"door_4": {"name": "Door 4"},
"door_5": {"name": "Door 5"},
"door_6": {"name": "Door 6"},
"door_7": {"name": "Door 7"},
"door_8": {"name": "Door 8"},
"trapdoor_1": {"name": "Trapdoor 1"},
"trapdoor_2": {"name": "Trapdoor 2"},
"big_trapdoor": {"name": "Big Trapdoor"},
"bridge_flat": {"name": "Bridge Flat"},
"bridge_tilt_1": {"name": "Bridge Tilt 1"},
"bridge_tilt_2": {"name": "Bridge Tilt 2"},
"cog_1": {"name": "Cog 1"},
"cog_2": {"name": "Cog 2"},
"cog_3": {"name": "Cog 3"},
"player_1": {"name": "Cutscene Actor 1"},
"player_2": {"name": "Cutscene Actor 2"},
"player_3": {"name": "Cutscene Actor 3"},
"player_4": {"name": "Cutscene Actor 4"},
"save_crystal": {"name": "Savegame Crystal"},
"puzzle_hole_1": {"name": "Puzzle Hole 1 (Empty)"},
"puzzle_hole_2": {"name": "Puzzle Hole 2 (Empty)"},
"puzzle_hole_3": {"name": "Puzzle Hole 3 (Empty)"},
"puzzle_hole_4": {"name": "Puzzle Hole 4 (Empty)"},
"puzzle_done_1": {"name": "Puzzle Hole 1 (Done)"},
"puzzle_done_2": {"name": "Puzzle Hole 2 (Done)"},
"puzzle_done_3": {"name": "Puzzle Hole 3 (Done)"},
"puzzle_done_4": {"name": "Puzzle Hole 4 (Done)"},
"midas_touch": {"name": "Midas Hand"},
"key_hole_1": {"name": "Keyhole 1"},
"key_hole_2": {"name": "Keyhole 1"},
"key_hole_3": {"name": "Keyhole 1"},
"key_hole_4": {"name": "Keyhole 1"},
"scion_holder": {"name": "Scion Holder"},
"explosion_1": {"name": "Explosion 1"},
"explosion_2": {"name": "Explosion 2"},
"splash_1": {"name": "Splash 1"},
"splash_2": {"name": "Splash 2"},
"bubbles_1": {"name": "Bubbles 1"},
"bubbles_2": {"name": "Bubbles 2"},
"bubble_emitter": {"name": "Bubbles Emitter"},
"blood_1": {"name": "Blood 1"},
"blood_2": {"name": "Blood 2"},
"dart_effect": {"name": "Dart Effect"},
"statue": {"name": "Statue"},
"portacabin": {"name": "Portable Cabin"},
"pods": {"name": "Pod"},
"ricochet_1": {"name": "Ricochet"},
"twinkle": {"name": "Sparkles"},
"gun_flash": {"name": "Gun Flash"},
"dust": {"name": "Dust"},
"body_part": {"name": "Body Part"},
"camera_target": {"name": "Camera Target"},
"waterfall": {"name": "Waterfall Mist"},
"missile_1": {"name": "Missile 1"},
"missile_2": {"name": "Missile 2"},
"missile_3": {"name": "Missile 3"},
"missile_4": {"name": "Missile 4"},
"missile_5": {"name": "Missile 5"},
"ember": {"name": "Ember"},
"ember_emitter": {"name": "Ember Emitter"},
"flame": {"name": "Flame"},
"flame_emitter": {"name": "Flame Emitter"},
"lava_wedge": {"name": "Lava Wedge"},
"big_pod": {"name": "Big Pod"},
"boat": {"name": "Boat"},
"earthquake": {"name": "Earthquake"},
"skybox": {"name": "Skybox"},
"pickup_aid": {"name": "Pickup Aid"},
"temp_7": {"name": "Temp 7"},
"temp_8": {"name": "Temp 8"},
"temp_9": {"name": "Temp 9"},
"temp_10": {"name": "Temp 10"},
"hair": {"name": "Lara's Braid"},
"alphabet": {"name": "Alphabet"},
},
"game_strings": {
@ -304,35 +331,6 @@
"HEADING_INVENTORY": "INVENTORY",
"HEADING_ITEMS": "ITEMS",
"HEADING_OPTION": "OPTION",
"INV_ITEM_COMPASS": "Compass",
"INV_ITEM_CONTROLS": "Controls",
"INV_ITEM_DETAILS": "Detail Levels",
"INV_ITEM_GAME": "Game",
"INV_ITEM_GRENADE": "Grenade",
"INV_ITEM_KEY_1": "Key",
"INV_ITEM_KEY_2": "Key",
"INV_ITEM_KEY_3": "Key",
"INV_ITEM_KEY_4": "Key",
"INV_ITEM_LARAS_HOME": "Lara's Home",
"INV_ITEM_LARGE_MEDIPACK": "Large Medi Pack",
"INV_ITEM_LEADBAR": "Lead Bar",
"INV_ITEM_MAGNUM": "Magnums",
"INV_ITEM_MAGNUM_AMMO": "Magnum Clips",
"INV_ITEM_PICKUP_1": "Pickup",
"INV_ITEM_PICKUP_2": "Pickup",
"INV_ITEM_PISTOLS": "Pistols",
"INV_ITEM_PISTOL_AMMO": "Pistol Clips",
"INV_ITEM_PUZZLE_1": "Puzzle",
"INV_ITEM_PUZZLE_2": "Puzzle",
"INV_ITEM_PUZZLE_3": "Puzzle",
"INV_ITEM_PUZZLE_4": "Puzzle",
"INV_ITEM_SCION": "Scion",
"INV_ITEM_SHOTGUN": "Shotgun",
"INV_ITEM_SHOTGUN_AMMO": "Shotgun Shells",
"INV_ITEM_SMALL_MEDIPACK": "Small Medi Pack",
"INV_ITEM_SOUND": "Sound",
"INV_ITEM_UZI": "Uzis",
"INV_ITEM_UZI_AMMO": "Uzi Clips",
"ITEM_EXAMINE_ROLE": "\\{button empty} %s: Examine",
"ITEM_USE_ROLE": "\\{button empty} %s: Use",
"KEYMAP_ACTION": "Action",

View file

@ -2,9 +2,9 @@
"levels": [
// Level 2: City of Vilcabamba
{
"game_strings": {
"INV_ITEM_KEY_1": "Silver Key",
"INV_ITEM_PUZZLE_1": "Gold Idol"
"objects": {
"key_1": {"name": "Silver Key"},
"puzzle_1": {"name": "Gold Idol"},
},
},

View file

@ -2,15 +2,15 @@
"levels": [
// Level 0: Return to Egypt
{
"game_strings": {
"INV_ITEM_KEY_1": "Gold Key",
"objects": {
"key_1": {"name": "Gold Key"},
},
},
// Level 1: Temple of the Cat
{
"game_strings": {
"INV_ITEM_KEY_1": "Ornate Key",
"objects": {
"key_1": {"name": "Ornate Key"},
},
},

View file

@ -1,6 +1,6 @@
{
// NOTE: bad changes to this file may result in crashes.
// Lines starting with double slashes are comments and are ignored.
// For usage, refer to the documentation here:
// https://github.com/LostArtefacts/TRX/blob/stable/docs/GAME_STRINGS.md
"levels": [
// 0. Lara's Home
@ -8,53 +8,53 @@
// 1. The Great Wall
{
"game_strings": {
"INV_ITEM_KEY_1": "Guardhouse Key",
"INV_ITEM_KEY_2": "Rusty Key",
"objects": {
"key_1": {"name": "Guardhouse Key"},
"key_2": {"name": "Rusty Key"},
},
},
// 2. Venice
{
"game_strings": {
"INV_ITEM_KEY_1": "Boathouse Key",
"INV_ITEM_KEY_2": "Steel Key",
"INV_ITEM_KEY_3": "Iron Key",
"objects": {
"key_1": {"name": "Boathouse Key"},
"key_2": {"name": "Steel Key"},
"key_3": {"name": "Iron Key"},
},
},
// 3. Bartoli's Hideout
{
"game_strings": {
"INV_ITEM_KEY_1": "Library Key",
"INV_ITEM_KEY_2": "Detonator Key",
"objects": {
"key_1": {"name": "Library Key"},
"key_2": {"name": "Detonator Key"},
},
},
// 4. Opera House
{
"game_strings": {
"INV_ITEM_KEY_1": "Ornate Key",
"INV_ITEM_PUZZLE_1": "Relay Box",
"INV_ITEM_PUZZLE_2": "Circuit Board",
"objects": {
"key_1": {"name": "Ornate Key"},
"puzzle_1": {"name": "Relay Box"},
"puzzle_2": {"name": "Circuit Board"},
},
},
// 5. Offshore Rig
{
"game_strings": {
"INV_ITEM_KEY_1": "Red Pass Card",
"INV_ITEM_KEY_2": "Yellow Pass Card",
"INV_ITEM_KEY_3": "Green Pass Card",
"objects": {
"key_1": {"name": "Red Pass Card"},
"key_2": {"name": "Yellow Pass Card"},
"key_3": {"name": "Green Pass Card"},
},
},
// 6. Diving Area
{
"game_strings": {
"INV_ITEM_KEY_1": "Red Pass Card",
"INV_ITEM_KEY_4": "Blue Pass Card",
"INV_ITEM_PUZZLE_1": "Machine Chip",
"objects": {
"key_1": {"name": "Red Pass Card"},
"key_4": {"name": "Blue Pass Card"},
"puzzle_1": {"name": "Machine Chip"},
},
},
@ -63,347 +63,373 @@
// 8. Wreck of the Maria Doria
{
"game_strings": {
"INV_ITEM_KEY_1": "Rest Room Key",
"INV_ITEM_KEY_2": "Rusty Key",
"INV_ITEM_KEY_3": "Cabin Key",
"INV_ITEM_PUZZLE_1": "Circuit Breaker",
"objects": {
"key_1": {"name": "Rest Room Key"},
"key_2": {"name": "Rusty Key"},
"key_3": {"name": "Cabin Key"},
"puzzle_1": {"name": "Circuit Breaker"},
},
},
// 9. Living Quarters
{
"game_strings": {
"INV_ITEM_KEY_1": "Theatre Key",
"INV_ITEM_KEY_2": "Rusty Key",
"objects": {
"key_1": {"name": "Theatre Key"},
"key_2": {"name": "Rusty Key"},
},
},
// 10. The Deck
{
"game_strings": {
"INV_ITEM_KEY_2": "Stern Key",
"INV_ITEM_KEY_3": "Storage Key",
"INV_ITEM_KEY_4": "Cabin Key",
"INV_ITEM_PUZZLE_4": "The Seraph",
"objects": {
"key_2": {"name": "Stern Key"},
"key_3": {"name": "Storage Key"},
"key_4": {"name": "Cabin Key"},
"puzzle_4": {"name": "The Seraph"},
},
},
// 11. Tibetan Foothills
{
"object_names": {
"O_TIGER": "Snow Leopard",
},
"game_strings": {
"INV_ITEM_KEY_1": "Drawbridge Key",
"INV_ITEM_KEY_2": "Hut Key",
"INV_ITEM_PUZZLE_4": "The Seraph",
"objects": {
"tiger": {"name": "Snow Leopard"},
"key_1": {"name": "Drawbridge Key"},
"key_2": {"name": "Hut Key"},
"puzzle_4": {"name": "The Seraph"},
},
},
// 12. Barkhang Monastery
{
"game_strings": {
"INV_ITEM_KEY_1": "Strongroom Key",
"INV_ITEM_KEY_2": "Trapdoor Key",
"INV_ITEM_KEY_3": "Rooftops Key",
"INV_ITEM_KEY_4": "Main Hall Key",
"INV_ITEM_PUZZLE_1": "Prayer Wheels",
"INV_ITEM_PUZZLE_2": "Gemstones",
"INV_ITEM_PUZZLE_4": "The Seraph",
"objects": {
"key_1": {"name": "Strongroom Key"},
"key_2": {"name": "Trapdoor Key"},
"key_3": {"name": "Rooftops Key"},
"key_4": {"name": "Main Hall Key"},
"puzzle_1": {"name": "Prayer Wheels"},
"puzzle_2": {"name": "Gemstones"},
"puzzle_4": {"name": "The Seraph"},
},
},
// 13. Catacombs of the Talion
{
"object_names": {
"O_TIGER": "Snow Leopard",
},
"game_strings": {
"INV_ITEM_PICKUP_1": "Gong Hammer",
"INV_ITEM_PUZZLE_1": "Tibetan Mask",
"objects": {
"tiger": {"name": "Snow Leopard"},
"pickup_1": {"name": "Gong Hammer"},
"puzzle_1": {"name": "Tibetan Mask"},
},
},
// 14. Ice Palace
{
"object_names": {
"O_TIGER": "Snow Leopard",
},
"game_strings": {
"INV_ITEM_KEY_2": "Gong Hammer",
"INV_ITEM_PICKUP_2": "Talion",
"INV_ITEM_PUZZLE_1": "Tibetan Mask",
"objects": {
"tiger": {"name": "Snow Leopard"},
"key_2": {"name": "Gong Hammer"},
"pickup_2": {"name": "Talion"},
"puzzle_1": {"name": "Tibetan Mask"},
},
},
// 15. Temple of Xian
{
"game_strings": {
"INV_ITEM_KEY_2": "Gold Key",
"INV_ITEM_KEY_3": "Silver Key",
"INV_ITEM_KEY_4": "Main Chamber Key",
"INV_ITEM_PUZZLE_1": "The Dragon Seal",
"objects": {
"key_2": {"name": "Gold Key"},
"key_3": {"name": "Silver Key"},
"key_4": {"name": "Main Chamber Key"},
"puzzle_1": {"name": "The Dragon Seal"},
},
},
// 16. Floating Islands
{
"game_strings": {
"INV_ITEM_PUZZLE_1": "Mystic Plaque",
"INV_ITEM_PUZZLE_2": "Mystic Plaque",
"objects": {
"puzzle_1": {"name": "Mystic Plaque"},
"puzzle_2": {"name": "Mystic Plaque"},
},
},
// 17. The Dragon's Lair
{
"game_strings": {
"INV_ITEM_PUZZLE_1": "Mystic Plaque",
"INV_ITEM_PUZZLE_2": "Dagger of Xian",
"objects": {
"puzzle_1": {"name": "Mystic Plaque"},
"puzzle_2": {"name": "Dagger of Xian"},
},
},
// 18. Home Sweet Home
{
"game_strings": {
"INV_ITEM_KEY_1": "Gun Cupboard Key",
"INV_ITEM_PUZZLE_1": "Dagger of Xian",
"objects": {
"key_1": {"name": "Gun Cupboard Key"},
"puzzle_1": {"name": "Dagger of Xian"},
},
},
// 19. Demo 1
{
"game_strings": {
"INV_ITEM_KEY_1": "Boathouse Key",
"INV_ITEM_KEY_2": "Steel Key",
"INV_ITEM_KEY_3": "Iron Key",
"objects": {
"key_1": {"name": "Boathouse Key"},
"key_2": {"name": "Steel Key"},
"key_3": {"name": "Iron Key"},
},
},
// 20. Demo 2
{
"game_strings": {
"INV_ITEM_KEY_1": "Rest Room Key",
"INV_ITEM_KEY_2": "Rusty Key",
"INV_ITEM_KEY_3": "Cabin Key",
"INV_ITEM_PUZZLE_1": "Circuit Breaker",
"objects": {
"key_1": {"name": "Rest Room Key"},
"key_2": {"name": "Rusty Key"},
"key_3": {"name": "Cabin Key"},
"puzzle_1": {"name": "Circuit Breaker"},
},
},
// 21. Demo 3
{
"game_strings": {
"INV_ITEM_KEY_1": "Drawbridge Key",
"INV_ITEM_KEY_2": "Hut Key",
"INV_ITEM_PUZZLE_4": "The Seraph",
"objects": {
"key_1": {"name": "Drawbridge Key"},
"key_2": {"name": "Hut Key"},
"puzzle_4": {"name": "The Seraph"},
},
},
],
"object_names": {
"O_LARA": "Lara",
"O_LARA_PISTOLS": "Pistols Animation",
"O_LARA_HAIR": "Braid",
"O_LARA_SHOTGUN": "Shotgun Animation",
"O_LARA_MAGNUMS": "Magnums Animation",
"O_LARA_UZIS": "Uzis Animation",
"O_LARA_M16": "M16 Animation",
"O_LARA_GRENADE": "Grenade Launcher Animation",
"O_LARA_HARPOON": "Harpoon Animation",
"O_LARA_FLARE": "Flare Animation",
"O_LARA_SKIDOO": "Snowmobile Animation",
"O_LARA_BOAT": "Boat Animation",
"O_LARA_EXTRA": "Lara's Extra Animation",
"O_SKIDOO_FAST": "Red Snowmobile",
"O_BOAT": "Boat",
"O_DOG": "Dog",
"O_CULT_1": "Masked Goon 1",
"O_CULT_1A": "Masked Goon 2",
"O_CULT_1B": "Masked Goon 3",
"O_CULT_2": "Knife Thrower",
"O_CULT_3": "Shotgun Goon",
"O_MOUSE": "Rat",
"O_DRAGON_FRONT": "Dragon Front",
"O_DRAGON_BACK": "Dragon Back",
"O_GONDOLA": "Gondola",
"O_SHARK": "Shark",
"O_EEL": "Eel",
"O_BIG_EEL": "Big Eel",
"O_BARRACUDA": "Barracuda",
"O_DIVER": "Scuba Diver",
"O_WORKER_1": "Gunman Goon 1",
"O_WORKER_2": "Gunman Goon 2",
"O_WORKER_3": "Stick Wielding Goon 1",
"O_WORKER_4": "Stick Wielding Goon 2",
"O_WORKER_5": "Flamethrower Goon",
"O_JELLY": "Jellyfish",
"O_SPIDER": "Spider",
"O_BIG_SPIDER": "Giant Spider",
"O_CROW": "Crow",
"O_TIGER": "Tiger",
"O_BARTOLI": "Marco Bartoli",
"O_XIAN_SPEARMAN": "Xian Spearman",
"O_XIAN_SPEARMAN_STATUE": "Xian Spearman Statue",
"O_XIAN_KNIGHT": "Xian Knight",
"O_XIAN_KNIGHT_STATUE": "Xian Knight",
"O_YETI": "Yeti",
"O_BIRD_GUARDIAN": "Bird Monster",
"O_EAGLE": "Eagle",
"O_BANDIT_1": "Mercenary 1",
"O_BANDIT_2": "Mercenary 2",
"O_BANDIT_2B": "Mercenary 3",
"O_SKIDOO_ARMED": "Black Snowmobile",
"O_SKIDOO_DRIVER": "Black Snowmobile Driver",
"O_MONK_1": "Monk 1",
"O_MONK_2": "Monk 2",
"O_FALLING_BLOCK_1": "Falling Block 1",
"O_FALLING_BLOCK_2": "Falling Block 2",
"O_FALLING_BLOCK_3": "Loose Boards",
"O_PENDULUM_1": "Sandbag",
"O_SPIKES": "Spikes",
"O_ROLLING_BALL_1": "Boulder 1",
"O_DART": "Disc",
"O_DART_EMITTER": "Disc Emitter",
"O_DRAWBRIDGE": "Drawbridge",
"O_TEETH_TRAP": "Teeth Trap",
"O_LIFT": "Lift",
"O_GENERAL": "Minisub",
"O_MOVABLE_BLOCK_1": "Push Block 1",
"O_MOVABLE_BLOCK_2": "Push Block 2",
"O_MOVABLE_BLOCK_3": "Push Block 3",
"O_MOVABLE_BLOCK_4": "Push Block 4",
"O_BIG_BOWL": "Lava Bowl",
"O_WINDOW_1": "Breakable Window 1",
"O_WINDOW_2": "Breakable Window 2",
"O_WINDOW_3": "Breakable Window 3",
"O_WINDOW_4": "Breakable Window 4",
"O_PROPELLER_1": "Airplane Propeller",
"O_POWER_SAW": "Power Saw",
"O_HOOK": "Hook",
"O_FALLING_CEILING": "Falling Ceiling",
"O_SPINNING_BLADE": "Spinning Blade",
"O_BLADE": "Wall-mounted Blade",
"O_KILLER_STATUE": "Statue with Sword",
"O_ROLLING_BALL_2": "Boulder 2",
"O_ICICLE": "Icicles",
"O_SPIKE_WALL": "Spike Wall",
"O_SPRINGBOARD": "Springboard",
"O_CEILING_SPIKES": "Spiky Ceiling",
"O_BELL": "Bell",
"O_WATER_SPRITE": "Boat Wake",
"O_SNOW_SPRITE": "Snowmobile Wale",
"O_SKIDOO_TRACK": "Snowmobile Track",
"O_SWITCH_TYPE_AIRLOCK": "Airlock Switch",
"O_SWITCH_TYPE_SMALL": "Small Switch",
"O_PROPELLER_2": "Underwater Propeller",
"O_PROPELLER_3": "Air Fan",
"O_PENDULUM_2": "Swinging Box",
"O_MESH_SWAP_1": "Mesh Swap 1",
"O_MESH_SWAP_2": "Mesh Swap 2",
"O_LARA_SWAP": "Lara Mesh Swap",
"O_TEXT_BOX": "UI Frame",
"O_ROLLING_BALL_3": "Boulder 3",
"O_ZIPLINE_HANDLE": "Zipline Handle",
"O_SWITCH_TYPE_BUTTON": "Switch Button",
"O_SWITCH_TYPE_NORMAL": "Lever/Switch",
"O_SWITCH_TYPE_UW": "Underwater Lever/Switch",
"O_DOOR_TYPE_1": "Door 1",
"O_DOOR_TYPE_2": "Door 2",
"O_DOOR_TYPE_3": "Door 3",
"O_DOOR_TYPE_4": "Door 4",
"O_DOOR_TYPE_5": "Door 5",
"O_DOOR_TYPE_6": "Door 6",
"O_DOOR_TYPE_7": "Door 7",
"O_DOOR_TYPE_8": "Door 8",
"O_TRAPDOOR_TYPE_1": "Trapdoor 1",
"O_TRAPDOOR_TYPE_2": "Trapdoor 2",
"O_TRAPDOOR_TYPE_3": "Trapdoor 3",
"O_BRIDGE_FLAT": "Bridge Flat",
"O_BRIDGE_TILT_1": "Bridge Tilt 1",
"O_BRIDGE_TILT_2": "Bridge Tilt 2",
"O_PLAYER_1": "Cutscene Actor 1",
"O_PLAYER_2": "Cutscene Actor 2",
"O_PLAYER_3": "Cutscene Actor 3",
"O_PLAYER_4": "Cutscene Actor 4",
"O_PLAYER_5": "Cutscene Actor 5",
"O_PLAYER_6": "Cutscene Actor 6",
"O_PLAYER_7": "Cutscene Actor 7",
"O_PLAYER_8": "Cutscene Actor 8",
"O_PLAYER_9": "Cutscene Actor 9",
"O_PLAYER_10": "Cutscene Actor 10",
"O_FLARES_ITEM": "Flares Box",
"O_GAMMA_OPTION": "Gamma Option",
"O_PUZZLE_HOLE_1": "Puzzle Hole 1 (Empty)",
"O_PUZZLE_HOLE_2": "Puzzle Hole 2 (Empty)",
"O_PUZZLE_HOLE_3": "Puzzle Hole 3 (Empty)",
"O_PUZZLE_HOLE_4": "Puzzle Hole 4 (Empty)",
"O_PUZZLE_DONE_1": "Puzzle Hole 1 (Done)",
"O_PUZZLE_DONE_2": "Puzzle Hole 2 (Done)",
"O_PUZZLE_DONE_3": "Puzzle Hole 3 (Done)",
"O_PUZZLE_DONE_4": "Puzzle Hole 4 (Done)",
"O_SECRET_1": "Secret 1",
"O_SECRET_2": "Secret 2",
"O_SECRET_3": "Secret 3",
"O_KEY_HOLE_1": "Keyhole 1",
"O_KEY_HOLE_2": "Keyhole 2",
"O_KEY_HOLE_3": "Keyhole 3",
"O_KEY_HOLE_4": "Keyhole 4",
"O_SPHERE_OF_DOOM_1": "Dragon Explosion 1",
"O_SPHERE_OF_DOOM_2": "Dragon Explosion 2",
"O_SPHERE_OF_DOOM_3": "Dragon Explosion 3",
"O_ALARM_SOUND": "Alarm",
"O_BIRD_TWEETER_1": "Dripping Water",
"O_DINO": "T-Rex",
"O_BIRD_TWEETER_2": "Singing Birds",
"O_CLOCK_CHIMES": "Bartoli Hideout clock",
"O_DRAGON_BONES_1": "Placeholder",
"O_DRAGON_BONES_2": "Dragon Bones Front",
"O_DRAGON_BONES_3": "Dragon Bones Back",
"O_HOT_LIQUID": "Extra Fire",
"O_BOAT_BITS": "Boat Bits",
"O_MINE": "Aquatic Mine",
"O_INV_BACKGROUND": "Menu Background",
"O_FX_RESERVED": "Gray disk",
"O_GONG_BONGER": "Gong Stick",
"O_DETONATOR_1": "Gong",
"O_DETONATOR_2": "Detonator Box",
"O_COPTER": "Helicopter",
"O_EXPLOSION": "Explosion",
"O_SPLASH": "Water Ripples",
"O_BUBBLE": "Bubble",
"O_BUBBLE_EMITTER": "Bubbles Emitter",
"O_BLOOD": "Blood",
"O_DART_EFFECT": "Dart Effect",
"O_FLARE_FIRE": "Flare sparks",
"O_GLOW": "Glow",
"O_GLOW_RESERVED": "Map Glow",
"O_RICOCHET": "Ricochet",
"O_TWINKLE": "Sparkles",
"O_GUN_FLASH": "Gun Flash",
"O_M16_FLASH": "M16 Flash",
"O_BODY_PART": "Body Part",
"O_CAMERA_TARGET": "Camera Target",
"O_WATERFALL": "Waterfall Mist",
"O_MISSILE_HARPOON": "Missile Harpoon",
"O_MISSILE_FLAME": "Missile Flame",
"O_MISSILE_KNIFE": "Missile Knife",
"O_GRENADE": "Grenade",
"O_HARPOON_BOLT": "Harpoon Bolt",
"O_EMBER": "Ember",
"O_EMBER_EMITTER": "Ember Emitter",
"O_FLAME": "Flame",
"O_FLAME_EMITTER": "Flame Emitter",
"O_SKYBOX": "Skybox",
"O_ALPHABET": "Alphabet",
"O_DYING_MONK": "Dying monk",
"O_DING_DONG": "Doorbell",
"O_LARA_ALARM": "Alarm Bell",
"O_MINI_COPTER": "Helicopter 2",
"O_WINSTON": "Winston",
"O_ASSAULT_DIGITS": "Assault Digits",
"O_FINAL_LEVEL_COUNTER": "Final Level Counter",
"O_CUT_SHOTGUN": "Shotgun Shower Animation",
"O_EARTHQUAKE": "Earthquake",
"objects": {
"small_medipack": {"name": "Small Medipack"},
"large_medipack": {"name": "Large Medipack"},
"flare": {"name": "Flare"},
"flares_box": {"name": "Flares Box"},
"secret_1": {"name": "Secret 1"},
"secret_2": {"name": "Secret 2"},
"secret_3": {"name": "Secret 3"},
"pistols": {"name": "Pistols"},
"shotgun": {"name": "Shotgun"},
"magnums": {"name": "Automatic Pistols"},
"uzis": {"name": "Uzis"},
"harpoon_gun": {"name": "Harpoon Gun"},
"m16": {"name": "M16"},
"grenade_launcher": {"name": "Grenade Launcher"},
"pistols_ammo": {"name": "Pistol Clips"},
"shotgun_ammo": {"name": "Shotgun Shells"},
"magnums_ammo": {"name": "Automatic Pistol Clips"},
"uzis_ammo": {"name": "Uzi Clips"},
"harpoon_gun_ammo": {"name": "Harpoons"},
"m16_ammo": {"name": "M16 Clips"},
"grenade_launcher_ammo": {"name": "Grenades"},
"key_1": {"name": "Key 1"},
"key_2": {"name": "Key 2"},
"key_3": {"name": "Key 3"},
"key_4": {"name": "Key 4"},
"puzzle_1": {"name": "Puzzle Item 1"},
"puzzle_2": {"name": "Puzzle Item 2"},
"puzzle_3": {"name": "Puzzle Item 3"},
"puzzle_4": {"name": "Puzzle Item 4"},
"pickup_1": {"name": "Pickup Item 1"},
"pickup_2": {"name": "Pickup Item 2"},
"compass": {"name": "Statistics"},
"passport": {"name": "Game"},
"photo": {"name": "Lara's Home"},
"graphics": {"name": "Detail Levels"},
"controls": {"name": "Controls"},
"sound": {"name": "Sound"},
"lara": {"name": "Lara"},
"lara_pistols": {"name": "Pistols Animation"},
"lara_hair": {"name": "Braid"},
"lara_shotgun": {"name": "Shotgun Animation"},
"lara_magnums": {"name": "Magnums Animation"},
"lara_uzis": {"name": "Uzis Animation"},
"lara_m16": {"name": "M16 Animation"},
"lara_grenade": {"name": "Grenade Launcher Animation"},
"lara_harpoon": {"name": "Harpoon Animation"},
"lara_flare": {"name": "Flare Animation"},
"lara_skidoo": {"name": "Snowmobile Animation"},
"lara_boat": {"name": "Boat Animation"},
"lara_extra": {"name": "Lara's Extra Animation"},
"skidoo_fast": {"name": "Red Snowmobile"},
"boat": {"name": "Boat"},
"dog": {"name": "Dog"},
"cult_1": {"name": "Masked Goon 1"},
"cult_1a": {"name": "Masked Goon 2"},
"cult_1b": {"name": "Masked Goon 3"},
"cult_2": {"name": "Knife Thrower"},
"cult_3": {"name": "Shotgun Goon"},
"mouse": {"name": "Rat"},
"dragon_front": {"name": "Dragon Front"},
"dragon_back": {"name": "Dragon Back"},
"gondola": {"name": "Gondola"},
"shark": {"name": "Shark"},
"eel": {"name": "Eel"},
"big_eel": {"name": "Big Eel"},
"barracuda": {"name": "Barracuda"},
"diver": {"name": "Scuba Diver"},
"worker_1": {"name": "Gunman Goon 1"},
"worker_2": {"name": "Gunman Goon 2"},
"worker_3": {"name": "Stick Wielding Goon 1"},
"worker_4": {"name": "Stick Wielding Goon 2"},
"worker_5": {"name": "Flamethrower Goon"},
"jelly": {"name": "Jellyfish"},
"spider": {"name": "Spider"},
"big_spider": {"name": "Giant Spider"},
"crow": {"name": "Crow"},
"tiger": {"name": "Tiger"},
"bartoli": {"name": "Marco Bartoli"},
"xian_spearman": {"name": "Xian Spearman"},
"xian_spearman_statue": {"name": "Xian Spearman Statue"},
"xian_knight": {"name": "Xian Knight"},
"xian_knight_statue": {"name": "Xian Knight"},
"yeti": {"name": "Yeti"},
"bird_guardian": {"name": "Bird Monster"},
"eagle": {"name": "Eagle"},
"bandit_1": {"name": "Mercenary 1"},
"bandit_2": {"name": "Mercenary 2"},
"bandit_2b": {"name": "Mercenary 3"},
"skidoo_armed": {"name": "Black Snowmobile"},
"skidoo_driver": {"name": "Black Snowmobile Driver"},
"monk_1": {"name": "Monk 1"},
"monk_2": {"name": "Monk 2"},
"falling_block_1": {"name": "Falling Block 1"},
"falling_block_2": {"name": "Falling Block 2"},
"falling_block_3": {"name": "Loose Boards"},
"pendulum_1": {"name": "Sandbag"},
"spikes": {"name": "Spikes"},
"rolling_ball_1": {"name": "Boulder 1"},
"dart": {"name": "Disc"},
"dart_emitter": {"name": "Disc Emitter"},
"drawbridge": {"name": "Drawbridge"},
"teeth_trap": {"name": "Teeth Trap"},
"lift": {"name": "Lift"},
"general": {"name": "Minisub"},
"movable_block_1": {"name": "Push Block 1"},
"movable_block_2": {"name": "Push Block 2"},
"movable_block_3": {"name": "Push Block 3"},
"movable_block_4": {"name": "Push Block 4"},
"big_bowl": {"name": "Lava Bowl"},
"window_1": {"name": "Breakable Window 1"},
"window_2": {"name": "Breakable Window 2"},
"window_3": {"name": "Breakable Window 3"},
"window_4": {"name": "Breakable Window 4"},
"propeller_1": {"name": "Airplane Propeller"},
"power_saw": {"name": "Power Saw"},
"hook": {"name": "Hook"},
"falling_ceiling": {"name": "Falling Ceiling"},
"spinning_blade": {"name": "Spinning Blade"},
"blade": {"name": "Wall-mounted Blade"},
"killer_statue": {"name": "Statue with Sword"},
"rolling_ball_2": {"name": "Boulder 2"},
"icicle": {"name": "Icicles"},
"spike_wall": {"name": "Spike Wall"},
"springboard": {"name": "Springboard"},
"ceiling_spikes": {"name": "Spiky Ceiling"},
"bell": {"name": "Bell"},
"water_sprite": {"name": "Boat Wake"},
"snow_sprite": {"name": "Snowmobile Wale"},
"skidoo_track": {"name": "Snowmobile Track"},
"switch_type_airlock": {"name": "Airlock Switch"},
"switch_type_small": {"name": "Small Switch"},
"propeller_2": {"name": "Underwater Propeller"},
"propeller_3": {"name": "Air Fan"},
"pendulum_2": {"name": "Swinging Box"},
"mesh_swap_1": {"name": "Mesh Swap 1"},
"mesh_swap_2": {"name": "Mesh Swap 2"},
"lara_swap": {"name": "Lara Mesh Swap"},
"text_box": {"name": "UI Frame"},
"rolling_ball_3": {"name": "Boulder 3"},
"zipline_handle": {"name": "Zipline Handle"},
"switch_type_button": {"name": "Switch Button"},
"switch_type_normal": {"name": "Lever/Switch"},
"switch_type_uw": {"name": "Underwater Lever/Switch"},
"door_type_1": {"name": "Door 1"},
"door_type_2": {"name": "Door 2"},
"door_type_3": {"name": "Door 3"},
"door_type_4": {"name": "Door 4"},
"door_type_5": {"name": "Door 5"},
"door_type_6": {"name": "Door 6"},
"door_type_7": {"name": "Door 7"},
"door_type_8": {"name": "Door 8"},
"trapdoor_type_1": {"name": "Trapdoor 1"},
"trapdoor_type_2": {"name": "Trapdoor 2"},
"trapdoor_type_3": {"name": "Trapdoor 3"},
"bridge_flat": {"name": "Bridge Flat"},
"bridge_tilt_1": {"name": "Bridge Tilt 1"},
"bridge_tilt_2": {"name": "Bridge Tilt 2"},
"player_1": {"name": "Cutscene Actor 1"},
"player_2": {"name": "Cutscene Actor 2"},
"player_3": {"name": "Cutscene Actor 3"},
"player_4": {"name": "Cutscene Actor 4"},
"player_5": {"name": "Cutscene Actor 5"},
"player_6": {"name": "Cutscene Actor 6"},
"player_7": {"name": "Cutscene Actor 7"},
"player_8": {"name": "Cutscene Actor 8"},
"player_9": {"name": "Cutscene Actor 9"},
"player_10": {"name": "Cutscene Actor 10"},
"key_hole_1": {"name": "Keyhole 1"},
"key_hole_2": {"name": "Keyhole 2"},
"key_hole_3": {"name": "Keyhole 3"},
"key_hole_4": {"name": "Keyhole 4"},
"puzzle_hole_1": {"name": "Puzzle Hole 1 (Empty)"},
"puzzle_hole_2": {"name": "Puzzle Hole 2 (Empty)"},
"puzzle_hole_3": {"name": "Puzzle Hole 3 (Empty)"},
"puzzle_hole_4": {"name": "Puzzle Hole 4 (Empty)"},
"puzzle_done_1": {"name": "Puzzle Hole 1 (Done)"},
"puzzle_done_2": {"name": "Puzzle Hole 2 (Done)"},
"puzzle_done_3": {"name": "Puzzle Hole 3 (Done)"},
"puzzle_done_4": {"name": "Puzzle Hole 4 (Done)"},
"sphere_of_doom_1": {"name": "Dragon Explosion 1"},
"sphere_of_doom_2": {"name": "Dragon Explosion 2"},
"sphere_of_doom_3": {"name": "Dragon Explosion 3"},
"alarm_sound": {"name": "Alarm"},
"bird_tweeter_1": {"name": "Dripping Water"},
"dino": {"name": "T-Rex"},
"bird_tweeter_2": {"name": "Singing Birds"},
"clock_chimes": {"name": "Bartoli Hideout clock"},
"dragon_bones_1": {"name": "Placeholder"},
"dragon_bones_2": {"name": "Dragon Bones Front"},
"dragon_bones_3": {"name": "Dragon Bones Back"},
"hot_liquid": {"name": "Extra Fire"},
"boat_bits": {"name": "Boat Bits"},
"mine": {"name": "Aquatic Mine"},
"inv_background": {"name": "Menu Background"},
"fx_reserved": {"name": "Gray disk"},
"gong_bonger": {"name": "Gong Stick"},
"detonator_1": {"name": "Gong"},
"detonator_2": {"name": "Detonator Box"},
"copter": {"name": "Helicopter"},
"explosion": {"name": "Explosion"},
"splash": {"name": "Water Ripples"},
"bubble": {"name": "Bubble"},
"bubble_emitter": {"name": "Bubbles Emitter"},
"blood": {"name": "Blood"},
"dart_effect": {"name": "Dart Effect"},
"flare_fire": {"name": "Flare sparks"},
"glow": {"name": "Glow"},
"glow_reserved": {"name": "Map Glow"},
"ricochet": {"name": "Ricochet"},
"twinkle": {"name": "Sparkles"},
"gun_flash": {"name": "Gun Flash"},
"m16_flash": {"name": "M16 Flash"},
"body_part": {"name": "Body Part"},
"camera_target": {"name": "Camera Target"},
"waterfall": {"name": "Waterfall Mist"},
"missile_harpoon": {"name": "Missile Harpoon"},
"missile_flame": {"name": "Missile Flame"},
"missile_knife": {"name": "Missile Knife"},
"grenade": {"name": "Grenade"},
"harpoon_bolt": {"name": "Harpoon Bolt"},
"ember": {"name": "Ember"},
"ember_emitter": {"name": "Ember Emitter"},
"flame": {"name": "Flame"},
"flame_emitter": {"name": "Flame Emitter"},
"skybox": {"name": "Skybox"},
"alphabet": {"name": "Alphabet"},
"dying_monk": {"name": "Dying monk"},
"ding_dong": {"name": "Doorbell"},
"lara_alarm": {"name": "Alarm Bell"},
"mini_copter": {"name": "Helicopter 2"},
"winston": {"name": "Winston"},
"assault_digits": {"name": "Assault Digits"},
"final_level_counter": {"name": "Final Level Counter"},
"cut_shotgun": {"name": "Shotgun Shower Animation"},
"earthquake": {"name": "Earthquake"},
},
"game_strings": {
@ -418,39 +444,6 @@
"HEADING_INVENTORY": "INVENTORY",
"HEADING_ITEMS": "ITEMS",
"HEADING_OPTION": "OPTION",
"INV_ITEM_CONTROLS": "Controls",
"INV_ITEM_DETAILS": "Detail Levels",
"INV_ITEM_FLARE": "Flare",
"INV_ITEM_GAME": "Game",
"INV_ITEM_GRENADE": "Grenade Launcher",
"INV_ITEM_GRENADE_AMMO": "Grenades",
"INV_ITEM_HARPOON": "Harpoon Gun",
"INV_ITEM_HARPOON_AMMO": "Harpoons",
"INV_ITEM_KEY_1": "Key",
"INV_ITEM_KEY_2": "Key",
"INV_ITEM_KEY_3": "Key",
"INV_ITEM_KEY_4": "Key",
"INV_ITEM_LARAS_HOME": "Lara's Home",
"INV_ITEM_LARGE_MEDIPACK": "Large Medi Pack",
"INV_ITEM_M16": "M16",
"INV_ITEM_M16_AMMO": "M16 Clips",
"INV_ITEM_MAGNUMS": "Automatic Pistols",
"INV_ITEM_MAGNUM_AMMO": "Automatic Pistol Clips",
"INV_ITEM_PICKUP_1": "Pickup",
"INV_ITEM_PICKUP_2": "Pickup",
"INV_ITEM_PISTOLS": "Pistols",
"INV_ITEM_PISTOL_AMMO": "Pistol Clips",
"INV_ITEM_PUZZLE_1": "Puzzle",
"INV_ITEM_PUZZLE_2": "Puzzle",
"INV_ITEM_PUZZLE_3": "Puzzle",
"INV_ITEM_PUZZLE_4": "Puzzle",
"INV_ITEM_SHOTGUN": "Shotgun",
"INV_ITEM_SHOTGUN_AMMO": "Shotgun Shells",
"INV_ITEM_SMALL_MEDIPACK": "Small Medi Pack",
"INV_ITEM_SOUND": "Sound",
"INV_ITEM_STOPWATCH": "Statistics",
"INV_ITEM_UZIS": "Uzis",
"INV_ITEM_UZI_AMMO": "Uzi Clips",
"KEYMAP_ACTION": "Action",
"KEYMAP_BACK": "Back",
"KEYMAP_CAMERA_BACK": "Camera Back",

172
docs/GAME_STRINGS.md Normal file
View file

@ -0,0 +1,172 @@
# TRX Game Strings Configuration
This document describes how to use the game strings. Game strings let users
translate the game and change the built-in object names for the purpose of
building custom levels. The configuration includes definitions for game levels,
objects, and all UI elements, and is structured in a JSON5 format which
permits comments.
## General structure
The document is organized as follows:
```json5
{
"levels": {
{
"objects": {
"key_1": {
"name": "Silver Key",
"description": "This shows when the player examines key1 in the inventory.",
},
"puzzle_1": {
"name": "Gold Idol",
"description": "You can use \n to make new lines and \f to make new pages.",
},
"key_2": {
"name": "Rusty Key",
},
// etc
},
"game_strings": {
"STATS_TIME_TAKEN": "...",
// etc
},
},
// etc
},
"objects": {
"lara": {"name": "Lara"},
// etc
},
"game_strings": {
"STATS_TIME_TAKEN": "...",
// etc
},
}
```
<table>
<tr valign="top" align="left">
<th>Property</th>
<th>Type</th>
<th>Required</th>
<th>Description</th>
</tr>
<tr valign="top">
<td>
<code>levels</code>
</td>
<td>Object&nbsp;array</td>
<td>No</td>
<td>
This is where overrides for individual level details are defined. If a
level doesn't override a string through its <code>objects</code> or
<code>game_strings</code>, it'll be looked up in the global scope next.
If the global scope doesn't define it either, it'll default to an
internal default value shipped with the engine.
</td>
</tr>
<tr valign="top">
<td>
<code>objects</code>
</td>
<td>Object&nbsp;array</td>
<td>No</td>
<td>
Object-related strings.
</td>
</tr>
<tr valign="top">
<td>
<code>game_strings</code>
</td>
<td>String-to-string map</td>
<td>No</td>
<td>
General game/UI strings.
</td>
</tr>
<tr valign="top">
<td>
<code>name</code>
</td>
<td>String</td>
<td>No</td>
<td colspan="2">
Allows to rename any object, including key items and pickups.
</td>
</tr>
<tr valign="top">
<td>
<code>description</code>
</td>
<td>String</td>
<td>No</td>
<td colspan="2">
Allows longer text descriptions to be defined for key and puzzle items.
Players can examine items in the inventory when this text has been
defined. Use <code>\n</code> in the text to create new lines; you can also
use <code>\f</code> to force a page break. Long text will be automatically
wrapped and paginated as necessary. If an empty string is defined, the UI
will not be shown and the inventory item simply focused instead.
</td>
</tr>
</table>
## Common Object IDs and names
| JSON key | Object ID (TR1) | Object ID (TR2) |
|------------|-----------------|-----------------|
| `key_1` | 129 and 133 | 193 and 197 |
| `key_2` | 130 and 134 | 194 and 198 |
| `key_3` | 131 and 135 | 195 and 199 |
| `key_4` | 132 and 136 | 196 and 200 |
| `pickup_1` | 141 and 148 | 205 and 207 |
| `pickup_2` | 142 and 149 | 206 and 208 |
| `puzzle_1` | 110 and 114 | 174 and 178 |
| `puzzle_2` | 111 and 115 | 175 and 179 |
| `puzzle_3` | 112 and 116 | 176 and 180 |
| `puzzle_4` | 113 and 117 | 177 and 181 |
| `secret_1` | - | 190 |
| `secret_2` | - | 191 |
| `secret_3` | - | 192 |
> [!NOTE]
> Nearly all pickup items exist in two forms, as early games differentiate
> between a sprite displayed on the ground and a 3D object depicted in the
> inventory ring. Secrets are a notable exception, as they never appear in the
> inventory ring in the original game. For convenience, both forms are defined
> using a single key.
## Usage Guidelines
- Levels are zero-indexed and match the order with the game flow file.
- It doesn't make sense to ship a custom level with all of the strings defined.
Actually, your file should be as small as possible - the game will fall back to the
built-in defaults for you! For example - the following document is perfectly fine:
```json5
{
"levels": [
{
"objects": {
{"name": "key_1": "Gold Key"},
},
},
]
}
```
- Sometimes it makes sense to rename not just puzzle items and keys, but also
other objects, such as enemies. A great example of this is TR2 object
#&NoBreak;39 - usually it's a tiger, but in the snow levels it becomes a snow
leopard.
- TRX gives a name to all objects. Even when the player cannot normally see
names of objects other than pickups and special inventory ring items, these
are used in console commands such as `/tp` and `/give` for example, `/tp
tiger` should teleport Lara to the object #&NoBreak;39.
- For a full list of object IDs for a particular engine, please refer to the
game strings files shipped with relevant TRX builds.

View file

@ -42,11 +42,6 @@ various pieces of global behaviour.
// etc
}
],
"strings": {
"HEADING_INVENTORY": "INVENTORY",
"HEADING_GAME_OVER": "GAME OVER",
// etc
},
```
</details>
@ -193,17 +188,6 @@ various pieces of global behaviour.
<code>savegame_fmt_legacy</code>
</td>
</tr>
<tr valign="top">
<td>
<code>strings</code>
</td>
<td>String-to-string map</td>
<td>Yes</td>
<td>
All language used in the game is defined here. Edit the right-hand values
only.
</td>
</tr>
<tr valign="top">
<td>
<a name="water-color"></a>
@ -259,16 +243,6 @@ Following are each of the properties available within a level.
{"type": "start_game"},
// etc
],
"strings": {
"key1": "Silver Key",
"puzzle2": "Machine Cog",
// etc
},
"examine": {
"key1": "This shows when the player examines key1 in the inventory.",
"puzzle2": "You can use \n to make new lines and \f to make new pages.",
// etc
},
},
```
</details>
@ -313,22 +287,6 @@ Following are each of the properties available within a level.
for details.
</td>
</tr>
<tr valign="top">
<td>
<code>examine</code>
</td>
<td>String-to-string map</td>
<td>No</td>
<td colspan="2">
Allows longer text descriptions to be defined for key and puzzle items,
over and above the names defined in <code>strings</code> (see below).
Players can examine items in the inventory when this text has been
defined. Use <code>\n</code> in the text to create new lines; you can also
use <code>\f</code> to force a page break. Long text will be automatically
wrapped and paginated as necessary. If an empty string is defined, the UI
will not be shown and the inventory item simply focussed instead.
</td>
</tr>
<tr valign="top">
<td>
<code>file</code>
@ -401,86 +359,6 @@ Following are each of the properties available within a level.
<a href="#sequences">Sequences</a> for full details.
</td>
</tr>
<tr valign="top">
<td rowspan="12">
<code>strings</code>
</td>
<td rowspan="12">String-to-string map</td>
<td rowspan="12">No</td>
<td colspan="2">
Key and puzzle item names. The possible types are as follows. If this map
is missing, or is missing an item's name, the game will use a suitable
default value.
</td>
</tr>
<tr valign="top">
<td>
<strong>String ID</strong>
</td>
<td>
<strong>Description</strong>
</td>
</tr>
<tr valign="top">
<td>
<code>key1</code>
</td>
<td>Describes pickup object ID 129 in the inventory top-ring.</td>
</tr>
<tr valign="top">
<td>
<code>key2</code>
</td>
<td>Describes pickup object ID 130 in the inventory top-ring.</td>
</tr>
<tr valign="top">
<td>
<code>key3</code>
</td>
<td>Describes pickup object ID 131 in the inventory top-ring.</td>
</tr>
<tr valign="top">
<td>
<code>key4</code>
</td>
<td>Describes pickup object ID 132 in the inventory top-ring.</td>
</tr>
<tr valign="top">
<td>
<code>pickup1</code>
</td>
<td>Describes pickup object ID 141 in the inventory top-ring.</td>
</tr>
<tr valign="top">
<td>
<code>pickup2</code>
</td>
<td>Describes pickup object ID 142 in the inventory top-ring.</td>
</tr>
<tr valign="top">
<td>
<code>puzzle1</code>
</td>
<td>Describes pickup object ID 110 in the inventory top-ring.</td>
</tr>
<tr valign="top">
<td>
<code>puzzle2</code>
</td>
<td>Describes pickup object ID 111 in the inventory top-ring.</td>
</tr>
<tr valign="top">
<td>
<code>puzzle3</code>
</td>
<td>Describes pickup object ID 112 in the inventory top-ring.</td>
</tr>
<tr valign="top">
<td>
<code>puzzle4</code>
</td>
<td>Describes pickup object ID 113 in the inventory top-ring.</td>
</tr>
<tr valign="top">
<td>
<code>title</code>
@ -935,7 +813,6 @@ game will exit to title.
{"type": "level_stats", "level_id": 1},
{"type": "exit_to_level", "level_id": 2},
],
"strings": {},
},
{
@ -950,7 +827,6 @@ game will exit to title.
{"type": "level_stats", "level_id": 2},
{"type": "exit_to_level", "level_id": 3},
],
"strings": {},
},
{
@ -971,7 +847,6 @@ game will exit to title.
{"type": "total_stats", "picture_path": "data/install.pcx"},
{"type": "exit_to_level", "level_id": 4},
],
"strings": {},
},
{
@ -986,7 +861,6 @@ game will exit to title.
{"type": "stop_game"},
{"type": "exit_to_cine", "level_id": 6},
],
"strings": {},
},
{
@ -1003,7 +877,6 @@ game will exit to title.
{"type": "total_stats", "picture_path": "data/install.pcx"},
{"type": "exit_to_title"},
],
"strings": {},
},
{
@ -1021,7 +894,6 @@ game will exit to title.
{"type": "level_stats", "level_id": 4},
{"type": "exit_to_level", "level_id": 5},
],
"strings": {},
},
```
</details>
@ -1066,10 +938,6 @@ the engine's overall item limit).
{"type": "level_stats", "level_id": 1},
{"type": "exit_to_level", "level_id": 2},
],
"strings": {
"key1": "Silver Key",
"puzzle2": "Machine Cog",
},
},
```

View file

@ -1,5 +0,0 @@
#if TR_VERSION == 1
#include "aliases_tr1.def"
#elif TR_VERSION == 2
#include "aliases_tr2.def"
#endif

View file

@ -1,56 +0,0 @@
OBJ_ALIAS_DEFINE(O_PISTOL_ITEM, GS_ID(INV_ITEM_PISTOLS))
OBJ_ALIAS_DEFINE(O_PISTOL_OPTION, GS_ID(INV_ITEM_PISTOLS))
OBJ_ALIAS_DEFINE(O_SHOTGUN_ITEM, GS_ID(INV_ITEM_SHOTGUN))
OBJ_ALIAS_DEFINE(O_SHOTGUN_OPTION, GS_ID(INV_ITEM_SHOTGUN))
OBJ_ALIAS_DEFINE(O_MAGNUM_ITEM, GS_ID(INV_ITEM_MAGNUM))
OBJ_ALIAS_DEFINE(O_MAGNUM_OPTION, GS_ID(INV_ITEM_MAGNUM))
OBJ_ALIAS_DEFINE(O_UZI_ITEM, GS_ID(INV_ITEM_UZI))
OBJ_ALIAS_DEFINE(O_UZI_OPTION, GS_ID(INV_ITEM_UZI))
OBJ_ALIAS_DEFINE(O_PISTOL_AMMO_ITEM, GS_ID(INV_ITEM_PISTOL_AMMO))
OBJ_ALIAS_DEFINE(O_PISTOL_AMMO_OPTION, GS_ID(INV_ITEM_PISTOL_AMMO))
OBJ_ALIAS_DEFINE(O_SG_AMMO_ITEM, GS_ID(INV_ITEM_SHOTGUN_AMMO))
OBJ_ALIAS_DEFINE(O_SG_AMMO_OPTION, GS_ID(INV_ITEM_SHOTGUN_AMMO))
OBJ_ALIAS_DEFINE(O_MAG_AMMO_ITEM, GS_ID(INV_ITEM_MAGNUM_AMMO))
OBJ_ALIAS_DEFINE(O_MAG_AMMO_OPTION, GS_ID(INV_ITEM_MAGNUM_AMMO))
OBJ_ALIAS_DEFINE(O_UZI_AMMO_ITEM, GS_ID(INV_ITEM_UZI_AMMO))
OBJ_ALIAS_DEFINE(O_UZI_AMMO_OPTION, GS_ID(INV_ITEM_UZI_AMMO))
OBJ_ALIAS_DEFINE(O_EXPLOSIVE_ITEM, GS_ID(INV_ITEM_GRENADE))
OBJ_ALIAS_DEFINE(O_EXPLOSIVE_OPTION, GS_ID(INV_ITEM_GRENADE))
OBJ_ALIAS_DEFINE(O_MEDI_ITEM, GS_ID(INV_ITEM_SMALL_MEDIPACK))
OBJ_ALIAS_DEFINE(O_MEDI_OPTION, GS_ID(INV_ITEM_SMALL_MEDIPACK))
OBJ_ALIAS_DEFINE(O_BIGMEDI_ITEM, GS_ID(INV_ITEM_LARGE_MEDIPACK))
OBJ_ALIAS_DEFINE(O_BIGMEDI_OPTION, GS_ID(INV_ITEM_LARGE_MEDIPACK))
OBJ_ALIAS_DEFINE(O_PUZZLE_ITEM_1, GS_ID(INV_ITEM_PUZZLE_1))
OBJ_ALIAS_DEFINE(O_PUZZLE_OPTION_1, GS_ID(INV_ITEM_PUZZLE_1))
OBJ_ALIAS_DEFINE(O_PUZZLE_ITEM_2, GS_ID(INV_ITEM_PUZZLE_2))
OBJ_ALIAS_DEFINE(O_PUZZLE_OPTION_2, GS_ID(INV_ITEM_PUZZLE_2))
OBJ_ALIAS_DEFINE(O_PUZZLE_ITEM_3, GS_ID(INV_ITEM_PUZZLE_3))
OBJ_ALIAS_DEFINE(O_PUZZLE_OPTION_3, GS_ID(INV_ITEM_PUZZLE_3))
OBJ_ALIAS_DEFINE(O_PUZZLE_ITEM_4, GS_ID(INV_ITEM_PUZZLE_4))
OBJ_ALIAS_DEFINE(O_PUZZLE_OPTION_4, GS_ID(INV_ITEM_PUZZLE_4))
OBJ_ALIAS_DEFINE(O_KEY_ITEM_1, GS_ID(INV_ITEM_KEY_1))
OBJ_ALIAS_DEFINE(O_KEY_OPTION_1, GS_ID(INV_ITEM_KEY_1))
OBJ_ALIAS_DEFINE(O_KEY_ITEM_2, GS_ID(INV_ITEM_KEY_2))
OBJ_ALIAS_DEFINE(O_KEY_OPTION_2, GS_ID(INV_ITEM_KEY_2))
OBJ_ALIAS_DEFINE(O_KEY_ITEM_3, GS_ID(INV_ITEM_KEY_3))
OBJ_ALIAS_DEFINE(O_KEY_OPTION_3, GS_ID(INV_ITEM_KEY_3))
OBJ_ALIAS_DEFINE(O_KEY_ITEM_4, GS_ID(INV_ITEM_KEY_4))
OBJ_ALIAS_DEFINE(O_KEY_OPTION_4, GS_ID(INV_ITEM_KEY_4))
OBJ_ALIAS_DEFINE(O_PICKUP_ITEM_1, GS_ID(INV_ITEM_PICKUP_1))
OBJ_ALIAS_DEFINE(O_PICKUP_OPTION_1, GS_ID(INV_ITEM_PICKUP_1))
OBJ_ALIAS_DEFINE(O_PICKUP_ITEM_2, GS_ID(INV_ITEM_PICKUP_2))
OBJ_ALIAS_DEFINE(O_PICKUP_OPTION_2, GS_ID(INV_ITEM_PICKUP_2))
OBJ_ALIAS_DEFINE(O_LEADBAR_ITEM, GS_ID(INV_ITEM_LEADBAR))
OBJ_ALIAS_DEFINE(O_LEADBAR_OPTION, GS_ID(INV_ITEM_LEADBAR))
OBJ_ALIAS_DEFINE(O_SCION_ITEM_1, GS_ID(INV_ITEM_SCION))
OBJ_ALIAS_DEFINE(O_SCION_ITEM_2, GS_ID(INV_ITEM_SCION))
OBJ_ALIAS_DEFINE(O_SCION_ITEM_3, GS_ID(INV_ITEM_SCION))
OBJ_ALIAS_DEFINE(O_SCION_ITEM_4, GS_ID(INV_ITEM_SCION))
OBJ_ALIAS_DEFINE(O_SCION_OPTION, GS_ID(INV_ITEM_SCION))
OBJ_ALIAS_DEFINE(O_COMPASS_OPTION, GS_ID(INV_ITEM_COMPASS))
OBJ_ALIAS_DEFINE(O_PASSPORT_OPTION, GS_ID(INV_ITEM_GAME))
OBJ_ALIAS_DEFINE(O_PASSPORT_CLOSED, GS_ID(INV_ITEM_GAME))
OBJ_ALIAS_DEFINE(O_DETAIL_OPTION, GS_ID(INV_ITEM_DETAILS))
OBJ_ALIAS_DEFINE(O_SOUND_OPTION, GS_ID(INV_ITEM_SOUND))
OBJ_ALIAS_DEFINE(O_CONTROL_OPTION, GS_ID(INV_ITEM_CONTROLS))
OBJ_ALIAS_DEFINE(O_PHOTO_OPTION, GS_ID(INV_ITEM_LARAS_HOME))

View file

@ -1,62 +0,0 @@
OBJ_ALIAS_DEFINE(O_COMPASS_OPTION, GS_ID(INV_ITEM_STOPWATCH))
OBJ_ALIAS_DEFINE(O_COMPASS_ITEM, GS_ID(INV_ITEM_STOPWATCH))
OBJ_ALIAS_DEFINE(O_PISTOL_ITEM, GS_ID(INV_ITEM_PISTOLS))
OBJ_ALIAS_DEFINE(O_PISTOL_OPTION, GS_ID(INV_ITEM_PISTOLS))
OBJ_ALIAS_DEFINE(O_FLARE_ITEM, GS_ID(INV_ITEM_FLARE))
OBJ_ALIAS_DEFINE(O_FLARES_OPTION, GS_ID(INV_ITEM_FLARE))
OBJ_ALIAS_DEFINE(O_SHOTGUN_ITEM, GS_ID(INV_ITEM_SHOTGUN))
OBJ_ALIAS_DEFINE(O_SHOTGUN_OPTION, GS_ID(INV_ITEM_SHOTGUN))
OBJ_ALIAS_DEFINE(O_MAGNUM_ITEM, GS_ID(INV_ITEM_MAGNUMS))
OBJ_ALIAS_DEFINE(O_MAGNUM_OPTION, GS_ID(INV_ITEM_MAGNUMS))
OBJ_ALIAS_DEFINE(O_UZI_ITEM, GS_ID(INV_ITEM_UZIS))
OBJ_ALIAS_DEFINE(O_UZI_OPTION, GS_ID(INV_ITEM_UZIS))
OBJ_ALIAS_DEFINE(O_HARPOON_ITEM, GS_ID(INV_ITEM_HARPOON))
OBJ_ALIAS_DEFINE(O_HARPOON_OPTION, GS_ID(INV_ITEM_HARPOON))
OBJ_ALIAS_DEFINE(O_M16_ITEM, GS_ID(INV_ITEM_M16))
OBJ_ALIAS_DEFINE(O_M16_OPTION, GS_ID(INV_ITEM_M16))
OBJ_ALIAS_DEFINE(O_GRENADE_ITEM, GS_ID(INV_ITEM_GRENADE))
OBJ_ALIAS_DEFINE(O_GRENADE_OPTION, GS_ID(INV_ITEM_GRENADE))
OBJ_ALIAS_DEFINE(O_PISTOL_AMMO_ITEM, GS_ID(INV_ITEM_PISTOL_AMMO))
OBJ_ALIAS_DEFINE(O_PISTOL_AMMO_OPTION, GS_ID(INV_ITEM_PISTOL_AMMO))
OBJ_ALIAS_DEFINE(O_SHOTGUN_AMMO_ITEM, GS_ID(INV_ITEM_SHOTGUN_AMMO))
OBJ_ALIAS_DEFINE(O_SHOTGUN_AMMO_OPTION, GS_ID(INV_ITEM_SHOTGUN_AMMO))
OBJ_ALIAS_DEFINE(O_MAGNUM_AMMO_ITEM, GS_ID(INV_ITEM_MAGNUM_AMMO))
OBJ_ALIAS_DEFINE(O_MAGNUM_AMMO_OPTION, GS_ID(INV_ITEM_MAGNUM_AMMO))
OBJ_ALIAS_DEFINE(O_UZI_AMMO_ITEM, GS_ID(INV_ITEM_UZI_AMMO))
OBJ_ALIAS_DEFINE(O_UZI_AMMO_OPTION, GS_ID(INV_ITEM_UZI_AMMO))
OBJ_ALIAS_DEFINE(O_HARPOON_AMMO_ITEM, GS_ID(INV_ITEM_HARPOON_AMMO))
OBJ_ALIAS_DEFINE(O_HARPOON_AMMO_OPTION, GS_ID(INV_ITEM_HARPOON_AMMO))
OBJ_ALIAS_DEFINE(O_M16_AMMO_ITEM, GS_ID(INV_ITEM_M16_AMMO))
OBJ_ALIAS_DEFINE(O_M16_AMMO_OPTION, GS_ID(INV_ITEM_M16_AMMO))
OBJ_ALIAS_DEFINE(O_GRENADE_AMMO_ITEM, GS_ID(INV_ITEM_GRENADE_AMMO))
OBJ_ALIAS_DEFINE(O_GRENADE_AMMO_OPTION, GS_ID(INV_ITEM_GRENADE_AMMO))
OBJ_ALIAS_DEFINE(O_SMALL_MEDIPACK_ITEM, GS_ID(INV_ITEM_SMALL_MEDIPACK))
OBJ_ALIAS_DEFINE(O_SMALL_MEDIPACK_OPTION, GS_ID(INV_ITEM_SMALL_MEDIPACK))
OBJ_ALIAS_DEFINE(O_LARGE_MEDIPACK_ITEM, GS_ID(INV_ITEM_LARGE_MEDIPACK))
OBJ_ALIAS_DEFINE(O_LARGE_MEDIPACK_OPTION, GS_ID(INV_ITEM_LARGE_MEDIPACK))
OBJ_ALIAS_DEFINE(O_PICKUP_ITEM_1, GS_ID(INV_ITEM_PICKUP_1))
OBJ_ALIAS_DEFINE(O_PICKUP_OPTION_1, GS_ID(INV_ITEM_PICKUP_1))
OBJ_ALIAS_DEFINE(O_PICKUP_ITEM_2, GS_ID(INV_ITEM_PICKUP_2))
OBJ_ALIAS_DEFINE(O_PICKUP_OPTION_2, GS_ID(INV_ITEM_PICKUP_2))
OBJ_ALIAS_DEFINE(O_PUZZLE_ITEM_1, GS_ID(INV_ITEM_PUZZLE_1))
OBJ_ALIAS_DEFINE(O_PUZZLE_OPTION_1, GS_ID(INV_ITEM_PUZZLE_1))
OBJ_ALIAS_DEFINE(O_PUZZLE_ITEM_2, GS_ID(INV_ITEM_PUZZLE_2))
OBJ_ALIAS_DEFINE(O_PUZZLE_OPTION_2, GS_ID(INV_ITEM_PUZZLE_2))
OBJ_ALIAS_DEFINE(O_PUZZLE_ITEM_3, GS_ID(INV_ITEM_PUZZLE_3))
OBJ_ALIAS_DEFINE(O_PUZZLE_OPTION_3, GS_ID(INV_ITEM_PUZZLE_3))
OBJ_ALIAS_DEFINE(O_PUZZLE_ITEM_4, GS_ID(INV_ITEM_PUZZLE_4))
OBJ_ALIAS_DEFINE(O_PUZZLE_OPTION_4, GS_ID(INV_ITEM_PUZZLE_4))
OBJ_ALIAS_DEFINE(O_KEY_ITEM_1, GS_ID(INV_ITEM_KEY_1))
OBJ_ALIAS_DEFINE(O_KEY_OPTION_1, GS_ID(INV_ITEM_KEY_1))
OBJ_ALIAS_DEFINE(O_KEY_ITEM_2, GS_ID(INV_ITEM_KEY_2))
OBJ_ALIAS_DEFINE(O_KEY_OPTION_2, GS_ID(INV_ITEM_KEY_2))
OBJ_ALIAS_DEFINE(O_KEY_ITEM_3, GS_ID(INV_ITEM_KEY_3))
OBJ_ALIAS_DEFINE(O_KEY_OPTION_3, GS_ID(INV_ITEM_KEY_3))
OBJ_ALIAS_DEFINE(O_KEY_ITEM_4, GS_ID(INV_ITEM_KEY_4))
OBJ_ALIAS_DEFINE(O_KEY_OPTION_4, GS_ID(INV_ITEM_KEY_4))
OBJ_ALIAS_DEFINE(O_PASSPORT_OPTION, GS_ID(INV_ITEM_GAME))
OBJ_ALIAS_DEFINE(O_PASSPORT_CLOSED, GS_ID(INV_ITEM_GAME))
OBJ_ALIAS_DEFINE(O_DETAIL_OPTION, GS_ID(INV_ITEM_DETAILS))
OBJ_ALIAS_DEFINE(O_SOUND_OPTION, GS_ID(INV_ITEM_SOUND))
OBJ_ALIAS_DEFINE(O_CONTROL_OPTION, GS_ID(INV_ITEM_CONTROLS))
OBJ_ALIAS_DEFINE(O_PHOTO_OPTION, GS_ID(INV_ITEM_LARAS_HOME))

View file

@ -8,6 +8,7 @@
#include "memory.h"
#include <stddef.h>
#include <string.h>
typedef void (*M_LOAD_STRING_FUNC)(const char *, const char *);
@ -15,168 +16,116 @@ GS_FILE g_GST_File = {};
static struct {
GAME_OBJECT_ID object_id;
GAME_STRING_ID game_string_id;
} m_ObjectAliases[] = {
#define OBJ_ALIAS_DEFINE(object_id_, game_string_id_) \
{ .object_id = object_id_, .game_string_id = game_string_id_ },
#include "./aliases.def"
const char *key_name;
} m_ObjectKeyNames[] = {
#define OBJ_ALIAS_DEFINE(object_id_, source_object_id_)
#define OBJ_NAME_DEFINE(object_id_, key_name_, default_name) \
{ .object_id = object_id_, .key_name = key_name_ },
#include "game/objects/names.def"
#undef OBJ_ALIAS_DEFINE
#undef OBJ_NAME_DEFINE
{ .object_id = NO_OBJECT },
};
static void M_GameStringTableEntry_Free(GS_TABLE_ENTRY *entry);
static void M_GameStringTable_Free(GS_TABLE *gs_table);
static void M_GameStringFile_Free(GS_FILE *gs_file);
static void M_ApplyGameString(const char *key, const char *value);
static void M_ApplyObjectName(const char *key, const char *value);
static void M_ApplyObjectDescription(const char *key, const char *value);
static void M_ApplyEntries(
const GS_TABLE_ENTRY *const entries, M_LOAD_STRING_FUNC load_func);
static void M_ApplyStrings(
const GS_TABLE_ENTRY *global_entries, const GS_TABLE_ENTRY *level_entries,
M_LOAD_STRING_FUNC load_func);
static void M_ApplyGameStrings(const GS_FILE *gs_table, int32_t level_num);
static void M_ApplyObjectNames(const GS_FILE *gs_table, int32_t level_num);
static void M_ApplyObjectDescriptions(
const GS_FILE *gs_table, int32_t level_num);
static struct {
GAME_OBJECT_ID target_object_id;
GAME_OBJECT_ID source_object_id;
} m_ObjectAliases[] = {
#define OBJ_ALIAS_DEFINE(target_object_id_, source_object_id_) \
{ .target_object_id = target_object_id_, \
.source_object_id = source_object_id_ },
#define OBJ_NAME_DEFINE(object_id_, key_name_, default_name)
#include "game/objects/names.def"
#undef OBJ_ALIAS_DEFINE
#undef OBJ_NAME_DEFINE
{ .target_object_id = NO_OBJECT },
};
static void M_GameStringTableEntry_Free(GS_TABLE_ENTRY *const entry)
static GAME_OBJECT_ID M_GetObjectID(const char *const key);
static void M_Apply(const GS_TABLE *table);
static GAME_OBJECT_ID M_GetObjectID(const char *const key)
{
if (entry == NULL) {
return;
for (int32_t i = 0; m_ObjectKeyNames[i].object_id != NO_OBJECT; i++) {
if (strcmp(m_ObjectKeyNames[i].key_name, key) == 0) {
return m_ObjectKeyNames[i].object_id;
}
}
GS_TABLE_ENTRY *cur = entry;
while (cur->key != NULL) {
Memory_FreePointer(&cur->key);
Memory_FreePointer(&cur->value);
cur++;
}
Memory_Free(entry);
return NO_OBJECT;
}
static void M_GameStringTable_Free(GS_TABLE *const gs_table)
static void M_DoObjectAliases(void)
{
M_GameStringTableEntry_Free(gs_table->object_names);
gs_table->object_names = NULL;
M_GameStringTableEntry_Free(gs_table->object_descriptions);
gs_table->object_descriptions = NULL;
M_GameStringTableEntry_Free(gs_table->game_strings);
gs_table->game_strings = NULL;
}
static void M_GameStringFile_Free(GS_FILE *const gs_file)
{
M_GameStringTable_Free(&gs_file->global);
for (int32_t i = 0; i < gs_file->level_count; i++) {
M_GameStringTable_Free(&gs_file->levels[i]);
}
Memory_FreePointer(&gs_file->levels);
gs_file->level_count = 0;
}
static void M_ApplyGameString(const char *const key, const char *const value)
{
if (!GameString_IsKnown(key)) {
LOG_ERROR("Invalid game string key: %s", key);
} else if (value == NULL) {
LOG_ERROR("Invalid game string value: %s", key);
} else {
GameString_Define(key, value);
}
}
static void M_ApplyObjectName(const char *const key, const char *const value)
{
const GAME_OBJECT_ID object_id =
ENUM_MAP_GET(GAME_OBJECT_ID, key, NO_OBJECT);
if (object_id == NO_OBJECT) {
LOG_ERROR("Invalid object id: %s", key);
} else {
Object_SetName(object_id, value);
}
}
static void M_ApplyObjectDescription(
const char *const key, const char *const value)
{
const GAME_OBJECT_ID object_id =
ENUM_MAP_GET(GAME_OBJECT_ID, key, NO_OBJECT);
if (object_id == NO_OBJECT) {
LOG_ERROR("Invalid object id: %s", key);
} else {
Object_SetDescription(object_id, value);
}
}
static void M_ApplyEntries(
const GS_TABLE_ENTRY *entries, const M_LOAD_STRING_FUNC load_func)
{
while (entries != NULL && entries->key != NULL) {
load_func(entries->key, entries->value);
entries++;
}
}
static void M_ApplyStrings(
const GS_TABLE_ENTRY *const global_entries,
const GS_TABLE_ENTRY *const level_entries,
const M_LOAD_STRING_FUNC load_func)
{
M_ApplyEntries(global_entries, load_func);
if (level_entries != NULL) {
M_ApplyEntries(level_entries, load_func);
}
}
static void M_ApplyGameStrings(
const GS_FILE *const gs_file, const int32_t level_num)
{
ASSERT(level_num >= -1 && level_num < gs_file->level_count);
M_ApplyStrings(
gs_file->global.game_strings,
level_num != -1 ? gs_file->levels[level_num].game_strings : NULL,
M_ApplyGameString);
}
static void M_ApplyObjectNames(
const GS_FILE *const gs_file, const int32_t level_num)
{
ASSERT(level_num >= -1 && level_num < gs_file->level_count);
M_ApplyStrings(
gs_file->global.object_names,
level_num != -1 ? gs_file->levels[level_num].object_names : NULL,
M_ApplyObjectName);
}
static void M_ApplyObjectDescriptions(
const GS_FILE *const gs_file, const int32_t level_num)
{
ASSERT(level_num >= -1 && level_num < gs_file->level_count);
M_ApplyStrings(
gs_file->global.object_descriptions,
level_num != -1 ? gs_file->levels[level_num].object_descriptions : NULL,
M_ApplyObjectDescription);
}
void GameStringTable_Apply(const int32_t level_num)
{
Object_ResetNames();
const GS_FILE *const gs_file = &g_GST_File;
M_ApplyObjectNames(gs_file, level_num);
M_ApplyObjectDescriptions(gs_file, level_num);
M_ApplyGameStrings(gs_file, level_num);
for (int32_t i = 0; m_ObjectAliases[i].object_id != NO_OBJECT; i++) {
const char *const new_name =
GameString_Get(m_ObjectAliases[i].game_string_id);
if (new_name != NULL) {
Object_SetName(m_ObjectAliases[i].object_id, new_name);
for (int32_t i = 0; m_ObjectAliases[i].target_object_id != NO_OBJECT; i++) {
const GAME_OBJECT_ID target_object_id =
m_ObjectAliases[i].target_object_id;
const GAME_OBJECT_ID source_object_id =
m_ObjectAliases[i].source_object_id;
Object_SetName(target_object_id, Object_GetName(source_object_id));
const char *const description = Object_GetDescription(source_object_id);
if (description != NULL) {
Object_SetDescription(target_object_id, description);
}
}
}
static void M_Apply(const GS_TABLE *const table)
{
{
const GS_GAME_STRING_ENTRY *cur = table->game_strings;
while (cur != NULL && cur->key != NULL) {
if (!GameString_IsKnown(cur->key)) {
LOG_ERROR("Invalid game string key: %s", cur->key);
} else if (cur->value == NULL) {
LOG_ERROR("Invalid game string value: %s", cur->key);
} else {
GameString_Define(cur->key, cur->value);
}
cur++;
}
}
{
const GS_OBJECT_ENTRY *cur = table->objects;
while (cur != NULL && cur->key != NULL) {
const GAME_OBJECT_ID object_id = M_GetObjectID(cur->key);
if (object_id == NO_OBJECT) {
LOG_ERROR("Invalid object id: %s", cur->key);
} else {
if (cur->name == NULL) {
LOG_ERROR("Invalid object name: %s", cur->key);
} else {
Object_SetName(object_id, cur->name);
}
if (cur->description != NULL) {
Object_SetDescription(object_id, cur->description);
}
}
cur++;
}
}
}
void GameStringTable_Apply(const int32_t level_num)
{
const GS_FILE *const gs_file = &g_GST_File;
if (level_num < -1 || level_num >= gs_file->level_count) {
LOG_WARNING(
"Trying to apply unavailable strings for level %d", level_num);
return;
}
LOG_DEBUG("loading file %d", level_num);
Object_ResetNames();
M_Apply(&gs_file->global);
if (level_num != -1) {
M_Apply(&gs_file->levels[level_num]);
}
M_DoObjectAliases();
}
void GameStringTable_Shutdown(void)
{
M_GameStringFile_Free(&g_GST_File);
GS_File_Free(&g_GST_File);
}

View file

@ -0,0 +1,47 @@
#include "game/game_string_table/priv.h"
#include "memory.h"
void GS_Table_Free(GS_TABLE *const gs_table)
{
if (gs_table == NULL) {
return;
}
if (gs_table->objects != NULL) {
GS_OBJECT_ENTRY *cur = gs_table->objects;
while (cur->key != NULL) {
Memory_FreePointer(&cur->key);
Memory_FreePointer(&cur->name);
Memory_FreePointer(&cur->description);
cur++;
}
Memory_Free(gs_table->objects);
gs_table->objects = NULL;
}
if (gs_table->game_strings != NULL) {
GS_GAME_STRING_ENTRY *cur = gs_table->game_strings;
while (cur->key != NULL) {
Memory_FreePointer(&cur->key);
Memory_FreePointer(&cur->value);
cur++;
}
Memory_Free(gs_table->game_strings);
gs_table->game_strings = NULL;
}
}
void GS_File_Free(GS_FILE *const gs_file)
{
if (gs_file == NULL) {
return;
}
GS_Table_Free(&gs_file->global);
if (gs_file->levels != NULL) {
for (int32_t i = 0; i < gs_file->level_count; i++) {
GS_Table_Free(&gs_file->levels[i]);
}
}
Memory_FreePointer(&gs_file->levels);
gs_file->level_count = 0;
}

View file

@ -4,13 +4,18 @@
typedef struct {
const char *key;
const char *value;
} GS_TABLE_ENTRY;
const char *name;
const char *description;
} GS_OBJECT_ENTRY;
typedef struct {
GS_TABLE_ENTRY *object_names;
GS_TABLE_ENTRY *object_descriptions;
GS_TABLE_ENTRY *game_strings;
const char *key;
const char *value;
} GS_GAME_STRING_ENTRY;
typedef struct {
GS_OBJECT_ENTRY *objects;
GS_GAME_STRING_ENTRY *game_strings;
} GS_TABLE;
typedef struct {
@ -20,3 +25,6 @@ typedef struct {
} GS_FILE;
extern GS_FILE g_GST_File;
void GS_Table_Free(GS_TABLE *gs_table);
void GS_File_Free(GS_FILE *gs_file);

View file

@ -1,47 +1,89 @@
#include "filesystem.h"
#include "game/game_string_table.h"
#include "game/game_string_table/priv.h"
#include "game/gameflow.h"
#include "json.h"
#include "log.h"
#include "memory.h"
#include <string.h>
static bool M_LoadTableFromJSON(
JSON_OBJECT *root_obj, const char *key, GS_TABLE_ENTRY **dest);
static bool M_LoadTableFromJSON(JSON_OBJECT *root_obj, GS_TABLE *out_table);
static bool M_LoadLevelsFromJSON(JSON_OBJECT *obj, GS_FILE *gs_file);
static bool M_LoadTableFromJSON(
JSON_OBJECT *const root_obj, const char *const key, GS_TABLE_ENTRY **dest)
JSON_OBJECT *const root_obj, GS_TABLE *const out_table)
{
const JSON_OBJECT *const strings_obj = JSON_ObjectGetObject(root_obj, key);
if (strings_obj == NULL) {
// key is missing - rely on default strings
return true;
}
bool result = true;
*dest = Memory_Alloc(sizeof(GS_TABLE_ENTRY) * (strings_obj->length + 1));
// Load objects
JSON_OBJECT *const jobjs = JSON_ObjectGetObject(root_obj, "objects");
if (jobjs != NULL) {
const size_t object_count = jobjs->length;
out_table->objects =
Memory_Alloc(sizeof(GS_OBJECT_ENTRY) * (object_count + 1));
GS_TABLE_ENTRY *cur = *dest;
JSON_OBJECT_ELEMENT *strings_elem = strings_obj->start;
for (size_t i = 0; i < strings_obj->length;
i++, strings_elem = strings_elem->next) {
const char *const key = strings_elem->name->string;
const char *const value = JSON_ObjectGetString(strings_obj, key, NULL);
if (value == NULL) {
LOG_ERROR("invalid string key %s", strings_elem->name->string);
return NULL;
JSON_OBJECT_ELEMENT *jobj_elem = jobjs->start;
for (size_t i = 0; i < object_count; i++, jobj_elem = jobj_elem->next) {
JSON_OBJECT *const jobj_obj = JSON_ValueAsObject(jobj_elem->value);
const char *const key = jobj_elem->name->string;
const char *const name =
JSON_ObjectGetString(jobj_obj, "name", JSON_INVALID_STRING);
const char *const description = JSON_ObjectGetString(
jobj_obj, "description", JSON_INVALID_STRING);
if (key == JSON_INVALID_STRING) {
LOG_WARNING(
"Invalid game string object entry %d: missing key.", i);
} else if (name == JSON_INVALID_STRING) {
LOG_WARNING(
"Invalid game string object entry %s: missing value.", key);
} else {
GS_OBJECT_ENTRY *const object_entry = &out_table->objects[i];
object_entry->key = Memory_DupStr(key);
object_entry->name = Memory_DupStr(name);
object_entry->description = description != JSON_INVALID_STRING
? Memory_DupStr(description)
: NULL;
}
}
cur->key = Memory_DupStr(key);
cur->value = Memory_DupStr(value);
cur++;
}
cur->key = NULL;
cur->value = NULL;
return true;
// Load game_strings
JSON_OBJECT *const jgs_obj = JSON_ObjectGetObject(root_obj, "game_strings");
if (jgs_obj != NULL) {
const size_t gs_count = jgs_obj->length;
out_table->game_strings =
Memory_Alloc(sizeof(GS_GAME_STRING_ENTRY) * (gs_count + 1));
JSON_OBJECT_ELEMENT *jgs_elem = jgs_obj->start;
for (size_t i = 0; i < gs_count; i++, jgs_elem = jgs_elem->next) {
JSON_OBJECT *const jgs_obj = JSON_ValueAsObject(jgs_elem->value);
const char *const key = jgs_elem->name->string;
const char *const value =
JSON_ValueGetString(jgs_elem->value, JSON_INVALID_STRING);
if (key == JSON_INVALID_STRING) {
LOG_WARNING("Invalid game string entry %d: missing key.", i);
} else if (value == JSON_INVALID_STRING) {
LOG_WARNING("Invalid game string entry %d: missing value.", i);
} else {
GS_GAME_STRING_ENTRY *const gs_entry =
&out_table->game_strings[i];
gs_entry->key = Memory_DupStr(key);
gs_entry->value = Memory_DupStr(value);
}
}
}
end:
if (!result) {
if (out_table != NULL) {
GS_Table_Free(out_table);
}
}
return result;
}
static bool M_LoadLevelsFromJSON(JSON_OBJECT *const obj, GS_FILE *const gs_file)
@ -55,22 +97,12 @@ static bool M_LoadLevelsFromJSON(JSON_OBJECT *const obj, GS_FILE *const gs_file)
goto end;
}
int32_t level_count = jlvl_arr->length;
if (level_count != GameFlow_GetLevelCount()) {
LOG_ERROR(
"'levels' must have exactly %d levels, as we still rely on legacy "
"tombpc.dat",
GameFlow_GetLevelCount());
result = false;
goto end;
}
gs_file->level_count = level_count;
gs_file->levels = Memory_Alloc(sizeof(GS_TABLE) * level_count);
gs_file->level_count = jlvl_arr->length;
gs_file->levels = Memory_Alloc(sizeof(GS_TABLE) * jlvl_arr->length);
JSON_ARRAY_ELEMENT *jlvl_elem = jlvl_arr->start;
for (size_t i = 0; i < jlvl_arr->length; i++, jlvl_elem = jlvl_elem->next) {
GS_TABLE *const level = &gs_file->levels[i];
GS_TABLE *const level_table = &gs_file->levels[i];
JSON_OBJECT *const jlvl_obj = JSON_ValueAsObject(jlvl_elem->value);
if (jlvl_obj == NULL) {
@ -79,12 +111,7 @@ static bool M_LoadLevelsFromJSON(JSON_OBJECT *const obj, GS_FILE *const gs_file)
goto end;
}
result &=
M_LoadTableFromJSON(jlvl_obj, "object_names", &level->object_names);
result &= M_LoadTableFromJSON(
jlvl_obj, "object_descriptions", &level->object_descriptions);
result &=
M_LoadTableFromJSON(jlvl_obj, "game_strings", &level->game_strings);
result &= M_LoadTableFromJSON(jlvl_obj, level_table);
}
end:
@ -120,12 +147,7 @@ bool GameStringTable_LoadFromFile(const char *const path)
GS_FILE *const gs_file = &g_GST_File;
JSON_OBJECT *root_obj = JSON_ValueAsObject(root);
result &= M_LoadTableFromJSON(
root_obj, "object_names", &gs_file->global.object_names);
result &= M_LoadTableFromJSON(
root_obj, "object_descriptions", &gs_file->global.object_descriptions);
result &= M_LoadTableFromJSON(
root_obj, "game_strings", &gs_file->global.game_strings);
result &= M_LoadTableFromJSON(root_obj, &gs_file->global);
result &= M_LoadLevelsFromJSON(root_obj, gs_file);
end:

View file

@ -58,8 +58,20 @@ void Object_ResetNames(void)
{
M_ClearNames();
#define OBJ_NAME_DEFINE(object_id, name) Object_SetName(object_id, name);
// first set up the names
#define OBJ_ALIAS_DEFINE(target_object_id, source_object_id)
#define OBJ_NAME_DEFINE(object_id, key, name) Object_SetName(object_id, name);
#include "game/objects/names.def"
#undef OBJ_NAME_DEFINE
#undef OBJ_ALIAS_DEFINE
// then do the aliases
#define OBJ_ALIAS_DEFINE(target_object_id, source_object_id) \
Object_SetName(target_object_id, Object_GetName(source_object_id));
#define OBJ_NAME_DEFINE(object_id, key, name)
#include "game/objects/names.def"
#undef OBJ_NAME_DEFINE
#undef OBJ_ALIAS_DEFINE
}
GAME_OBJECT_ID *Object_IdsFromName(

View file

@ -109,23 +109,6 @@ GS_DEFINE(MISC_EXIT, "Exit")
GS_DEFINE(STATS_BASIC_FMT, "%d")
GS_DEFINE(STATS_DETAIL_FMT, "%d of %d")
GS_DEFINE(STATS_FINAL_STATISTICS, "Final Statistics")
GS_DEFINE(INV_ITEM_GAME, "Game")
GS_DEFINE(INV_ITEM_PUZZLE_1, "Puzzle")
GS_DEFINE(INV_ITEM_PUZZLE_2, "Puzzle")
GS_DEFINE(INV_ITEM_PUZZLE_3, "Puzzle")
GS_DEFINE(INV_ITEM_PUZZLE_4, "Puzzle")
GS_DEFINE(INV_ITEM_KEY_1, "Key")
GS_DEFINE(INV_ITEM_KEY_2, "Key")
GS_DEFINE(INV_ITEM_KEY_3, "Key")
GS_DEFINE(INV_ITEM_KEY_4, "Key")
GS_DEFINE(INV_ITEM_PICKUP_1, "Pickup")
GS_DEFINE(INV_ITEM_PICKUP_2, "Pickup")
GS_DEFINE(INV_ITEM_LARAS_HOME, "Lara's Home")
GS_DEFINE(INV_ITEM_SMALL_MEDIPACK, "Small Medi Pack")
GS_DEFINE(INV_ITEM_LARGE_MEDIPACK, "Large Medi Pack")
GS_DEFINE(INV_ITEM_DETAILS, "Detail Levels")
GS_DEFINE(INV_ITEM_SOUND, "Sound")
GS_DEFINE(INV_ITEM_CONTROLS, "Controls")
GS_DEFINE(PASSPORT_SELECT_LEVEL, "Select Level")
GS_DEFINE(PASSPORT_LOAD_GAME, "Load Game")
GS_DEFINE(PASSPORT_SAVE_GAME, "Save Game")

View file

@ -1,136 +1,198 @@
OBJ_NAME_DEFINE(O_LARA, "Lara")
OBJ_NAME_DEFINE(O_PISTOL_ANIM, "Pistols Animation")
OBJ_NAME_DEFINE(O_SHOTGUN_ANIM, "Shotgun Animation")
OBJ_NAME_DEFINE(O_MAGNUM_ANIM, "Magnums Animation")
OBJ_NAME_DEFINE(O_UZI_ANIM, "Uzis Animation")
OBJ_NAME_DEFINE(O_LARA_EXTRA, "Lara's Extra Animation")
OBJ_NAME_DEFINE(O_BACON_LARA, "Bacon Lara")
OBJ_NAME_DEFINE(O_WOLF, "Wolf")
OBJ_NAME_DEFINE(O_BEAR, "Bear")
OBJ_NAME_DEFINE(O_BAT, "Bat")
OBJ_NAME_DEFINE(O_CROCODILE, "Crocodile")
OBJ_NAME_DEFINE(O_ALLIGATOR, "Alligator")
OBJ_NAME_DEFINE(O_LION, "Lion")
OBJ_NAME_DEFINE(O_LIONESS, "Lioness")
OBJ_NAME_DEFINE(O_PUMA, "Puma")
OBJ_NAME_DEFINE(O_APE, "Ape")
OBJ_NAME_DEFINE(O_RAT, "Rat")
OBJ_NAME_DEFINE(O_VOLE, "Vole")
OBJ_NAME_DEFINE(O_TREX, "T-Rex")
OBJ_NAME_DEFINE(O_RAPTOR, "Raptor")
OBJ_NAME_DEFINE(O_WARRIOR_1, "Mutant 1")
OBJ_NAME_DEFINE(O_WARRIOR_2, "Mutant 2")
OBJ_NAME_DEFINE(O_WARRIOR_3, "Mutant 3")
OBJ_NAME_DEFINE(O_CENTAUR, "Centaur")
OBJ_NAME_DEFINE(O_MUMMY, "Mummy")
OBJ_NAME_DEFINE(O_DINO_WARRIOR, "Dino Mutant")
OBJ_NAME_DEFINE(O_FISH, "Mutant Fish")
OBJ_NAME_DEFINE(O_LARSON, "Larson")
OBJ_NAME_DEFINE(O_PIERRE, "Pierre")
OBJ_NAME_DEFINE(O_SKATEBOARD, "Skateboard")
OBJ_NAME_DEFINE(O_SKATEKID, "Skate Kid")
OBJ_NAME_DEFINE(O_COWBOY, "Cowboy")
OBJ_NAME_DEFINE(O_BALDY, "Baldy")
OBJ_NAME_DEFINE(O_NATLA, "Natla")
OBJ_NAME_DEFINE(O_TORSO, "Torso")
OBJ_NAME_DEFINE(O_FALLING_BLOCK, "Falling Block")
OBJ_NAME_DEFINE(O_PENDULUM, "Pendulum")
OBJ_NAME_DEFINE(O_SPIKES, "Spikes")
OBJ_NAME_DEFINE(O_ROLLING_BALL, "Boulder")
OBJ_NAME_DEFINE(O_DART, "Dart")
OBJ_NAME_DEFINE(O_DART_EMITTER, "Dart Emitter")
OBJ_NAME_DEFINE(O_DRAWBRIDGE, "Drawbridge")
OBJ_NAME_DEFINE(O_TEETH_TRAP, "Teeth Trap")
OBJ_NAME_DEFINE(O_DAMOCLES_SWORD, "Damocles Sword")
OBJ_NAME_DEFINE(O_THORS_HANDLE, "Thor's Hammer Handle")
OBJ_NAME_DEFINE(O_THORS_HEAD, "Thor's Hammer")
OBJ_NAME_DEFINE(O_LIGHTNING_EMITTER, "Lightning Emitter")
OBJ_NAME_DEFINE(O_MOVING_BAR, "Moving Bar")
OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_1, "Push Block 1")
OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_2, "Push Block 2")
OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_3, "Push Block 3")
OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_4, "Push Block 4")
OBJ_NAME_DEFINE(O_SLIDING_PILLAR, "Sliding Pillar")
OBJ_NAME_DEFINE(O_FALLING_CEILING_1, "Falling Ceiling 1")
OBJ_NAME_DEFINE(O_FALLING_CEILING_2, "Falling Ceiling 2")
OBJ_NAME_DEFINE(O_SWITCH_TYPE_1, "Switch 1")
OBJ_NAME_DEFINE(O_SWITCH_TYPE_2, "Switch 2")
OBJ_NAME_DEFINE(O_DOOR_TYPE_1, "Door 1")
OBJ_NAME_DEFINE(O_DOOR_TYPE_2, "Door 2")
OBJ_NAME_DEFINE(O_DOOR_TYPE_3, "Door 3")
OBJ_NAME_DEFINE(O_DOOR_TYPE_4, "Door 4")
OBJ_NAME_DEFINE(O_DOOR_TYPE_5, "Door 5")
OBJ_NAME_DEFINE(O_DOOR_TYPE_6, "Door 6")
OBJ_NAME_DEFINE(O_DOOR_TYPE_7, "Door 7")
OBJ_NAME_DEFINE(O_DOOR_TYPE_8, "Door 8")
OBJ_NAME_DEFINE(O_TRAPDOOR_1, "Trapdoor 1")
OBJ_NAME_DEFINE(O_TRAPDOOR_2, "Trapdoor 2")
OBJ_NAME_DEFINE(O_BIGTRAPDOOR, "Big Trapdoor")
OBJ_NAME_DEFINE(O_BRIDGE_FLAT, "Bridge Flat")
OBJ_NAME_DEFINE(O_BRIDGE_TILT_1, "Bridge Tilt 1")
OBJ_NAME_DEFINE(O_BRIDGE_TILT_2, "Bridge Tilt 2")
OBJ_NAME_DEFINE(O_COG_1, "Cog 1")
OBJ_NAME_DEFINE(O_COG_2, "Cog 2")
OBJ_NAME_DEFINE(O_COG_3, "Cog 3")
OBJ_NAME_DEFINE(O_PLAYER_1, "Cutscene Actor 1")
OBJ_NAME_DEFINE(O_PLAYER_2, "Cutscene Actor 2")
OBJ_NAME_DEFINE(O_PLAYER_3, "Cutscene Actor 3")
OBJ_NAME_DEFINE(O_PLAYER_4, "Cutscene Actor 4")
OBJ_NAME_DEFINE(O_MAP_CLOSED, "Map Closed")
OBJ_NAME_DEFINE(O_SAVEGAME_ITEM, "Savegame Crystal")
OBJ_NAME_DEFINE(O_GAMMA_OPTION, "Gamma")
OBJ_NAME_DEFINE(O_PUZZLE_HOLE_1, "Puzzle Hole 1 (Empty)")
OBJ_NAME_DEFINE(O_PUZZLE_HOLE_2, "Puzzle Hole 2 (Empty)")
OBJ_NAME_DEFINE(O_PUZZLE_HOLE_3, "Puzzle Hole 3 (Empty)")
OBJ_NAME_DEFINE(O_PUZZLE_HOLE_4, "Puzzle Hole 4 (Empty)")
OBJ_NAME_DEFINE(O_PUZZLE_DONE_1, "Puzzle Hole 1 (Done)")
OBJ_NAME_DEFINE(O_PUZZLE_DONE_2, "Puzzle Hole 2 (Done)")
OBJ_NAME_DEFINE(O_PUZZLE_DONE_3, "Puzzle Hole 3 (Done)")
OBJ_NAME_DEFINE(O_PUZZLE_DONE_4, "Puzzle Hole 4 (Done)")
OBJ_NAME_DEFINE(O_MIDAS_TOUCH, "Midas Hand")
OBJ_NAME_DEFINE(O_KEY_HOLE_1, "Keyhole 1")
OBJ_NAME_DEFINE(O_KEY_HOLE_2, "Keyhole 1")
OBJ_NAME_DEFINE(O_KEY_HOLE_3, "Keyhole 1")
OBJ_NAME_DEFINE(O_KEY_HOLE_4, "Keyhole 1")
OBJ_NAME_DEFINE(O_SCION_HOLDER, "Scion Holder")
OBJ_NAME_DEFINE(O_EXPLOSION_1, "Explosion 1")
OBJ_NAME_DEFINE(O_EXPLOSION_2, "Explosion 2")
OBJ_NAME_DEFINE(O_SPLASH_1, "Splash 1")
OBJ_NAME_DEFINE(O_SPLASH_2, "Splash 2")
OBJ_NAME_DEFINE(O_BUBBLES_1, "Bubbles 1")
OBJ_NAME_DEFINE(O_BUBBLES_2, "Bubbles 2")
OBJ_NAME_DEFINE(O_BUBBLE_EMITTER, "Bubbles Emitter")
OBJ_NAME_DEFINE(O_BLOOD_1, "Blood 1")
OBJ_NAME_DEFINE(O_BLOOD_2, "Blood 2")
OBJ_NAME_DEFINE(O_DART_EFFECT, "Dart Effect")
OBJ_NAME_DEFINE(O_STATUE, "Statue")
OBJ_NAME_DEFINE(O_PORTACABIN, "Portable Cabin")
OBJ_NAME_DEFINE(O_PODS, "Pod")
OBJ_NAME_DEFINE(O_RICOCHET_1, "Ricochet")
OBJ_NAME_DEFINE(O_TWINKLE, "Sparkles")
OBJ_NAME_DEFINE(O_GUN_FLASH, "Gun Flash")
OBJ_NAME_DEFINE(O_DUST, "Dust")
OBJ_NAME_DEFINE(O_BODY_PART, "Body Part")
OBJ_NAME_DEFINE(O_CAMERA_TARGET, "Camera Target")
OBJ_NAME_DEFINE(O_WATERFALL, "Waterfall Mist")
OBJ_NAME_DEFINE(O_MISSILE_1, "Missile 1")
OBJ_NAME_DEFINE(O_MISSILE_2, "Missile 2")
OBJ_NAME_DEFINE(O_MISSILE_3, "Missile 3")
OBJ_NAME_DEFINE(O_MISSILE_4, "Missile 4")
OBJ_NAME_DEFINE(O_MISSILE_5, "Missile 5")
OBJ_NAME_DEFINE(O_EMBER, "Ember")
OBJ_NAME_DEFINE(O_EMBER_EMITTER, "Ember Emitter")
OBJ_NAME_DEFINE(O_FLAME, "Flame")
OBJ_NAME_DEFINE(O_FLAME_EMITTER, "Flame Emitter")
OBJ_NAME_DEFINE(O_LAVA_WEDGE, "Lava Wedge")
OBJ_NAME_DEFINE(O_BIG_POD, "Big Pod")
OBJ_NAME_DEFINE(O_BOAT, "Boat")
OBJ_NAME_DEFINE(O_EARTHQUAKE, "Earthquake")
OBJ_NAME_DEFINE(O_SKYBOX, "Skybox")
OBJ_NAME_DEFINE(O_PICKUP_AID, "Pickup Aid")
OBJ_NAME_DEFINE(O_TEMP_7, "Temp 7")
OBJ_NAME_DEFINE(O_TEMP_8, "Temp 8")
OBJ_NAME_DEFINE(O_TEMP_9, "Temp 9")
OBJ_NAME_DEFINE(O_TEMP_10, "Temp 10")
OBJ_NAME_DEFINE(O_HAIR, "Lara's Braid")
OBJ_NAME_DEFINE(O_ALPHABET, "Alphabet")
// pickups on the ground
OBJ_NAME_DEFINE(O_MEDI_ITEM, "small_medipack", "Small Medi Pack")
OBJ_NAME_DEFINE(O_BIGMEDI_ITEM, "large_medipack", "Large Medi Pack")
OBJ_NAME_DEFINE(O_PISTOL_ITEM, "pistols", "Pistols")
OBJ_NAME_DEFINE(O_SHOTGUN_ITEM, "shotgun", "Shotgun")
OBJ_NAME_DEFINE(O_MAGNUM_ITEM, "magnums", "Magnums")
OBJ_NAME_DEFINE(O_UZI_ITEM, "uzis", "Uzis")
OBJ_NAME_DEFINE(O_PISTOL_AMMO_ITEM, "pistol_ammo", "Pistol Clips")
OBJ_NAME_DEFINE(O_SG_AMMO_ITEM, "shotgun_ammo", "Shotgun Shells")
OBJ_NAME_DEFINE(O_MAG_AMMO_ITEM, "magnums_ammo", "Magnum Clips")
OBJ_NAME_DEFINE(O_UZI_AMMO_ITEM, "uzis_ammo", "Uzi Clips")
OBJ_NAME_DEFINE(O_EXPLOSIVE_ITEM, "grenade", "Grenade")
OBJ_NAME_DEFINE(O_KEY_ITEM_1, "key_1", "Key 1")
OBJ_NAME_DEFINE(O_KEY_ITEM_2, "key_2", "Key 2")
OBJ_NAME_DEFINE(O_KEY_ITEM_3, "key_3", "Key 3")
OBJ_NAME_DEFINE(O_KEY_ITEM_4, "key_4", "Key 4")
OBJ_NAME_DEFINE(O_PUZZLE_ITEM_1, "puzzle_1", "Puzzle Item 1")
OBJ_NAME_DEFINE(O_PUZZLE_ITEM_2, "puzzle_2", "Puzzle Item 2")
OBJ_NAME_DEFINE(O_PUZZLE_ITEM_3, "puzzle_3", "Puzzle Item 3")
OBJ_NAME_DEFINE(O_PUZZLE_ITEM_4, "puzzle_4", "Puzzle Item 4")
OBJ_NAME_DEFINE(O_PICKUP_ITEM_1, "pickup_1", "Pickup Item 1")
OBJ_NAME_DEFINE(O_PICKUP_ITEM_2, "pickup_2", "Pickup Item 2")
OBJ_NAME_DEFINE(O_LEADBAR_ITEM, "lead_bar", "Lead Bar")
OBJ_NAME_DEFINE(O_SCION_ITEM_1, "scion", "Scion")
OBJ_ALIAS_DEFINE(O_SCION_ITEM_2, O_SCION_ITEM_1)
OBJ_ALIAS_DEFINE(O_SCION_ITEM_3, O_SCION_ITEM_1)
OBJ_ALIAS_DEFINE(O_SCION_ITEM_4, O_SCION_ITEM_1)
// inventory ring
OBJ_NAME_DEFINE(O_COMPASS_OPTION, "compass", "Compass")
OBJ_NAME_DEFINE(O_PASSPORT_OPTION, "passport", "Game")
OBJ_NAME_DEFINE(O_PHOTO_OPTION, "photo", "Lara's Home")
OBJ_NAME_DEFINE(O_DETAIL_OPTION, "graphics", "Detail Levels")
OBJ_NAME_DEFINE(O_CONTROL_OPTION, "controls", "Controls")
OBJ_NAME_DEFINE(O_SOUND_OPTION, "sound", "Sound")
OBJ_NAME_DEFINE(O_GAMMA_OPTION, "gamma", "Gamma")
OBJ_NAME_DEFINE(O_MAP_CLOSED, "map", "Map")
OBJ_ALIAS_DEFINE(O_PISTOL_OPTION, O_PISTOL_ITEM)
OBJ_ALIAS_DEFINE(O_PISTOL_AMMO_OPTION, O_PISTOL_ITEM)
OBJ_ALIAS_DEFINE(O_SHOTGUN_OPTION, O_SHOTGUN_ITEM)
OBJ_ALIAS_DEFINE(O_MAGNUM_OPTION, O_MAGNUM_ITEM)
OBJ_ALIAS_DEFINE(O_UZI_OPTION, O_UZI_ITEM)
OBJ_ALIAS_DEFINE(O_SG_AMMO_OPTION, O_SG_AMMO_ITEM)
OBJ_ALIAS_DEFINE(O_MAG_AMMO_OPTION, O_MAG_AMMO_ITEM)
OBJ_ALIAS_DEFINE(O_UZI_AMMO_OPTION, O_UZI_AMMO_ITEM)
OBJ_ALIAS_DEFINE(O_EXPLOSIVE_OPTION, O_EXPLOSIVE_ITEM)
OBJ_ALIAS_DEFINE(O_MEDI_OPTION, O_MEDI_ITEM)
OBJ_ALIAS_DEFINE(O_BIGMEDI_OPTION, O_BIGMEDI_ITEM)
OBJ_ALIAS_DEFINE(O_PUZZLE_OPTION_1, O_PUZZLE_ITEM_1)
OBJ_ALIAS_DEFINE(O_PUZZLE_OPTION_2, O_PUZZLE_ITEM_2)
OBJ_ALIAS_DEFINE(O_PUZZLE_OPTION_3, O_PUZZLE_ITEM_3)
OBJ_ALIAS_DEFINE(O_PUZZLE_OPTION_4, O_PUZZLE_ITEM_4)
OBJ_ALIAS_DEFINE(O_KEY_OPTION_1, O_KEY_ITEM_1)
OBJ_ALIAS_DEFINE(O_KEY_OPTION_2, O_KEY_ITEM_2)
OBJ_ALIAS_DEFINE(O_KEY_OPTION_3, O_KEY_ITEM_3)
OBJ_ALIAS_DEFINE(O_KEY_OPTION_4, O_KEY_ITEM_4)
OBJ_ALIAS_DEFINE(O_PICKUP_OPTION_1, O_PICKUP_ITEM_1)
OBJ_ALIAS_DEFINE(O_PICKUP_OPTION_2, O_PICKUP_ITEM_2)
OBJ_ALIAS_DEFINE(O_LEADBAR_OPTION, O_LEADBAR_ITEM)
OBJ_ALIAS_DEFINE(O_SCION_OPTION, O_SCION_ITEM_1)
OBJ_ALIAS_DEFINE(O_PASSPORT_CLOSED, O_PASSPORT_OPTION)
// general objects
OBJ_NAME_DEFINE(O_LARA, "lara", "Lara")
OBJ_NAME_DEFINE(O_PISTOL_ANIM, "pistol_anim", "Pistols Animation")
OBJ_NAME_DEFINE(O_SHOTGUN_ANIM, "shotgun_anim", "Shotgun Animation")
OBJ_NAME_DEFINE(O_MAGNUM_ANIM, "magnum_anim", "Magnums Animation")
OBJ_NAME_DEFINE(O_UZI_ANIM, "uzi_anim", "Uzis Animation")
OBJ_NAME_DEFINE(O_LARA_EXTRA, "lara_extra", "Lara's Extra Animation")
OBJ_NAME_DEFINE(O_BACON_LARA, "bacon_lara", "Bacon Lara")
OBJ_NAME_DEFINE(O_WOLF, "wolf", "Wolf")
OBJ_NAME_DEFINE(O_BEAR, "bear", "Bear")
OBJ_NAME_DEFINE(O_BAT, "bat", "Bat")
OBJ_NAME_DEFINE(O_CROCODILE, "crocodile", "Crocodile")
OBJ_NAME_DEFINE(O_ALLIGATOR, "alligator", "Alligator")
OBJ_NAME_DEFINE(O_LION, "lion", "Lion")
OBJ_NAME_DEFINE(O_LIONESS, "lioness", "Lioness")
OBJ_NAME_DEFINE(O_PUMA, "puma", "Puma")
OBJ_NAME_DEFINE(O_APE, "ape", "Ape")
OBJ_NAME_DEFINE(O_RAT, "rat", "Rat")
OBJ_NAME_DEFINE(O_VOLE, "vole", "Vole")
OBJ_NAME_DEFINE(O_TREX, "trex", "T-Rex")
OBJ_NAME_DEFINE(O_RAPTOR, "raptor", "Raptor")
OBJ_NAME_DEFINE(O_WARRIOR_1, "mutant_1", "Mutant 1")
OBJ_NAME_DEFINE(O_WARRIOR_2, "mutant_2", "Mutant 2")
OBJ_NAME_DEFINE(O_WARRIOR_3, "mutant_3", "Mutant 3")
OBJ_NAME_DEFINE(O_CENTAUR, "centaur", "Centaur")
OBJ_NAME_DEFINE(O_MUMMY, "mummy", "Mummy")
OBJ_NAME_DEFINE(O_DINO_WARRIOR, "dino_mutant", "Dino Mutant")
OBJ_NAME_DEFINE(O_FISH, "fish_mutant", "Mutant Fish")
OBJ_NAME_DEFINE(O_LARSON, "larson", "Larson")
OBJ_NAME_DEFINE(O_PIERRE, "pierre", "Pierre")
OBJ_NAME_DEFINE(O_SKATEBOARD, "skateboard", "Skateboard")
OBJ_NAME_DEFINE(O_SKATEKID, "skate_kid", "Skate Kid")
OBJ_NAME_DEFINE(O_COWBOY, "cowboy", "Cowboy")
OBJ_NAME_DEFINE(O_BALDY, "baldy", "Baldy")
OBJ_NAME_DEFINE(O_NATLA, "natla", "Natla")
OBJ_NAME_DEFINE(O_TORSO, "torso", "Torso")
OBJ_NAME_DEFINE(O_FALLING_BLOCK, "falling_block", "Falling Block")
OBJ_NAME_DEFINE(O_PENDULUM, "pendulum", "Pendulum")
OBJ_NAME_DEFINE(O_SPIKES, "spikes", "Spikes")
OBJ_NAME_DEFINE(O_ROLLING_BALL, "rolling_ball", "Boulder")
OBJ_NAME_DEFINE(O_DART, "dart", "Dart")
OBJ_NAME_DEFINE(O_DART_EMITTER, "dart_emitter", "Dart Emitter")
OBJ_NAME_DEFINE(O_DRAWBRIDGE, "drawbridge", "Drawbridge")
OBJ_NAME_DEFINE(O_TEETH_TRAP, "teeth_trap", "Teeth Trap")
OBJ_NAME_DEFINE(O_DAMOCLES_SWORD, "damocles_sword", "Damocles Sword")
OBJ_NAME_DEFINE(O_THORS_HANDLE, "thors_handle", "Thor's Hammer Handle")
OBJ_NAME_DEFINE(O_THORS_HEAD, "thors_head", "Thor's Hammer")
OBJ_NAME_DEFINE(O_LIGHTNING_EMITTER, "lightning_emitter", "Lightning Emitter")
OBJ_NAME_DEFINE(O_MOVING_BAR, "moving_bar", "Moving Bar")
OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_1, "movable_block_1", "Push Block 1")
OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_2, "movable_block_2", "Push Block 2")
OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_3, "movable_block_3", "Push Block 3")
OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_4, "movable_block_4", "Push Block 4")
OBJ_NAME_DEFINE(O_SLIDING_PILLAR, "sliding_pillar", "Sliding Pillar")
OBJ_NAME_DEFINE(O_FALLING_CEILING_1, "falling_ceiling_1", "Falling Ceiling 1")
OBJ_NAME_DEFINE(O_FALLING_CEILING_2, "falling_ceiling_2", "Falling Ceiling 2")
OBJ_NAME_DEFINE(O_SWITCH_TYPE_1, "switch_1", "Switch 1")
OBJ_NAME_DEFINE(O_SWITCH_TYPE_2, "switch_2", "Switch 2")
OBJ_NAME_DEFINE(O_DOOR_TYPE_1, "door_1", "Door 1")
OBJ_NAME_DEFINE(O_DOOR_TYPE_2, "door_2", "Door 2")
OBJ_NAME_DEFINE(O_DOOR_TYPE_3, "door_3", "Door 3")
OBJ_NAME_DEFINE(O_DOOR_TYPE_4, "door_4", "Door 4")
OBJ_NAME_DEFINE(O_DOOR_TYPE_5, "door_5", "Door 5")
OBJ_NAME_DEFINE(O_DOOR_TYPE_6, "door_6", "Door 6")
OBJ_NAME_DEFINE(O_DOOR_TYPE_7, "door_7", "Door 7")
OBJ_NAME_DEFINE(O_DOOR_TYPE_8, "door_8", "Door 8")
OBJ_NAME_DEFINE(O_TRAPDOOR_1, "trapdoor_1", "Trapdoor 1")
OBJ_NAME_DEFINE(O_TRAPDOOR_2, "trapdoor_2", "Trapdoor 2")
OBJ_NAME_DEFINE(O_BIGTRAPDOOR, "big_trapdoor", "Big Trapdoor")
OBJ_NAME_DEFINE(O_BRIDGE_FLAT, "bridge_flat", "Bridge Flat")
OBJ_NAME_DEFINE(O_BRIDGE_TILT_1, "bridge_tilt_1", "Bridge Tilt 1")
OBJ_NAME_DEFINE(O_BRIDGE_TILT_2, "bridge_tilt_2", "Bridge Tilt 2")
OBJ_NAME_DEFINE(O_COG_1, "cog_1", "Cog 1")
OBJ_NAME_DEFINE(O_COG_2, "cog_2", "Cog 2")
OBJ_NAME_DEFINE(O_COG_3, "cog_3", "Cog 3")
OBJ_NAME_DEFINE(O_PLAYER_1, "player_1", "Cutscene Actor 1")
OBJ_NAME_DEFINE(O_PLAYER_2, "player_2", "Cutscene Actor 2")
OBJ_NAME_DEFINE(O_PLAYER_3, "player_3", "Cutscene Actor 3")
OBJ_NAME_DEFINE(O_PLAYER_4, "player_4", "Cutscene Actor 4")
OBJ_NAME_DEFINE(O_SAVEGAME_ITEM, "save_crystal", "Savegame Crystal")
OBJ_NAME_DEFINE(O_PUZZLE_HOLE_1, "puzzle_hole_1", "Puzzle Hole 1 (Empty)")
OBJ_NAME_DEFINE(O_PUZZLE_HOLE_2, "puzzle_hole_2", "Puzzle Hole 2 (Empty)")
OBJ_NAME_DEFINE(O_PUZZLE_HOLE_3, "puzzle_hole_3", "Puzzle Hole 3 (Empty)")
OBJ_NAME_DEFINE(O_PUZZLE_HOLE_4, "puzzle_hole_4", "Puzzle Hole 4 (Empty)")
OBJ_NAME_DEFINE(O_PUZZLE_DONE_1, "puzzle_done_1", "Puzzle Hole 1 (Done)")
OBJ_NAME_DEFINE(O_PUZZLE_DONE_2, "puzzle_done_2", "Puzzle Hole 2 (Done)")
OBJ_NAME_DEFINE(O_PUZZLE_DONE_3, "puzzle_done_3", "Puzzle Hole 3 (Done)")
OBJ_NAME_DEFINE(O_PUZZLE_DONE_4, "puzzle_done_4", "Puzzle Hole 4 (Done)")
OBJ_NAME_DEFINE(O_MIDAS_TOUCH, "midas_touch", "Midas Hand")
OBJ_NAME_DEFINE(O_KEY_HOLE_1, "key_hole_1", "Keyhole 1")
OBJ_NAME_DEFINE(O_KEY_HOLE_2, "key_hole_2", "Keyhole 1")
OBJ_NAME_DEFINE(O_KEY_HOLE_3, "key_hole_3", "Keyhole 1")
OBJ_NAME_DEFINE(O_KEY_HOLE_4, "key_hole_4", "Keyhole 1")
OBJ_NAME_DEFINE(O_SCION_HOLDER, "scion_holder", "Scion Holder")
OBJ_NAME_DEFINE(O_EXPLOSION_1, "explosion_1", "Explosion 1")
OBJ_NAME_DEFINE(O_EXPLOSION_2, "explosion_2", "Explosion 2")
OBJ_NAME_DEFINE(O_SPLASH_1, "splash_1", "Splash 1")
OBJ_NAME_DEFINE(O_SPLASH_2, "splash_2", "Splash 2")
OBJ_NAME_DEFINE(O_BUBBLES_1, "bubbles_1", "Bubbles 1")
OBJ_NAME_DEFINE(O_BUBBLES_2, "bubbles_2", "Bubbles 2")
OBJ_NAME_DEFINE(O_BUBBLE_EMITTER, "bubble_emitter", "Bubbles Emitter")
OBJ_NAME_DEFINE(O_BLOOD_1, "blood_1", "Blood 1")
OBJ_NAME_DEFINE(O_BLOOD_2, "blood_2", "Blood 2")
OBJ_NAME_DEFINE(O_DART_EFFECT, "dart_effect", "Dart Effect")
OBJ_NAME_DEFINE(O_STATUE, "statue", "Statue")
OBJ_NAME_DEFINE(O_PORTACABIN, "portacabin", "Portable Cabin")
OBJ_NAME_DEFINE(O_PODS, "pods", "Pod")
OBJ_NAME_DEFINE(O_RICOCHET_1, "ricochet_1", "Ricochet")
OBJ_NAME_DEFINE(O_TWINKLE, "twinkle", "Sparkles")
OBJ_NAME_DEFINE(O_GUN_FLASH, "gun_flash", "Gun Flash")
OBJ_NAME_DEFINE(O_DUST, "dust", "Dust")
OBJ_NAME_DEFINE(O_BODY_PART, "body_part", "Body Part")
OBJ_NAME_DEFINE(O_CAMERA_TARGET, "camera_target", "Camera Target")
OBJ_NAME_DEFINE(O_WATERFALL, "waterfall", "Waterfall Mist")
OBJ_NAME_DEFINE(O_MISSILE_1, "missile_1", "Missile 1")
OBJ_NAME_DEFINE(O_MISSILE_2, "missile_2", "Missile 2")
OBJ_NAME_DEFINE(O_MISSILE_3, "missile_3", "Missile 3")
OBJ_NAME_DEFINE(O_MISSILE_4, "missile_4", "Missile 4")
OBJ_NAME_DEFINE(O_MISSILE_5, "missile_5", "Missile 5")
OBJ_NAME_DEFINE(O_EMBER, "ember", "Ember")
OBJ_NAME_DEFINE(O_EMBER_EMITTER, "ember_emitter", "Ember Emitter")
OBJ_NAME_DEFINE(O_FLAME, "flame", "Flame")
OBJ_NAME_DEFINE(O_FLAME_EMITTER, "flame_emitter", "Flame Emitter")
OBJ_NAME_DEFINE(O_LAVA_WEDGE, "lava_wedge", "Lava Wedge")
OBJ_NAME_DEFINE(O_BIG_POD, "big_pod", "Big Pod")
OBJ_NAME_DEFINE(O_BOAT, "boat", "Boat")
OBJ_NAME_DEFINE(O_EARTHQUAKE, "earthquake", "Earthquake")
OBJ_NAME_DEFINE(O_SKYBOX, "skybox", "Skybox")
OBJ_NAME_DEFINE(O_PICKUP_AID, "pickup_aid", "Pickup Aid")
OBJ_NAME_DEFINE(O_TEMP_7, "temp_7", "Temp 7")
OBJ_NAME_DEFINE(O_TEMP_8, "temp_8", "Temp 8")
OBJ_NAME_DEFINE(O_TEMP_9, "temp_9", "Temp 9")
OBJ_NAME_DEFINE(O_TEMP_10, "temp_10", "Temp 10")
OBJ_NAME_DEFINE(O_HAIR, "hair", "Lara's Braid")
OBJ_NAME_DEFINE(O_ALPHABET, "alphabet", "Alphabet")

View file

@ -1,203 +1,270 @@
OBJ_NAME_DEFINE(O_LARA, "Lara")
OBJ_NAME_DEFINE(O_LARA_PISTOLS, "Pistols Animation")
OBJ_NAME_DEFINE(O_LARA_HAIR, "Braid")
OBJ_NAME_DEFINE(O_LARA_SHOTGUN, "Shotgun Animation")
OBJ_NAME_DEFINE(O_LARA_MAGNUMS, "Magnums Animation")
OBJ_NAME_DEFINE(O_LARA_UZIS, "Uzis Animation")
OBJ_NAME_DEFINE(O_LARA_M16, "M16 Animation")
OBJ_NAME_DEFINE(O_LARA_GRENADE, "Grenade Launcher Animation")
OBJ_NAME_DEFINE(O_LARA_HARPOON, "Harpoon Animation")
OBJ_NAME_DEFINE(O_LARA_FLARE, "Flare Animation")
OBJ_NAME_DEFINE(O_LARA_SKIDOO, "Snowmobile Animation")
OBJ_NAME_DEFINE(O_LARA_BOAT, "Boat Animation")
OBJ_NAME_DEFINE(O_LARA_EXTRA, "Lara's Extra Animation")
OBJ_NAME_DEFINE(O_SKIDOO_FAST, "Red Snowmobile")
OBJ_NAME_DEFINE(O_BOAT, "Boat")
OBJ_NAME_DEFINE(O_DOG, "Dog")
OBJ_NAME_DEFINE(O_CULT_1, "Masked Goon 1")
OBJ_NAME_DEFINE(O_CULT_1A, "Masked Goon 2")
OBJ_NAME_DEFINE(O_CULT_1B, "Masked Goon 3")
OBJ_NAME_DEFINE(O_CULT_2, "Knife Thrower")
OBJ_NAME_DEFINE(O_CULT_3, "Shotgun Goon")
OBJ_NAME_DEFINE(O_MOUSE, "Rat")
OBJ_NAME_DEFINE(O_DRAGON_FRONT, "Dragon Front")
OBJ_NAME_DEFINE(O_DRAGON_BACK, "Dragon Back")
OBJ_NAME_DEFINE(O_GONDOLA, "Gondola")
OBJ_NAME_DEFINE(O_SHARK, "Shark")
OBJ_NAME_DEFINE(O_EEL, "Eel")
OBJ_NAME_DEFINE(O_BIG_EEL, "Big Eel")
OBJ_NAME_DEFINE(O_BARRACUDA, "Barracuda")
OBJ_NAME_DEFINE(O_DIVER, "Scuba Diver")
OBJ_NAME_DEFINE(O_WORKER_1, "Gunman Goon 1")
OBJ_NAME_DEFINE(O_WORKER_2, "Gunman Goon 2")
OBJ_NAME_DEFINE(O_WORKER_3, "Stick Wielding Goon 1")
OBJ_NAME_DEFINE(O_WORKER_4, "Stick Wielding Goon 2")
OBJ_NAME_DEFINE(O_WORKER_5, "Flamethrower Goon")
OBJ_NAME_DEFINE(O_JELLY, "Jellyfish")
OBJ_NAME_DEFINE(O_SPIDER, "Spider")
OBJ_NAME_DEFINE(O_BIG_SPIDER, "Giant Spider")
OBJ_NAME_DEFINE(O_CROW, "Crow")
OBJ_NAME_DEFINE(O_TIGER, "Tiger")
OBJ_NAME_DEFINE(O_BARTOLI, "Marco Bartoli")
OBJ_NAME_DEFINE(O_XIAN_SPEARMAN, "Xian Spearman")
OBJ_NAME_DEFINE(O_XIAN_SPEARMAN_STATUE, "Xian Spearman Statue")
OBJ_NAME_DEFINE(O_XIAN_KNIGHT, "Xian Knight")
OBJ_NAME_DEFINE(O_XIAN_KNIGHT_STATUE, "Xian Knight")
OBJ_NAME_DEFINE(O_YETI, "Yeti")
OBJ_NAME_DEFINE(O_BIRD_GUARDIAN, "Bird Monster")
OBJ_NAME_DEFINE(O_EAGLE, "Eagle")
OBJ_NAME_DEFINE(O_BANDIT_1, "Mercenary 1")
OBJ_NAME_DEFINE(O_BANDIT_2, "Mercenary 2")
OBJ_NAME_DEFINE(O_BANDIT_2B, "Mercenary 3")
OBJ_NAME_DEFINE(O_SKIDOO_ARMED, "Black Snowmobile")
OBJ_NAME_DEFINE(O_SKIDOO_DRIVER, "Black Snowmobile Driver")
OBJ_NAME_DEFINE(O_MONK_1, "Monk 1")
OBJ_NAME_DEFINE(O_MONK_2, "Monk 2")
OBJ_NAME_DEFINE(O_FALLING_BLOCK_1, "Falling Block 1")
OBJ_NAME_DEFINE(O_FALLING_BLOCK_2, "Falling Block 2")
OBJ_NAME_DEFINE(O_FALLING_BLOCK_3, "Loose Boards")
OBJ_NAME_DEFINE(O_PENDULUM_1, "Sandbag")
OBJ_NAME_DEFINE(O_SPIKES, "Spikes")
OBJ_NAME_DEFINE(O_ROLLING_BALL_1, "Boulder 1")
OBJ_NAME_DEFINE(O_DART, "Disc")
OBJ_NAME_DEFINE(O_DART_EMITTER, "Disc Emitter")
OBJ_NAME_DEFINE(O_DRAWBRIDGE, "Drawbridge")
OBJ_NAME_DEFINE(O_TEETH_TRAP, "Teeth Trap")
OBJ_NAME_DEFINE(O_LIFT, "Lift")
OBJ_NAME_DEFINE(O_GENERAL, "Minisub")
OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_1, "Push Block 1")
OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_2, "Push Block 2")
OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_3, "Push Block 3")
OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_4, "Push Block 4")
OBJ_NAME_DEFINE(O_BIG_BOWL, "Lava Bowl")
OBJ_NAME_DEFINE(O_WINDOW_1, "Breakable Window 1")
OBJ_NAME_DEFINE(O_WINDOW_2, "Breakable Window 2")
OBJ_NAME_DEFINE(O_WINDOW_3, "Breakable Window 3")
OBJ_NAME_DEFINE(O_WINDOW_4, "Breakable Window 4")
OBJ_NAME_DEFINE(O_PROPELLER_1, "Airplane Propeller")
OBJ_NAME_DEFINE(O_POWER_SAW, "Power Saw")
OBJ_NAME_DEFINE(O_HOOK, "Hook")
OBJ_NAME_DEFINE(O_FALLING_CEILING, "Falling Ceiling")
OBJ_NAME_DEFINE(O_SPINNING_BLADE, "Spinning Blade")
OBJ_NAME_DEFINE(O_BLADE, "Wall-mounted Blade")
OBJ_NAME_DEFINE(O_KILLER_STATUE, "Statue with Sword")
OBJ_NAME_DEFINE(O_ROLLING_BALL_2, "Boulder 2")
OBJ_NAME_DEFINE(O_ICICLE, "Icicles")
OBJ_NAME_DEFINE(O_SPIKE_WALL, "Spike Wall")
OBJ_NAME_DEFINE(O_SPRINGBOARD, "Springboard")
OBJ_NAME_DEFINE(O_CEILING_SPIKES, "Spiky Ceiling")
OBJ_NAME_DEFINE(O_BELL, "Bell")
OBJ_NAME_DEFINE(O_WATER_SPRITE, "Boat Wake")
OBJ_NAME_DEFINE(O_SNOW_SPRITE, "Snowmobile Wale")
OBJ_NAME_DEFINE(O_SKIDOO_TRACK, "Snowmobile Track")
OBJ_NAME_DEFINE(O_SWITCH_TYPE_AIRLOCK, "Airlock Switch")
OBJ_NAME_DEFINE(O_SWITCH_TYPE_SMALL, "Small Switch")
OBJ_NAME_DEFINE(O_PROPELLER_2, "Underwater Propeller")
OBJ_NAME_DEFINE(O_PROPELLER_3, "Air Fan")
OBJ_NAME_DEFINE(O_PENDULUM_2, "Swinging Box")
OBJ_NAME_DEFINE(O_MESH_SWAP_1, "Mesh Swap 1")
OBJ_NAME_DEFINE(O_MESH_SWAP_2, "Mesh Swap 2")
OBJ_NAME_DEFINE(O_LARA_SWAP, "Lara Mesh Swap")
OBJ_NAME_DEFINE(O_TEXT_BOX, "UI Frame")
OBJ_NAME_DEFINE(O_ROLLING_BALL_3, "Boulder 3")
OBJ_NAME_DEFINE(O_ZIPLINE_HANDLE, "Zipline Handle")
OBJ_NAME_DEFINE(O_SWITCH_TYPE_BUTTON, "Switch Button")
OBJ_NAME_DEFINE(O_SWITCH_TYPE_NORMAL, "Lever/Switch")
OBJ_NAME_DEFINE(O_SWITCH_TYPE_UW, "Underwater Lever/Switch")
OBJ_NAME_DEFINE(O_DOOR_TYPE_1, "Door 1")
OBJ_NAME_DEFINE(O_DOOR_TYPE_2, "Door 2")
OBJ_NAME_DEFINE(O_DOOR_TYPE_3, "Door 3")
OBJ_NAME_DEFINE(O_DOOR_TYPE_4, "Door 4")
OBJ_NAME_DEFINE(O_DOOR_TYPE_5, "Door 5")
OBJ_NAME_DEFINE(O_DOOR_TYPE_6, "Door 6")
OBJ_NAME_DEFINE(O_DOOR_TYPE_7, "Door 7")
OBJ_NAME_DEFINE(O_DOOR_TYPE_8, "Door 8")
OBJ_NAME_DEFINE(O_TRAPDOOR_TYPE_1, "Trapdoor 1")
OBJ_NAME_DEFINE(O_TRAPDOOR_TYPE_2, "Trapdoor 2")
OBJ_NAME_DEFINE(O_TRAPDOOR_TYPE_3, "Trapdoor 3")
OBJ_NAME_DEFINE(O_BRIDGE_FLAT, "Bridge Flat")
OBJ_NAME_DEFINE(O_BRIDGE_TILT_1, "Bridge Tilt 1")
OBJ_NAME_DEFINE(O_BRIDGE_TILT_2, "Bridge Tilt 2")
OBJ_NAME_DEFINE(O_PLAYER_1, "Cutscene Actor 1")
OBJ_NAME_DEFINE(O_PLAYER_2, "Cutscene Actor 2")
OBJ_NAME_DEFINE(O_PLAYER_3, "Cutscene Actor 3")
OBJ_NAME_DEFINE(O_PLAYER_4, "Cutscene Actor 4")
OBJ_NAME_DEFINE(O_PLAYER_5, "Cutscene Actor 5")
OBJ_NAME_DEFINE(O_PLAYER_6, "Cutscene Actor 6")
OBJ_NAME_DEFINE(O_PLAYER_7, "Cutscene Actor 7")
OBJ_NAME_DEFINE(O_PLAYER_8, "Cutscene Actor 8")
OBJ_NAME_DEFINE(O_PLAYER_9, "Cutscene Actor 9")
OBJ_NAME_DEFINE(O_PLAYER_10, "Cutscene Actor 10")
OBJ_NAME_DEFINE(O_FLARES_ITEM, "Flares Box")
OBJ_NAME_DEFINE(O_GAMMA_OPTION, "Gamma Option")
OBJ_NAME_DEFINE(O_PUZZLE_HOLE_1, "Puzzle Hole 1 (Empty)")
OBJ_NAME_DEFINE(O_PUZZLE_HOLE_2, "Puzzle Hole 2 (Empty)")
OBJ_NAME_DEFINE(O_PUZZLE_HOLE_3, "Puzzle Hole 3 (Empty)")
OBJ_NAME_DEFINE(O_PUZZLE_HOLE_4, "Puzzle Hole 4 (Empty)")
OBJ_NAME_DEFINE(O_PUZZLE_DONE_1, "Puzzle Hole 1 (Done)")
OBJ_NAME_DEFINE(O_PUZZLE_DONE_2, "Puzzle Hole 2 (Done)")
OBJ_NAME_DEFINE(O_PUZZLE_DONE_3, "Puzzle Hole 3 (Done)")
OBJ_NAME_DEFINE(O_PUZZLE_DONE_4, "Puzzle Hole 4 (Done)")
OBJ_NAME_DEFINE(O_SECRET_1, "Secret 1")
OBJ_NAME_DEFINE(O_SECRET_2, "Secret 2")
OBJ_NAME_DEFINE(O_SECRET_3, "Secret 3")
OBJ_NAME_DEFINE(O_KEY_HOLE_1, "Keyhole 1")
OBJ_NAME_DEFINE(O_KEY_HOLE_2, "Keyhole 2")
OBJ_NAME_DEFINE(O_KEY_HOLE_3, "Keyhole 3")
OBJ_NAME_DEFINE(O_KEY_HOLE_4, "Keyhole 4")
OBJ_NAME_DEFINE(O_SPHERE_OF_DOOM_1, "Dragon Explosion 1")
OBJ_NAME_DEFINE(O_SPHERE_OF_DOOM_2, "Dragon Explosion 2")
OBJ_NAME_DEFINE(O_SPHERE_OF_DOOM_3, "Dragon Explosion 3")
OBJ_NAME_DEFINE(O_ALARM_SOUND, "Alarm")
OBJ_NAME_DEFINE(O_BIRD_TWEETER_1, "Dripping Water")
OBJ_NAME_DEFINE(O_DINO, "T-Rex")
OBJ_NAME_DEFINE(O_BIRD_TWEETER_2, "Singing Birds")
OBJ_NAME_DEFINE(O_CLOCK_CHIMES, "Bartoli Hideout clock")
OBJ_NAME_DEFINE(O_DRAGON_BONES_1, "Placeholder")
OBJ_NAME_DEFINE(O_DRAGON_BONES_2, "Dragon Bones Front")
OBJ_NAME_DEFINE(O_DRAGON_BONES_3, "Dragon Bones Back")
OBJ_NAME_DEFINE(O_HOT_LIQUID, "Extra Fire")
OBJ_NAME_DEFINE(O_BOAT_BITS, "Boat Bits")
OBJ_NAME_DEFINE(O_MINE, "Aquatic Mine")
OBJ_NAME_DEFINE(O_INV_BACKGROUND, "Menu Background")
OBJ_NAME_DEFINE(O_FX_RESERVED, "Gray disk")
OBJ_NAME_DEFINE(O_GONG_BONGER, "Gong Stick")
OBJ_NAME_DEFINE(O_DETONATOR_1, "Gong")
OBJ_NAME_DEFINE(O_DETONATOR_2, "Detonator Box")
OBJ_NAME_DEFINE(O_COPTER, "Helicopter")
OBJ_NAME_DEFINE(O_EXPLOSION, "Explosion")
OBJ_NAME_DEFINE(O_SPLASH, "Water Ripples")
OBJ_NAME_DEFINE(O_BUBBLE, "Bubble")
OBJ_NAME_DEFINE(O_BUBBLE_EMITTER, "Bubbles Emitter")
OBJ_NAME_DEFINE(O_BLOOD, "Blood")
OBJ_NAME_DEFINE(O_DART_EFFECT, "Dart Effect")
OBJ_NAME_DEFINE(O_FLARE_FIRE, "Flare sparks")
OBJ_NAME_DEFINE(O_GLOW, "Glow")
OBJ_NAME_DEFINE(O_GLOW_RESERVED, "Map Glow")
OBJ_NAME_DEFINE(O_RICOCHET, "Ricochet")
OBJ_NAME_DEFINE(O_TWINKLE, "Sparkles")
OBJ_NAME_DEFINE(O_GUN_FLASH, "Gun Flash")
OBJ_NAME_DEFINE(O_M16_FLASH, "M16 Flash")
OBJ_NAME_DEFINE(O_BODY_PART, "Body Part")
OBJ_NAME_DEFINE(O_CAMERA_TARGET, "Camera Target")
OBJ_NAME_DEFINE(O_WATERFALL, "Waterfall Mist")
OBJ_NAME_DEFINE(O_MISSILE_HARPOON, "Missile Harpoon")
OBJ_NAME_DEFINE(O_MISSILE_FLAME, "Missile Flame")
OBJ_NAME_DEFINE(O_MISSILE_KNIFE, "Missile Knife")
OBJ_NAME_DEFINE(O_GRENADE, "Grenade")
OBJ_NAME_DEFINE(O_HARPOON_BOLT, "Harpoon Bolt")
OBJ_NAME_DEFINE(O_EMBER, "Ember")
OBJ_NAME_DEFINE(O_EMBER_EMITTER, "Ember Emitter")
OBJ_NAME_DEFINE(O_FLAME, "Flame")
OBJ_NAME_DEFINE(O_FLAME_EMITTER, "Flame Emitter")
OBJ_NAME_DEFINE(O_SKYBOX, "Skybox")
OBJ_NAME_DEFINE(O_ALPHABET, "Alphabet")
OBJ_NAME_DEFINE(O_DYING_MONK, "Dying monk")
OBJ_NAME_DEFINE(O_DING_DONG, "Doorbell")
OBJ_NAME_DEFINE(O_LARA_ALARM, "Alarm Bell")
OBJ_NAME_DEFINE(O_MINI_COPTER, "Helicopter 2")
OBJ_NAME_DEFINE(O_WINSTON, "Winston")
OBJ_NAME_DEFINE(O_ASSAULT_DIGITS, "Assault Digits")
OBJ_NAME_DEFINE(O_FINAL_LEVEL_COUNTER, "Final Level Counter")
OBJ_NAME_DEFINE(O_CUT_SHOTGUN, "Shotgun Shower Animation")
OBJ_NAME_DEFINE(O_EARTHQUAKE, "Earthquake")
// pickups on the ground
OBJ_NAME_DEFINE(O_SMALL_MEDIPACK_ITEM, "small_medipack", "Small Medipack")
OBJ_NAME_DEFINE(O_LARGE_MEDIPACK_ITEM, "large_medipack", "Large Medipack")
OBJ_NAME_DEFINE(O_FLARE_ITEM, "flare", "Flare")
OBJ_NAME_DEFINE(O_FLARES_ITEM, "flares_box", "Flares Box")
OBJ_NAME_DEFINE(O_SECRET_1, "secret_1", "Secret 1")
OBJ_NAME_DEFINE(O_SECRET_2, "secret_2", "Secret 2")
OBJ_NAME_DEFINE(O_SECRET_3, "secret_3", "Secret 3")
OBJ_NAME_DEFINE(O_PISTOL_ITEM, "pistols", "Pistols")
OBJ_NAME_DEFINE(O_SHOTGUN_ITEM, "shotgun", "Shotgun")
OBJ_NAME_DEFINE(O_MAGNUM_ITEM, "magnums", "Automatic Pistols")
OBJ_NAME_DEFINE(O_UZI_ITEM, "uzis", "Uzis")
OBJ_NAME_DEFINE(O_HARPOON_ITEM, "harpoon_gun", "Harpoon Gun")
OBJ_NAME_DEFINE(O_M16_ITEM, "m16", "M16")
OBJ_NAME_DEFINE(O_GRENADE_ITEM, "grenade_launcher", "Grenade Launcher")
OBJ_NAME_DEFINE(O_PISTOL_AMMO_ITEM, "pistols_ammo", "Pistol Clips")
OBJ_NAME_DEFINE(O_SHOTGUN_AMMO_ITEM, "shotgun_ammo", "Shotgun Shells")
OBJ_NAME_DEFINE(O_MAGNUM_AMMO_ITEM, "magnums_ammo", "Automatic Pistol Clips")
OBJ_NAME_DEFINE(O_UZI_AMMO_ITEM, "uzis_ammo", "Uzi Clips")
OBJ_NAME_DEFINE(O_HARPOON_AMMO_ITEM, "harpoon_gun_ammo", "Harpoons")
OBJ_NAME_DEFINE(O_M16_AMMO_ITEM, "m16_ammo", "M16 Clips")
OBJ_NAME_DEFINE(O_GRENADE_AMMO_ITEM, "grenade_launcher_ammo", "Grenades")
OBJ_NAME_DEFINE(O_KEY_ITEM_1, "key_1", "Key 1")
OBJ_NAME_DEFINE(O_KEY_ITEM_2, "key_2", "Key 2")
OBJ_NAME_DEFINE(O_KEY_ITEM_3, "key_3", "Key 3")
OBJ_NAME_DEFINE(O_KEY_ITEM_4, "key_4", "Key 4")
OBJ_NAME_DEFINE(O_PUZZLE_ITEM_1, "puzzle_1", "Puzzle Item 1")
OBJ_NAME_DEFINE(O_PUZZLE_ITEM_2, "puzzle_2", "Puzzle Item 2")
OBJ_NAME_DEFINE(O_PUZZLE_ITEM_3, "puzzle_3", "Puzzle Item 3")
OBJ_NAME_DEFINE(O_PUZZLE_ITEM_4, "puzzle_4", "Puzzle Item 4")
OBJ_NAME_DEFINE(O_PICKUP_ITEM_1, "pickup_1", "Pickup Item 1")
OBJ_NAME_DEFINE(O_PICKUP_ITEM_2, "pickup_2", "Pickup Item 2")
// inventory ring
OBJ_ALIAS_DEFINE(O_COMPASS_OPTION, O_COMPASS_ITEM)
OBJ_NAME_DEFINE(O_COMPASS_ITEM, "compass", "Statistics")
OBJ_NAME_DEFINE(O_PASSPORT_OPTION, "passport", "Game")
OBJ_NAME_DEFINE(O_PHOTO_OPTION, "photo", "Lara's Home")
OBJ_NAME_DEFINE(O_DETAIL_OPTION, "graphics", "Detail Levels")
OBJ_NAME_DEFINE(O_CONTROL_OPTION, "controls", "Controls")
OBJ_NAME_DEFINE(O_SOUND_OPTION, "sound", "Sound")
OBJ_ALIAS_DEFINE(O_SMALL_MEDIPACK_OPTION, O_SMALL_MEDIPACK_ITEM)
OBJ_ALIAS_DEFINE(O_LARGE_MEDIPACK_OPTION, O_LARGE_MEDIPACK_ITEM)
OBJ_ALIAS_DEFINE(O_FLARES_OPTION, O_FLARE_ITEM)
OBJ_ALIAS_DEFINE(O_PISTOL_OPTION, O_PISTOL_ITEM)
OBJ_ALIAS_DEFINE(O_PISTOL_AMMO_OPTION, O_PISTOL_AMMO_ITEM)
OBJ_ALIAS_DEFINE(O_SHOTGUN_OPTION, O_SHOTGUN_ITEM)
OBJ_ALIAS_DEFINE(O_MAGNUM_OPTION, O_MAGNUM_ITEM)
OBJ_ALIAS_DEFINE(O_UZI_OPTION, O_UZI_ITEM)
OBJ_ALIAS_DEFINE(O_HARPOON_OPTION, O_HARPOON_ITEM)
OBJ_ALIAS_DEFINE(O_M16_OPTION, O_M16_ITEM)
OBJ_ALIAS_DEFINE(O_GRENADE_OPTION, O_GRENADE_ITEM)
OBJ_ALIAS_DEFINE(O_SHOTGUN_AMMO_OPTION, O_SHOTGUN_AMMO_ITEM)
OBJ_ALIAS_DEFINE(O_MAGNUM_AMMO_OPTION, O_MAGNUM_AMMO_ITEM)
OBJ_ALIAS_DEFINE(O_UZI_AMMO_OPTION, O_UZI_AMMO_ITEM)
OBJ_ALIAS_DEFINE(O_HARPOON_AMMO_OPTION, O_HARPOON_AMMO_ITEM)
OBJ_ALIAS_DEFINE(O_M16_AMMO_OPTION, O_M16_AMMO_ITEM)
OBJ_ALIAS_DEFINE(O_GRENADE_AMMO_OPTION, O_GRENADE_AMMO_ITEM)
OBJ_ALIAS_DEFINE(O_PUZZLE_OPTION_1, O_PUZZLE_ITEM_1)
OBJ_ALIAS_DEFINE(O_PUZZLE_OPTION_2, O_PUZZLE_ITEM_2)
OBJ_ALIAS_DEFINE(O_PUZZLE_OPTION_3, O_PUZZLE_ITEM_3)
OBJ_ALIAS_DEFINE(O_PUZZLE_OPTION_4, O_PUZZLE_ITEM_4)
OBJ_ALIAS_DEFINE(O_KEY_OPTION_1, O_KEY_ITEM_1)
OBJ_ALIAS_DEFINE(O_KEY_OPTION_2, O_KEY_ITEM_2)
OBJ_ALIAS_DEFINE(O_KEY_OPTION_3, O_KEY_ITEM_3)
OBJ_ALIAS_DEFINE(O_KEY_OPTION_4, O_KEY_ITEM_4)
OBJ_ALIAS_DEFINE(O_PICKUP_OPTION_1, O_PICKUP_ITEM_1)
OBJ_ALIAS_DEFINE(O_PICKUP_OPTION_2, O_PICKUP_ITEM_2)
OBJ_ALIAS_DEFINE(O_PASSPORT_CLOSED, O_PASSPORT_OPTION)
// general objects
OBJ_NAME_DEFINE(O_LARA, "lara", "Lara")
OBJ_NAME_DEFINE(O_LARA_PISTOLS, "lara_pistols", "Pistols Animation")
OBJ_NAME_DEFINE(O_LARA_HAIR, "lara_hair", "Braid")
OBJ_NAME_DEFINE(O_LARA_SHOTGUN, "lara_shotgun", "Shotgun Animation")
OBJ_NAME_DEFINE(O_LARA_MAGNUMS, "lara_magnums", "Magnums Animation")
OBJ_NAME_DEFINE(O_LARA_UZIS, "lara_uzis", "Uzis Animation")
OBJ_NAME_DEFINE(O_LARA_M16, "lara_m16", "M16 Animation")
OBJ_NAME_DEFINE(O_LARA_GRENADE, "lara_grenade", "Grenade Launcher Animation")
OBJ_NAME_DEFINE(O_LARA_HARPOON, "lara_harpoon", "Harpoon Animation")
OBJ_NAME_DEFINE(O_LARA_FLARE, "lara_flare", "Flare Animation")
OBJ_NAME_DEFINE(O_LARA_SKIDOO, "lara_skidoo", "Snowmobile Animation")
OBJ_NAME_DEFINE(O_LARA_BOAT, "lara_boat", "Boat Animation")
OBJ_NAME_DEFINE(O_LARA_EXTRA, "lara_extra", "Lara's Extra Animation")
OBJ_NAME_DEFINE(O_SKIDOO_FAST, "skidoo_fast", "Red Snowmobile")
OBJ_NAME_DEFINE(O_BOAT, "boat", "Boat")
OBJ_NAME_DEFINE(O_DOG, "dog", "Dog")
OBJ_NAME_DEFINE(O_CULT_1, "cult_1", "Masked Goon 1")
OBJ_NAME_DEFINE(O_CULT_1A, "cult_1a", "Masked Goon 2")
OBJ_NAME_DEFINE(O_CULT_1B, "cult_1b", "Masked Goon 3")
OBJ_NAME_DEFINE(O_CULT_2, "cult_2", "Knife Thrower")
OBJ_NAME_DEFINE(O_CULT_3, "cult_3", "Shotgun Goon")
OBJ_NAME_DEFINE(O_MOUSE, "mouse", "Rat")
OBJ_NAME_DEFINE(O_DRAGON_FRONT, "dragon_front", "Dragon Front")
OBJ_NAME_DEFINE(O_DRAGON_BACK, "dragon_back", "Dragon Back")
OBJ_NAME_DEFINE(O_GONDOLA, "gondola", "Gondola")
OBJ_NAME_DEFINE(O_SHARK, "shark", "Shark")
OBJ_NAME_DEFINE(O_EEL, "eel", "Eel")
OBJ_NAME_DEFINE(O_BIG_EEL, "big_eel", "Big Eel")
OBJ_NAME_DEFINE(O_BARRACUDA, "barracuda", "Barracuda")
OBJ_NAME_DEFINE(O_DIVER, "diver", "Scuba Diver")
OBJ_NAME_DEFINE(O_WORKER_1, "worker_1", "Gunman Goon 1")
OBJ_NAME_DEFINE(O_WORKER_2, "worker_2", "Gunman Goon 2")
OBJ_NAME_DEFINE(O_WORKER_3, "worker_3", "Stick Wielding Goon 1")
OBJ_NAME_DEFINE(O_WORKER_4, "worker_4", "Stick Wielding Goon 2")
OBJ_NAME_DEFINE(O_WORKER_5, "worker_5", "Flamethrower Goon")
OBJ_NAME_DEFINE(O_JELLY, "jelly", "Jellyfish")
OBJ_NAME_DEFINE(O_SPIDER, "spider", "Spider")
OBJ_NAME_DEFINE(O_BIG_SPIDER, "big_spider", "Giant Spider")
OBJ_NAME_DEFINE(O_CROW, "crow", "Crow")
OBJ_NAME_DEFINE(O_TIGER, "tiger", "Tiger")
OBJ_NAME_DEFINE(O_BARTOLI, "bartoli", "Marco Bartoli")
OBJ_NAME_DEFINE(O_XIAN_SPEARMAN, "xian_spearman", "Xian Spearman")
OBJ_NAME_DEFINE(O_XIAN_SPEARMAN_STATUE, "xian_spearman_statue", "Xian Spearman Statue")
OBJ_NAME_DEFINE(O_XIAN_KNIGHT, "xian_knight", "Xian Knight")
OBJ_NAME_DEFINE(O_XIAN_KNIGHT_STATUE, "xian_knight_statue", "Xian Knight")
OBJ_NAME_DEFINE(O_YETI, "yeti", "Yeti")
OBJ_NAME_DEFINE(O_BIRD_GUARDIAN, "bird_guardian", "Bird Monster")
OBJ_NAME_DEFINE(O_EAGLE, "eagle", "Eagle")
OBJ_NAME_DEFINE(O_BANDIT_1, "bandit_1", "Mercenary 1")
OBJ_NAME_DEFINE(O_BANDIT_2, "bandit_2", "Mercenary 2")
OBJ_NAME_DEFINE(O_BANDIT_2B, "bandit_2b", "Mercenary 3")
OBJ_NAME_DEFINE(O_SKIDOO_ARMED, "skidoo_armed", "Black Snowmobile")
OBJ_NAME_DEFINE(O_SKIDOO_DRIVER, "skidoo_driver", "Black Snowmobile Driver")
OBJ_NAME_DEFINE(O_MONK_1, "monk_1", "Monk 1")
OBJ_NAME_DEFINE(O_MONK_2, "monk_2", "Monk 2")
OBJ_NAME_DEFINE(O_FALLING_BLOCK_1, "falling_block_1", "Falling Block 1")
OBJ_NAME_DEFINE(O_FALLING_BLOCK_2, "falling_block_2", "Falling Block 2")
OBJ_NAME_DEFINE(O_FALLING_BLOCK_3, "falling_block_3", "Loose Boards")
OBJ_NAME_DEFINE(O_PENDULUM_1, "pendulum_1", "Sandbag")
OBJ_NAME_DEFINE(O_SPIKES, "spikes", "Spikes")
OBJ_NAME_DEFINE(O_ROLLING_BALL_1, "rolling_ball_1", "Boulder 1")
OBJ_NAME_DEFINE(O_DART, "dart", "Disc")
OBJ_NAME_DEFINE(O_DART_EMITTER, "dart_emitter", "Disc Emitter")
OBJ_NAME_DEFINE(O_DRAWBRIDGE, "drawbridge", "Drawbridge")
OBJ_NAME_DEFINE(O_TEETH_TRAP, "teeth_trap", "Teeth Trap")
OBJ_NAME_DEFINE(O_LIFT, "lift", "Lift")
OBJ_NAME_DEFINE(O_GENERAL, "general", "Minisub")
OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_1, "movable_block_1", "Push Block 1")
OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_2, "movable_block_2", "Push Block 2")
OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_3, "movable_block_3", "Push Block 3")
OBJ_NAME_DEFINE(O_MOVABLE_BLOCK_4, "movable_block_4", "Push Block 4")
OBJ_NAME_DEFINE(O_BIG_BOWL, "big_bowl", "Lava Bowl")
OBJ_NAME_DEFINE(O_WINDOW_1, "window_1", "Breakable Window 1")
OBJ_NAME_DEFINE(O_WINDOW_2, "window_2", "Breakable Window 2")
OBJ_NAME_DEFINE(O_WINDOW_3, "window_3", "Breakable Window 3")
OBJ_NAME_DEFINE(O_WINDOW_4, "window_4", "Breakable Window 4")
OBJ_NAME_DEFINE(O_PROPELLER_1, "propeller_1", "Airplane Propeller")
OBJ_NAME_DEFINE(O_POWER_SAW, "power_saw", "Power Saw")
OBJ_NAME_DEFINE(O_HOOK, "hook", "Hook")
OBJ_NAME_DEFINE(O_FALLING_CEILING, "falling_ceiling", "Falling Ceiling")
OBJ_NAME_DEFINE(O_SPINNING_BLADE, "spinning_blade", "Spinning Blade")
OBJ_NAME_DEFINE(O_BLADE, "blade", "Wall-mounted Blade")
OBJ_NAME_DEFINE(O_KILLER_STATUE, "killer_statue", "Statue with Sword")
OBJ_NAME_DEFINE(O_ROLLING_BALL_2, "rolling_ball_2", "Boulder 2")
OBJ_NAME_DEFINE(O_ICICLE, "icicle", "Icicles")
OBJ_NAME_DEFINE(O_SPIKE_WALL, "spike_wall", "Spike Wall")
OBJ_NAME_DEFINE(O_SPRINGBOARD, "springboard", "Springboard")
OBJ_NAME_DEFINE(O_CEILING_SPIKES, "ceiling_spikes", "Spiky Ceiling")
OBJ_NAME_DEFINE(O_BELL, "bell", "Bell")
OBJ_NAME_DEFINE(O_WATER_SPRITE, "water_sprite", "Boat Wake")
OBJ_NAME_DEFINE(O_SNOW_SPRITE, "snow_sprite", "Snowmobile Wale")
OBJ_NAME_DEFINE(O_SKIDOO_TRACK, "skidoo_track", "Snowmobile Track")
OBJ_NAME_DEFINE(O_SWITCH_TYPE_AIRLOCK, "switch_type_airlock", "Airlock Switch")
OBJ_NAME_DEFINE(O_SWITCH_TYPE_SMALL, "switch_type_small", "Small Switch")
OBJ_NAME_DEFINE(O_PROPELLER_2, "propeller_2", "Underwater Propeller")
OBJ_NAME_DEFINE(O_PROPELLER_3, "propeller_3", "Air Fan")
OBJ_NAME_DEFINE(O_PENDULUM_2, "pendulum_2", "Swinging Box")
OBJ_NAME_DEFINE(O_MESH_SWAP_1, "mesh_swap_1", "Mesh Swap 1")
OBJ_NAME_DEFINE(O_MESH_SWAP_2, "mesh_swap_2", "Mesh Swap 2")
OBJ_NAME_DEFINE(O_LARA_SWAP, "lara_swap", "Lara Mesh Swap")
OBJ_NAME_DEFINE(O_TEXT_BOX, "text_box", "UI Frame")
OBJ_NAME_DEFINE(O_ROLLING_BALL_3, "rolling_ball_3", "Boulder 3")
OBJ_NAME_DEFINE(O_ZIPLINE_HANDLE, "zipline_handle", "Zipline Handle")
OBJ_NAME_DEFINE(O_SWITCH_TYPE_BUTTON, "switch_type_button", "Switch Button")
OBJ_NAME_DEFINE(O_SWITCH_TYPE_NORMAL, "switch_type_normal", "Lever/Switch")
OBJ_NAME_DEFINE(O_SWITCH_TYPE_UW, "switch_type_uw", "Underwater Lever/Switch")
OBJ_NAME_DEFINE(O_DOOR_TYPE_1, "door_type_1", "Door 1")
OBJ_NAME_DEFINE(O_DOOR_TYPE_2, "door_type_2", "Door 2")
OBJ_NAME_DEFINE(O_DOOR_TYPE_3, "door_type_3", "Door 3")
OBJ_NAME_DEFINE(O_DOOR_TYPE_4, "door_type_4", "Door 4")
OBJ_NAME_DEFINE(O_DOOR_TYPE_5, "door_type_5", "Door 5")
OBJ_NAME_DEFINE(O_DOOR_TYPE_6, "door_type_6", "Door 6")
OBJ_NAME_DEFINE(O_DOOR_TYPE_7, "door_type_7", "Door 7")
OBJ_NAME_DEFINE(O_DOOR_TYPE_8, "door_type_8", "Door 8")
OBJ_NAME_DEFINE(O_TRAPDOOR_TYPE_1, "trapdoor_type_1", "Trapdoor 1")
OBJ_NAME_DEFINE(O_TRAPDOOR_TYPE_2, "trapdoor_type_2", "Trapdoor 2")
OBJ_NAME_DEFINE(O_TRAPDOOR_TYPE_3, "trapdoor_type_3", "Trapdoor 3")
OBJ_NAME_DEFINE(O_BRIDGE_FLAT, "bridge_flat", "Bridge Flat")
OBJ_NAME_DEFINE(O_BRIDGE_TILT_1, "bridge_tilt_1", "Bridge Tilt 1")
OBJ_NAME_DEFINE(O_BRIDGE_TILT_2, "bridge_tilt_2", "Bridge Tilt 2")
OBJ_NAME_DEFINE(O_PLAYER_1, "player_1", "Cutscene Actor 1")
OBJ_NAME_DEFINE(O_PLAYER_2, "player_2", "Cutscene Actor 2")
OBJ_NAME_DEFINE(O_PLAYER_3, "player_3", "Cutscene Actor 3")
OBJ_NAME_DEFINE(O_PLAYER_4, "player_4", "Cutscene Actor 4")
OBJ_NAME_DEFINE(O_PLAYER_5, "player_5", "Cutscene Actor 5")
OBJ_NAME_DEFINE(O_PLAYER_6, "player_6", "Cutscene Actor 6")
OBJ_NAME_DEFINE(O_PLAYER_7, "player_7", "Cutscene Actor 7")
OBJ_NAME_DEFINE(O_PLAYER_8, "player_8", "Cutscene Actor 8")
OBJ_NAME_DEFINE(O_PLAYER_9, "player_9", "Cutscene Actor 9")
OBJ_NAME_DEFINE(O_PLAYER_10, "player_10", "Cutscene Actor 10")
OBJ_NAME_DEFINE(O_KEY_HOLE_1, "key_hole_1", "Keyhole 1")
OBJ_NAME_DEFINE(O_KEY_HOLE_2, "key_hole_2", "Keyhole 2")
OBJ_NAME_DEFINE(O_KEY_HOLE_3, "key_hole_3", "Keyhole 3")
OBJ_NAME_DEFINE(O_KEY_HOLE_4, "key_hole_4", "Keyhole 4")
OBJ_NAME_DEFINE(O_PUZZLE_HOLE_1, "puzzle_hole_1", "Puzzle Hole 1 (Empty)")
OBJ_NAME_DEFINE(O_PUZZLE_HOLE_2, "puzzle_hole_2", "Puzzle Hole 2 (Empty)")
OBJ_NAME_DEFINE(O_PUZZLE_HOLE_3, "puzzle_hole_3", "Puzzle Hole 3 (Empty)")
OBJ_NAME_DEFINE(O_PUZZLE_HOLE_4, "puzzle_hole_4", "Puzzle Hole 4 (Empty)")
OBJ_NAME_DEFINE(O_PUZZLE_DONE_1, "puzzle_done_1", "Puzzle Hole 1 (Done)")
OBJ_NAME_DEFINE(O_PUZZLE_DONE_2, "puzzle_done_2", "Puzzle Hole 2 (Done)")
OBJ_NAME_DEFINE(O_PUZZLE_DONE_3, "puzzle_done_3", "Puzzle Hole 3 (Done)")
OBJ_NAME_DEFINE(O_PUZZLE_DONE_4, "puzzle_done_4", "Puzzle Hole 4 (Done)")
OBJ_NAME_DEFINE(O_SPHERE_OF_DOOM_1, "sphere_of_doom_1", "Dragon Explosion 1")
OBJ_NAME_DEFINE(O_SPHERE_OF_DOOM_2, "sphere_of_doom_2", "Dragon Explosion 2")
OBJ_NAME_DEFINE(O_SPHERE_OF_DOOM_3, "sphere_of_doom_3", "Dragon Explosion 3")
OBJ_NAME_DEFINE(O_ALARM_SOUND, "alarm_sound", "Alarm")
OBJ_NAME_DEFINE(O_BIRD_TWEETER_1, "bird_tweeter_1", "Dripping Water")
OBJ_NAME_DEFINE(O_DINO, "dino", "T-Rex")
OBJ_NAME_DEFINE(O_BIRD_TWEETER_2, "bird_tweeter_2", "Singing Birds")
OBJ_NAME_DEFINE(O_CLOCK_CHIMES, "clock_chimes", "Bartoli Hideout clock")
OBJ_NAME_DEFINE(O_DRAGON_BONES_1, "dragon_bones_1", "Placeholder")
OBJ_NAME_DEFINE(O_DRAGON_BONES_2, "dragon_bones_2", "Dragon Bones Front")
OBJ_NAME_DEFINE(O_DRAGON_BONES_3, "dragon_bones_3", "Dragon Bones Back")
OBJ_NAME_DEFINE(O_HOT_LIQUID, "hot_liquid", "Extra Fire")
OBJ_NAME_DEFINE(O_BOAT_BITS, "boat_bits", "Boat Bits")
OBJ_NAME_DEFINE(O_MINE, "mine", "Aquatic Mine")
OBJ_NAME_DEFINE(O_INV_BACKGROUND, "inv_background", "Menu Background")
OBJ_NAME_DEFINE(O_FX_RESERVED, "fx_reserved", "Gray disk")
OBJ_NAME_DEFINE(O_GONG_BONGER, "gong_bonger", "Gong Stick")
OBJ_NAME_DEFINE(O_DETONATOR_1, "detonator_1", "Gong")
OBJ_NAME_DEFINE(O_DETONATOR_2, "detonator_2", "Detonator Box")
OBJ_NAME_DEFINE(O_COPTER, "copter", "Helicopter")
OBJ_NAME_DEFINE(O_EXPLOSION, "explosion", "Explosion")
OBJ_NAME_DEFINE(O_SPLASH, "splash", "Water Ripples")
OBJ_NAME_DEFINE(O_BUBBLE, "bubble", "Bubble")
OBJ_NAME_DEFINE(O_BUBBLE_EMITTER, "bubble_emitter", "Bubbles Emitter")
OBJ_NAME_DEFINE(O_BLOOD, "blood", "Blood")
OBJ_NAME_DEFINE(O_DART_EFFECT, "dart_effect", "Dart Effect")
OBJ_NAME_DEFINE(O_FLARE_FIRE, "flare_fire", "Flare sparks")
OBJ_NAME_DEFINE(O_GLOW, "glow", "Glow")
OBJ_NAME_DEFINE(O_GLOW_RESERVED, "glow_reserved", "Map Glow")
OBJ_NAME_DEFINE(O_RICOCHET, "ricochet", "Ricochet")
OBJ_NAME_DEFINE(O_TWINKLE, "twinkle", "Sparkles")
OBJ_NAME_DEFINE(O_GUN_FLASH, "gun_flash", "Gun Flash")
OBJ_NAME_DEFINE(O_M16_FLASH, "m16_flash", "M16 Flash")
OBJ_NAME_DEFINE(O_BODY_PART, "body_part", "Body Part")
OBJ_NAME_DEFINE(O_CAMERA_TARGET, "camera_target", "Camera Target")
OBJ_NAME_DEFINE(O_WATERFALL, "waterfall", "Waterfall Mist")
OBJ_NAME_DEFINE(O_MISSILE_HARPOON, "missile_harpoon", "Missile Harpoon")
OBJ_NAME_DEFINE(O_MISSILE_FLAME, "missile_flame", "Missile Flame")
OBJ_NAME_DEFINE(O_MISSILE_KNIFE, "missile_knife", "Missile Knife")
OBJ_NAME_DEFINE(O_GRENADE, "grenade", "Grenade")
OBJ_NAME_DEFINE(O_HARPOON_BOLT, "harpoon_bolt", "Harpoon Bolt")
OBJ_NAME_DEFINE(O_EMBER, "ember", "Ember")
OBJ_NAME_DEFINE(O_EMBER_EMITTER, "ember_emitter", "Ember Emitter")
OBJ_NAME_DEFINE(O_FLAME, "flame", "Flame")
OBJ_NAME_DEFINE(O_FLAME_EMITTER, "flame_emitter", "Flame Emitter")
OBJ_NAME_DEFINE(O_SKYBOX, "skybox", "Skybox")
OBJ_NAME_DEFINE(O_ALPHABET, "alphabet", "Alphabet")
OBJ_NAME_DEFINE(O_DYING_MONK, "dying_monk", "Dying monk")
OBJ_NAME_DEFINE(O_DING_DONG, "ding_dong", "Doorbell")
OBJ_NAME_DEFINE(O_LARA_ALARM, "lara_alarm", "Alarm Bell")
OBJ_NAME_DEFINE(O_MINI_COPTER, "mini_copter", "Helicopter 2")
OBJ_NAME_DEFINE(O_WINSTON, "winston", "Winston")
OBJ_NAME_DEFINE(O_ASSAULT_DIGITS, "assault_digits", "Assault Digits")
OBJ_NAME_DEFINE(O_FINAL_LEVEL_COUNTER, "final_level_counter", "Final Level Counter")
OBJ_NAME_DEFINE(O_CUT_SHOTGUN, "cut_shotgun", "Shotgun Shower Animation")
OBJ_NAME_DEFINE(O_EARTHQUAKE, "earthquake", "Earthquake")

View file

@ -111,6 +111,7 @@ sources = [
'game/game.c',
'game/game_string.c',
'game/game_string_table/common.c',
'game/game_string_table/priv.c',
'game/game_string_table/reader.c',
'game/gamebuf.c',
'game/input/backends/controller.c',

View file

@ -47,18 +47,6 @@ GS_DEFINE(STATS_DEATHS, "DEATHS")
GS_DEFINE(STATS_TIME_TAKEN, "TIME TAKEN")
GS_DEFINE(STATS_BONUS_STATISTICS, "Bonus Statistics")
GS_DEFINE(MISC_EMPTY_SLOT_FMT, "- EMPTY SLOT %d -")
GS_DEFINE(INV_ITEM_LEADBAR, "Lead Bar")
GS_DEFINE(INV_ITEM_SCION, "Scion")
GS_DEFINE(INV_ITEM_PISTOLS, "Pistols")
GS_DEFINE(INV_ITEM_SHOTGUN, "Shotgun")
GS_DEFINE(INV_ITEM_MAGNUM, "Magnums")
GS_DEFINE(INV_ITEM_UZI, "Uzis")
GS_DEFINE(INV_ITEM_GRENADE, "Grenade")
GS_DEFINE(INV_ITEM_PISTOL_AMMO, "Pistol Clips")
GS_DEFINE(INV_ITEM_SHOTGUN_AMMO, "Shotgun Shells")
GS_DEFINE(INV_ITEM_MAGNUM_AMMO, "Magnum Clips")
GS_DEFINE(INV_ITEM_UZI_AMMO, "Uzi Clips")
GS_DEFINE(INV_ITEM_COMPASS, "Compass")
GS_DEFINE(OSD_FLY_MODE_ON, "Fly mode enabled")
GS_DEFINE(OSD_FLY_MODE_OFF, "Fly mode disabled")
GS_DEFINE(OSD_GIVE_ITEM_ALL_KEYS, "Surprise! Every key item Lara needs is now in her backpack.")

View file

@ -131,11 +131,8 @@ void Shell_Init(
Shell_ExitSystemFmt("Unable to load gameflow file: %s", game_flow_path);
return;
}
if (!GameStringTable_LoadFromFile(game_strings_path)) {
Shell_ExitSystemFmt(
"Unable to load game strings: %s", game_strings_path);
return;
}
GameStringTable_LoadFromFile(game_strings_path);
Savegame_Init();
Savegame_ScanSavedGames();
Savegame_HighlightNewestSlot();

View file

@ -26,22 +26,6 @@ GS_DEFINE(STATS_DISTANCE_TRAVELLED, "Distance Travelled")
GS_DEFINE(STATS_ASSAULT_TITLE, "BEST TIMES")
GS_DEFINE(STATS_ASSAULT_NO_TIMES_SET, "No Times Set")
GS_DEFINE(STATS_ASSAULT_FINISH, "Finish")
GS_DEFINE(INV_ITEM_STOPWATCH, "Statistics")
GS_DEFINE(INV_ITEM_PISTOLS, "Pistols")
GS_DEFINE(INV_ITEM_SHOTGUN, "Shotgun")
GS_DEFINE(INV_ITEM_MAGNUMS, "Automatic Pistols")
GS_DEFINE(INV_ITEM_UZIS, "Uzis")
GS_DEFINE(INV_ITEM_HARPOON, "Harpoon Gun")
GS_DEFINE(INV_ITEM_M16, "M16")
GS_DEFINE(INV_ITEM_GRENADE, "Grenade Launcher")
GS_DEFINE(INV_ITEM_FLARE, "Flare")
GS_DEFINE(INV_ITEM_PISTOL_AMMO, "Pistol Clips")
GS_DEFINE(INV_ITEM_SHOTGUN_AMMO, "Shotgun Shells")
GS_DEFINE(INV_ITEM_MAGNUM_AMMO, "Automatic Pistol Clips")
GS_DEFINE(INV_ITEM_UZI_AMMO, "Uzi Clips")
GS_DEFINE(INV_ITEM_HARPOON_AMMO, "Harpoons")
GS_DEFINE(INV_ITEM_M16_AMMO, "M16 Clips")
GS_DEFINE(INV_ITEM_GRENADE_AMMO, "Grenades")
GS_DEFINE(PASSPORT_EXIT_DEMO, "Exit Demo")
GS_DEFINE(MISC_NONE, "None")
GS_DEFINE(MISC_EMPTY_SLOT, "- EMPTY SLOT -")

View file

@ -374,11 +374,7 @@ void Shell_Main(void)
Shell_ExitSystem("Could not load the new script file.");
return;
}
if (!GameStringTable_LoadFromFile(m_CurrentGameStringsPath)) {
Shell_ExitSystem("Could not load game strings.");
return;
}
GameStringTable_LoadFromFile(m_CurrentGameStringsPath);
InitialiseStartInfo();
S_FrontEndCheck();

View file

@ -6,6 +6,18 @@ from pathlib import Path
from shared.paths import PROJECT_PATHS, SHARED_INCLUDE_DIR
def get_objects_map(paths: list[Path]) -> dict[str, str]:
result: dict[str, str] = {}
for path in paths:
for line in path.read_text().splitlines():
if match := re.match(
r'^OBJ_NAME_DEFINE\((\w+),\s*"([^"]+)",\s*"([^"]+)"\)$',
line.strip(),
):
result[match.group(2)] = match.group(3)
return result
def get_strings_map(paths: list[Path]) -> dict[str, str]:
result: dict[str, str] = {}
for path in paths:
@ -22,11 +34,15 @@ def postprocess_game_strings(
object_names_map: dict[str, str],
game_strings_map: dict[str, str],
) -> str:
max_key_length = (
max(len(json.dumps(key)) for key in object_names_map.keys()) + 2
)
indent = " " * 8
content = re.sub(
r'^( "object_names": {)[\S\s]*?^( })',
' "object_names": {\n'
r'^( "objects": {)[\S\s]*?^( })',
' "objects": {\n'
+ "\n".join(
f" {json.dumps(key)}: {json.dumps(value)},"
f"{indent}{f'{json.dumps(key)}: '.ljust(max_key_length)}{json.dumps({'name': value})},"
for key, value in object_names_map.items()
)
+ "\n }",
@ -55,9 +71,11 @@ def process(game: int) -> None:
PROJECT_PATHS[game].src_dir / "game/game_string.def",
SHARED_INCLUDE_DIR / "game/game_string.def",
]
OBJECT_NAMES_DEF_PATH = SHARED_INCLUDE_DIR / f"game/objects/names_tr{game}.def"
OBJECT_NAMES_DEF_PATH = (
SHARED_INCLUDE_DIR / f"game/objects/names_tr{game}.def"
)
object_names_map = get_strings_map([OBJECT_NAMES_DEF_PATH])
object_names_map = get_objects_map([OBJECT_NAMES_DEF_PATH])
game_strings_map = get_strings_map(GAME_STRING_DEF_PATHS)
assert object_names_map
assert game_strings_map