diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1b3af3ab9..a3664ef25 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,5 @@
## [Unreleased](https://github.com/LostArtefacts/TR-Rando/compare/V1.10.2...master) - xxxx-xx-xx
-- added support for TR1X 4.14 (now the minimum version supported) (#803)
+- added support for TR1X 4.15 (now the minimum version supported) (#803)
- added support for TR2X (#821)
- added support for The Golden Mask in TR2X and playing in combined mode (see Level Sequencing options) (#59)
- added Spanish translations for TR1 (#800)
diff --git a/Deps/TRGE.Coord.dll b/Deps/TRGE.Coord.dll
index 48f7aa438..99fe3415b 100644
Binary files a/Deps/TRGE.Coord.dll and b/Deps/TRGE.Coord.dll differ
diff --git a/Deps/TRGE.Core.dll b/Deps/TRGE.Core.dll
index 4846607ad..7c2c66461 100644
Binary files a/Deps/TRGE.Core.dll and b/Deps/TRGE.Core.dll differ
diff --git a/README.md b/README.md
index 6e3ca47ad..39b283c98 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
-TR Rando is a randomizer tool for the classic Tomb Raider series (TR 1-3 and Unfinished Business) and Tomb Raider I-III Remastered. It allows you to change many aspects of the
+TR Rando is a randomizer tool for the classic Tomb Raider series (TR 1-3, Unfinished Business and The Golden Mask) and Tomb Raider I-III Remastered. It allows you to change many aspects of the
original levels, such as item pickups, secrets, enemies, Lara's appearance, level order, text...[and so much more](#features).
## Installation
diff --git a/TRLevelControl/Helpers/TR1TypeUtilities.cs b/TRLevelControl/Helpers/TR1TypeUtilities.cs
index a582ca0cf..8a1a96a6a 100644
--- a/TRLevelControl/Helpers/TR1TypeUtilities.cs
+++ b/TRLevelControl/Helpers/TR1TypeUtilities.cs
@@ -526,7 +526,6 @@ public static bool CanSharePickupSpace(TR1Type type)
|| IsKeyholeType(type)
|| IsSlotType(type)
|| IsEnemyType(type)
- || IsBridge(type)
|| IsTrapdoor(type)
|| IsDoorType(type)
|| IsPushblockType(type)
diff --git a/TRLevelControl/Helpers/TR2TypeUtilities.cs b/TRLevelControl/Helpers/TR2TypeUtilities.cs
index 560336c0e..a2ed48e96 100644
--- a/TRLevelControl/Helpers/TR2TypeUtilities.cs
+++ b/TRLevelControl/Helpers/TR2TypeUtilities.cs
@@ -908,7 +908,6 @@ public static bool CanSharePickupSpace(TR2Type type, bool remastered)
|| IsUnrenderedType(type)
|| IsVehicleType(type)
|| IsBreakableWindowType(type)
- || IsBridgeType(type)
|| type == TR2Type.Lara
|| type == TR2Type.Drawbridge
|| type == TR2Type.FallingBlock
diff --git a/TRRandomizerCore/Randomizers/TR1/Classic/TR1OutfitRandomizer.cs b/TRRandomizerCore/Randomizers/TR1/Classic/TR1OutfitRandomizer.cs
index 158d71bee..b89009675 100644
--- a/TRRandomizerCore/Randomizers/TR1/Classic/TR1OutfitRandomizer.cs
+++ b/TRRandomizerCore/Randomizers/TR1/Classic/TR1OutfitRandomizer.cs
@@ -20,7 +20,6 @@ public class TR1OutfitRandomizer : BaseTR1Randomizer
{
private static readonly string _gymOutfitHash = "6523d69dbf1f0ab671f5f877afe6ff35";
private static readonly string _mauledOutfitHash = "ab52e600b2f4fa7edfd3e9a32d1a5582";
- private static readonly Version _minBraidCutsceneVersion = new(2, 13, 0);
private static readonly TR1SFX[] _barefootSfxIDs = new TR1SFX[] { TR1SFX.LaraFeet, TR1SFX.LaraLand };
private static readonly double _mauledLaraChance = (double)1 / 3;
private static readonly double _partialGymChance = (double)1 / 3;
@@ -454,20 +453,13 @@ private void AmendBackpack(TR1CombinedLevel level)
}
}
- private bool CutsceneSupportsBraid(TR1CombinedLevel parentLevel)
+ private static bool CutsceneSupportsBraid(TR1CombinedLevel parentLevel)
{
if (!parentLevel.HasCutScene || parentLevel.Is(TR1LevelNames.MINES))
{
return false;
}
- // Not supported before 2.13, so don't make any changes to Lara here.
- Version tr1xVersion = _outer.ScriptEditor.Edition.ExeVersion;
- if (tr1xVersion == null || tr1xVersion < _minBraidCutsceneVersion)
- {
- return false;
- }
-
if (parentLevel.Is(TR1LevelNames.ATLANTIS))
{
// Lara's head may be Natla's or Pierre's, so only support the braid if
diff --git a/TRRandomizerCore/Randomizers/TR2/Remastered/TR2REnemyRandomizer.cs b/TRRandomizerCore/Randomizers/TR2/Remastered/TR2REnemyRandomizer.cs
index b294f323e..f338bea14 100644
--- a/TRRandomizerCore/Randomizers/TR2/Remastered/TR2REnemyRandomizer.cs
+++ b/TRRandomizerCore/Randomizers/TR2/Remastered/TR2REnemyRandomizer.cs
@@ -353,7 +353,8 @@ internal void ApplyRandomization()
{
TR2EnemyAllocator.DisguiseType(level.Name, level.Data.Models, importedCollection.BirdMonsterGuiser, TR2Type.BirdMonster);
TR2EnemyAllocator.DisguiseType(level.Name, level.PDPData, importedCollection.BirdMonsterGuiser, TR2Type.BirdMonster);
- level.MapData[importedCollection.BirdMonsterGuiser] = _birdMonsterTypes.RandomItem(_outer._generator);
+ level.MapData[TR2TypeUtilities.TranslateAlias(importedCollection.BirdMonsterGuiser)]
+ = _birdMonsterTypes.RandomItem(_outer._generator);
enemies.BirdMonsterGuiser = importedCollection.BirdMonsterGuiser;
}
diff --git a/TRRandomizerCore/Resources/TR1/Environment/LEVEL5.PHD-Environment.json b/TRRandomizerCore/Resources/TR1/Environment/LEVEL5.PHD-Environment.json
index b43273aeb..9d57dc1ee 100644
--- a/TRRandomizerCore/Resources/TR1/Environment/LEVEL5.PHD-Environment.json
+++ b/TRRandomizerCore/Resources/TR1/Environment/LEVEL5.PHD-Environment.json
@@ -24,6 +24,61 @@
"272": 181
}
},
+ {
+ "Comments": "Fix a hole in the wall in room 2.",
+ "EMType": 23,
+ "Modifications": [
+ {
+ "RoomNumber": 2,
+ "FaceIndex": 2,
+ "VertexChanges": {
+ "0": {
+ "Y": -256
+ }
+ }
+ },
+ {
+ "RoomNumber": 2,
+ "FaceIndex": 1,
+ "VertexChanges": {
+ "2": {
+ "X": 1024,
+ "Y": -256
+ }
+ }
+ }
+ ]
+ },
+ {
+ "EMType": 26,
+ "Triangles": {
+ "2": [
+ {
+ "Type": 3,
+ "Vertices": [
+ 4,
+ 152,
+ 153
+ ],
+ "Texture": 16
+ }
+ ]
+ }
+ },
+ {
+ "EMType": 23,
+ "Modifications": [
+ {
+ "RoomNumber": 2,
+ "FaceIndex": 1,
+ "VertexChanges": {
+ "2": {
+ "X": -1024
+ }
+ }
+ }
+ ]
+ },
{
"Comments": "Add wind to outside rooms.",
"EMType": 121,
diff --git a/TRRandomizerCore/Resources/TR1/Textures/Mapping/LEVEL7A.PHD-Textures.json b/TRRandomizerCore/Resources/TR1/Textures/Mapping/LEVEL7A.PHD-Textures.json
index 358c8d955..056e91e2c 100644
--- a/TRRandomizerCore/Resources/TR1/Textures/Mapping/LEVEL7A.PHD-Textures.json
+++ b/TRRandomizerCore/Resources/TR1/Textures/Mapping/LEVEL7A.PHD-Textures.json
@@ -8,6 +8,15 @@
"BackgroundIndex": 15
}
]
+ },
+ "Landmarks.Rylael": {
+ "0": [
+ {
+ "RoomNumber": 5,
+ "RectangleIndices": [ 21 ],
+ "BackgroundIndex": 30
+ }
+ ]
}
},
diff --git a/TRRandomizerCore/Resources/TR1/Textures/Source/Static/Landmarks/Rylael/Data.json b/TRRandomizerCore/Resources/TR1/Textures/Source/Static/Landmarks/Rylael/Data.json
new file mode 100644
index 000000000..fca17f888
--- /dev/null
+++ b/TRRandomizerCore/Resources/TR1/Textures/Source/Static/Landmarks/Rylael/Data.json
@@ -0,0 +1,7 @@
+{
+ "VariantMap": {
+ "Default": [
+ "0, 0, 64, 64"
+ ]
+ }
+}
diff --git a/TRRandomizerCore/Resources/TR1/Textures/Source/Static/Landmarks/Rylael/Segments.png b/TRRandomizerCore/Resources/TR1/Textures/Source/Static/Landmarks/Rylael/Segments.png
new file mode 100644
index 000000000..d69abb20c
Binary files /dev/null and b/TRRandomizerCore/Resources/TR1/Textures/Source/Static/Landmarks/Rylael/Segments.png differ
diff --git a/TRRandomizerCore/Resources/TR2/Environment/LEVEL3.TR2-Environment.json b/TRRandomizerCore/Resources/TR2/Environment/LEVEL3.TR2-Environment.json
index 252f1eee8..19394d256 100644
--- a/TRRandomizerCore/Resources/TR2/Environment/LEVEL3.TR2-Environment.json
+++ b/TRRandomizerCore/Resources/TR2/Environment/LEVEL3.TR2-Environment.json
@@ -30,6 +30,25 @@
}
]
},
+ {
+ "Comments": "Ensure slot 118 triggers the doors in the unflipped state.",
+ "EMType": 61,
+ "EntityLocation": 118,
+ "Trigger": {
+ "TrigType": 3,
+ "Mask": 31,
+ "SwitchOrKeyRef": 118,
+ "Actions": [
+ {
+ "Parameter": 117
+ },
+ {
+ "Parameter": 116
+ }
+ ]
+ },
+ "Replace": true
+ },
{
"Comments": "Add a ladder as a return path from room 8.",
"EMType": 26,
diff --git a/TRRandomizerCore/Resources/TR2/Environment/UNWATER.TR2-Environment.json b/TRRandomizerCore/Resources/TR2/Environment/UNWATER.TR2-Environment.json
index 4accdbbac..41bf1ad55 100644
--- a/TRRandomizerCore/Resources/TR2/Environment/UNWATER.TR2-Environment.json
+++ b/TRRandomizerCore/Resources/TR2/Environment/UNWATER.TR2-Environment.json
@@ -2586,9 +2586,9 @@
"EMType": 44,
"EntityIndex": 2,
"TargetLocation": {
- "X": 36842,
+ "X": 36352,
"Y": -512,
- "Z": 48100,
+ "Z": 47616,
"Angle": -16384
}
},
diff --git a/TRRandomizerCore/Resources/TR2/Strings/G11N/gamestrings_EN.json b/TRRandomizerCore/Resources/TR2/Strings/G11N/gamestrings_EN.json
index 5dd3ec2f9..5424555ec 100644
--- a/TRRandomizerCore/Resources/TR2/Strings/G11N/gamestrings_EN.json
+++ b/TRRandomizerCore/Resources/TR2/Strings/G11N/gamestrings_EN.json
@@ -559,7 +559,7 @@
"Quest for the Seraph",
"Iceberg Wins",
"Big Air Pocket",
- "[ then ]"
+ "Up then down"
],
"KeyItems": {
"Key2": [
diff --git a/TRRandomizerView/TRRandomizerView.csproj b/TRRandomizerView/TRRandomizerView.csproj
index 9caf8fd86..464102408 100644
--- a/TRRandomizerView/TRRandomizerView.csproj
+++ b/TRRandomizerView/TRRandomizerView.csproj
@@ -20,9 +20,9 @@
false
Resources\rando.ico
- 1.10.2
+ 1.11.0
Tomb Raider Randomizer
- Copyright © Tomb Raider Community 2024
+ Copyright © Tomb Raider Community 2025
diff --git a/USING.md b/USING.md
index 95e02ba85..18417a4e8 100644
--- a/USING.md
+++ b/USING.md
@@ -29,14 +29,12 @@ Following is a brief video explanation of the setup, but be sure to read each of
Before you launch the randomizer for the first time, you should carry out a few steps as follows.
***
> ### TR1
-> You must use [TR1X](https://github.com/LostArtefacts/TR1X) to be able to randomize Tomb Raider 1. Follow the installation guide on the TR1X GitHub page, or you can also refer to [this video](https://www.youtube.com/watch?v=WfyHin4Hpgs) for guidance. Note that if using the TR1X installer, the default directory where your game will be located is your Documents folder as opposed to the base game folder.
+> You must use [TR1X](https://github.com/LostArtefacts/TRX) to be able to randomize Tomb Raider 1. Follow the installation guide on the TR1X GitHub page, or you can also refer to [this video](https://www.youtube.com/watch?v=WfyHin4Hpgs) for guidance. Note that if using the TR1X installer, the default directory where your game will be located is your Documents folder as opposed to the base game folder.
>
> You must also ensure that you have the Unfinished Business levels files in your installation. These are available when using the TR1X installer, and we recommend that you choose the set that contains music triggers. The level files are also available to download manually from https://lostartefacts.dev/aux/tr1x/trub-music.zip - you can then simply extract the files into your TR1X data folder.
***
> ### TR2
-> Use the [Version Swapper](https://github.com/TombRunners/tr2-version-swapper) or install and configure [TR2Main](https://github.com/Arsunt/TR2Main).
->
-> _This step is entirely optional based on your own preference of gameplay._
+> You must use [TR2X](https://github.com/LostArtefacts/TRX) to be able to randomize Tomb Raider 2. Follow the installation guide on the TR2X GitHub page. Note that if using the TR2X installer, the default directory where your game will be located is your Documents folder as opposed to the base game folder.
***
> ### TR3
> Use the [Version Swapper](https://github.com/TombRunners/tr3-version-swapper) or install and configure [tomb3](https://github.com/Trxyebeep/tomb3). Using tomb3 is recommended to enable all features in the randomizer, plus to enjoy all of the benefits of the improved game. See https://github.com/Trxyebeep/tomb3/blob/master/USING.md for detailed installation steps.
@@ -131,7 +129,7 @@ You may see the following error message when you try to launch the randomizer -
If however the randomizer doesn't launch, but you don't see the above error, you can install the runtime manually using the link below.
-- https://aka.ms/dotnet/6.0/windowsdesktop-runtime-win-x64.exe
+- https://aka.ms/dotnet/8.0/windowsdesktop-runtime-win-x64.exe
### General issues
If you encounter error messages during randomization, the most likely cause is unclean data files. In this case, you should follow these steps.