From 011dfec04da3f79ee4bacc71eab1221b512ed7fd Mon Sep 17 00:00:00 2001 From: lahm86 <33758420+lahm86@users.noreply.github.com> Date: Fri, 9 Aug 2024 11:58:53 +0100 Subject: [PATCH] Retain prisoners in TR3R (#740) Resolves #739. --- CHANGELOG.md | 1 + .../Randomizers/TR3/Classic/TR3EnemyRandomizer.cs | 2 +- .../TR3/Remastered/TR3REnemyRandomizer.cs | 2 +- .../Randomizers/TR3/Shared/TR3EnemyAllocator.cs | 14 +++++++++++++- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0c4c34a..41ff0012 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ - fixed secrets in 40 Fathoms all generally appearing too close to the start of the level (#729) - fixed the Jade secret appearing before the Stone in TR2R Floating Islands (#729) - fixed being unable to collect secret artefacts in TR3R High Security Compound (#737) +- fixed (the lack of) prisoners in Area51 crashing the game when loading a save (#739) - improved data integrity checks when opening a folder and prior to randomization (#719) ## [V1.9.1](https://github.com/LostArtefacts/TR-Rando/compare/V1.9.0...V1.9.1) - 2024-06-23 diff --git a/TRRandomizerCore/Randomizers/TR3/Classic/TR3EnemyRandomizer.cs b/TRRandomizerCore/Randomizers/TR3/Classic/TR3EnemyRandomizer.cs index c954f623..274bebce 100644 --- a/TRRandomizerCore/Randomizers/TR3/Classic/TR3EnemyRandomizer.cs +++ b/TRRandomizerCore/Randomizers/TR3/Classic/TR3EnemyRandomizer.cs @@ -142,7 +142,7 @@ protected override void StartImpl() List levels = new(_enemyMapping.Keys); foreach (TR3CombinedLevel level in levels) { - _enemyMapping[level] = _outer._allocator.SelectCrossLevelEnemies(level.Name, level.Data, level.Sequence); + _enemyMapping[level] = _outer._allocator.SelectCrossLevelEnemies(level.Name, level.Data, level.Sequence, false); } } diff --git a/TRRandomizerCore/Randomizers/TR3/Remastered/TR3REnemyRandomizer.cs b/TRRandomizerCore/Randomizers/TR3/Remastered/TR3REnemyRandomizer.cs index 55328ba6..6e12d4b1 100644 --- a/TRRandomizerCore/Randomizers/TR3/Remastered/TR3REnemyRandomizer.cs +++ b/TRRandomizerCore/Randomizers/TR3/Remastered/TR3REnemyRandomizer.cs @@ -152,7 +152,7 @@ protected override void StartImpl() List levels = new(_enemyMapping.Keys); foreach (TR3RCombinedLevel level in levels) { - _enemyMapping[level] = _outer._allocator.SelectCrossLevelEnemies(level.Name, level.Data, level.Sequence); + _enemyMapping[level] = _outer._allocator.SelectCrossLevelEnemies(level.Name, level.Data, level.Sequence, true); } } diff --git a/TRRandomizerCore/Randomizers/TR3/Shared/TR3EnemyAllocator.cs b/TRRandomizerCore/Randomizers/TR3/Shared/TR3EnemyAllocator.cs index 344f4062..069d9687 100644 --- a/TRRandomizerCore/Randomizers/TR3/Shared/TR3EnemyAllocator.cs +++ b/TRRandomizerCore/Randomizers/TR3/Shared/TR3EnemyAllocator.cs @@ -41,7 +41,7 @@ protected override Dictionary> GetRestrictedRooms(string leve protected override bool IsOneShotType(TR3Type type) => _oneShotEnemies.Contains(type); - public EnemyTransportCollection SelectCrossLevelEnemies(string levelName, TR3Level level, int levelSequence) + public EnemyTransportCollection SelectCrossLevelEnemies(string levelName, TR3Level level, int levelSequence, bool remastered) { if (levelName == TR3LevelNames.ASSAULT) { @@ -76,6 +76,18 @@ public EnemyTransportCollection SelectCrossLevelEnemies(string levelNam } } + if (remastered && (levelName == TR3LevelNames.HSC || levelName == TR3LevelNames.AREA51)) + { + // TRR prisoners have to remain because of (presumably) the way the game fixes them not being friendly. + if (!newTypes.Contains(TR3Type.Prisoner)) + { + newTypes.Add(TR3Type.Prisoner); + } + + level.Entities.FindAll(e => e.TypeID == TR3Type.Prisoner) + .ForEach(e => ItemFactory.LockItem(levelName, level.Entities.IndexOf(e))); + } + foreach (int itemIndex in ItemFactory.GetLockedItems(levelName)) { TR3Entity item = level.Entities[itemIndex];