2025-01-03 12:31:54 +01:00
|
|
|
|
# Game flow specification
|
2025-02-04 19:45:28 +01:00
|
|
|
|
|
|
|
|
|
In the original Tomb Raider 1, the game flow was completely hard-coded,
|
|
|
|
|
including the levels, limiting the builders' flexibility. Tomb Raider 2
|
|
|
|
|
improved upon this by introducing a tombpc.dat binary file for game
|
|
|
|
|
configuration, although it remained cryptic and required builders to use
|
|
|
|
|
dedicated tooling. TR1X and TR2X have transitioned away from these earlier
|
|
|
|
|
methods, choosing to manage game flow with a JSON file that provides a unified
|
|
|
|
|
structure for both games. This document details the elements that can be
|
|
|
|
|
modified using this updated format.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
|
|
|
|
|
Jump to:
|
|
|
|
|
- [Global properties](#global-properties)
|
|
|
|
|
- [Level properties](#level-properties)
|
|
|
|
|
- [Sequences](#sequences)
|
|
|
|
|
- [Bonus levels](#bonus-levels)
|
|
|
|
|
- [Item drops](#item-drops)
|
|
|
|
|
- [Injections](#injections)
|
2024-11-09 15:00:29 +00:00
|
|
|
|
- [User configuration](#user-configuration)
|
2023-10-03 22:55:13 +01:00
|
|
|
|
|
|
|
|
|
## Global properties
|
2025-02-04 19:45:28 +01:00
|
|
|
|
The following properties are in the root of the game flow document and control
|
|
|
|
|
various pieces of global behaviour. Currently, the majority of this section
|
|
|
|
|
remains distinct for each game.
|
|
|
|
|
|
|
|
|
|
#### TR1
|
2023-10-03 22:55:13 +01:00
|
|
|
|
|
|
|
|
|
<details>
|
|
|
|
|
<summary>Show snippet</summary>
|
2024-04-09 10:45:34 +02:00
|
|
|
|
|
2023-10-03 22:55:13 +01:00
|
|
|
|
```json5
|
|
|
|
|
"main_menu_picture": "data/titleh.png",
|
|
|
|
|
"savegame_fmt_legacy": "saveati.%d",
|
|
|
|
|
"savegame_fmt_bson": "save_tr1_%02d.dat",
|
|
|
|
|
"demo_delay": 16,
|
|
|
|
|
"water_color": [0.45, 1.0, 1.0],
|
2025-04-07 22:52:55 +02:00
|
|
|
|
"fog_start": 22.0,
|
|
|
|
|
"fog_end": 30.0,
|
2023-10-03 22:55:13 +01:00
|
|
|
|
"injections": [
|
|
|
|
|
"data/global_injection1.bin",
|
|
|
|
|
"data/global_injection2.bin",
|
|
|
|
|
// etc
|
|
|
|
|
],
|
|
|
|
|
"convert_dropped_guns": false,
|
2024-11-10 17:52:02 +00:00
|
|
|
|
"enforced_config": {
|
|
|
|
|
"enable_save_crystals": false,
|
|
|
|
|
},
|
2023-10-03 22:55:13 +01:00
|
|
|
|
"levels": [
|
|
|
|
|
{
|
2025-01-24 13:20:34 +01:00
|
|
|
|
"path": "data/gym.phd",
|
2023-10-03 22:55:13 +01:00
|
|
|
|
// etc
|
2025-01-24 12:35:10 +01:00
|
|
|
|
},
|
2023-10-03 22:55:13 +01:00
|
|
|
|
],
|
2025-01-25 20:00:50 +01:00
|
|
|
|
"cutscenes": [
|
|
|
|
|
{
|
|
|
|
|
"path": "data/cut1.phd",
|
|
|
|
|
// etc
|
|
|
|
|
},
|
|
|
|
|
],
|
2025-01-25 14:44:08 +01:00
|
|
|
|
"demos": [
|
|
|
|
|
{
|
|
|
|
|
"path": "data/gym.phd",
|
|
|
|
|
// etc
|
|
|
|
|
},
|
|
|
|
|
],
|
2025-01-24 12:35:10 +01:00
|
|
|
|
"fmvs": [
|
|
|
|
|
{"path": "data/snow.rpl"},
|
|
|
|
|
// etc
|
|
|
|
|
},
|
2023-10-03 22:55:13 +01:00
|
|
|
|
```
|
|
|
|
|
</details>
|
|
|
|
|
|
|
|
|
|
<table>
|
|
|
|
|
<tr valign="top" align="left">
|
|
|
|
|
<th>Property</th>
|
|
|
|
|
<th>Type</th>
|
|
|
|
|
<th>Description</th>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<a name="convert-dropped-guns"></a>
|
|
|
|
|
<code>convert_dropped_guns</code>
|
|
|
|
|
</td>
|
|
|
|
|
<td>Boolean</td>
|
|
|
|
|
<td>
|
|
|
|
|
Forces guns dropped by enemies to be converted to the equivalent ammo
|
|
|
|
|
if Lara already has the gun. See <a href="#item-drops">Item drops</a>
|
|
|
|
|
for full details.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>demo_delay</code></td>
|
|
|
|
|
<td>Double<strong>*</strong></td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>
|
|
|
|
|
The number of seconds to pass in the main menu before playing the demo.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<a name="draw-distance-fade"></a>
|
2025-04-07 22:52:55 +02:00
|
|
|
|
<code>fog_start</code>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
2025-04-09 23:05:23 +02:00
|
|
|
|
<td>Double</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>
|
|
|
|
|
The distance (in tiles) at which objects and the world start to fade into
|
|
|
|
|
blackness.
|
|
|
|
|
<ul>
|
2025-04-09 23:05:23 +02:00
|
|
|
|
<li>The default value in OG TR1 is hardcoded to 12.</li>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<li>The default (disabled) value in TombATI is 72.</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<a name="draw-distance-max"></a>
|
2025-04-07 22:52:55 +02:00
|
|
|
|
<code>fog_end</code>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
2025-04-09 23:05:23 +02:00
|
|
|
|
<td>Double</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>
|
|
|
|
|
The distance (in tiles) at which objects and the world are clipped away.
|
|
|
|
|
<ul>
|
2025-04-09 23:05:23 +02:00
|
|
|
|
<li>The default value in OG TR1 is hardcoded to 20.</li>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<li>The default (disabled) value in TombATI is 80.</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2024-12-13 22:23:03 +00:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<a name="enable-killer-pushblocks"></a>
|
|
|
|
|
<code>enable_killer_pushblocks</code>
|
|
|
|
|
</td>
|
|
|
|
|
<td>Boolean</td>
|
|
|
|
|
<td>
|
|
|
|
|
If enabled, when a pushblock falls from the air and lands on Lara, it will
|
|
|
|
|
kill her outright. Otherwise, Lara will clip on top of the block and
|
|
|
|
|
survive.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2024-10-16 12:03:32 +01:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<a name="enable-tr2-item-drops"></a>
|
|
|
|
|
<code>enable_tr2_item_drops</code>
|
|
|
|
|
</td>
|
|
|
|
|
<td>Boolean</td>
|
|
|
|
|
<td>
|
|
|
|
|
Forces enemies who are placed in the same position as pickup items to
|
|
|
|
|
carry those items and drop them when killed, similar to TR2+. See
|
|
|
|
|
<a href="#item-drops">Item drops</a> for full details.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><a name="enforced-config"></a>
|
|
|
|
|
<code>enforced_config</code></td>
|
2024-11-10 17:52:02 +00:00
|
|
|
|
<td>String-to-object map</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>
|
2024-11-10 17:52:02 +00:00
|
|
|
|
This allows <em>any</em> regular game config setting to be overriden. See
|
|
|
|
|
<a href="#user-configuration">User configuration</a> for full details.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>injections</code></td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>String array</td>
|
|
|
|
|
<td>
|
|
|
|
|
Global data injection file paths. Individual levels will inherit these
|
|
|
|
|
unless <code>inherit_injections</code> is set to <code>false</code> on
|
|
|
|
|
those levels. See <a href="#injections">Injections</a> for full details.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>levels</code></td>
|
|
|
|
|
<td>Object array<strong>*</strong></td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>
|
|
|
|
|
This is where the individual level details are defined - see
|
|
|
|
|
<a href="#level-properties">Level properties</a> for full details.
|
|
|
|
|
</td>
|
2024-04-09 10:45:34 +02:00
|
|
|
|
</tr>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>main_menu_picture</code></td>
|
|
|
|
|
<td>String<strong>*</strong></td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>Path to the main menu background image.</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>savegame_fmt_bson</code></td>
|
|
|
|
|
<td>String<strong>*</strong></td>
|
|
|
|
|
<td>Path pattern to look for the savegame files.</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>savegame_fmt_legacy</code></td>
|
|
|
|
|
<td>String<strong>*</strong></td>
|
|
|
|
|
<td>Path pattern to look for the old TombATI savegame files.</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<a name="water-color"></a>
|
|
|
|
|
<code>water_color</code>
|
|
|
|
|
</td>
|
|
|
|
|
<td>Float array</td>
|
|
|
|
|
<td>
|
2025-04-12 15:16:28 +02:00
|
|
|
|
Water color (R, G, B) or `#RRGGBB`. 1.0 or `FF` means pass-through, 0.0
|
|
|
|
|
or `00` means completely black color.
|
2025-04-12 15:09:39 +02:00
|
|
|
|
See <a href="#water-color-table">this table</a> for reference values.</a>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
</table>
|
|
|
|
|
|
2025-02-04 19:45:28 +01:00
|
|
|
|
**\*** Required property.
|
|
|
|
|
|
|
|
|
|
#### TR2
|
|
|
|
|
|
|
|
|
|
<table>
|
|
|
|
|
<tr valign="top" align="left">
|
|
|
|
|
<th>Property</th>
|
|
|
|
|
<th>Type</th>
|
|
|
|
|
<th>Description</th>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>cmd_init</code></td>
|
|
|
|
|
<td rowspan="6">Object</td>
|
|
|
|
|
<td>
|
|
|
|
|
The command to run when the game is first launched. See <a
|
|
|
|
|
href="#game-flow-commands">Game flow commands</a> for full details.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>cmd_title</code></td>
|
|
|
|
|
<td>The command to run when the main menu is to be shown.</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>cmd_death_in_game</code></td>
|
|
|
|
|
<td>The command to run when Lara dies.</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>cmd_death_in_demo</code></td>
|
|
|
|
|
<td>The command to run when Lara dies during a demo (not used in the original game).</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>cmd_demo_interrupt</code></td>
|
|
|
|
|
<td>The command to run when the player interrupts a demo.</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>cmd_demo_end</code></td>
|
|
|
|
|
<td>The command to run when a demo finishes playback.</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>cheat_keys</code></td>
|
|
|
|
|
<td>Boolean</td>
|
|
|
|
|
<td>
|
|
|
|
|
Whether to enable original game cheats (the ones where Lara turns around
|
|
|
|
|
three times).
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>load_save_disabled</code></td>
|
|
|
|
|
<td>Boolean</td>
|
|
|
|
|
<td>Whether to disable saving and loading the game.</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>play_any_level</code></td>
|
|
|
|
|
<td>Boolean</td>
|
|
|
|
|
<td>
|
|
|
|
|
Whether to show a full list of all levels in place of the New Game
|
|
|
|
|
passport page.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>lockout_option_ring</code></td>
|
|
|
|
|
<td>Boolean</td>
|
|
|
|
|
<td>Whether to disallow the players to use control ring while ingame.</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>gym_enabled</code></td>
|
|
|
|
|
<td>Boolean</td>
|
|
|
|
|
<td>Whether to enable Lara's Home.</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>demo_version</code></td>
|
|
|
|
|
<td>Boolean</td>
|
|
|
|
|
<td>Legacy setting scheduled for removal at a later time.</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>single_level</code></td>
|
|
|
|
|
<td>Integer</td>
|
|
|
|
|
<td>Force the player to only play this one level.</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>demo_delay</code></td>
|
|
|
|
|
<td>Double</td>
|
|
|
|
|
<td>
|
|
|
|
|
The number of seconds to pass in the main menu before playing the demo.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2025-03-15 18:35:40 +00:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>main_menu_picture</code></td>
|
|
|
|
|
<td>String<strong>*</strong></td>
|
|
|
|
|
<td>Path to the main menu background image.</td>
|
|
|
|
|
</tr>
|
2025-03-15 22:25:13 +00:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>savegame_fmt_legacy</code></td>
|
|
|
|
|
<td>String<strong>*</strong></td>
|
|
|
|
|
<td>Path pattern to look for the original savegame files.</td>
|
|
|
|
|
</tr>
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>secret_track</code></td>
|
|
|
|
|
<td>Integer</td>
|
|
|
|
|
<td>
|
|
|
|
|
Music track to play when a secret is found. -1 to not play anything.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2025-03-13 19:39:58 +00:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>sfx_path</code></td>
|
|
|
|
|
<td>String</td>
|
|
|
|
|
<td>
|
|
|
|
|
The path to the sound effects (.sfx) file to use in the game.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2025-04-09 23:05:23 +02:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<a name="draw-distance-fade"></a>
|
|
|
|
|
<code>fog_start</code>
|
|
|
|
|
</td>
|
|
|
|
|
<td>Double</td>
|
|
|
|
|
<td>
|
|
|
|
|
The distance (in tiles) at which objects and the world start to fade into
|
|
|
|
|
blackness. The default value in OG TR2 is hardcoded to 12.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<a name="draw-distance-max"></a>
|
|
|
|
|
<code>fog_end</code>
|
|
|
|
|
</td>
|
2025-04-10 18:07:11 +02:00
|
|
|
|
<td>Double</td>
|
2025-04-09 23:05:23 +02:00
|
|
|
|
<td>
|
|
|
|
|
The distance (in tiles) at which objects and the world are clipped away.
|
|
|
|
|
The default value in OG TR2 is hardcoded to 20.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2025-04-10 18:07:11 +02:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>water_color</code>
|
|
|
|
|
</td>
|
2025-04-12 15:16:28 +02:00
|
|
|
|
<td>Float array or hex string</td>
|
2025-04-10 18:07:11 +02:00
|
|
|
|
<td>
|
2025-04-12 15:16:28 +02:00
|
|
|
|
Water color (R, G, B) or `#RRGGBB`. 1.0 or `FF` means pass-through, 0.0
|
|
|
|
|
or `00` means completely black color.
|
2025-04-12 15:09:39 +02:00
|
|
|
|
See <a href="#water-color-table">this table</a> for reference values.</a>
|
2025-04-10 18:07:11 +02:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2025-02-04 19:45:28 +01:00
|
|
|
|
</table>
|
|
|
|
|
|
|
|
|
|
## Game flow commands
|
|
|
|
|
|
|
|
|
|
The command allows you to modify the original game flow, but please note that
|
|
|
|
|
deviations from the original script may result in unexpected behavior. If you
|
|
|
|
|
encounter any bugs, we encourage you to report your experience by opening an
|
|
|
|
|
issue on GitHub. The overall structure is as follows:
|
|
|
|
|
|
|
|
|
|
```json5
|
|
|
|
|
{
|
|
|
|
|
"command": "play_level",
|
|
|
|
|
"param": 5,
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Currently the following commands are available.
|
|
|
|
|
|
|
|
|
|
<table>
|
|
|
|
|
<tr>
|
|
|
|
|
<th>Command</th>
|
|
|
|
|
<th>Description</th>
|
|
|
|
|
<th>Parameter</th>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td><code>noop</code></td>
|
|
|
|
|
<td>Continue the flow as normal.</td>
|
|
|
|
|
<td>N/A</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td><code>play_level</code></td>
|
|
|
|
|
<td>Play a specific level.</td>
|
|
|
|
|
<td>Level to play.</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td><code>load_saved_game</code></td>
|
|
|
|
|
<td>Load a specific savegame.</td>
|
|
|
|
|
<td>Save slot number to use</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td><code>play_cutscene</code></td>
|
|
|
|
|
<td>Play a specific cutscene.</td>
|
|
|
|
|
<td>Cutscene number to play</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td><code>play_demo</code></td>
|
|
|
|
|
<td>Play a specific demo.</td>
|
|
|
|
|
<td>Demo number to play.</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td><code>play_fmv</code></td>
|
|
|
|
|
<td>Play a specific movie.</td>
|
|
|
|
|
<td>Movie number to play.</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td><code>exit_to_title</code></td>
|
|
|
|
|
<td>Return the game to the title screen.</td>
|
|
|
|
|
<td>N/A</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td><code>level_complete</code></td>
|
|
|
|
|
<td>
|
|
|
|
|
End the current sequence inside level sequences, do nothing otherwise.
|
|
|
|
|
</td>
|
|
|
|
|
<td>N/A</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td><code>exit_game</code></td>
|
|
|
|
|
<td>Exit the game to desktop.</td>
|
|
|
|
|
<td>N/A</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td><code>select_level</code></td>
|
|
|
|
|
<td>Play a specific level (and reset inventory).</td>
|
|
|
|
|
<td>Level number to play.</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td><code>restart_level</code>¹</td>
|
|
|
|
|
<td>Restart the currently played level.</td>
|
|
|
|
|
<td>N/A</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td><code>story_so_far</code>¹</td>
|
|
|
|
|
<td>Play the movies and cutscenes up until the currently played level.</td>
|
|
|
|
|
<td>Save slot number to use</td>
|
|
|
|
|
</tr>
|
|
|
|
|
</table>
|
|
|
|
|
|
|
|
|
|
**¹** Tomb Raider 1 only.
|
|
|
|
|
|
|
|
|
|
Additional notes:
|
|
|
|
|
- All numbers (levels, cutscenes, ...) start with 0.
|
|
|
|
|
|
2023-10-03 22:55:13 +01:00
|
|
|
|
## Level properties
|
|
|
|
|
The `levels` section of the document defines how the game plays out. This is an
|
|
|
|
|
array of objects and can be defined in any order. The flow is controlled using
|
|
|
|
|
the correct [sequencing](#sequences) within each level itself.
|
|
|
|
|
|
|
|
|
|
Following are each of the properties available within a level.
|
|
|
|
|
|
|
|
|
|
<details>
|
|
|
|
|
<summary>Show snippet</summary>
|
|
|
|
|
|
|
|
|
|
```json5
|
|
|
|
|
{
|
2025-01-24 13:20:34 +01:00
|
|
|
|
"path": "data/example.phd",
|
|
|
|
|
"music_track": 57,
|
2023-10-03 22:55:13 +01:00
|
|
|
|
"lara_type": 0,
|
|
|
|
|
"water_color": [0.7, 0.5, 0.85],
|
2025-04-07 22:52:55 +02:00
|
|
|
|
"fog_start": 34.0,
|
|
|
|
|
"fog_end": 50.0,
|
2023-10-03 22:55:13 +01:00
|
|
|
|
"unobtainable_pickups": 1,
|
|
|
|
|
"unobtainable_kills": 1,
|
|
|
|
|
"inherit_injections": false,
|
|
|
|
|
"injections": [
|
|
|
|
|
"data/level_injection1.bin",
|
|
|
|
|
"data/level_injection2.bin",
|
|
|
|
|
],
|
|
|
|
|
"item_drops": [
|
|
|
|
|
{"enemy_num": 17, "object_ids": [86]},
|
|
|
|
|
{"enemy_num": 50, "object_ids": [87]},
|
|
|
|
|
// etc
|
|
|
|
|
],
|
|
|
|
|
"sequence": [
|
2025-01-24 13:20:34 +01:00
|
|
|
|
{"type": "play_fmv", "fmv_id": 0},
|
2023-10-03 22:55:13 +01:00
|
|
|
|
// etc
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
```
|
|
|
|
|
</details>
|
|
|
|
|
|
|
|
|
|
<table>
|
|
|
|
|
<tr valign="top" align="left">
|
|
|
|
|
<th>Property</th>
|
|
|
|
|
<th>Type</th>
|
|
|
|
|
<th colspan="2">Description</th>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>path</code></td>
|
|
|
|
|
<td>String<strong>*</strong></td>
|
2025-01-27 00:53:02 +01:00
|
|
|
|
<td colspan="2">The path to the level's data file.</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-01-27 00:53:02 +01:00
|
|
|
|
<td rowspan="7">
|
|
|
|
|
<code>type</code>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
2025-01-27 00:53:02 +01:00
|
|
|
|
<td rowspan="7">String</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td colspan="2">
|
2025-01-27 00:53:02 +01:00
|
|
|
|
The level type, which must be one of the following values.
|
|
|
|
|
Defaults to normal level.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><strong>Type</strong></td>
|
|
|
|
|
<td><strong>Description</strong></td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>normal</code></td>
|
2025-01-27 00:53:02 +01:00
|
|
|
|
<td>A standard level.</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>gym</code></td>
|
2025-01-27 00:53:02 +01:00
|
|
|
|
<td>
|
|
|
|
|
At most one of these can be defined. Accessed from the photo option
|
|
|
|
|
(object ID 73) on the title screen. If omitted, the photo option is not
|
|
|
|
|
displayed.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>bonus</code></td>
|
2025-01-27 00:53:02 +01:00
|
|
|
|
<td>
|
|
|
|
|
Only playable when all secrets are collected. See
|
|
|
|
|
<a href="#bonus-levels">Bonus levels</a> for full details.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>current</code></td>
|
2025-01-27 00:53:02 +01:00
|
|
|
|
<td>
|
|
|
|
|
One level of this type is necessary to read TombATI's save files. OG has a
|
|
|
|
|
special level called <code>LV_CURRENT</code> to handle save/load logic.
|
|
|
|
|
TR1X does away with this hack. However, the existing save games expect the
|
|
|
|
|
level count to match, otherwise the game will crash.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>dummy</code></td>
|
2025-01-27 00:53:02 +01:00
|
|
|
|
<td>A placeholder level necessary to read TombATI's save files.</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>sequence</code></td>
|
|
|
|
|
<td>Object array<strong>*</strong></td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td colspan="2">
|
|
|
|
|
Instructions to define how a level plays out. See
|
|
|
|
|
<a href="#sequences">Sequences</a> for full details.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>music_track</code></td>
|
|
|
|
|
<td>Integer<strong>*</strong></td>
|
2025-01-27 00:53:02 +01:00
|
|
|
|
<td colspan="2">The ambient music track ID.</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-04-09 23:05:23 +02:00
|
|
|
|
<td><code>fog_start</code></td>
|
2025-01-27 00:53:02 +01:00
|
|
|
|
<td>Double</td>
|
|
|
|
|
<td colspan="2">
|
|
|
|
|
Can be customized per level. See <a href="#draw-distance-fade">above</a>
|
|
|
|
|
for details.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-04-09 23:05:23 +02:00
|
|
|
|
<td><code>fog_end</code></td>
|
2025-01-27 00:53:02 +01:00
|
|
|
|
<td>Double</td>
|
|
|
|
|
<td colspan="2">
|
|
|
|
|
Can be customized per level. See <a href="#draw-distance-max">above</a>
|
|
|
|
|
for details.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>injections</code></td>
|
2025-01-27 00:53:02 +01:00
|
|
|
|
<td>String array</td>
|
|
|
|
|
<td colspan="2">
|
|
|
|
|
Injection file paths. See <a href="#injections">Injections</a> for full
|
|
|
|
|
details.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>inherit_injections</code></td>
|
2025-01-27 00:53:02 +01:00
|
|
|
|
<td>Boolean</td>
|
|
|
|
|
<td colspan="2">
|
|
|
|
|
A flag to indicate whether or not the level should use the globally
|
|
|
|
|
defined injections. See <a href="#injections">Injections</a> for full
|
|
|
|
|
details.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>item_drops</code><strong>¹</strong></td>
|
|
|
|
|
<td>Object array</td>
|
2025-01-27 00:53:02 +01:00
|
|
|
|
<td colspan="2">
|
|
|
|
|
Instructions to allocate items to enemies who will drop those items when
|
|
|
|
|
killed. See <a href="#item-drops">Item drops</a> for full details.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>lara_type</code><strong>¹</strong></td>
|
2025-01-27 00:53:02 +01:00
|
|
|
|
<td>Integer / string</td>
|
|
|
|
|
<td colspan="2">
|
|
|
|
|
Used only in cutscene levels to link the braid (if enabled) to the
|
|
|
|
|
relevant cutscene actor object ID.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2025-03-13 19:39:58 +00:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>sfx_path</code><strong>²</strong></td>
|
|
|
|
|
<td>String</td>
|
|
|
|
|
<td colspan="2">
|
|
|
|
|
The path to the sound effects (.sfx) file to use in this level. If this
|
|
|
|
|
property is not defined, the default global file will be used.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>unobtainable_kills</code><strong>¹</strong></td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>Integer</td>
|
|
|
|
|
<td colspan="2">
|
|
|
|
|
A count of enemies that will be excluded from kill statistics.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>unobtainable_pickups</code><strong>¹</strong></td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>Integer</td>
|
|
|
|
|
<td colspan="2">
|
|
|
|
|
A count of items that will be excluded from pickup statistics.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2024-05-31 18:53:22 -04:00
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>unobtainable_secrets</code><strong>¹</strong></td>
|
2024-05-31 18:53:22 -04:00
|
|
|
|
<td>Integer</td>
|
|
|
|
|
<td colspan="2">
|
|
|
|
|
A count of secrets that will be excluded from secret statistics. Useful for level demos.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>water_color</code><strong>¹</strong></td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>Float array</td>
|
|
|
|
|
<td colspan="2">
|
|
|
|
|
Can be customized per level. See <a href="#water-color">above</a> for
|
|
|
|
|
details.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
</table>
|
|
|
|
|
|
2025-02-04 19:45:28 +01:00
|
|
|
|
**\*** Required property.
|
|
|
|
|
**¹** Tomb Raider 1 only.
|
2025-03-13 19:39:58 +00:00
|
|
|
|
**²** Tomb Raider 2 only.
|
2025-02-04 19:45:28 +01:00
|
|
|
|
|
2023-10-03 22:55:13 +01:00
|
|
|
|
## Sequences
|
2025-02-04 19:45:28 +01:00
|
|
|
|
The following describes each available game flow sequence type and the required
|
2023-10-03 22:55:13 +01:00
|
|
|
|
parameters for each. Note that while this table is displayed in alphabetical
|
|
|
|
|
order, care must be taken to define sequences in the correct order. Refer to the
|
2025-02-04 19:45:28 +01:00
|
|
|
|
default game flow for examples.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
|
|
|
|
|
<table>
|
|
|
|
|
<tr valign="top" align="left">
|
|
|
|
|
<th>Sequence</th>
|
|
|
|
|
<th>Parameter</th>
|
|
|
|
|
<th>Type</th>
|
|
|
|
|
<th>Description</th>
|
|
|
|
|
</tr>
|
2025-01-27 00:53:02 +01:00
|
|
|
|
<tr valign="top">
|
2025-02-04 21:53:55 +01:00
|
|
|
|
<td><code>loop_game</code></td>
|
2025-01-27 00:53:02 +01:00
|
|
|
|
<td colspan="2" align="center">N/A</td>
|
|
|
|
|
<td>Plays the main game loop.</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>level_complete</code></td>
|
2025-01-27 00:53:02 +01:00
|
|
|
|
<td colspan="2" align="center">N/A</td>
|
|
|
|
|
<td>Ends the current level and plays the next one, if available.</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>exit_to_title</code></td>
|
2025-01-27 00:53:02 +01:00
|
|
|
|
<td colspan="2" align="center">N/A</td>
|
|
|
|
|
<td>Returns to the title level.</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>level_stats</code></td>
|
2025-01-27 00:53:02 +01:00
|
|
|
|
<td colspan="2" align="center">N/A</td>
|
|
|
|
|
<td>
|
|
|
|
|
Displays the end of level statistics for the current level. In a Gym
|
|
|
|
|
level, this fades the screen to black.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>total_stats</code></td>
|
|
|
|
|
<td><code>path</code></td>
|
2025-01-27 00:53:02 +01:00
|
|
|
|
<td>String</td>
|
|
|
|
|
<td>
|
|
|
|
|
Displays the end of game statistics with the given picture file shown as
|
|
|
|
|
a background.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<tr valign="top">
|
2025-01-29 02:28:00 +01:00
|
|
|
|
<td rowspan="4">
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<code>display_picture</code>
|
|
|
|
|
</td>
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>path</code></td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>String</td>
|
2025-04-21 21:49:29 +02:00
|
|
|
|
<td>
|
|
|
|
|
Displays the specified picture for a fixed time.
|
|
|
|
|
Files that are needed to function only with a specific aspect ratio can
|
|
|
|
|
be placed in a directory adjacent to the main image, named according to
|
|
|
|
|
the aspect ratio – for example, 4x3/title.png or 16x10/title.png. The
|
|
|
|
|
game won't attempt to match these precisely; instead, it will select the
|
|
|
|
|
file with the aspect ratio closest to the game's viewport. The main image
|
|
|
|
|
designated by <code>path</code> is presumed to have a 16:9 aspect ratio
|
|
|
|
|
for this purpose, and as such there's no need for 16x9-specific
|
|
|
|
|
directory.<br/>
|
|
|
|
|
This logic applies to all images.
|
|
|
|
|
</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>display_time</code></td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>Double</td>
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td> Number of seconds to display the picture for (default: 5). </td>
|
2025-01-29 02:28:00 +01:00
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>fade_in_time</code></td>
|
2025-01-29 02:28:00 +01:00
|
|
|
|
<td>Double</td>
|
|
|
|
|
<td>
|
|
|
|
|
Number of seconds to do the fade-in animation, if enabled (default: 1).
|
|
|
|
|
</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</tr>
|
2024-03-22 11:11:57 -04:00
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>fade_out_time</code></td>
|
2025-01-29 02:28:00 +01:00
|
|
|
|
<td>Double</td>
|
|
|
|
|
<td>
|
|
|
|
|
Number of seconds to do the fade-out animation, if enabled (default: 0.33).
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td rowspan="4"><code>loading_screen</code><strong>¹</strong></td>
|
|
|
|
|
<td><code>path</code></td>
|
2024-03-22 11:11:57 -04:00
|
|
|
|
<td>String</td>
|
2025-01-29 02:28:00 +01:00
|
|
|
|
<td rowspan="4">
|
|
|
|
|
Shows a picture prior to loading a level. Functions identically to
|
|
|
|
|
<code>display_picture</code>, except these pictures can be
|
|
|
|
|
enabled/disabled by the user with the loading screen option in the config
|
|
|
|
|
tool.
|
2024-03-22 11:11:57 -04:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>display_time</code></td>
|
2024-03-22 11:11:57 -04:00
|
|
|
|
<td>Double</td>
|
|
|
|
|
</tr>
|
2025-01-29 02:28:00 +01:00
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>fade_in_time</code></td>
|
2025-01-29 02:28:00 +01:00
|
|
|
|
<td>Double</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>fade_out_time</code></td>
|
2025-01-29 02:28:00 +01:00
|
|
|
|
<td>Double</td>
|
|
|
|
|
</tr>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>play_cutscene</code></td>
|
|
|
|
|
<td><code>cutscene_id</code></td>
|
|
|
|
|
<td>Integer</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>
|
2025-02-04 19:45:28 +01:00
|
|
|
|
Plays the specified cinematic level (from the <code>cutscenes</code>).
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>play_fmv</code></td>
|
|
|
|
|
<td><code>fmv_id</code></td>
|
2025-01-27 00:53:02 +01:00
|
|
|
|
<td>String</td>
|
|
|
|
|
<td>
|
|
|
|
|
Plays the specified FMV. <code>fmv_id</code> must be a valid index into
|
|
|
|
|
the <code>fmvs</code> root key.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>flip_map</code><strong>¹</strong></td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td colspan="2" align="center">N/A</td>
|
|
|
|
|
<td>Triggers the flip map.</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td rowspan="2">
|
|
|
|
|
<a name="give-item"></a>
|
|
|
|
|
<code>give_item</code>
|
|
|
|
|
</td>
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>object_id</code></td>
|
2025-01-24 13:55:44 +01:00
|
|
|
|
<td>Integer / String</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td rowspan="2">
|
2025-02-01 23:34:15 +01:00
|
|
|
|
Adds the specified item and quantity to Lara's inventory.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>quantity</code></td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>Integer</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td rowspan="2"><code>add_secret_reward</code><strong>²</strong></td>
|
|
|
|
|
<td><code>object_id</code></td>
|
|
|
|
|
<td>Integer / String</td>
|
|
|
|
|
<td rowspan="2">
|
|
|
|
|
Adds the specified item to the current level's list of rewards for
|
|
|
|
|
collecting all secrets.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
2025-02-04 19:45:28 +01:00
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>quantity</code></td>
|
|
|
|
|
<td>Integer</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td rowspan="3"><code>mesh_swap</code><strong>¹</strong></td>
|
|
|
|
|
<td><code>object1_id</code></td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>Integer</td>
|
|
|
|
|
<td rowspan="3">Swaps the given mesh ID between the given objects.</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>object2_id</code></td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>Integer</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>mesh_id</code></td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>Integer</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>play_music</code></td>
|
|
|
|
|
<td><code>music_track</code></td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>Integer</td>
|
|
|
|
|
<td>Plays the given audio track.</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>remove_ammo</code></td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td colspan="2" align="center">N/A</td>
|
2025-02-09 22:17:26 +01:00
|
|
|
|
<td rowspan="5">
|
2025-02-01 23:34:15 +01:00
|
|
|
|
Any combination of these sequences can be used to modify Lara's
|
2023-10-03 22:55:13 +01:00
|
|
|
|
inventory at the start of a level. There are a few simple points to note:
|
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<code>remove_weapons</code> does not remove the ammo for those guns,
|
|
|
|
|
and equally <code>remove_ammo</code> does not remove the guns. Each
|
|
|
|
|
works independently of the other.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
These sequences can also work together with
|
|
|
|
|
<a href="#give-item"><code>give_item</code></a> - so, item removal is
|
|
|
|
|
performed first, followed by addition.
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>remove_weapons</code></td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td colspan="2" align="center">N/A</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-09 22:17:26 +01:00
|
|
|
|
<td><code>remove_medipacks</code></td>
|
|
|
|
|
<td colspan="2" align="center">N/A</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>remove_flares</code><strong>²</strong></td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td colspan="2" align="center">N/A</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>remove_scions</code><strong>¹</strong></td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td colspan="2" align="center">N/A</td>
|
|
|
|
|
</tr>
|
2025-02-01 19:52:42 +01:00
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td rowspan="3"><code>set_cutscene_pos</code><strong>¹</strong></td>
|
|
|
|
|
<td><code><code>x</code></code></td>
|
2025-02-01 19:52:42 +01:00
|
|
|
|
<td>Integer</td>
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td rowspan="3">Sets the camera's position.</td>
|
2025-02-01 19:52:42 +01:00
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code><code>y</code></code></td>
|
2025-02-01 19:52:42 +01:00
|
|
|
|
<td>Integer</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code><code>z</code></code></td>
|
|
|
|
|
<td>Integer</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>set_cutscene_angle</code></td>
|
|
|
|
|
<td><code>value</code></td>
|
2025-02-01 19:52:42 +01:00
|
|
|
|
<td>Integer</td>
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td>Sets the camera's angle.</td>
|
2025-02-01 19:52:42 +01:00
|
|
|
|
</tr>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<tr valign="top">
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>setup_bacon_lara</code><strong>¹</strong></td>
|
|
|
|
|
<td><code>anchor_room</code></td>
|
|
|
|
|
<td>Integer</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>
|
2025-02-04 19:45:28 +01:00
|
|
|
|
Sets the room number in which Bacon Lara will be anchored to enable
|
|
|
|
|
correct mirroring behaviour with Lara.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
2025-02-04 19:45:28 +01:00
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>enable_sunset</code><strong>²</strong></td>
|
|
|
|
|
<td colspan="2" align="center">N/A</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>
|
2025-02-04 19:45:28 +01:00
|
|
|
|
Enables the sunset effect, like in Bartoli's Hideout. At present, this
|
|
|
|
|
feature is hardcoded to gradually darken the game 40 minutes into playing
|
|
|
|
|
a level.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td><code>set_lara_start_anim</code><strong>²</strong></td>
|
|
|
|
|
<td><code>value</code></td>
|
|
|
|
|
<td>Integer</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>
|
2025-02-04 19:45:28 +01:00
|
|
|
|
Applies the selected animation to Lara when the level begins. This is
|
|
|
|
|
used, for example, in the Offshore Rig of Tomb Raider II.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
2025-02-04 19:45:28 +01:00
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
2025-02-21 10:14:39 +00:00
|
|
|
|
<td><code>disable_floor</code></td>
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td><code>value</code></td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>Integer</td>
|
|
|
|
|
<td>
|
2025-02-04 19:45:28 +01:00
|
|
|
|
Configures a specific height (with 256 representing 1 click and 1024
|
|
|
|
|
representing 1 sector) to define an abyss that will invariably lead to
|
|
|
|
|
Lara's death if she falls into it. Additionally, it employs special
|
|
|
|
|
rendering to ensure it isn't treated as solid ground. This is used, for
|
|
|
|
|
example, in the Floating Islands of Tomb Raider II.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
</table>
|
|
|
|
|
|
2025-02-04 19:45:28 +01:00
|
|
|
|
**¹** Tomb Raider 1 only.
|
|
|
|
|
**²** Tomb Raider 2 only.
|
|
|
|
|
|
2025-01-25 20:00:50 +01:00
|
|
|
|
## Cutscenes
|
|
|
|
|
The `cutscenes` section contains all the cinematic levels, used with the
|
|
|
|
|
`play_cutscene` sequence. Its structure is identical to the `levels` section.
|
|
|
|
|
|
|
|
|
|
|
2025-01-25 14:44:08 +01:00
|
|
|
|
## Demos
|
2025-01-25 20:00:50 +01:00
|
|
|
|
The `demos` section contains all the levels that can play a demo when the player
|
2025-01-25 14:44:08 +01:00
|
|
|
|
leaves the main inventory screen idle for a while or by using the `/demo`
|
|
|
|
|
command. For the demos to work, these levels need to have demo data built-in.
|
|
|
|
|
Aside from this requirement, this section works just like the `levels` section.
|
|
|
|
|
|
2023-10-03 22:55:13 +01:00
|
|
|
|
## Bonus levels
|
2025-02-04 19:45:28 +01:00
|
|
|
|
The game flow supports bonus levels, which are unlocked only when the player
|
2023-10-03 22:55:13 +01:00
|
|
|
|
collects all secrets in the game's normal levels. These bonus levels behave just
|
|
|
|
|
like normal levels, so you can include FMVs, cutscenes in-between and so on.
|
|
|
|
|
|
|
|
|
|
Statistics are maintained separately, so normal end-game statistics are shown
|
|
|
|
|
once, and then separate bonus level statistics are shown on completion of those
|
|
|
|
|
levels.
|
|
|
|
|
|
|
|
|
|
Following is a sample level configuration with three normal levels and two bonus
|
|
|
|
|
levels. After the end-game credits are played following level 3, if the player
|
|
|
|
|
has collected all secrets, they will then be taken to level 4. Otherwise, the
|
|
|
|
|
game will exit to title.
|
|
|
|
|
|
|
|
|
|
<details>
|
|
|
|
|
<summary>Show example setup</summary>
|
|
|
|
|
|
|
|
|
|
```json5
|
|
|
|
|
{
|
2025-01-25 20:00:50 +01:00
|
|
|
|
"levels": [
|
|
|
|
|
{
|
|
|
|
|
// gym level definition
|
|
|
|
|
},
|
2023-10-03 22:55:13 +01:00
|
|
|
|
|
2025-01-25 20:00:50 +01:00
|
|
|
|
{
|
|
|
|
|
"path": "data/level1.phd",
|
|
|
|
|
"music_track": 57,
|
|
|
|
|
"sequence": [
|
2025-02-04 21:53:55 +01:00
|
|
|
|
{"type": "loop_game"},
|
2025-01-27 01:01:32 +01:00
|
|
|
|
{"type": "level_stats"},
|
2025-01-27 00:21:46 +01:00
|
|
|
|
{"type": "level_complete"},
|
2025-01-25 20:00:50 +01:00
|
|
|
|
],
|
|
|
|
|
},
|
2023-10-03 22:55:13 +01:00
|
|
|
|
|
2025-01-25 20:00:50 +01:00
|
|
|
|
{
|
|
|
|
|
"path": "data/level2.phd",
|
|
|
|
|
"music_track": 57,
|
|
|
|
|
"sequence": [
|
2025-02-04 21:53:55 +01:00
|
|
|
|
{"type": "loop_game"},
|
2025-01-27 01:01:32 +01:00
|
|
|
|
{"type": "level_stats"},
|
2025-01-27 00:21:46 +01:00
|
|
|
|
{"type": "level_complete"},
|
2025-01-25 20:00:50 +01:00
|
|
|
|
],
|
|
|
|
|
},
|
2023-10-03 22:55:13 +01:00
|
|
|
|
|
2025-01-25 20:00:50 +01:00
|
|
|
|
{
|
|
|
|
|
"path": "data/level3.phd",
|
|
|
|
|
"music_track": 57,
|
|
|
|
|
"sequence": [
|
2025-02-04 21:53:55 +01:00
|
|
|
|
{"type": "loop_game"},
|
2025-01-27 01:01:32 +01:00
|
|
|
|
{"type": "level_stats"},
|
2025-01-26 23:54:13 +01:00
|
|
|
|
{"type": "play_music", "music_track": 19},
|
|
|
|
|
{"type": "display_picture", "path": "data/end.pcx", "display_time": 7.5},
|
|
|
|
|
{"type": "display_picture", "path": "data/cred1.pcx", "display_time": 7.5},
|
|
|
|
|
{"type": "display_picture", "path": "data/cred2.pcx", "display_time": 7.5},
|
|
|
|
|
{"type": "display_picture", "path": "data/cred3.pcx", "display_time": 7.5},
|
|
|
|
|
{"type": "total_stats", "background_path": "data/install.pcx"},
|
2025-01-27 00:21:46 +01:00
|
|
|
|
{"type": "level_complete"},
|
2025-01-25 20:00:50 +01:00
|
|
|
|
],
|
|
|
|
|
},
|
2023-10-03 22:55:13 +01:00
|
|
|
|
|
2025-01-25 20:00:50 +01:00
|
|
|
|
{
|
|
|
|
|
"path": "data/bonus1.phd",
|
|
|
|
|
"type": "bonus",
|
|
|
|
|
"music_track": 57,
|
|
|
|
|
"sequence": [
|
2025-01-26 23:54:13 +01:00
|
|
|
|
{"type": "play_fmv", "fmv_path": "fmv/snow.avi"},
|
2025-02-04 21:53:55 +01:00
|
|
|
|
{"type": "loop_game"},
|
2025-01-26 23:54:13 +01:00
|
|
|
|
{"type": "play_cutscene", "cutscene_id": 0},
|
2025-01-27 01:01:32 +01:00
|
|
|
|
{"type": "level_stats"},
|
2025-01-27 00:21:46 +01:00
|
|
|
|
{"type": "level_complete"},
|
2025-01-25 20:00:50 +01:00
|
|
|
|
],
|
|
|
|
|
},
|
2023-10-03 22:55:13 +01:00
|
|
|
|
|
2025-01-25 20:00:50 +01:00
|
|
|
|
{
|
|
|
|
|
"path": "data/bonus2.phd",
|
|
|
|
|
"type": "bonus",
|
|
|
|
|
"music_track": 57,
|
|
|
|
|
"sequence": [
|
2025-02-04 21:53:55 +01:00
|
|
|
|
{"type": "loop_game"},
|
2025-01-27 01:01:32 +01:00
|
|
|
|
{"type": "level_stats"},
|
2025-01-26 23:54:13 +01:00
|
|
|
|
{"type": "play_music", "music_track": 14},
|
|
|
|
|
{"type": "total_stats", "background_path": "data/install.pcx"},
|
|
|
|
|
{"type": "exit_to_title"},
|
2025-01-25 20:00:50 +01:00
|
|
|
|
],
|
|
|
|
|
},
|
2023-10-03 22:55:13 +01:00
|
|
|
|
],
|
|
|
|
|
|
2025-01-25 20:00:50 +01:00
|
|
|
|
"cutscenes": [
|
|
|
|
|
{
|
|
|
|
|
"path": "data/bonuscut1.phd",
|
2025-01-27 00:39:51 +01:00
|
|
|
|
"music_track": 23,
|
2025-01-25 20:00:50 +01:00
|
|
|
|
"sequence": [
|
|
|
|
|
{"type": "set_cutscene_angle", "value": -23312},
|
2025-02-04 21:53:55 +01:00
|
|
|
|
{"type": "loop_game"},
|
2025-01-25 20:00:50 +01:00
|
|
|
|
],
|
|
|
|
|
},
|
2023-10-03 22:55:13 +01:00
|
|
|
|
],
|
2025-01-25 20:00:50 +01:00
|
|
|
|
}
|
2023-10-03 22:55:13 +01:00
|
|
|
|
```
|
|
|
|
|
</details>
|
|
|
|
|
|
|
|
|
|
## Item drops
|
2025-02-04 19:45:28 +01:00
|
|
|
|
In the original Tomb Raider I, items dropped by enemies were hardcoded such
|
|
|
|
|
that only specific enemies could drop, and the items and quantities that they
|
|
|
|
|
dropped were immutable. This is no longer the case, with the game flow providing
|
|
|
|
|
a mechanism to allow the _majority_ of enemy types to carry and drop items.
|
|
|
|
|
Note that this also means by default that the original enemies who did drop
|
|
|
|
|
items will not do so unless the game flow has been configured as such.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
|
2024-10-16 12:03:32 +01:00
|
|
|
|
Item drops can be defined in two ways. If `enable_tr2_item_drops` is `true`,
|
|
|
|
|
then custom level builders can add items directly to the level file, setting
|
|
|
|
|
their position to be the same as the enemies who should drop them.
|
|
|
|
|
|
|
|
|
|
For the original levels, `enable_tr2_item_drops` is `false`. Item drops are
|
|
|
|
|
instead defined in the `item_drops` section of a level's definition by creating
|
|
|
|
|
objects with the following parameter structure. You can define at most one entry
|
|
|
|
|
per enemy, but that definition can have as many drop items as necessary (within
|
|
|
|
|
the engine's overall item limit).
|
2023-10-03 22:55:13 +01:00
|
|
|
|
|
|
|
|
|
<details>
|
|
|
|
|
<summary>Show example setup</summary>
|
|
|
|
|
|
|
|
|
|
```json5
|
|
|
|
|
{
|
2025-01-24 13:20:34 +01:00
|
|
|
|
"path": "data/example.phd",
|
|
|
|
|
"music_track": 57,
|
2023-10-03 22:55:13 +01:00
|
|
|
|
"item_drops": [
|
|
|
|
|
{"enemy_num": 17, "object_ids": [86]},
|
|
|
|
|
{"enemy_num": 50, "object_ids": [87]},
|
|
|
|
|
{"enemy_num": 12, "object_ids": [93, 93]},
|
|
|
|
|
{"enemy_num": 47, "object_ids": [111]},
|
|
|
|
|
],
|
|
|
|
|
"sequence": [
|
2025-02-04 21:53:55 +01:00
|
|
|
|
{"type": "loop_game"},
|
2025-01-27 01:01:32 +01:00
|
|
|
|
{"type": "level_stats"},
|
2025-01-27 00:21:46 +01:00
|
|
|
|
{"type": "level_complete"},
|
2023-10-03 22:55:13 +01:00
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
This translates as follows.
|
|
|
|
|
- Enemy #17 will drop the magnums
|
|
|
|
|
- Enemy #50 will drop the uzis
|
|
|
|
|
- Enemy #12 will drop two small medipacks
|
|
|
|
|
- Enemy #47 will drop puzzle 2
|
|
|
|
|
</details>
|
|
|
|
|
|
|
|
|
|
<table>
|
|
|
|
|
<tr valign="top" align="left">
|
|
|
|
|
<th>Parameter</th>
|
|
|
|
|
<th>Type</th>
|
|
|
|
|
<th>Description</th>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>enemy_num</code>
|
|
|
|
|
</td>
|
|
|
|
|
<td>Integer</td>
|
|
|
|
|
<td>The index of the enemy in the level's item list.</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>object_ids</code>
|
|
|
|
|
</td>
|
2025-01-24 13:55:44 +01:00
|
|
|
|
<td>Integer / string array</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>
|
|
|
|
|
A list of item <em>types</em> to drop. These items will spawn dynamically
|
|
|
|
|
and do not need to be added to the level file. Duplicate IDs are permitted
|
|
|
|
|
in the same array.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
</table>
|
|
|
|
|
|
|
|
|
|
You can also toggle `convert_dropped_guns` in
|
|
|
|
|
[global properties](#convert-dropped-guns). When `true`, if an enemy drops a gun
|
|
|
|
|
that Lara already has, it will be converted to the equivalent ammo. When
|
|
|
|
|
`false`, the gun will always be dropped.
|
|
|
|
|
|
|
|
|
|
### Enemy validity
|
|
|
|
|
|
2023-10-05 18:39:39 +01:00
|
|
|
|
All enemy types are permitted to carry and drop items. This includes regular
|
2025-02-04 19:45:28 +01:00
|
|
|
|
enemies as well as TR1 Atlantean pods (objects 163, 181), TR1 centaur
|
|
|
|
|
statues (object 161), and TR2 statues (objects 42, 44). For pods, the items will be allocated to the creature
|
|
|
|
|
within (obviously empty pods are excluded).
|
2023-10-03 22:55:13 +01:00
|
|
|
|
|
2025-02-04 19:45:28 +01:00
|
|
|
|
Items dropped by flying or swimming creatures will fall to the ground (TR1 only).
|
2023-10-05 18:39:39 +01:00
|
|
|
|
|
2025-02-04 19:45:28 +01:00
|
|
|
|
For clarity, following is a list of all enemy type IDs which you can
|
|
|
|
|
reference when building your game flow. The game flow will ignore drops for
|
2023-10-05 18:39:39 +01:00
|
|
|
|
non-enemy type objects, and a suitable warning message will be produced in the
|
|
|
|
|
log file.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
|
|
|
|
|
<table>
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<tr><th colspan="2">TR1</th><th colspan="2">TR2</th></tr>
|
|
|
|
|
<tr valign="top" align="left"><th>Object ID <th>Name</th><th>Object ID <th>Name</th></tr>
|
|
|
|
|
<tr><td>7</td><td>Wolf</td><td>15</td><td>Dog</td></tr>
|
|
|
|
|
<tr><td>8</td><td>Bear</td><td>16</td><td>Masked Goon 1</td></tr>
|
|
|
|
|
<tr><td>9</td><td>Bat</td><td>17</td><td>Masked Goon 2</td></tr>
|
|
|
|
|
<tr><td>10</td><td>Crocodile</td><td>18</td><td>Masked Goon 3</td></tr>
|
|
|
|
|
<tr><td>11</td><td>Alligator</td><td>19</td><td>Knife Thrower</td></tr>
|
|
|
|
|
<tr><td>12</td><td>Lion</td><td>20</td><td>Shotgun Goon</td></tr>
|
|
|
|
|
<tr><td>13</td><td>Lioness</td><td>21</td><td>Rat</td></tr>
|
|
|
|
|
<tr><td>14</td><td>Puma</td><td>22</td><td>Dragon Front</td></tr>
|
|
|
|
|
<tr><td>15</td><td>Ape</td><td>25</td><td>Shark</td></tr>
|
|
|
|
|
<tr><td>16</td><td>Rat</td><td>26</td><td>Eel</td></tr>
|
|
|
|
|
<tr><td>17</td><td>Vole</td><td>27</td><td>Big Eel</td></tr>
|
|
|
|
|
<tr><td>18</td><td>T-rex</td><td>28</td><td>Barracuda</td></tr>
|
|
|
|
|
<tr><td>19</td><td>Raptor</td><td>29</td><td>Scuba Diver</td></tr>
|
|
|
|
|
<tr><td>20</td><td>Flying mutant</td><td>30</td><td>Gunman Goon 1</td></tr>
|
|
|
|
|
<tr><td>21</td><td>Grounded mutant (shooter)</td><td>31</td><td>Gunman Goon 2</td></tr>
|
|
|
|
|
<tr><td>22</td><td>Grounded mutant (non-shooter)</td><td>32</td><td>Stick Wielding Goon 1</td></tr>
|
|
|
|
|
<tr><td>23</td><td>Centaur</td><td>33</td><td>Stick Wielding Goon 2</td></tr>
|
|
|
|
|
<tr><td>24</td><td>Mummy (Tomb of Qualopec)</td><td>34</td><td>Flamethrower Goon</td></tr>
|
|
|
|
|
<tr><td>27</td><td>Larson</td><td>35</td><td>Jellyfish</td></tr>
|
|
|
|
|
<tr><td>28</td><td>Pierre (not runaway)</td><td>36</td><td>Spider</td></tr>
|
|
|
|
|
<tr><td>30</td><td>Skate kid</td><td>37</td><td>Giant Spider</td></tr>
|
|
|
|
|
<tr><td>31</td><td>Cowboy</td><td>38</td><td>Crow</td></tr>
|
|
|
|
|
<tr><td>32</td><td>Kold</td><td>39</td><td>Tiger</td></tr>
|
|
|
|
|
<tr><td>33</td><td>Natla (items drop after second phase)</td><td>40</td><td>Marco Bartoli</td></tr>
|
|
|
|
|
<tr><td>34</td><td>Torso</td><td>41</td><td>Xian Spearman</td></tr>
|
|
|
|
|
<tr><td colspan="2" rowspan="11"></td><td>42</td><td>Xian Spearman Statue</td></tr>
|
|
|
|
|
<tr><td>43</td><td>Xian Knight</td></tr>
|
|
|
|
|
<tr><td>44</td><td>Xian Knight</td></tr>
|
|
|
|
|
<tr><td>45</td><td>Yeti</td></tr>
|
|
|
|
|
<tr><td>46</td><td>Bird Monster</td></tr>
|
|
|
|
|
<tr><td>47</td><td>Eagle</td></tr>
|
|
|
|
|
<tr><td>48</td><td>Mercenary 1</td></tr>
|
|
|
|
|
<tr><td>49</td><td>Mercenary 2</td></tr>
|
|
|
|
|
<tr><td>50</td><td>Mercenary 3</td></tr>
|
|
|
|
|
<tr><td>52</td><td>Black Snowmobile Driver</td></tr>
|
|
|
|
|
<tr><td>214</td><td>T-Rex</td></tr>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</table>
|
|
|
|
|
|
|
|
|
|
### Item validity
|
|
|
|
|
The following object types are capable of being carried and dropped. The
|
2025-02-04 19:45:28 +01:00
|
|
|
|
game flow will ignore anything that is not in this list, and a suitable warning
|
2023-10-03 22:55:13 +01:00
|
|
|
|
message will be produced in the log file.
|
|
|
|
|
|
|
|
|
|
<table>
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<tr><th colspan="2">TR1</th><th colspan="2">TR2</th></tr>
|
|
|
|
|
<tr valign="top" align="left"><th>Object ID</th><th>Name</th><th>Object ID</th><th>Name</th></tr>
|
|
|
|
|
<tr><td>84</td><td>Pistols</td><td>135</td><td>Pistols</td></tr>
|
|
|
|
|
<tr><td>85</td><td>Shotgun</td><td>136</td><td>Shotgun</td></tr>
|
|
|
|
|
<tr><td>86</td><td>Magnums</td><td>137</td><td>Automatic Pistols</td></tr>
|
|
|
|
|
<tr><td>87</td><td>Uzis</td><td>138</td><td>Uzis</td></tr>
|
|
|
|
|
<tr><td>89</td><td>Shotgun ammo</td><td>139</td><td>Harpoon Gun</td></tr>
|
|
|
|
|
<tr><td>90</td><td>Magnum ammo</td><td>140</td><td>M16</td></tr>
|
|
|
|
|
<tr><td>91</td><td>Uzi ammo</td><td>141</td><td>Grenade Launcher</td></tr>
|
|
|
|
|
<tr><td>93</td><td>Small medipack</td><td>142</td><td>Pistol Clips</td></tr>
|
|
|
|
|
<tr><td>94</td><td>Large medipack</td><td>143</td><td>Shotgun Shells</td></tr>
|
|
|
|
|
<tr><td>110</td><td>Puzzle1</td><td>144</td><td>Automatic Pistol Clips</td></tr>
|
|
|
|
|
<tr><td>111</td><td>Puzzle2</td><td>145</td><td>Uzi Clips</td></tr>
|
|
|
|
|
<tr><td>112</td><td>Puzzle3</td><td>146</td><td>Harpoons</td></tr>
|
|
|
|
|
<tr><td>113</td><td>Puzzle4</td><td>147</td><td>M16 Clips</td></tr>
|
|
|
|
|
<tr><td>126</td><td>Lead bar</td><td>148</td><td>Grenades</td></tr>
|
|
|
|
|
<tr><td>129</td><td>Key1</td><td>149</td><td>Small Medipack</td></tr>
|
|
|
|
|
<tr><td>130</td><td>Key2</td><td>150</td><td>Large Medipack</td></tr>
|
|
|
|
|
<tr><td>131</td><td>Key3</td><td>152</td><td>Flare</td></tr>
|
|
|
|
|
<tr><td>132</td><td>Key4</td><td>151</td><td>Flares Box</td></tr>
|
|
|
|
|
<tr><td>141</td><td>Pickup1</td><td>174</td><td>Puzzle Item 1</td></tr>
|
|
|
|
|
<tr><td>142</td><td>Pickup2</td><td>175</td><td>Puzzle Item 2</td></tr>
|
|
|
|
|
<tr><td>144</td><td>Scion (à la Pierre)</td><td>176</td><td>Puzzle Item 3</td></tr>
|
|
|
|
|
<tr><td rowspan="10" colspan="2"></td><td>177</td><td>Puzzle Item 4</td></tr>
|
|
|
|
|
<tr><td>193</td><td>Key 1</td></tr>
|
|
|
|
|
<tr><td>194</td><td>Key 2</td></tr>
|
|
|
|
|
<tr><td>195</td><td>Key 3</td></tr>
|
|
|
|
|
<tr><td>196</td><td>Key 4</td></tr>
|
|
|
|
|
<tr><td>205</td><td>Pickup Item 1</td></tr>
|
|
|
|
|
<tr><td>206</td><td>Pickup Item 2</td></tr>
|
|
|
|
|
<tr><td>190</td><td>Secret 1</td></tr>
|
|
|
|
|
<tr><td>191</td><td>Secret 2</td></tr>
|
|
|
|
|
<tr><td>192</td><td>Secret 3</td></tr>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</table>
|
|
|
|
|
|
2025-02-04 19:45:28 +01:00
|
|
|
|
|
|
|
|
|
|
2023-10-03 22:55:13 +01:00
|
|
|
|
## Injections
|
2025-02-04 19:45:28 +01:00
|
|
|
|
Injections defined in the global game flow will by default be applied to each
|
2023-10-03 22:55:13 +01:00
|
|
|
|
level. Individual levels can also specify their own specific injections to
|
|
|
|
|
include. In that case, the global injections are merged with the level's when
|
|
|
|
|
the level loads.
|
|
|
|
|
|
|
|
|
|
Individual levels can set `inherit_injections` to `false` and as a result they
|
|
|
|
|
will not use the global injection files. If those levels have their own
|
|
|
|
|
injections defined, only those will be used. And of course, if they have none
|
|
|
|
|
defined, nothing will be injected.
|
|
|
|
|
|
|
|
|
|
_Disclaimer: Custom levels should not use the injections mechanism and instead
|
|
|
|
|
should provide data that is already correct and consistent. Reports of bugs
|
|
|
|
|
about injection files not working for custom levels will not be considered. Note
|
|
|
|
|
however that the injections that relate to Lara can work in custom levels
|
|
|
|
|
that do not modify Lara's default mesh structure or animations. These injection
|
|
|
|
|
files are based on the original Lara model._
|
|
|
|
|
|
2025-02-04 19:45:28 +01:00
|
|
|
|
The game flow will ignore referenced injection files that do not exist, but it is
|
|
|
|
|
best practice to remove the references to maintain a clean game flow file.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
|
|
|
|
|
Following is a summary of what each of the default injection files that are
|
|
|
|
|
provided with the game achieves.
|
|
|
|
|
|
|
|
|
|
<table>
|
|
|
|
|
<tr valign="top" align="left">
|
|
|
|
|
<th>Injection file</th>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
<th>Usage</th>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<th>Purpose</th>
|
|
|
|
|
</tr>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>*_cameras.bin</code>
|
|
|
|
|
</td>
|
|
|
|
|
<td>TR1</td>
|
|
|
|
|
<td>
|
|
|
|
|
Injects positional adjustments for cameras that can otherwise cause visual
|
|
|
|
|
issues, such as in Temple of the Cat.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>*_fd.bin</code>
|
|
|
|
|
</td>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
<td>TR1, TR2</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>
|
|
|
|
|
Injects fixes for floor data issues in the original levels. Refer to the
|
|
|
|
|
README for a full list of fixes.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>*_itemrots.bin</code>
|
|
|
|
|
</td>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
<td>TR1, TR2</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>
|
|
|
|
|
Injects rotations on pickup items so they make more visual sense when
|
|
|
|
|
using the 3D pickups option.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>*_meshfixes.bin</code>
|
|
|
|
|
</td>
|
|
|
|
|
<td>TR1</td>
|
|
|
|
|
<td>
|
|
|
|
|
Injects miscellaneous mesh adjustments for objects, such as in Obelisk of
|
|
|
|
|
Khamoon to avoid z-fighting.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>*_pickup_meshes.bin</code>
|
|
|
|
|
</td>
|
|
|
|
|
<td>TR1, TR2</td>
|
|
|
|
|
<td>
|
|
|
|
|
Injects mesh edits to change the scale of various pickup models, such as
|
|
|
|
|
the keys in St. Francis' Folly or the Prayer Wheel in Barkhang Monastry.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>*_sfx.bin</code>
|
|
|
|
|
</td>
|
|
|
|
|
<td>TR1, TR2</td>
|
|
|
|
|
<td>
|
|
|
|
|
Injects various SFX fixes or additions, such as the PSX Uzi SFX in TR1, or
|
|
|
|
|
fixing the silent enemies in TR2's water levels.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2024-07-20 11:57:15 +01:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>*_skybox.bin</code>
|
|
|
|
|
</td>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
<td>TR1</td>
|
2024-07-20 11:57:15 +01:00
|
|
|
|
<td>
|
|
|
|
|
Injects a predefined skybox model into specific levels.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>*_textures.bin</code>
|
|
|
|
|
</td>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
<td>TR1</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>
|
|
|
|
|
Injects fixes for texture issues in the original levels, such as gaps in
|
|
|
|
|
the walls or wrongly colored models. Refer to the README for a full list
|
|
|
|
|
of fixes.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2025-04-16 20:46:26 +01:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>boat_bits.bin</code>
|
|
|
|
|
</td>
|
|
|
|
|
<td>TR2</td>
|
|
|
|
|
<td>
|
|
|
|
|
Injects a model in slot `O_BOAT_BITS` (221) which is used to show the boat
|
|
|
|
|
exploding when it crosses mines.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>backpack.bin</code>
|
|
|
|
|
</td>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
<td>TR1</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td rowspan="2">
|
|
|
|
|
Injects mesh edits for Lara's backback, such that it becomes shallower.
|
|
|
|
|
This is only applied when the braid is enabled, to avoid the braid
|
|
|
|
|
merging with the backpack. The different files are needed to address mesh
|
|
|
|
|
structure differences between cutscene and normal levels.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>backpack_cut.bin</code>
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>braid.bin</code>
|
|
|
|
|
</td>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
<td rowspan="4">TR1</td>
|
2024-09-29 20:23:05 +01:00
|
|
|
|
<td rowspan="4">
|
2023-10-03 22:55:13 +01:00
|
|
|
|
Injects a braid when the option for it is enabled. This also edits Lara's
|
|
|
|
|
head meshes (object 0 and object 4) to make the braid fit better. A golden
|
|
|
|
|
braid is also provided for the Midas Touch animation. Again, different
|
|
|
|
|
files are needed to cater for mesh differences between cutscene and normal
|
2024-09-29 20:23:05 +01:00
|
|
|
|
levels. The Lost Valley file comprises a head mesh edit for object 5 only.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>braid_cut1.bin</code>
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>braid_cut2_cut4.bin</code>
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2024-09-29 20:23:05 +01:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>braid_valley.bin</code>
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>bubbles.bin</code>
|
|
|
|
|
</td>
|
|
|
|
|
<td>TR1</td>
|
|
|
|
|
<td>
|
|
|
|
|
Injects replacement sprite textures for Lara's underwater bubble sprites,
|
|
|
|
|
which are cut off in OG.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2024-04-08 15:21:42 +01:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>cistern_plants.bin</code>
|
|
|
|
|
</td>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
<td>TR1</td>
|
2024-04-08 15:21:42 +01:00
|
|
|
|
<td>
|
|
|
|
|
This disables the animation on sprite ID 193 in The Cistern and Tomb of
|
|
|
|
|
Tihocan.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>khamoon_mummy.bin</code>
|
|
|
|
|
</td>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
<td>TR1</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>
|
|
|
|
|
Injects the mummy in room 25 of City of Khamoon, which is present in the
|
|
|
|
|
PS1 version but not the PC.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>lara_animations.bin</code>
|
|
|
|
|
</td>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
<td>TR1</td>
|
2023-10-03 22:55:13 +01:00
|
|
|
|
<td>
|
2024-11-04 11:22:55 +00:00
|
|
|
|
Injects several animations, state changes and commands for Lara, such as
|
|
|
|
|
responsive jumping, jump-twist, somersault, underwater roll, and wading.
|
2023-10-03 22:55:13 +01:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>lara_gym_guns.bin</code>
|
|
|
|
|
</td>
|
|
|
|
|
<td>TR1</td>
|
|
|
|
|
<td>
|
|
|
|
|
Injects all of Lara's weapons and weapon animations in TR1's gym level.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2024-10-06 00:27:48 +02:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>explosion.bin</code>
|
|
|
|
|
</td>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
<td>TR1</td>
|
2024-10-06 00:27:48 +02:00
|
|
|
|
<td>
|
|
|
|
|
Injects explosion sprites for certain console commands.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>font.bin</code>
|
|
|
|
|
</td>
|
|
|
|
|
<td>TR1, TR2</td>
|
|
|
|
|
<td>
|
|
|
|
|
Injects replacement font sprites to support more characters than OG.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>guardian_death_commands.bin</code>
|
|
|
|
|
</td>
|
|
|
|
|
<td>TR2</td>
|
|
|
|
|
<td>
|
|
|
|
|
Injects an animation command for the bird guardian to end the level on the
|
|
|
|
|
final frame of its death animation. The original hard-coded end-level
|
|
|
|
|
behaviour is removed in TR2X.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2024-10-15 15:40:48 +01:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>mines_pushblocks.bin</code>
|
|
|
|
|
</td>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
<td>TR1</td>
|
2024-10-15 15:40:48 +01:00
|
|
|
|
<td>
|
|
|
|
|
Injects animation command data for pushblock types 2, 3 and 4 to restore
|
|
|
|
|
the missing scraping SFX when pulling these blocks.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2024-12-17 22:42:39 +00:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>pickup_aid.bin</code>
|
|
|
|
|
</td>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
<td>TR1</td>
|
2024-12-17 22:42:39 +00:00
|
|
|
|
<td>
|
|
|
|
|
Injects a sprite sequence similar to the Midas twinkle effect, which is
|
|
|
|
|
used when the option for pickup aids is enabled. Custom levels should
|
|
|
|
|
define a suitable sprite sequence in slot 185.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2024-10-06 00:27:48 +02:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>photo.bin</code>
|
|
|
|
|
</td>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
<td>TR1, TR2</td>
|
2024-10-06 00:27:48 +02:00
|
|
|
|
<td>
|
|
|
|
|
Injects camera shutter sound effect for the photo mode, needed only for
|
|
|
|
|
the cutscene levels.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2024-09-15 14:12:39 +01:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>purple_crystal.bin</code>
|
|
|
|
|
</td>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
<td>TR1</td>
|
2024-09-15 14:12:39 +01:00
|
|
|
|
<td>
|
|
|
|
|
Injects a replacement savegame crystal model to match the PS1 style.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2024-06-13 16:22:49 +01:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>scion_collision.bin</code>
|
|
|
|
|
</td>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
<td>TR1</td>
|
2024-06-13 16:22:49 +01:00
|
|
|
|
<td>
|
|
|
|
|
Increases the collision radius on the (targetable) Scion such that it can
|
|
|
|
|
be shot with the shotgun.
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
2025-04-11 21:24:54 +01:00
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
<code>seaweed_collision.bin</code>
|
2025-04-11 21:24:54 +01:00
|
|
|
|
</td>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
<td>TR2</td>
|
2025-04-11 21:24:54 +01:00
|
|
|
|
<td>
|
2025-04-13 15:51:47 +01:00
|
|
|
|
Fixes the seaweed in Living Quarters blocking Lara from exiting the water.
|
2025-04-11 21:24:54 +01:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
</table>
|
2025-02-04 19:45:28 +01:00
|
|
|
|
|
2025-01-24 12:35:10 +01:00
|
|
|
|
## FMVs
|
|
|
|
|
|
|
|
|
|
The FMVs section of the document defines how to play video content. This is an
|
|
|
|
|
array of objects and can be defined in any order. The flow is controlled using
|
|
|
|
|
the correct sequencing within each level itself.
|
|
|
|
|
|
|
|
|
|
Following are each of the properties available within an FMV.
|
|
|
|
|
|
|
|
|
|
<details>
|
|
|
|
|
<summary>Show snippet</summary>
|
|
|
|
|
|
|
|
|
|
```json5
|
|
|
|
|
{
|
|
|
|
|
"path": "data/example.avi",
|
|
|
|
|
}
|
|
|
|
|
```
|
2025-02-04 19:45:28 +01:00
|
|
|
|
</details>
|
2025-01-24 12:35:10 +01:00
|
|
|
|
|
|
|
|
|
<table>
|
|
|
|
|
<tr valign="top" align="left">
|
|
|
|
|
<th>Property</th>
|
|
|
|
|
<th>Type</th>
|
|
|
|
|
<th colspan="2">Description</th>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr valign="top">
|
|
|
|
|
<td>
|
|
|
|
|
<code>path</code>
|
|
|
|
|
</td>
|
2025-02-04 19:45:28 +01:00
|
|
|
|
<td>String<strong>*</strong></td>
|
2025-01-24 12:35:10 +01:00
|
|
|
|
<td colspan="2">The path to the FMV's video file.</td>
|
|
|
|
|
</tr>
|
|
|
|
|
</table>
|
|
|
|
|
|
2025-02-04 19:45:28 +01:00
|
|
|
|
**\*** Required property.
|
|
|
|
|
|
2024-11-09 15:00:29 +00:00
|
|
|
|
## User Configuration
|
|
|
|
|
TRX ships with a configuration tool to allow users to adjust game settings to
|
2025-02-04 19:45:28 +01:00
|
|
|
|
their taste. This tool writes to `cfg\TR1X.json5` and `cfg\TR2X.json5`. As a
|
|
|
|
|
level builder, you may however wish to enforce some settings to match how your
|
|
|
|
|
level is designed.
|
2024-11-09 15:00:29 +00:00
|
|
|
|
|
|
|
|
|
As an example, let's say you do not wish to add save crystals to your level, and
|
|
|
|
|
as a result you wish to prevent the player from enabling that option in the
|
2024-11-10 17:52:02 +00:00
|
|
|
|
config tool. To achieve this, open `cfg\TR1X_gameflow.json5` in a suitable text
|
|
|
|
|
editor and add the following.
|
2024-11-09 15:00:29 +00:00
|
|
|
|
|
|
|
|
|
```json
|
2024-11-10 17:52:02 +00:00
|
|
|
|
"enforced_config" : {
|
2024-11-09 15:00:29 +00:00
|
|
|
|
"enable_save_crystals" : false,
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
This means that the game will enforce your chosen value for this particular
|
|
|
|
|
config setting. If the player launches the config tool, the option to toggle
|
|
|
|
|
save crystals will be greyed out.
|
|
|
|
|
|
2024-11-10 17:52:02 +00:00
|
|
|
|
You can add as many settings within the `enforced_config` section as needed.
|
2025-02-04 19:45:28 +01:00
|
|
|
|
Refer to the key names within `cfg\TR1X.json5` and `cfg\TR2X.json5` for
|
|
|
|
|
reference.
|
2024-11-09 15:00:29 +00:00
|
|
|
|
|
2025-02-04 19:45:28 +01:00
|
|
|
|
Note that you do not need to ship a full configuration with your level, and
|
2024-11-09 15:00:29 +00:00
|
|
|
|
indeed it is not recommended to do so if you have, for example, your own custom
|
|
|
|
|
keyboard or controller layouts defined.
|
|
|
|
|
|
2025-02-04 19:45:28 +01:00
|
|
|
|
If you do not have any requirement to enforce settings, you can omit the
|
|
|
|
|
`enforced_config` section from your game flow altogether.
|
2025-04-12 15:09:39 +02:00
|
|
|
|
|
|
|
|
|
## Water colors<a id="user-content-water-color-table"></a>
|
|
|
|
|
|
|
|
|
|
<table>
|
|
|
|
|
<thead>
|
|
|
|
|
<tr>
|
|
|
|
|
<th>Game</th>
|
|
|
|
|
<th>Color (hex)</th>
|
|
|
|
|
<th>Color (array)</th>
|
|
|
|
|
<th>Usage</th>
|
|
|
|
|
</tr>
|
|
|
|
|
</thead>
|
|
|
|
|
<tbody>
|
|
|
|
|
<tr>
|
|
|
|
|
<td rowspan="2">TR1</td>
|
2025-04-12 15:35:02 +02:00
|
|
|
|
<td><img src="https://dummyimage.com/20x20/99b2ff/fff.png&text=+" valign="middle"/> <code>#99B2FF</code></td>
|
2025-04-12 15:09:39 +02:00
|
|
|
|
<td><code>[0.6, 0.7, 1.0]</code></td>
|
|
|
|
|
<td>original DOS version color</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
2025-04-12 15:35:02 +02:00
|
|
|
|
<td><img src="https://dummyimage.com/20x20/72ffff/fff.png&text=+" valign="middle"/> <code>#72FFFF</code></td>
|
2025-04-12 15:09:39 +02:00
|
|
|
|
<td><code>[0.45, 1.0, 1.0]</code></td>
|
|
|
|
|
<td>default TombATI color</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td rowspan="7">TR2</td>
|
2025-04-12 15:35:02 +02:00
|
|
|
|
<td><img src="https://dummyimage.com/20x20/80dfff/fff.png&text=+" valign="middle"/> <code>#80DFFF</code></td>
|
2025-04-12 15:09:39 +02:00
|
|
|
|
<td><code>[0.5, 0.875, 1.0]</code></td>
|
|
|
|
|
<td>default PC hardware renderer color</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
2025-04-12 15:35:02 +02:00
|
|
|
|
<td><img src="https://dummyimage.com/20x20/aaaaff/fff.png&text=+" valign="middle"/> <code>#AAAAFF</code></td>
|
2025-04-12 15:09:39 +02:00
|
|
|
|
<td><code>[0.66, 0.66, 1.0]</code></td>
|
|
|
|
|
<td>default PC software renderer color</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
2025-04-12 15:35:02 +02:00
|
|
|
|
<td><img src="https://dummyimage.com/20x20/ccff80/fff.png&text=+" valign="middle"/> <code>#CCFF80</code></td>
|
2025-04-12 15:09:39 +02:00
|
|
|
|
<td><code>[0.8, 1.0, 0.5]</code></td>
|
|
|
|
|
<td>Venice, Bartoli's Hideout and Opera House (PS1)</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
2025-04-12 15:35:02 +02:00
|
|
|
|
<td><img src="https://dummyimage.com/20x20/ccff99/fff.png&text=+" valign="middle"/> <code>#CCFF99</code></td>
|
2025-04-12 15:09:39 +02:00
|
|
|
|
<td><code>[0.8, 1.0, 0.6]</code></td>
|
|
|
|
|
<td>Temple of Xian (PS1)</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
2025-04-12 15:35:02 +02:00
|
|
|
|
<td><img src="https://dummyimage.com/20x20/ccffcc/fff.png&text=+" valign="middle"/> <code>#CCFFCC</code></td>
|
2025-04-12 15:09:39 +02:00
|
|
|
|
<td><code>[0.8, 1.0, 0.8]</code></td>
|
|
|
|
|
<td>Floating Islands and Dragon's Lair (PS1)</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
2025-04-12 15:35:02 +02:00
|
|
|
|
<td><img src="https://dummyimage.com/20x20/b2e5e5/fff.png&text=+" valign="middle"/> <code>#B2E5E5</code></td>
|
2025-04-12 15:09:39 +02:00
|
|
|
|
<td><code>[0.7, 0.9, 0.9]</code></td>
|
|
|
|
|
<td>The Great Wall and Tibetan Foothills (PS1)</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
2025-04-12 15:35:02 +02:00
|
|
|
|
<td><img src="https://dummyimage.com/20x20/80ffff/fff.png&text=+" valign="middle"/> <code>#80FFFF</code></td>
|
2025-04-12 15:09:39 +02:00
|
|
|
|
<td><code>[0.5, 1.0, 1.0]</code></td>
|
|
|
|
|
<td>All other PS1 levels</td>
|
|
|
|
|
</tr>
|
|
|
|
|
</tbody>
|
|
|
|
|
</table>
|