From ca13dac9e7e8ed801bf97d89eabec03dd379a8eb Mon Sep 17 00:00:00 2001 From: lahm86 <33758420+lahm86@users.noreply.github.com> Date: Sun, 14 Apr 2024 20:07:11 +0100 Subject: [PATCH] Add initial support for TRR (#615) Part of #614. --- Deps/TRGE.Coord.dll | Bin 1610240 -> 1613312 bytes Deps/TRGE.Core.dll | Bin 224768 -> 240640 bytes SFXExport/Program.cs | 37 ++- TRLevelControl/Helpers/TRConsts.cs | 2 + ...{TR1RandoEditor.cs => TR1ClassicEditor.cs} | 6 +- .../Editors/TR1RemasteredEditor.cs | 138 +++++++++ ...{TR2RandoEditor.cs => TR2ClassicEditor.cs} | 6 +- .../Editors/TR2RemasteredEditor.cs | 141 +++++++++ ...{TR3RandoEditor.cs => TR3ClassicEditor.cs} | 6 +- .../Editors/TR3RemasteredEditor.cs | 142 +++++++++ TRRandomizerCore/Helpers/ChecksumTester.cs | 101 ++++++ TRRandomizerCore/Levels/TR1RCombinedLevel.cs | 20 ++ TRRandomizerCore/Levels/TR2RCombinedLevel.cs | 20 ++ TRRandomizerCore/Levels/TR3RCombinedLevel.cs | 20 ++ .../Processors/TR1/TR1RLevelProcessor.cs | 72 +++++ .../Processors/TR2/TR2RLevelProcessor.cs | 72 +++++ .../Processors/TR3/TR3RLevelProcessor.cs | 72 +++++ .../Randomizers/Shared/LocationPicker.cs | 4 +- .../TR1/TR1StartPositionRandomizer.cs | 53 +--- .../Randomizers/TR1R/BaseTR1RRandomizer.cs | 13 + .../Randomizers/TR1R/TR1RAudioRandomizer.cs | 119 +++++++ .../TR1R/TR1REnvironmentRandomizer.cs | 84 +++++ .../Randomizers/TR1R/TR1RItemRandomizer.cs | 264 ++++++++++++++++ .../TR1R/TR1RStartPositionRandomizer.cs | 64 ++++ .../TR2/TR2StartPositionRandomizer.cs | 46 +-- .../Randomizers/TR2R/BaseTR2RRandomizer.cs | 13 + .../Randomizers/TR2R/TR2RAudioRandomizer.cs | 290 ++++++++++++++++++ .../TR2R/TR2REnvironmentRandomizer.cs | 84 +++++ .../Randomizers/TR2R/TR2RItemRandomizer.cs | 229 ++++++++++++++ .../TR2R/TR2RStartPositionRandomizer.cs | 72 +++++ .../TR3/TR3StartPositionRandomizer.cs | 91 ++---- .../Randomizers/TR3R/BaseTR3RRandomizer.cs | 13 + .../Randomizers/TR3R/TR3RAudioRandomizer.cs | 252 +++++++++++++++ .../TR3R/TR3REnvironmentRandomizer.cs | 84 +++++ .../Randomizers/TR3R/TR3RItemRandomizer.cs | 283 +++++++++++++++++ .../TR3R/TR3RStartPositionRandomizer.cs | 78 +++++ .../Resources/TR1/Audio/audio_tracks.json | 5 +- .../TR2/Locations/unarmed_locations.json | 20 +- TRRandomizerCore/TRRandomizerController.cs | 6 +- TRRandomizerCore/TRRandomizerCoord.cs | 17 +- TRRandomizerCore/TRRandomizerType.cs | 2 + TRRandomizerCore/TRVersionSupport.cs | 67 +++- TRRandomizerView/Controls/EditorControl.xaml | 89 ++---- .../Controls/EditorControl.xaml.cs | 23 +- TRRandomizerView/Model/ControllerOptions.cs | 35 ++- TRRandomizerView/Model/ManagedSeed.cs | 2 +- TRRandomizerView/Model/OptionGenerator.cs | 2 +- TRRandomizerView/Windows/AdvancedWindow.xaml | 2 +- .../Windows/AdvancedWindow.xaml.cs | 11 + .../Windows/GlobalSettingsWindow.xaml | 6 +- 50 files changed, 2997 insertions(+), 281 deletions(-) rename TRRandomizerCore/Editors/{TR1RandoEditor.cs => TR1ClassicEditor.cs} (98%) create mode 100644 TRRandomizerCore/Editors/TR1RemasteredEditor.cs rename TRRandomizerCore/Editors/{TR2RandoEditor.cs => TR2ClassicEditor.cs} (98%) create mode 100644 TRRandomizerCore/Editors/TR2RemasteredEditor.cs rename TRRandomizerCore/Editors/{TR3RandoEditor.cs => TR3ClassicEditor.cs} (98%) create mode 100644 TRRandomizerCore/Editors/TR3RemasteredEditor.cs create mode 100644 TRRandomizerCore/Levels/TR1RCombinedLevel.cs create mode 100644 TRRandomizerCore/Levels/TR2RCombinedLevel.cs create mode 100644 TRRandomizerCore/Levels/TR3RCombinedLevel.cs create mode 100644 TRRandomizerCore/Processors/TR1/TR1RLevelProcessor.cs create mode 100644 TRRandomizerCore/Processors/TR2/TR2RLevelProcessor.cs create mode 100644 TRRandomizerCore/Processors/TR3/TR3RLevelProcessor.cs create mode 100644 TRRandomizerCore/Randomizers/TR1R/BaseTR1RRandomizer.cs create mode 100644 TRRandomizerCore/Randomizers/TR1R/TR1RAudioRandomizer.cs create mode 100644 TRRandomizerCore/Randomizers/TR1R/TR1REnvironmentRandomizer.cs create mode 100644 TRRandomizerCore/Randomizers/TR1R/TR1RItemRandomizer.cs create mode 100644 TRRandomizerCore/Randomizers/TR1R/TR1RStartPositionRandomizer.cs create mode 100644 TRRandomizerCore/Randomizers/TR2R/BaseTR2RRandomizer.cs create mode 100644 TRRandomizerCore/Randomizers/TR2R/TR2RAudioRandomizer.cs create mode 100644 TRRandomizerCore/Randomizers/TR2R/TR2REnvironmentRandomizer.cs create mode 100644 TRRandomizerCore/Randomizers/TR2R/TR2RItemRandomizer.cs create mode 100644 TRRandomizerCore/Randomizers/TR2R/TR2RStartPositionRandomizer.cs create mode 100644 TRRandomizerCore/Randomizers/TR3R/BaseTR3RRandomizer.cs create mode 100644 TRRandomizerCore/Randomizers/TR3R/TR3RAudioRandomizer.cs create mode 100644 TRRandomizerCore/Randomizers/TR3R/TR3REnvironmentRandomizer.cs create mode 100644 TRRandomizerCore/Randomizers/TR3R/TR3RItemRandomizer.cs create mode 100644 TRRandomizerCore/Randomizers/TR3R/TR3RStartPositionRandomizer.cs diff --git a/Deps/TRGE.Coord.dll b/Deps/TRGE.Coord.dll index cad8510204914382576f24b4449bea1a909e1339..331968e09db054a54bfe77dc036a6a82cfbdea05 100644 GIT binary patch delta 27008 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 buemyRX7EAxf0nd&z+>@ia=%qp_6htyS+zFx delta 24147 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 diff --git a/Deps/TRGE.Core.dll b/Deps/TRGE.Core.dll index 828bad9703f7458cce621aa36cfda0f4e8f9ee41..58c2c607141f83202c2aeae7406bfaca06e78dfa 100644 GIT binary patch literal 240640 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 =zP0x?R7QE5uC%&=a~Rri#% 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ⅈ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%0A<_w} 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[1]); + if (!Enum.IsDefined(typeof(TRGameVersion), version)) { - Directory.Delete(exportDir, true); + Console.WriteLine("Unrecognised game verion."); + return; + } + + if (Directory.Exists(version.ToString())) + { + Directory.Delete(version.ToString(), true); } - Directory.CreateDirectory(exportDir); + Directory.CreateDirectory(version.ToString()); + + bool remaster = args.Length > 2 && args[2].ToUpper() == "REMASTER"; switch (Path.GetExtension(file).ToUpper()) { case ".SFX": - ExtractFromSFX(file, exportDir); + ExtractFromSFX(file, version, remaster); break; case ".PHD": - ExtractFromPHD(file, exportDir); + ExtractFromPHD(file, version); break; default: Console.WriteLine("Unsupported file."); @@ -35,10 +43,17 @@ static void Main(string[] args) } } - private static void ExtractFromSFX(string file, string exportDir) + private static void ExtractFromSFX(string file, TRGameVersion version, bool remaster) { int sample = 0; using BinaryReader reader = new(File.Open(file, FileMode.Open)); + + if (remaster) + { + // Header remains unknown for now + reader.BaseStream.Position = version == TRGameVersion.TR1 ? 0x200 : 0x2E4; + } + while (reader.BaseStream.Position < reader.BaseStream.Length) { uint[] header = new uint[11]; @@ -47,7 +62,7 @@ private static void ExtractFromSFX(string file, string exportDir) header[i] = reader.ReadUInt32(); } - using BinaryWriter writer = new(File.Create(Path.Combine(exportDir, sample++ + ".wav"))); + using BinaryWriter writer = new(File.Create(Path.Combine(version.ToString(), sample++ + ".wav"))); for (int i = 0; i < header.Length; i++) { writer.Write(header[i]); @@ -61,7 +76,7 @@ private static void ExtractFromSFX(string file, string exportDir) } } - private static void ExtractFromPHD(string file, string exportDir) + private static void ExtractFromPHD(string file, TRGameVersion version) { TR1Level level = new TR1LevelControl().Read(file); for (int i = 0; i < level.NumSampleIndices; i++) @@ -73,7 +88,7 @@ private static void ExtractFromPHD(string file, string exportDir) sampleEnd = (uint)level.Samples.Length; } - using BinaryWriter writer = new(File.Create(Path.Combine(exportDir, i + ".wav"))); + using BinaryWriter writer = new(File.Create(Path.Combine(version.ToString(), i + ".wav"))); for (uint j = sampleStart; j < sampleEnd; j++) { writer.Write(level.Samples[j]); @@ -84,7 +99,7 @@ private static void ExtractFromPHD(string file, string exportDir) private static void Usage() { Console.WriteLine(); - Console.WriteLine("Usage: SFXExport [*.SFX|*.PHD] [EXPORT_DIR]"); + Console.WriteLine("Usage: SFXExport [*.SFX|*.PHD] [TR1|TR2|TR3] [REMASTER|CLASSIC]"); Console.WriteLine(); Console.WriteLine("Example"); diff --git a/TRLevelControl/Helpers/TRConsts.cs b/TRLevelControl/Helpers/TRConsts.cs index 2bc0c38d3..356b39162 100644 --- a/TRLevelControl/Helpers/TRConsts.cs +++ b/TRLevelControl/Helpers/TRConsts.cs @@ -22,4 +22,6 @@ public static class TRConsts public const int MaskBits = 5; public const int FullMask = (1 << MaskBits) - 1; + + public const int Angle45 = 8192; } diff --git a/TRRandomizerCore/Editors/TR1RandoEditor.cs b/TRRandomizerCore/Editors/TR1ClassicEditor.cs similarity index 98% rename from TRRandomizerCore/Editors/TR1RandoEditor.cs rename to TRRandomizerCore/Editors/TR1ClassicEditor.cs index d089b631d..d2ca4df34 100644 --- a/TRRandomizerCore/Editors/TR1RandoEditor.cs +++ b/TRRandomizerCore/Editors/TR1ClassicEditor.cs @@ -11,19 +11,19 @@ namespace TRRandomizerCore.Editors; -public class TR1RandoEditor : TR1LevelEditor, ISettingsProvider +public class TR1ClassicEditor : TR1LevelEditor, ISettingsProvider { private static readonly Point _regularBadgePos = new(706, 537); private static readonly Point _goldBadgePos = new(498, 445); public RandomizerSettings Settings { get; private set; } - public TR1RandoEditor(TRDirectoryIOArgs args, TREdition edition) + public TR1ClassicEditor(TRDirectoryIOArgs args, TREdition edition) : base(args, edition) { } protected override void ApplyConfig(Config config) { - Settings = new RandomizerSettings() + Settings = new() { ExcludableEnemies = JsonConvert.DeserializeObject>(File.ReadAllText(@"Resources\TR1\Restrictions\excludable_enemies.json")) }; diff --git a/TRRandomizerCore/Editors/TR1RemasteredEditor.cs b/TRRandomizerCore/Editors/TR1RemasteredEditor.cs new file mode 100644 index 000000000..3449eaf7a --- /dev/null +++ b/TRRandomizerCore/Editors/TR1RemasteredEditor.cs @@ -0,0 +1,138 @@ +using TRGE.Core; +using TRLevelControl.Model; +using TRRandomizerCore.Helpers; +using TRRandomizerCore.Randomizers; + +namespace TRRandomizerCore.Editors; + +public class TR1RemasteredEditor : TR1ClassicEditor +{ + public TR1RemasteredEditor(TRDirectoryIOArgs io, TREdition edition) + : base(io, edition) { } + + protected override void ApplyConfig(Config config) + { + base.ApplyConfig(config); + Settings.AllowReturnPathLocations = false; + Settings.AddReturnPaths = false; + Settings.FixOGBugs = false; + } + + protected override int GetSaveTarget(int numLevels) + { + int target = 0; + + if (Settings.RandomizeItems) + { + target += numLevels; + if (Settings.IncludeKeyItems) + { + target += numLevels; + } + } + + if (Settings.RandomizeStartPosition) + { + target += numLevels; + } + + if (Settings.RandomizeAudio) + { + target += numLevels; + } + + // Environment randomizer always runs + target += numLevels * 2; + + return target; + } + + protected override void SaveImpl(AbstractTRScriptEditor scriptEditor, TRSaveMonitor monitor) + { + List levels = new( + scriptEditor.EnabledScriptedLevels.Cast().ToList() + ); + + if (scriptEditor.GymAvailable) + { + levels.Add(scriptEditor.AssaultLevel as TRRScriptedLevel); + } + + string backupDirectory = _io.BackupDirectory.FullName; + string wipDirectory = _io.WIPOutputDirectory.FullName; + + ItemFactory itemFactory = new(@"Resources\TR1\Items\repurposable_items.json"); + TR1RItemRandomizer itemRandomizer = new() + { + ScriptEditor = scriptEditor, + Levels = levels, + BasePath = wipDirectory, + BackupPath = backupDirectory, + SaveMonitor = monitor, + Settings = Settings, + ItemFactory = itemFactory + }; + + TR1REnvironmentRandomizer environmentRandomizer = new() + { + ScriptEditor = scriptEditor, + Levels = levels, + BasePath = wipDirectory, + BackupPath = backupDirectory, + SaveMonitor = monitor, + Settings = Settings, + }; + + if (!monitor.IsCancelled && Settings.RandomizeItems) + { + monitor.FireSaveStateBeginning(TRSaveCategory.Custom, "Randomizing standard items"); + itemRandomizer.Randomize(Settings.ItemSeed); + } + + if (!monitor.IsCancelled && Settings.RandomizeStartPosition) + { + monitor.FireSaveStateBeginning(TRSaveCategory.Custom, "Randomizing start positions"); + new TR1RStartPositionRandomizer + { + ScriptEditor = scriptEditor, + Levels = levels, + BasePath = wipDirectory, + BackupPath = backupDirectory, + SaveMonitor = monitor, + Settings = Settings + }.Randomize(Settings.StartPositionSeed); + } + + if (!monitor.IsCancelled) + { + monitor.FireSaveStateBeginning(TRSaveCategory.Custom, Settings.RandomizeEnvironment ? "Randomizing environment" : "Applying default environment packs"); + environmentRandomizer.Randomize(Settings.EnvironmentSeed); + } + + if (!monitor.IsCancelled && Settings.RandomizeItems && Settings.IncludeKeyItems) + { + monitor.FireSaveStateBeginning(TRSaveCategory.Custom, "Randomizing key items"); + itemRandomizer.RandomizeKeyItems(); + } + + if (!monitor.IsCancelled) + { + monitor.FireSaveStateBeginning(TRSaveCategory.Custom, "Finalizing environment changes"); + environmentRandomizer.FinalizeEnvironment(); + } + + if (!monitor.IsCancelled && Settings.RandomizeAudio) + { + monitor.FireSaveStateBeginning(TRSaveCategory.Custom, "Randomizing audio tracks"); + new TR1RAudioRandomizer + { + ScriptEditor = scriptEditor, + Levels = levels, + BasePath = wipDirectory, + BackupPath = backupDirectory, + SaveMonitor = monitor, + Settings = Settings + }.Randomize(Settings.AudioSeed); + } + } +} diff --git a/TRRandomizerCore/Editors/TR2RandoEditor.cs b/TRRandomizerCore/Editors/TR2ClassicEditor.cs similarity index 98% rename from TRRandomizerCore/Editors/TR2RandoEditor.cs rename to TRRandomizerCore/Editors/TR2ClassicEditor.cs index a2a5baab9..01bdaae69 100644 --- a/TRRandomizerCore/Editors/TR2RandoEditor.cs +++ b/TRRandomizerCore/Editors/TR2ClassicEditor.cs @@ -9,16 +9,16 @@ namespace TRRandomizerCore.Editors; -public class TR2RandoEditor : TR2LevelEditor, ISettingsProvider +public class TR2ClassicEditor : TR2LevelEditor, ISettingsProvider { public RandomizerSettings Settings { get; private set; } - public TR2RandoEditor(TRDirectoryIOArgs args, TREdition edition) + public TR2ClassicEditor(TRDirectoryIOArgs args, TREdition edition) : base(args, edition) { } protected override void ApplyConfig(Config config) { - Settings = new RandomizerSettings + Settings = new() { ExcludableEnemies = JsonConvert.DeserializeObject>(File.ReadAllText(@"Resources\TR2\Restrictions\excludable_enemies.json")) }; diff --git a/TRRandomizerCore/Editors/TR2RemasteredEditor.cs b/TRRandomizerCore/Editors/TR2RemasteredEditor.cs new file mode 100644 index 000000000..cad8597dc --- /dev/null +++ b/TRRandomizerCore/Editors/TR2RemasteredEditor.cs @@ -0,0 +1,141 @@ +using TRGE.Core; +using TRLevelControl.Model; +using TRRandomizerCore.Helpers; +using TRRandomizerCore.Randomizers; + +namespace TRRandomizerCore.Editors; + +public class TR2RemasteredEditor : TR2ClassicEditor +{ + public TR2RemasteredEditor(TRDirectoryIOArgs io, TREdition edition) + : base(io, edition) { } + + protected override void ApplyConfig(Config config) + { + base.ApplyConfig(config); + Settings.AllowReturnPathLocations = false; + Settings.AddReturnPaths = false; + Settings.FixOGBugs = false; + } + + protected override int GetSaveTarget(int numLevels) + { + int target = 0; + + if (Settings.RandomizeItems) + { + target += numLevels; + if (Settings.IncludeKeyItems) + { + target += numLevels; + } + } + + if (Settings.RandomizeStartPosition) + { + target += numLevels; + } + + if (Settings.RandomizeAudio) + { + target += numLevels; + } + + // Environment randomizer always runs + target += numLevels * 2; + + return target; + } + + protected override void SaveImpl(AbstractTRScriptEditor scriptEditor, TRSaveMonitor monitor) + { + List levels = new( + scriptEditor.EnabledScriptedLevels.Cast().ToList() + ); + + if (scriptEditor.GymAvailable) + { + levels.Add(scriptEditor.AssaultLevel as TRRScriptedLevel); + } + + string backupDirectory = _io.BackupDirectory.FullName; + string wipDirectory = _io.WIPOutputDirectory.FullName; + + ItemFactory itemFactory = new() + { + DefaultItem = new() { Intensity1 = -1, Intensity2 = -1 } + }; + TR2RItemRandomizer itemRandomizer = new() + { + ScriptEditor = scriptEditor, + Levels = levels, + BasePath = wipDirectory, + BackupPath = backupDirectory, + SaveMonitor = monitor, + Settings = Settings, + ItemFactory = itemFactory, + }; + + TR2REnvironmentRandomizer environmentRandomizer = new() + { + ScriptEditor = scriptEditor, + Levels = levels, + BasePath = wipDirectory, + BackupPath = backupDirectory, + SaveMonitor = monitor, + Settings = Settings, + }; + + if (!monitor.IsCancelled && Settings.RandomizeItems) + { + monitor.FireSaveStateBeginning(TRSaveCategory.Custom, "Randomizing standard items"); + itemRandomizer.Randomize(Settings.ItemSeed); + } + + if (!monitor.IsCancelled && Settings.RandomizeStartPosition) + { + monitor.FireSaveStateBeginning(TRSaveCategory.Custom, "Randomizing start positions"); + new TR2RStartPositionRandomizer + { + ScriptEditor = scriptEditor, + Levels = levels, + BasePath = wipDirectory, + BackupPath = backupDirectory, + SaveMonitor = monitor, + Settings = Settings + }.Randomize(Settings.StartPositionSeed); + } + + if (!monitor.IsCancelled) + { + monitor.FireSaveStateBeginning(TRSaveCategory.Custom, Settings.RandomizeEnvironment ? "Randomizing environment" : "Applying default environment packs"); + environmentRandomizer.Randomize(Settings.EnvironmentSeed); + } + + if (!monitor.IsCancelled && Settings.RandomizeItems && Settings.IncludeKeyItems) + { + monitor.FireSaveStateBeginning(TRSaveCategory.Custom, "Randomizing key items"); + itemRandomizer.RandomizeKeyItems(); + } + + if (!monitor.IsCancelled) + { + monitor.FireSaveStateBeginning(TRSaveCategory.Custom, "Finalizing environment changes"); + environmentRandomizer.FinalizeEnvironment(); + } + + if (!monitor.IsCancelled && Settings.RandomizeAudio) + { + monitor.FireSaveStateBeginning(TRSaveCategory.Custom, "Randomizing audio tracks"); + new TR2RAudioRandomizer + { + ScriptEditor = scriptEditor, + Levels = levels, + BasePath = wipDirectory, + BackupPath = backupDirectory, + SaveMonitor = monitor, + Settings = Settings + }.Randomize(Settings.AudioSeed); + } + } +} diff --git a/TRRandomizerCore/Editors/TR3RandoEditor.cs b/TRRandomizerCore/Editors/TR3ClassicEditor.cs similarity index 98% rename from TRRandomizerCore/Editors/TR3RandoEditor.cs rename to TRRandomizerCore/Editors/TR3ClassicEditor.cs index 1f36c268e..1a80aeeb6 100644 --- a/TRRandomizerCore/Editors/TR3RandoEditor.cs +++ b/TRRandomizerCore/Editors/TR3ClassicEditor.cs @@ -9,16 +9,16 @@ namespace TRRandomizerCore.Editors; -public class TR3RandoEditor : TR3LevelEditor, ISettingsProvider +public class TR3ClassicEditor : TR3LevelEditor, ISettingsProvider { public RandomizerSettings Settings { get; private set; } - public TR3RandoEditor(TRDirectoryIOArgs args, TREdition edition) + public TR3ClassicEditor(TRDirectoryIOArgs args, TREdition edition) : base(args, edition) { } protected override void ApplyConfig(Config config) { - Settings = new RandomizerSettings + Settings = new() { ExcludableEnemies = JsonConvert.DeserializeObject>(File.ReadAllText(@"Resources\TR3\Restrictions\excludable_enemies.json")) }; diff --git a/TRRandomizerCore/Editors/TR3RemasteredEditor.cs b/TRRandomizerCore/Editors/TR3RemasteredEditor.cs new file mode 100644 index 000000000..43e3a416c --- /dev/null +++ b/TRRandomizerCore/Editors/TR3RemasteredEditor.cs @@ -0,0 +1,142 @@ +using TRGE.Core; +using TRLevelControl.Model; +using TRRandomizerCore.Helpers; +using TRRandomizerCore.Randomizers; + +namespace TRRandomizerCore.Editors; + +public class TR3RemasteredEditor : TR3ClassicEditor +{ + public TR3RemasteredEditor(TRDirectoryIOArgs io, TREdition edition) + : base(io, edition) { } + + protected override void ApplyConfig(Config config) + { + base.ApplyConfig(config); + Settings.AllowReturnPathLocations = false; + Settings.AddReturnPaths = false; + Settings.FixOGBugs = false; + } + + protected override int GetSaveTarget(int numLevels) + { + int target = 0; + + if (Settings.RandomizeItems) + { + target += numLevels; + if (Settings.IncludeKeyItems) + { + target += numLevels; + } + } + + if (Settings.RandomizeStartPosition) + { + target += numLevels; + } + + if (Settings.RandomizeAudio) + { + target += numLevels; + } + + // Environment randomizer always runs + target += numLevels * 2; + + return target; + } + + protected override void SaveImpl(AbstractTRScriptEditor scriptEditor, TRSaveMonitor monitor) + { + List levels = new( + scriptEditor.EnabledScriptedLevels.Cast().ToList() + ); + + if (scriptEditor.GymAvailable) + { + levels.Add(scriptEditor.AssaultLevel as TRRScriptedLevel); + } + + string backupDirectory = _io.BackupDirectory.FullName; + string wipDirectory = _io.WIPOutputDirectory.FullName; + + ItemFactory itemFactory = new(@"Resources\TR3\Items\repurposable_items.json") + { + DefaultItem = new() { Intensity1 = -1, Intensity2 = -1 } + }; + + TR3RItemRandomizer itemRandomizer = new() + { + ScriptEditor = scriptEditor, + Levels = levels, + BasePath = wipDirectory, + BackupPath = backupDirectory, + SaveMonitor = monitor, + Settings = Settings, + ItemFactory = itemFactory, + }; + + TR3REnvironmentRandomizer environmentRandomizer = new() + { + ScriptEditor = scriptEditor, + Levels = levels, + BasePath = wipDirectory, + BackupPath = backupDirectory, + SaveMonitor = monitor, + Settings = Settings, + }; + + if (!monitor.IsCancelled && Settings.RandomizeItems) + { + monitor.FireSaveStateBeginning(TRSaveCategory.Custom, "Randomizing standard items"); + itemRandomizer.Randomize(Settings.ItemSeed); + } + + if (!monitor.IsCancelled && Settings.RandomizeStartPosition) + { + monitor.FireSaveStateBeginning(TRSaveCategory.Custom, "Randomizing start positions"); + new TR3RStartPositionRandomizer + { + ScriptEditor = scriptEditor, + Levels = levels, + BasePath = wipDirectory, + BackupPath = backupDirectory, + SaveMonitor = monitor, + Settings = Settings + }.Randomize(Settings.StartPositionSeed); + } + + if (!monitor.IsCancelled) + { + monitor.FireSaveStateBeginning(TRSaveCategory.Custom, Settings.RandomizeEnvironment ? "Randomizing environment" : "Applying default environment packs"); + environmentRandomizer.Randomize(Settings.EnvironmentSeed); + } + + if (!monitor.IsCancelled && Settings.RandomizeItems && Settings.IncludeKeyItems) + { + monitor.FireSaveStateBeginning(TRSaveCategory.Custom, "Randomizing key items"); + itemRandomizer.RandomizeKeyItems(); + } + + if (!monitor.IsCancelled) + { + monitor.FireSaveStateBeginning(TRSaveCategory.Custom, "Finalizing environment changes"); + environmentRandomizer.FinalizeEnvironment(); + } + + if (!monitor.IsCancelled && Settings.RandomizeAudio) + { + monitor.FireSaveStateBeginning(TRSaveCategory.Custom, "Randomizing audio tracks"); + new TR3RAudioRandomizer + { + ScriptEditor = scriptEditor, + Levels = levels, + BasePath = wipDirectory, + BackupPath = backupDirectory, + SaveMonitor = monitor, + Settings = Settings + }.Randomize(Settings.AudioSeed); + } + } +} diff --git a/TRRandomizerCore/Helpers/ChecksumTester.cs b/TRRandomizerCore/Helpers/ChecksumTester.cs index b8faa2658..ad60b12c8 100644 --- a/TRRandomizerCore/Helpers/ChecksumTester.cs +++ b/TRRandomizerCore/Helpers/ChecksumTester.cs @@ -48,6 +48,44 @@ public bool Test(string file) "7f7c535bcab001698a1f965053972f49", // END.PHD "f03f7a545330d5ba30e2aec62d47b4a3", // END2.PHD + // TR1R V1.0+ + "16e1ec56fe8f00c97fb618e16f58ceed", // GYM.PHD + "b58c2461c5b01c378317f2f8a1a1fc55", // LEVEL1.PHD + "24ae96520c0f041d166f1ce3be09db84", // LEVEL2.PHD + "83b2e26a60a5fb30b19153c1ee945d5f", // LEVEL3A.PHD + "41949bf9de7ad208379491d20781c074", // LEVEL3B.PHD + "e7a2fed3f3b40c3367def9d6dfdd98e9", // LEVEL4.PHD + "115519647c6aa7e7c6da38dd00c55f26", // LEVEL5.PHD + "bd78c050343d8ff69de6fc8805e8dd18", // LEVEL6.PHD + "a02bcb8de92fa9dc9e410d5f8795537f", // LEVEL7A.PHD + "e9cee17932c3b6bb02e5a9beea1742b2", // LEVEL7B.PHD + "51a8aaa4a5f510fb6f4eeeea1985a4d9", // LEVEL8A.PHD + "58f050471880ba5d0c9677aaadf1ac4a", // LEVEL8B.PHD + "0cc53fac2255b1be1dbc032b0d5cdc01", // LEVEL8C.PHD + "cd134e858da2137b7c9601b8e9c3d273", // LEVEL10A.PHD + "ec8b196335968127c515739d7af3f55e", // LEVEL10B.PHD + "11a4d4674ba47dbe2da19c64eb7e5970", // CUT4.PHD + "c750c2fe90ab7d51dcfa2a9f35cbfe55", // LEVEL10C.PHD + "94ae1b3e5438457db2c110be20e5a93c", // EGYPT.PHD + "43072a2205d4af2d2fdba63e4ebf5c11", // CAT.PHD + "cba8ce583dbab726ffa2f0a3798a1572", // END.PHD + "2292ba13707de8524c51b1ffa9a95446", // END2.PHD + + // TR1R V1.1+ + "ed82f9c85457e4ec85b47f66090d1a11", // LEVEL1.PHD + "8124261717c6cd71ddc9eb95d76ef5e0", // LEVEL3B.PHD + "4f4304771122d0679826dfbf586f9d91", // LEVEL4.PHD + "f4144cba464d7eb8ecd4d37c57174ea8", // LEVEL5.PHD + "e06a9a1123b6cb1b1c57893bc1f1b0d1", // LEVEL8B.PHD + "9e5e30e25087490f0e9654e23951ccc6", // LEVEL8C.PHD + "126658bcdc6a6a32e8809d0b29c6a993", // LEVEL10A.PHD + "3d7fa5acc7d78c7f809ef08077a99fea", // LEVEL10B.PHD + "e3ad7ded14954ece42abf0d41f7ab55f", // LEVEL10C.PHD + + // TR1R V1.2+ + "8376349b1989024228f7135f9c7187a6", // LEVEL3A.PHD + "0878ce6127a93335b6a96f4dfbe61fb9", // LEVEL8C.PHD + // TR2 "d6f218e32d172e67db60daa35ef7e114", // ASSAULT.TR2 "da1e01683dad5fabbfff89c267b75b9e", // WALL.TR2 @@ -79,6 +117,35 @@ public bool Test(string file) "63ff8be5c7abf37d7065456afeda029f", // LEVEL4.TR2 "88c8124b6d152b9f3fe1c4eeec4428a5", // LEVEL5.TR2 + // TR2R V1.0+ + "eaa29bf1528f38230d7333689d047272", // WALL.TR2 + "3aaf0aee44fbd2f52b3e17cb44b98e3b", // BOAT.TR2 + "cab8e60a93bf0d57e6596770060cc174", // VENICE.TR2 + "e2c74ab8e0fb81c45e85d1644392812a", // OPERA.TR2 + "7eee55f021b37a71068f4df9e628268d", // RIG.TR2 + "4edcca946398df186af62a50a5a0efcc", // PLATFORM.TR2 + "54b750469b48153af58af6922b4c1dff", // UNWATER.TR2 + "90b734cbe488b2a926a8d02d7c7b24f8", // KEEL.TR2 + "3bb6c263b3758e781e0823cd0e4e5366", // LIVING.TR2 + "5f3b660dac21f1ff182eef75343913f4", // DECK.TR2 + "f60792466773c2fdd476ae11f9ad22e7", // SKIDOO.TR2 + "742ae5026fd241558c473ff89e6b868e", // MONASTRY.TR2 + "629eefb9558a215e452c87c35bfcc95a", // CATACOMB.TR2 + "e26bf56e74719cd4f7a11c2d1135143a", // ICECAVE.TR2 + "3d3413eb305b54e0fc67d028accf413b", // EMPRTOMB.TR2 + "4756d792860b1a8bb86effa7bdd0ce80", // FLOATING.TR2 + "25c5f07faecbe656e1c2190378d01e34", // XIAN.TR2 + "07f7fde736c6a3a9c46f877bf275e1aa", // HOUSE.TR2 + "ecf84476a8ca3eb1330d0078203d36e3", // LEVEL1.TR2 + "338df62a6a7bd6eb4b7d2f303eeec429", // LEVEL2.TR2 + "f0cb2aafd4ddbb6cd09b1d21d9eda8c6", // LEVEL3.TR2 + "a43bacce79dd110f55fdf635b95523bf", // LEVEL4.TR2 + "e05c5ec3c10e3043a42791a1b649ddc7", // LEVEL5.TR2 + + // TR2R V1.1+ + "79e3f05f963acac6f864ba81555cc15d", // MONASTRY.TR2 + "cf4f784bdfa0b5794b3437e4d9ed04d8", // ICECAVE.TR2 + // TR3 "5e11d251ddb12b98ebead1883dc12d2a", // HOUSE.TR2 "9befdc5075fdb84450d2ed0533719b12", // JUNGLE.TR2 (International) @@ -126,5 +193,39 @@ public bool Test(string file) "a83c32d6306e18e0a15d79138ac131cb", // UNDERSEA.TR2 "7cfb31fbd9031900c602eea32d1543ec", // ZOO.TR2 "17286cb4cd4f079cf208fdaf38e53d2b", // SLINC.TR2 + + // TR3R V1.0+ + "7894cb25312114d969b79d7a7fb17f67", // HOUSE.TR2 + "d9d5f08872ee43f6c27cf3b22cb9ae6d", // JUNGLE.TR2 + "21577b6e5828f1535ece0ca45b63ad5a", // CUT6.TR2 + "b7af59e80ae03e05202754764a8fb132", // TEMPLE.TR2 + "e4d88cb486c8054f7db6076ab9748792", // QUADCHAS.TR2 + "a0f0372b444a01676d99c7a0f49ad24e", // TONYBOSS.TR2 + "8080e2eb148541bc44a74317fbb93ad2", // SHORE.TR2 + "005183d2dd54f5fbb4ccf3293d643964", // CRASH.TR2 + "0cebb72fee215b40b722f0e96106a3a9", // RAPIDS.TR2 + "5c18e057ea40e4c1ceecebc5a9d9cd65", // TRIBOSS.TR2 + "633b0245e14c5b7faab90d1f549ac488", // ROOFS.TR2 + "864a61e73a371dfe0c593f8a233930ec", // SEWER.TR2 + "57a207f21c00362ce60f0ad3f5455a07", // TOWER.TR2 + "69a07074215c08a547a0055b774bacec", // OFFICE.TR2 + "1c4249c0fff242da45728f5177122c10", // STPAUL.TR2 + "62893b73166013b21e2fb3d9c8d9d606", // NEVADA.TR2 + "150b8eae81456cc7b928a40c1c9992ce", // COMPOUND.TR2 + "5e4d62be8333842ef61ac6720b8b77c3", // AREA51.TR2 + "42fd4ca5aa5c02bc4478bbd583689c1a", // ANTARC.TR2 + "d107f57cecfc03b53d00a46a0111dce5", // MINES.TR2 + "436620ba935ffc3cd798cf598ee46ae4", // CITY.TR2 + "ee94ce8722881ab7a1c66cda17bef933", // CHAMBER.TR2 + "1c4249c0fff242da45728f5177122c10", // STPAUL.TR2 + "6efcc71cace4527a0b79128111910eb7", // SCOTLAND.TR2 + "8dc5ff814b23b0654a0b261e501d0320", // WILLSDEN.TR2 + "b99c1af5f462344c267a2141b238fcb4", // CHUNNEL.TR2 + "5d002059f337f165066474a902796d0b", // UNDERSEA.TR2 + "ef8d013cf1fb6495943d9dd74ee09588", // ZOO.TR2 + "ac3b508ae772b3fbd4b16b83b829dfc6", // SLINC.TR2 + + // TR3R V1.1+ + "9a1f7162eb7e2b3a57a17e92e0edfbb6", // ANTARC.TR2 }; } diff --git a/TRRandomizerCore/Levels/TR1RCombinedLevel.cs b/TRRandomizerCore/Levels/TR1RCombinedLevel.cs new file mode 100644 index 000000000..db5aad15a --- /dev/null +++ b/TRRandomizerCore/Levels/TR1RCombinedLevel.cs @@ -0,0 +1,20 @@ +using TRGE.Core; +using TRLevelControl.Helpers; +using TRLevelControl.Model; + +namespace TRRandomizerCore.Levels; + +public class TR1RCombinedLevel +{ + public TR1Level Data { get; set; } + public TRRScriptedLevel Script { get; set; } + public string Checksum { get; set; } + public string Name => Script.LevelFileBaseName.ToUpper(); + public TR1RCombinedLevel CutSceneLevel { get; set; } + public TR1RCombinedLevel ParentLevel { get; set; } + public bool IsCutScene => ParentLevel != null; + public bool HasCutScene => Script.HasCutScene; + public int Sequence => IsCutScene ? ParentLevel.Sequence : Script.Sequence; + public bool Is(string levelFileName) => Script.Is(levelFileName); + public bool IsAssault => Is(TR1LevelNames.ASSAULT); +} diff --git a/TRRandomizerCore/Levels/TR2RCombinedLevel.cs b/TRRandomizerCore/Levels/TR2RCombinedLevel.cs new file mode 100644 index 000000000..b80eebfc0 --- /dev/null +++ b/TRRandomizerCore/Levels/TR2RCombinedLevel.cs @@ -0,0 +1,20 @@ +using TRGE.Core; +using TRLevelControl.Helpers; +using TRLevelControl.Model; + +namespace TRRandomizerCore.Levels; + +public class TR2RCombinedLevel +{ + public TR2Level Data { get; set; } + public TRRScriptedLevel Script { get; set; } + public string Checksum { get; set; } + public string Name => Script.LevelFileBaseName.ToUpper(); + public TR2RCombinedLevel CutSceneLevel { get; set; } + public TR2RCombinedLevel ParentLevel { get; set; } + public bool IsCutScene => ParentLevel != null; + public bool HasCutScene => Script.HasCutScene; + public int Sequence => IsCutScene ? ParentLevel.Sequence : Script.Sequence; + public bool Is(string levelFileName) => Script.Is(levelFileName); + public bool IsAssault => Is(TR2LevelNames.ASSAULT); +} diff --git a/TRRandomizerCore/Levels/TR3RCombinedLevel.cs b/TRRandomizerCore/Levels/TR3RCombinedLevel.cs new file mode 100644 index 000000000..f441d86e6 --- /dev/null +++ b/TRRandomizerCore/Levels/TR3RCombinedLevel.cs @@ -0,0 +1,20 @@ +using TRGE.Core; +using TRLevelControl.Helpers; +using TRLevelControl.Model; + +namespace TRRandomizerCore.Levels; + +public class TR3RCombinedLevel +{ + public TR3Level Data { get; set; } + public TRRScriptedLevel Script { get; set; } + public string Checksum { get; set; } + public string Name => Script.LevelFileBaseName.ToUpper(); + public TR3RCombinedLevel CutSceneLevel { get; set; } + public TR3RCombinedLevel ParentLevel { get; set; } + public bool IsCutScene => ParentLevel != null; + public bool HasCutScene => Script.HasCutScene; + public int Sequence => IsCutScene ? ParentLevel.Sequence : Script.Sequence; + public bool Is(string levelFileName) => Script.Is(levelFileName); + public bool IsAssault => Is(TR3LevelNames.ASSAULT); +} diff --git a/TRRandomizerCore/Processors/TR1/TR1RLevelProcessor.cs b/TRRandomizerCore/Processors/TR1/TR1RLevelProcessor.cs new file mode 100644 index 000000000..c4cecb6b5 --- /dev/null +++ b/TRRandomizerCore/Processors/TR1/TR1RLevelProcessor.cs @@ -0,0 +1,72 @@ +using TRGE.Core; +using TRLevelControl; +using TRLevelControl.Model; +using TRRandomizerCore.Levels; + +namespace TRRandomizerCore.Processors; + +public class TR1RLevelProcessor : AbstractLevelProcessor +{ + protected TR1LevelControl _control; + + public TR1RLevelProcessor() + { + _control = new(); + } + + protected override TR1RCombinedLevel LoadCombinedLevel(TRRScriptedLevel scriptedLevel) + { + TR1RCombinedLevel level = new() + { + Data = LoadLevelData(scriptedLevel.LevelFileBaseName), + Script = scriptedLevel, + Checksum = GetBackupChecksum(scriptedLevel.LevelFileBaseName) + }; + + if (scriptedLevel.HasCutScene) + { + level.CutSceneLevel = LoadCombinedLevel(scriptedLevel.CutSceneLevel as TRRScriptedLevel); + level.CutSceneLevel.ParentLevel = level; + } + + return level; + } + + public TR1Level LoadLevelData(string name) + { + lock (_controlLock) + { + string fullPath = Path.Combine(BasePath, name); + return _control.Read(fullPath); + } + } + + protected override void ReloadLevelData(TR1RCombinedLevel level) + { + level.Data = LoadLevelData(level.Name); + if (level.HasCutScene) + { + level.CutSceneLevel.Data = LoadLevelData(level.CutSceneLevel.Name); + } + } + + protected override void SaveLevel(TR1RCombinedLevel level) + { + SaveLevel(level.Data, level.Name); + if (level.HasCutScene) + { + SaveLevel(level.CutSceneLevel.Data, level.CutSceneLevel.Name); + } + + SaveScript(); + } + + public void SaveLevel(TR1Level level, string name) + { + lock (_controlLock) + { + string fullPath = Path.Combine(BasePath, name); + _control.Write(level, fullPath); + } + } +} diff --git a/TRRandomizerCore/Processors/TR2/TR2RLevelProcessor.cs b/TRRandomizerCore/Processors/TR2/TR2RLevelProcessor.cs new file mode 100644 index 000000000..b71db7fb1 --- /dev/null +++ b/TRRandomizerCore/Processors/TR2/TR2RLevelProcessor.cs @@ -0,0 +1,72 @@ +using TRGE.Core; +using TRLevelControl; +using TRLevelControl.Model; +using TRRandomizerCore.Levels; + +namespace TRRandomizerCore.Processors; + +public class TR2RLevelProcessor : AbstractLevelProcessor +{ + protected TR2LevelControl _control; + + public TR2RLevelProcessor() + { + _control = new(); + } + + protected override TR2RCombinedLevel LoadCombinedLevel(TRRScriptedLevel scriptedLevel) + { + TR2RCombinedLevel level = new() + { + Data = LoadLevelData(scriptedLevel.LevelFileBaseName), + Script = scriptedLevel, + Checksum = GetBackupChecksum(scriptedLevel.LevelFileBaseName) + }; + + if (scriptedLevel.HasCutScene) + { + level.CutSceneLevel = LoadCombinedLevel(scriptedLevel.CutSceneLevel as TRRScriptedLevel); + level.CutSceneLevel.ParentLevel = level; + } + + return level; + } + + public TR2Level LoadLevelData(string name) + { + lock (_controlLock) + { + string fullPath = Path.Combine(BasePath, name); + return _control.Read(fullPath); + } + } + + protected override void ReloadLevelData(TR2RCombinedLevel level) + { + level.Data = LoadLevelData(level.Name); + if (level.HasCutScene) + { + level.CutSceneLevel.Data = LoadLevelData(level.CutSceneLevel.Name); + } + } + + protected override void SaveLevel(TR2RCombinedLevel level) + { + SaveLevel(level.Data, level.Name); + if (level.HasCutScene) + { + SaveLevel(level.CutSceneLevel.Data, level.CutSceneLevel.Name); + } + + SaveScript(); + } + + public void SaveLevel(TR2Level level, string name) + { + lock (_controlLock) + { + string fullPath = Path.Combine(BasePath, name); + _control.Write(level, fullPath); + } + } +} diff --git a/TRRandomizerCore/Processors/TR3/TR3RLevelProcessor.cs b/TRRandomizerCore/Processors/TR3/TR3RLevelProcessor.cs new file mode 100644 index 000000000..d742ba0d1 --- /dev/null +++ b/TRRandomizerCore/Processors/TR3/TR3RLevelProcessor.cs @@ -0,0 +1,72 @@ +using TRGE.Core; +using TRLevelControl; +using TRLevelControl.Model; +using TRRandomizerCore.Levels; + +namespace TRRandomizerCore.Processors; + +public class TR3RLevelProcessor : AbstractLevelProcessor +{ + protected TR3LevelControl _control; + + public TR3RLevelProcessor() + { + _control = new(); + } + + protected override TR3RCombinedLevel LoadCombinedLevel(TRRScriptedLevel scriptedLevel) + { + TR3RCombinedLevel level = new() + { + Data = LoadLevelData(scriptedLevel.LevelFileBaseName), + Script = scriptedLevel, + Checksum = GetBackupChecksum(scriptedLevel.LevelFileBaseName) + }; + + if (scriptedLevel.HasCutScene) + { + level.CutSceneLevel = LoadCombinedLevel(scriptedLevel.CutSceneLevel as TRRScriptedLevel); + level.CutSceneLevel.ParentLevel = level; + } + + return level; + } + + public TR3Level LoadLevelData(string name) + { + lock (_controlLock) + { + string fullPath = Path.Combine(BasePath, name); + return _control.Read(fullPath); + } + } + + protected override void ReloadLevelData(TR3RCombinedLevel level) + { + level.Data = LoadLevelData(level.Name); + if (level.HasCutScene) + { + level.CutSceneLevel.Data = LoadLevelData(level.CutSceneLevel.Name); + } + } + + protected override void SaveLevel(TR3RCombinedLevel level) + { + SaveLevel(level.Data, level.Name); + if (level.HasCutScene) + { + SaveLevel(level.CutSceneLevel.Data, level.CutSceneLevel.Name); + } + + SaveScript(); + } + + public void SaveLevel(TR3Level level, string name) + { + lock (_controlLock) + { + string fullPath = Path.Combine(BasePath, name); + _control.Write(level, fullPath); + } + } +} diff --git a/TRRandomizerCore/Randomizers/Shared/LocationPicker.cs b/TRRandomizerCore/Randomizers/Shared/LocationPicker.cs index 7784bc6ea..f793f9de5 100644 --- a/TRRandomizerCore/Randomizers/Shared/LocationPicker.cs +++ b/TRRandomizerCore/Randomizers/Shared/LocationPicker.cs @@ -9,8 +9,6 @@ namespace TRRandomizerCore.Randomizers; public class LocationPicker : IRouteManager { - private static readonly int _rotation = -8192; - private readonly Dictionary> _routes; private List _locations, _usedTriggerLocations, _currentRoute; @@ -333,7 +331,7 @@ public void SetLocation(TREntity entity, Location location) // around randomly for variety. if (entity.Angle == -1) { - entity.Angle = (short)(_generator.Next(0, 8) * _rotation); + entity.Angle = (short)(_generator.Next(0, 8) * -TRConsts.Angle45); } } diff --git a/TRRandomizerCore/Randomizers/TR1/TR1StartPositionRandomizer.cs b/TRRandomizerCore/Randomizers/TR1/TR1StartPositionRandomizer.cs index d3eebaf1b..ccc329b8f 100644 --- a/TRRandomizerCore/Randomizers/TR1/TR1StartPositionRandomizer.cs +++ b/TRRandomizerCore/Randomizers/TR1/TR1StartPositionRandomizer.cs @@ -1,6 +1,7 @@ using Newtonsoft.Json; using TRFDControl; using TRGE.Core; +using TRLevelControl; using TRLevelControl.Model; using TRRandomizerCore.Helpers; using TRRandomizerCore.Levels; @@ -10,7 +11,6 @@ namespace TRRandomizerCore.Randomizers; public class TR1StartPositionRandomizer : BaseTR1Randomizer { - private static readonly short _rotation = -8192; private Dictionary> _startLocations; public override void Randomize(int seed) @@ -21,9 +21,7 @@ public override void Randomize(int seed) foreach (TR1ScriptedLevel lvl in Levels) { LoadLevelInstance(lvl); - RandomizeStartPosition(_levelInstance); - SaveLevelInstance(); if (!TriggerProgress()) @@ -35,7 +33,7 @@ public override void Randomize(int seed) private void RandomizeStartPosition(TR1CombinedLevel level) { - TR1Entity lara = level.Data.Entities.Find(e => e.TypeID == (short)TR1Type.Lara); + TR1Entity lara = level.Data.Entities.Find(e => e.TypeID == TR1Type.Lara); FDControl floorData = new(); floorData.ParseFromLevel(level.Data); @@ -45,45 +43,24 @@ private void RandomizeStartPosition(TR1CombinedLevel level) if (!Settings.RotateStartPositionOnly && _startLocations.ContainsKey(level.Name)) { List locations = _startLocations[level.Name]; - if (Settings.DevelopmentMode) + Location location; + do { - foreach (Location loc in locations) - { - level.Data.Entities.Add(new() - { - TypeID = (short)TR1Type.Lara, - X = loc.X, - Y = loc.Y, - Z = loc.Z, - Room = (short)loc.Room, - Angle = lara.Angle - }); - } + location = locations[_generator.Next(0, locations.Count)]; } - else - { - Location location; - do - { - location = locations[_generator.Next(0, locations.Count)]; - } - while (!location.Validated || location.ContainsSecret(level.Data, floorData)); + while (!location.Validated || location.ContainsSecret(level.Data, floorData)); - lara.X = location.X; - lara.Y = location.Y; - lara.Z = location.Z; - lara.Room = (short)location.Room; - lara.Angle = (short)(_generator.Next(0, 8) * _rotation); - } + lara.X = location.X; + lara.Y = location.Y; + lara.Z = location.Z; + lara.Room = (short)location.Room; } - else + + short currentAngle = lara.Angle; + do { - short currentAngle = lara.Angle; - do - { - lara.Angle = (short)(_generator.Next(0, 8) * _rotation); - } - while (lara.Angle == currentAngle); + lara.Angle = (short)(_generator.Next(0, 8) * -TRConsts.Angle45); } + while (lara.Angle == currentAngle); } } diff --git a/TRRandomizerCore/Randomizers/TR1R/BaseTR1RRandomizer.cs b/TRRandomizerCore/Randomizers/TR1R/BaseTR1RRandomizer.cs new file mode 100644 index 000000000..b04f72328 --- /dev/null +++ b/TRRandomizerCore/Randomizers/TR1R/BaseTR1RRandomizer.cs @@ -0,0 +1,13 @@ +using TRRandomizerCore.Editors; +using TRRandomizerCore.Processors; + +namespace TRRandomizerCore.Randomizers; + +public abstract class BaseTR1RRandomizer : TR1RLevelProcessor, IRandomizer +{ + public RandomizerSettings Settings { get; internal set; } + + protected Random _generator; + + public abstract void Randomize(int seed); +} diff --git a/TRRandomizerCore/Randomizers/TR1R/TR1RAudioRandomizer.cs b/TRRandomizerCore/Randomizers/TR1R/TR1RAudioRandomizer.cs new file mode 100644 index 000000000..dc0bf1501 --- /dev/null +++ b/TRRandomizerCore/Randomizers/TR1R/TR1RAudioRandomizer.cs @@ -0,0 +1,119 @@ +using System.Numerics; +using TREnvironmentEditor.Model.Types; +using TRFDControl; +using TRFDControl.FDEntryTypes; +using TRFDControl.Utilities; +using TRGE.Core; +using TRLevelControl; +using TRLevelControl.Model; +using TRRandomizerCore.Levels; + +namespace TRRandomizerCore.Randomizers; + +public class TR1RAudioRandomizer : BaseTR1RRandomizer +{ + private const int _defaultSecretTrack = 13; + + private AudioRandomizer _audioRandomizer; + + public override void Randomize(int seed) + { + _generator = new(seed); + + LoadAudioData(); + + foreach (TRRScriptedLevel lvl in Levels) + { + LoadLevelInstance(lvl); + + RandomizeMusicTriggers(_levelInstance); + RandomizeWibble(_levelInstance); + + SaveLevelInstance(); + if (!TriggerProgress()) + { + break; + } + } + } + + private void LoadAudioData() + { + _audioRandomizer = new(ScriptEditor.AudioProvider.GetCategorisedTracks()); + } + + private void RandomizeMusicTriggers(TR1RCombinedLevel level) + { + FDControl floorData = new(); + floorData.ParseFromLevel(level.Data); + + if (Settings.ChangeTriggerTracks) + { + RandomizeFloorTracks(level.Data, floorData); + } + + if (Settings.SeparateSecretTracks) + { + RandomizeSecretTracks(level, floorData); + } + + floorData.WriteToLevel(level.Data); + } + + private void RandomizeFloorTracks(TR1Level level, FDControl floorData) + { + _audioRandomizer.ResetFloorMap(); + foreach (TRRoom room in level.Rooms.Where(r => (r.Flags & EMLockMusicFunction.LockedMusicFlag) == 0)) + { + _audioRandomizer.RandomizeFloorTracks(room.Sectors, floorData, _generator, sectorIndex => + { + return new Vector2 + ( + TRConsts.Step2 + room.Info.X + sectorIndex / room.NumZSectors * TRConsts.Step4, + TRConsts.Step2 + room.Info.Z + sectorIndex % room.NumZSectors * TRConsts.Step4 + ); + }); + } + } + + private void RandomizeSecretTracks(TR1RCombinedLevel level, FDControl floorData) + { + List secretTracks = _audioRandomizer.GetTracks(TRAudioCategory.Secret); + + for (int i = 0; i < level.Script.NumSecrets; i++) + { + TRAudioTrack secretTrack = secretTracks[_generator.Next(0, secretTracks.Count)]; + if (secretTrack.ID == _defaultSecretTrack) + { + continue; + } + + FDActionListItem musicAction = new() + { + TrigAction = FDTrigAction.PlaySoundtrack, + Parameter = secretTrack.ID + }; + + List triggers = FDUtilities.GetSecretTriggers(floorData, i); + foreach (FDTriggerEntry trigger in triggers) + { + FDActionListItem currentMusicAction = trigger.TrigActionList.Find(a => a.TrigAction == FDTrigAction.PlaySoundtrack); + if (currentMusicAction == null) + { + trigger.TrigActionList.Add(musicAction); + } + } + } + } + + private void RandomizeWibble(TR1RCombinedLevel level) + { + if (Settings.RandomizeWibble) + { + foreach (TRSoundDetails details in level.Data.SoundDetails) + { + details.Wibble = true; + } + } + } +} diff --git a/TRRandomizerCore/Randomizers/TR1R/TR1REnvironmentRandomizer.cs b/TRRandomizerCore/Randomizers/TR1R/TR1REnvironmentRandomizer.cs new file mode 100644 index 000000000..0180ce550 --- /dev/null +++ b/TRRandomizerCore/Randomizers/TR1R/TR1REnvironmentRandomizer.cs @@ -0,0 +1,84 @@ +using TREnvironmentEditor; +using TREnvironmentEditor.Helpers; +using TREnvironmentEditor.Model; +using TRGE.Core; +using TRRandomizerCore.Levels; + +namespace TRRandomizerCore.Randomizers; + +public class TR1REnvironmentRandomizer : BaseTR1RRandomizer +{ + public override void Randomize(int seed) + { + _generator ??= new(seed); + + foreach (TRRScriptedLevel lvl in Levels) + { + LoadLevelInstance(lvl); + RandomizeEnvironment(_levelInstance); + + SaveLevelInstance(); + if (!TriggerProgress()) + { + break; + } + } + } + + public void FinalizeEnvironment() + { + foreach (TRRScriptedLevel lvl in Levels) + { + LoadLevelInstance(lvl); + FinalizeEnvironment(_levelInstance); + + SaveLevelInstance(); + if (!TriggerProgress()) + { + break; + } + } + } + + private EMEditorMapping GetMapping(TR1RCombinedLevel level) + => EMEditorMapping.Get(GetResourcePath($@"TR1\Environment\{level.Name}-Environment.json")); + + private void RandomizeEnvironment(TR1RCombinedLevel level) + { + EMEditorMapping mapping = GetMapping(level); + if (mapping != null) + { + ApplyMappingToLevel(level, mapping); + } + } + + private void ApplyMappingToLevel(TR1RCombinedLevel level, EMEditorMapping mapping) + { + EnvironmentPicker picker = new(Settings.HardEnvironmentMode) + { + Generator = _generator + }; + picker.LoadTags(Settings, true); + picker.Options.ExclusionMode = EMExclusionMode.Individual; + + mapping.All.ApplyToLevel(level.Data, picker.Options); + + // No further mods supported yet + } + + private void FinalizeEnvironment(TR1RCombinedLevel level) + { + EMEditorMapping mapping = GetMapping(level); + EnvironmentPicker picker = new(Settings.HardEnvironmentMode); + picker.Options.ExclusionMode = EMExclusionMode.Individual; + picker.ResetTags(true); + + if (mapping != null) + { + foreach (EMConditionalSingleEditorSet mod in mapping.ConditionalAll) + { + mod.ApplyToLevel(level.Data, picker.Options); + } + } + } +} diff --git a/TRRandomizerCore/Randomizers/TR1R/TR1RItemRandomizer.cs b/TRRandomizerCore/Randomizers/TR1R/TR1RItemRandomizer.cs new file mode 100644 index 000000000..058d40697 --- /dev/null +++ b/TRRandomizerCore/Randomizers/TR1R/TR1RItemRandomizer.cs @@ -0,0 +1,264 @@ +using Newtonsoft.Json; +using TRFDControl; +using TRFDControl.Utilities; +using TRGE.Core; +using TRLevelControl.Helpers; +using TRLevelControl.Model; +using TRRandomizerCore.Helpers; +using TRRandomizerCore.Levels; +using TRRandomizerCore.Secrets; +using TRRandomizerCore.Utilities; + +namespace TRRandomizerCore.Randomizers; + +public class TR1RItemRandomizer : BaseTR1RRandomizer +{ + private readonly Dictionary> _excludedLocations, _pistolLocations; + private readonly LocationPicker _picker; + + private TRSecretMapping _secretMapping; + private TR1Entity _unarmedLevelPistols; + + public ItemFactory ItemFactory { get; set; } + + public TR1RItemRandomizer() + { + _excludedLocations = JsonConvert.DeserializeObject>>(ReadResource(@"TR1\Locations\invalid_item_locations.json")); + _pistolLocations = JsonConvert.DeserializeObject>>(ReadResource(@"TR1\Locations\unarmed_locations.json")); + _picker = new(GetResourcePath(@"TR1\Locations\routes.json")); + } + + public override void Randomize(int seed) + { + _generator = new(seed); + + foreach (TRRScriptedLevel lvl in Levels) + { + LoadLevelInstance(lvl); + FindUnarmedLevelPistols(_levelInstance); + + _picker.Initialise(_levelInstance.Name, GetItemLocationPool(_levelInstance, false), Settings, _generator); + _secretMapping = TRSecretMapping.Get(GetResourcePath($@"TR1\SecretMapping\{_levelInstance.Name}-SecretMapping.json")); + + if (Settings.RandomizeItemTypes) + { + RandomizeItemTypes(_levelInstance); + } + + if (Settings.RandomizeItemPositions) + { + RandomizeItemLocations(_levelInstance); + } + + if (Settings.RandoItemDifficulty == ItemDifficulty.OneLimit) + { + EnforceOneLimit(_levelInstance); + } + + SaveLevelInstance(); + if (!TriggerProgress()) + { + break; + } + } + } + + public void RandomizeKeyItems() + { + foreach (TRRScriptedLevel lvl in Levels) + { + LoadLevelInstance(lvl); + RandomizeKeyItems(_levelInstance); + + SaveLevelInstance(); + if (!TriggerProgress()) + { + break; + } + } + } + + private void FindUnarmedLevelPistols(TR1RCombinedLevel level) + { + if (level.Script.RemovesWeapons) + { + _unarmedLevelPistols = level.Data.Entities.Find( + e => TR1TypeUtilities.IsWeaponPickup(e.TypeID) + && _pistolLocations[level.Name].Any(l => l.IsEquivalent(e.GetLocation()))); + } + else + { + _unarmedLevelPistols = null; + } + } + + private List GetItemLocationPool(TR1RCombinedLevel level, bool keyItemMode) + { + List exclusions = new(); + if (_excludedLocations.ContainsKey(level.Name)) + { + exclusions.AddRange(_excludedLocations[level.Name]); + } + + FDControl floorData = new(); + floorData.ParseFromLevel(level.Data); + + foreach (TR1Entity entity in level.Data.Entities) + { + if (!TR1TypeUtilities.CanSharePickupSpace(entity.TypeID)) + { + exclusions.Add(entity.GetFloorLocation(loc => + FDUtilities.GetRoomSector(loc.X, loc.Y, loc.Z, (short)loc.Room, level.Data, floorData))); + } + } + + TR1LocationGenerator generator = new(); + return generator.Generate(level.Data, exclusions, keyItemMode); + } + + public void RandomizeItemTypes(TR1RCombinedLevel level) + { + if (level.IsAssault) + { + return; + } + + List stdItemTypes = TR1TypeUtilities.GetStandardPickupTypes(); + stdItemTypes.Remove(TR1Type.PistolAmmo_S_P); + + bool hasPistols = level.Data.Entities.Any(e => e.TypeID == TR1Type.Pistols_S_P); + + for (int i = 0; i < level.Data.Entities.Count; i++) + { + TR1Entity entity = level.Data.Entities[i]; + TR1Type entityType = entity.TypeID; + if (!TR1TypeUtilities.IsStandardPickupType(entityType) || _secretMapping.RewardEntities.Contains(i)) + { + continue; + } + + if (entity == _unarmedLevelPistols) + { + if (entityType == TR1Type.Pistols_S_P && Settings.GiveUnarmedItems) + { + do + { + entityType = stdItemTypes[_generator.Next(0, stdItemTypes.Count)]; + } + while (!TR1TypeUtilities.IsWeaponPickup(entityType)); + entity.TypeID = entityType; + } + } + else if (TR1TypeUtilities.IsStandardPickupType(entityType)) + { + TR1Type newType = stdItemTypes[_generator.Next(0, stdItemTypes.Count)]; + if (newType == TR1Type.Pistols_S_P && (hasPistols || !level.Script.RemovesWeapons)) + { + do + { + newType = stdItemTypes[_generator.Next(0, stdItemTypes.Count)]; + } + while (!TR1TypeUtilities.IsWeaponPickup(newType) || newType == TR1Type.Pistols_S_P); + } + entity.TypeID = newType; + } + + hasPistols = level.Data.Entities.Any(e => e.TypeID == TR1Type.Pistols_S_P); + } + } + + public void RandomizeItemLocations(TR1RCombinedLevel level) + { + if (level.IsAssault) + { + return; + } + + FDControl floorData = new(); + floorData.ParseFromLevel(level.Data); + + for (int i = 0; i < level.Data.Entities.Count; i++) + { + TR1Entity entity = level.Data.Entities[i]; + if (!TR1TypeUtilities.IsStandardPickupType(entity.TypeID) + || _secretMapping.RewardEntities.Contains(i) + || ItemFactory.IsItemLocked(level.Name, i) + || entity == _unarmedLevelPistols) + { + continue; + } + + _picker.RandomizePickupLocation(entity); + entity.Intensity = 0; + } + } + + public void EnforceOneLimit(TR1RCombinedLevel level) + { + if (level.IsAssault) + { + return; + } + + HashSet uniqueTypes = new(); + if (_unarmedLevelPistols != null) + { + uniqueTypes.Add(_unarmedLevelPistols.TypeID); + } + + for (int i = 0; i < level.Data.Entities.Count; i++) + { + TR1Entity entity = level.Data.Entities[i]; + if (_secretMapping.RewardEntities.Contains(i) || entity == _unarmedLevelPistols) + { + continue; + } + + if ((TR1TypeUtilities.IsStandardPickupType(entity.TypeID) || TR1TypeUtilities.IsCrystalPickup(entity.TypeID)) + && !uniqueTypes.Add(entity.TypeID)) + { + ItemUtilities.HideEntity(entity); + ItemFactory.FreeItem(level.Name, i); + } + } + } + + private void RandomizeKeyItems(TR1RCombinedLevel level) + { + FDControl floorData = new(); + floorData.ParseFromLevel(level.Data); + + _picker.TriggerTestAction = location => LocationUtilities.HasAnyTrigger(location, level.Data, floorData); + _picker.RoomInfos = level.Data.Rooms + .Select(r => new ExtRoomInfo(r.Info, r.NumXSectors, r.NumZSectors)) + .ToList(); + + _picker.Initialise(_levelInstance.Name, GetItemLocationPool(_levelInstance, true), Settings, _generator); + + if (level.Is(TR1LevelNames.TIHOCAN) + && level.Data.Entities[TR1ItemRandomizer.TihocanPierreIndex].TypeID != TR1Type.Pierre) + { + level.Data.Entities.AddRange(TR1ItemRandomizer.TihocanEndItems); + } + + for (int i = 0; i < level.Data.Entities.Count; i++) + { + TR1Entity entity = level.Data.Entities[i]; + if (!IsMovableKeyItem(level, entity) + || ItemFactory.IsItemLocked(level.Name, i)) + { + continue; + } + + bool hasPickupTrigger = LocationUtilities.HasPickupTriger(entity, i, level.Data, floorData); + _picker.RandomizeKeyItemLocation(entity, hasPickupTrigger, + level.Script.OriginalSequence, level.Data.Rooms[entity.Room].Info); + } + } + + private static bool IsMovableKeyItem(TR1RCombinedLevel level, TR1Entity entity) + { + return TR1TypeUtilities.IsKeyItemType(entity.TypeID) + || (level.Is(TR1LevelNames.TIHOCAN) && entity.TypeID == TR1Type.ScionPiece2_S_P); + } +} diff --git a/TRRandomizerCore/Randomizers/TR1R/TR1RStartPositionRandomizer.cs b/TRRandomizerCore/Randomizers/TR1R/TR1RStartPositionRandomizer.cs new file mode 100644 index 000000000..13872bc96 --- /dev/null +++ b/TRRandomizerCore/Randomizers/TR1R/TR1RStartPositionRandomizer.cs @@ -0,0 +1,64 @@ +using Newtonsoft.Json; +using TRFDControl; +using TRGE.Core; +using TRLevelControl; +using TRLevelControl.Model; +using TRRandomizerCore.Helpers; +using TRRandomizerCore.Levels; +using TRRandomizerCore.Utilities; + +namespace TRRandomizerCore.Randomizers; + +public class TR1RStartPositionRandomizer : BaseTR1RRandomizer +{ + private Dictionary> _startLocations; + + public override void Randomize(int seed) + { + _generator = new Random(seed); + _startLocations = JsonConvert.DeserializeObject>>(ReadResource(@"TR1\Locations\start_positions.json")); + + foreach (TRRScriptedLevel lvl in Levels) + { + LoadLevelInstance(lvl); + RandomizeStartPosition(_levelInstance); + SaveLevelInstance(); + + if (!TriggerProgress()) + { + break; + } + } + } + + private void RandomizeStartPosition(TR1RCombinedLevel level) + { + TR1Entity lara = level.Data.Entities.Find(e => e.TypeID == TR1Type.Lara); + + FDControl floorData = new(); + floorData.ParseFromLevel(level.Data); + + if (!Settings.RotateStartPositionOnly && _startLocations.ContainsKey(level.Name)) + { + List locations = _startLocations[level.Name]; + Location location; + do + { + location = locations[_generator.Next(0, locations.Count)]; + } + while (!location.Validated || location.ContainsSecret(level.Data, floorData)); + + lara.X = location.X; + lara.Y = location.Y; + lara.Z = location.Z; + lara.Room = (short)location.Room; + } + + short currentAngle = lara.Angle; + do + { + lara.Angle = (short)(_generator.Next(0, 8) * -TRConsts.Angle45); + } + while (lara.Angle == currentAngle); + } +} diff --git a/TRRandomizerCore/Randomizers/TR2/TR2StartPositionRandomizer.cs b/TRRandomizerCore/Randomizers/TR2/TR2StartPositionRandomizer.cs index 39a276fce..b15dd95bc 100644 --- a/TRRandomizerCore/Randomizers/TR2/TR2StartPositionRandomizer.cs +++ b/TRRandomizerCore/Randomizers/TR2/TR2StartPositionRandomizer.cs @@ -4,6 +4,7 @@ using TRGE.Core; using TRLevelControl.Helpers; using TRLevelControl.Model; +using TRLevelControl; namespace TRRandomizerCore.Randomizers; @@ -19,9 +20,7 @@ public override void Randomize(int seed) foreach (TR2ScriptedLevel lvl in Levels) { LoadLevelInstance(lvl); - RandomizeStartPosition(_levelInstance); - SaveLevelInstance(); if (!TriggerProgress()) @@ -40,7 +39,7 @@ private void RandomizeStartPosition(TR2CombinedLevel level) return; } - TR2Entity lara = level.Data.Entities.Find(e => e.TypeID == (short)TR2Type.Lara); + TR2Entity lara = level.Data.Entities.Find(e => e.TypeID == TR2Type.Lara); // We only change position if there is not a secret in the same room as Lara, This is just in case it ends up // where she starts on a slope (GW or Opera House for example), as its X,Y,Z values may not be identical to Lara's, @@ -57,45 +56,18 @@ private void RandomizeStartPosition(TR2CombinedLevel level) if (!Settings.RotateStartPositionOnly && _startLocations.ContainsKey(level.Name)) { List locations = _startLocations[level.Name]; - if (Settings.DevelopmentMode) - { - foreach (Location loc in locations) - { - level.Data.Entities.Add(new() - { - TypeID = (short)TR2Type.Lara, - Room = Convert.ToInt16(loc.Room), - X = loc.X, - Y = loc.Y, - Z = loc.Z, - Angle = 0, - Intensity1 = -1, - Intensity2 = -1, - Flags = 0 - }); - } - } - else - { - Location location = locations[_generator.Next(0, locations.Count)]; - lara.Room = (short)location.Room; - lara.X = location.X; - lara.Y = location.Y; - lara.Z = location.Z; - lara.Angle = location.Angle; - } + Location location = locations[_generator.Next(0, locations.Count)]; + lara.Room = (short)location.Room; + lara.X = location.X; + lara.Y = location.Y; + lara.Z = location.Z; + lara.Angle = location.Angle; } - RotateLara(lara, level); - } - - private void RotateLara(TR2Entity lara, TR2CombinedLevel level) - { short currentAngle = lara.Angle; do { - int degrees = 45 * _generator.Next(0, 8); - lara.Angle = (short)(degrees * 16384 / -90); + lara.Angle = (short)(_generator.Next(0, 8) * -TRConsts.Angle45); } while (lara.Angle == currentAngle); diff --git a/TRRandomizerCore/Randomizers/TR2R/BaseTR2RRandomizer.cs b/TRRandomizerCore/Randomizers/TR2R/BaseTR2RRandomizer.cs new file mode 100644 index 000000000..ca2d48525 --- /dev/null +++ b/TRRandomizerCore/Randomizers/TR2R/BaseTR2RRandomizer.cs @@ -0,0 +1,13 @@ +using TRRandomizerCore.Editors; +using TRRandomizerCore.Processors; + +namespace TRRandomizerCore.Randomizers; + +public abstract class BaseTR2RRandomizer : TR2RLevelProcessor, IRandomizer +{ + public RandomizerSettings Settings { get; internal set; } + + protected Random _generator; + + public abstract void Randomize(int seed); +} diff --git a/TRRandomizerCore/Randomizers/TR2R/TR2RAudioRandomizer.cs b/TRRandomizerCore/Randomizers/TR2R/TR2RAudioRandomizer.cs new file mode 100644 index 000000000..ae13be06b --- /dev/null +++ b/TRRandomizerCore/Randomizers/TR2R/TR2RAudioRandomizer.cs @@ -0,0 +1,290 @@ +using Newtonsoft.Json; +using System.Numerics; +using TRFDControl; +using TRFDControl.FDEntryTypes; +using TRFDControl.Utilities; +using TRGE.Core; +using TRLevelControl; +using TRLevelControl.Helpers; +using TRLevelControl.Model; +using TRModelTransporter.Handlers; +using TRRandomizerCore.Helpers; +using TRRandomizerCore.Levels; +using TRRandomizerCore.SFX; + +namespace TRRandomizerCore.Randomizers; + +public class TR2RAudioRandomizer : BaseTR2RRandomizer +{ + private const int _maxSample = 407; + + private AudioRandomizer _audioRandomizer; + + private List> _soundEffects; + private List _sfxCategories; + private List _uncontrolledLevels; + + public override void Randomize(int seed) + { + _generator = new Random(seed); + + LoadAudioData(); + ChooseUncontrolledLevels(); + + foreach (TRRScriptedLevel lvl in Levels) + { + LoadLevelInstance(lvl); + + RandomizeMusicTriggers(_levelInstance); + RandomizeSoundEffects(_levelInstance); + RandomizeWibble(_levelInstance); + + SaveLevelInstance(); + if (!TriggerProgress()) + { + break; + } + } + } + + private void ChooseUncontrolledLevels() + { + TRRScriptedLevel assaultCourse = Levels.Find(l => l.Is(TR2LevelNames.ASSAULT)); + HashSet exlusions = new() { assaultCourse }; + + _uncontrolledLevels = Levels.RandomSelection(_generator, (int)Settings.UncontrolledSFXCount, exclusions: exlusions); + if (Settings.AssaultCourseWireframe) + { + _uncontrolledLevels.Add(assaultCourse); + } + } + + public bool IsUncontrolledLevel(TRRScriptedLevel level) + { + return _uncontrolledLevels.Contains(level); + } + + private void RandomizeMusicTriggers(TR2RCombinedLevel level) + { + FDControl floorData = new(); + floorData.ParseFromLevel(level.Data); + + if (Settings.ChangeTriggerTracks) + { + RandomizeFloorTracks(level.Data, floorData); + } + + if (Settings.SeparateSecretTracks) + { + RandomizeSecretTracks(level.Data, floorData); + } + + floorData.WriteToLevel(level.Data); + } + + private void RandomizeFloorTracks(TR2Level level, FDControl floorData) + { + _audioRandomizer.ResetFloorMap(); + foreach (TR2Room room in level.Rooms) + { + _audioRandomizer.RandomizeFloorTracks(room.SectorList, floorData, _generator, sectorIndex => + { + return new Vector2 + ( + TRConsts.Step2 + room.Info.X + sectorIndex / room.NumZSectors * TRConsts.Step4, + TRConsts.Step2 + room.Info.Z + sectorIndex % room.NumZSectors * TRConsts.Step4 + ); + }); + } + } + + private void RandomizeSecretTracks(TR2Level level, FDControl floorData) + { + List secretTracks = _audioRandomizer.GetTracks(TRAudioCategory.Secret); + Dictionary secrets = GetSecretItems(level); + foreach (int entityIndex in secrets.Keys) + { + TR2Entity secret = secrets[entityIndex]; + TRRoomSector sector = FDUtilities.GetRoomSector(secret.X, secret.Y, secret.Z, secret.Room, level, floorData); + if (sector.FDIndex == 0) + { + floorData.CreateFloorData(sector); + } + + List entries = floorData.Entries[sector.FDIndex]; + FDTriggerEntry existingTriggerEntry = entries.Find(e => e is FDTriggerEntry) as FDTriggerEntry; + bool existingEntityPickup = false; + if (existingTriggerEntry != null) + { + if (existingTriggerEntry.TrigType == FDTrigType.Pickup && existingTriggerEntry.TrigActionList[0].Parameter == entityIndex) + { + existingEntityPickup = true; + } + else + { + continue; + } + } + + FDActionListItem musicAction = new() + { + TrigAction = FDTrigAction.PlaySoundtrack, + Parameter = secretTracks[_generator.Next(0, secretTracks.Count)].ID + }; + + if (existingEntityPickup) + { + existingTriggerEntry.TrigActionList.Add(musicAction); + } + else + { + entries.Add(new FDTriggerEntry + { + Setup = new FDSetup { Value = 1028 }, + TrigSetup = new FDTrigSetup { Value = 15872 }, + TrigActionList = new List + { + new() { + TrigAction = FDTrigAction.Object, + Parameter = (ushort)entityIndex + }, + musicAction + } + }); + } + } + } + + private static Dictionary GetSecretItems(TR2Level level) + { + Dictionary entities = new(); + for (int i = 0; i < level.Entities.Count; i++) + { + if (TR2TypeUtilities.IsSecretType(level.Entities[i].TypeID)) + { + entities[i] = level.Entities[i]; + } + } + + return entities; + } + + private void LoadAudioData() + { + _audioRandomizer = new AudioRandomizer(ScriptEditor.AudioProvider.GetCategorisedTracks()); + _sfxCategories = AudioRandomizer.GetSFXCategories(Settings); + if (_sfxCategories.Count > 0) + { + _soundEffects = JsonConvert.DeserializeObject>>(ReadResource(@"TR2\Audio\sfx.json")); + } + } + + private void RandomizeSoundEffects(TR2RCombinedLevel level) + { + if (_sfxCategories.Count == 0) + { + return; + } + + if (IsUncontrolledLevel(level.Script)) + { + HashSet indices = new(); + while (indices.Count < level.Data.NumSampleIndices) + { + indices.Add((uint)_generator.Next(0, _maxSample + 1)); + } + level.Data.SampleIndices = indices.ToArray(); + } + else + { + for (int internalIndex = 0; internalIndex < level.Data.SoundMap.Length; internalIndex++) + { + TRSFXDefinition definition = _soundEffects.Find(sfx => sfx.InternalIndex == internalIndex); + if (level.Data.SoundMap[internalIndex] == -1 || definition == null || definition.Creature == TRSFXCreatureCategory.Lara || !_sfxCategories.Contains(definition.PrimaryCategory)) + { + continue; + } + + Predicate> pred; + if (Settings.LinkCreatureSFX && definition.Creature > TRSFXCreatureCategory.Lara) + { + pred = sfx => + { + return sfx.Categories.Contains(definition.PrimaryCategory) && + sfx != definition && + ( + sfx.Creature == definition.Creature || + (sfx.Creature == TRSFXCreatureCategory.Lara && definition.Creature == TRSFXCreatureCategory.Human) + ); + }; + } + else + { + pred = sfx => sfx.Categories.Contains(definition.PrimaryCategory) && sfx != definition; + } + + List> otherDefinitions = _soundEffects.FindAll(pred); + if (otherDefinitions.Count > 0) + { + TRSFXDefinition nextDefinition = otherDefinitions[_generator.Next(0, otherDefinitions.Count)]; + short soundDetailsIndex = ImportSoundEffect(level.Data, nextDefinition); + if (soundDetailsIndex != -1) + { + level.Data.SoundMap[internalIndex] = soundDetailsIndex; + } + } + } + } + + SoundUtilities.ResortSoundIndices(level.Data); + } + + private static short ImportSoundEffect(TR2Level level, TRSFXDefinition definition) + { + if (definition.SampleIndices.Count == 0) + { + return -1; + } + + List levelSamples = level.SampleIndices.ToList(); + List levelSoundDetails = level.SoundDetails.ToList(); + + uint minSample = definition.SampleIndices.Min(); + if (levelSamples.Contains(minSample)) + { + return (short)levelSoundDetails.FindIndex(d => levelSamples[d.Sample] == minSample); + } + + ushort newSampleIndex = (ushort)levelSamples.Count; + List sortedSamples = new(definition.SampleIndices); + sortedSamples.Sort(); + levelSamples.AddRange(sortedSamples); + + level.SampleIndices = levelSamples.ToArray(); + level.NumSampleIndices = (uint)levelSamples.Count; + + levelSoundDetails.Add(new TRSoundDetails + { + Chance = definition.Details.Chance, + Characteristics = definition.Details.Characteristics, + Sample = newSampleIndex, + Volume = definition.Details.Volume + }); + + level.SoundDetails = levelSoundDetails.ToArray(); + level.NumSoundDetails++; + + return (short)(level.NumSoundDetails - 1); + } + + private void RandomizeWibble(TR2RCombinedLevel level) + { + if (Settings.RandomizeWibble) + { + foreach (TRSoundDetails details in level.Data.SoundDetails) + { + details.Wibble = true; + } + } + } +} diff --git a/TRRandomizerCore/Randomizers/TR2R/TR2REnvironmentRandomizer.cs b/TRRandomizerCore/Randomizers/TR2R/TR2REnvironmentRandomizer.cs new file mode 100644 index 000000000..6e5d1c650 --- /dev/null +++ b/TRRandomizerCore/Randomizers/TR2R/TR2REnvironmentRandomizer.cs @@ -0,0 +1,84 @@ +using TREnvironmentEditor; +using TREnvironmentEditor.Helpers; +using TREnvironmentEditor.Model; +using TRGE.Core; +using TRRandomizerCore.Levels; + +namespace TRRandomizerCore.Randomizers; + +public class TR2REnvironmentRandomizer : BaseTR2RRandomizer +{ + public override void Randomize(int seed) + { + _generator ??= new(seed); + + foreach (TRRScriptedLevel lvl in Levels) + { + LoadLevelInstance(lvl); + RandomizeEnvironment(_levelInstance); + + SaveLevelInstance(); + if (!TriggerProgress()) + { + break; + } + } + } + + public void FinalizeEnvironment() + { + foreach (TRRScriptedLevel lvl in Levels) + { + LoadLevelInstance(lvl); + FinalizeEnvironment(_levelInstance); + + SaveLevelInstance(); + if (!TriggerProgress()) + { + break; + } + } + } + + private EMEditorMapping GetMapping(TR2RCombinedLevel level) + => EMEditorMapping.Get(GetResourcePath($@"TR2\Environment\{level.Name}-Environment.json")); + + private void RandomizeEnvironment(TR2RCombinedLevel level) + { + EMEditorMapping mapping = GetMapping(level); + if (mapping != null) + { + ApplyMappingToLevel(level, mapping); + } + } + + private void ApplyMappingToLevel(TR2RCombinedLevel level, EMEditorMapping mapping) + { + EnvironmentPicker picker = new(Settings.HardEnvironmentMode) + { + Generator = _generator + }; + picker.LoadTags(Settings, true); + picker.Options.ExclusionMode = EMExclusionMode.Individual; + + mapping.All.ApplyToLevel(level.Data, picker.Options); + + // No further mods supported yet + } + + private void FinalizeEnvironment(TR2RCombinedLevel level) + { + EMEditorMapping mapping = GetMapping(level); + EnvironmentPicker picker = new(Settings.HardEnvironmentMode); + picker.Options.ExclusionMode = EMExclusionMode.Individual; + picker.ResetTags(true); + + if (mapping != null) + { + foreach (EMConditionalSingleEditorSet mod in mapping.ConditionalAll) + { + mod.ApplyToLevel(level.Data, picker.Options); + } + } + } +} diff --git a/TRRandomizerCore/Randomizers/TR2R/TR2RItemRandomizer.cs b/TRRandomizerCore/Randomizers/TR2R/TR2RItemRandomizer.cs new file mode 100644 index 000000000..48e66ec16 --- /dev/null +++ b/TRRandomizerCore/Randomizers/TR2R/TR2RItemRandomizer.cs @@ -0,0 +1,229 @@ +using Newtonsoft.Json; +using TRFDControl; +using TRFDControl.Utilities; +using TRGE.Core; +using TRLevelControl.Helpers; +using TRLevelControl.Model; +using TRRandomizerCore.Helpers; +using TRRandomizerCore.Levels; +using TRRandomizerCore.Utilities; + +namespace TRRandomizerCore.Randomizers; + +public class TR2RItemRandomizer : BaseTR2RRandomizer +{ + private readonly Dictionary> _excludedLocations, _pistolLocations; + private readonly LocationPicker _picker; + + private TR2Entity _unarmedLevelPistols; + + public ItemFactory ItemFactory { get; set; } + + public TR2RItemRandomizer() + { + _excludedLocations = JsonConvert.DeserializeObject>>(ReadResource(@"TR2\Locations\invalid_item_locations.json")); + _pistolLocations = JsonConvert.DeserializeObject>>(ReadResource(@"TR2\Locations\unarmed_locations.json")); + _picker = new(GetResourcePath(@"TR2\Locations\routes.json")); + } + + public override void Randomize(int seed) + { + _generator = new(seed); + + foreach (TRRScriptedLevel lvl in Levels) + { + LoadLevelInstance(lvl); + FindUnarmedLevelPistols(_levelInstance); + + _picker.Initialise(_levelInstance.Name, GetItemLocationPool(_levelInstance, false), Settings, _generator); + + if (Settings.RandomizeItemTypes) + { + RandomizeItemTypes(_levelInstance); + } + + if (Settings.RandomizeItemPositions) + { + RandomizeItemLocations(_levelInstance); + } + + if (Settings.RandoItemDifficulty == ItemDifficulty.OneLimit) + { + EnforceOneLimit(_levelInstance); + } + + SaveLevelInstance(); + if (!TriggerProgress()) + { + break; + } + } + } + + public void RandomizeKeyItems() + { + foreach (TRRScriptedLevel lvl in Levels) + { + LoadLevelInstance(lvl); + RandomizeKeyItems(_levelInstance); + + SaveLevelInstance(); + if (!TriggerProgress()) + { + break; + } + } + } + + private void FindUnarmedLevelPistols(TR2RCombinedLevel level) + { + if (level.Script.RemovesWeapons) + { + _unarmedLevelPistols = level.Data.Entities.Find( + e => (TR2TypeUtilities.IsGunType(e.TypeID) || e.TypeID == TR2Type.Pistols_S_P) + && _pistolLocations[level.Name].Any(l => l.IsEquivalent(e.GetLocation()))); + } + else + { + _unarmedLevelPistols = null; + } + } + + private List GetItemLocationPool(TR2RCombinedLevel level, bool keyItemMode) + { + List exclusions = new(); + if (_excludedLocations.ContainsKey(level.Name)) + { + exclusions.AddRange(_excludedLocations[level.Name]); + } + + FDControl floorData = new(); + floorData.ParseFromLevel(level.Data); + + foreach (TR2Entity entity in level.Data.Entities) + { + if (!TR2TypeUtilities.CanSharePickupSpace(entity.TypeID)) + { + exclusions.Add(entity.GetFloorLocation(loc => + FDUtilities.GetRoomSector(loc.X, loc.Y, loc.Z, (short)loc.Room, level.Data, floorData))); + } + } + + TR2LocationGenerator generator = new(); + return generator.Generate(level.Data, exclusions, keyItemMode); + } + + private void RandomizeItemTypes(TR2RCombinedLevel level) + { + if (level.IsAssault + || (level.Is(TR2LevelNames.HOME) && (level.Script.RemovesWeapons || level.Script.RemovesAmmo))) + { + return; + } + + List stdItemTypes = TR2TypeUtilities.GetStandardPickupTypes(); + IEnumerable pickups = level.Data.Entities.Where(e => e != _unarmedLevelPistols && stdItemTypes.Contains(e.TypeID)); + + foreach (TR2Entity entity in pickups) + { + entity.TypeID = stdItemTypes[_generator.Next(0, stdItemTypes.Count)]; + } + } + + public void RandomizeItemLocations(TR2RCombinedLevel level) + { + if (level.Is(TR2LevelNames.HOME) && (level.Script.RemovesWeapons || level.Script.RemovesAmmo)) + { + return; + } + + for (int i = 0; i < level.Data.Entities.Count; i++) + { + TR2Entity entity = level.Data.Entities[i]; + if (!TR2TypeUtilities.IsStandardPickupType(entity.TypeID) + || ItemFactory.IsItemLocked(level.Name, i) + || entity == _unarmedLevelPistols) + { + continue; + } + + _picker.RandomizePickupLocation(entity); + entity.Intensity1 = entity.Intensity2 = -1; + } + } + + private void EnforceOneLimit(TR2RCombinedLevel level) + { + HashSet uniqueTypes = new(); + + for (int i = 0; i < level.Data.Entities.Count; i++) + { + TR2Entity entity = level.Data.Entities[i]; + if (TR2TypeUtilities.IsStandardPickupType(entity.TypeID) + && !uniqueTypes.Add(entity.TypeID)) + { + ItemUtilities.HideEntity(entity); + ItemFactory.FreeItem(level.Name, i); + } + } + } + + private void RandomizeKeyItems(TR2RCombinedLevel level) + { + FDControl floorData = new(); + floorData.ParseFromLevel(level.Data); + + _picker.TriggerTestAction = location => LocationUtilities.HasAnyTrigger(location, level.Data, floorData); + _picker.KeyItemTestAction = (location, hasPickupTrigger) => TestKeyItemLocation(location, hasPickupTrigger, level); + _picker.RoomInfos = level.Data.Rooms + .Select(r => new ExtRoomInfo(r.Info, r.NumXSectors, r.NumZSectors)) + .ToList(); + + _picker.Initialise(_levelInstance.Name, GetItemLocationPool(_levelInstance, true), Settings, _generator); + + for (int i = 0; i < level.Data.Entities.Count; i++) + { + TR2Entity entity = level.Data.Entities[i]; + if (!TR2TypeUtilities.IsKeyItemType(entity.TypeID) + || ItemFactory.IsItemLocked(level.Name, i)) + { + continue; + } + + // In OG, all puzzle2 items are switched to puzzle3 to allow the dragon to be imported everywhere. + // This means routes have been defined to look for these types, so we need to flip them temporarily. + // See TR2ModelAdjuster and LocationPicker.GetKeyItemID. + bool flipPuzzle2 = entity.TypeID == TR2Type.Puzzle2_S_P; + if (flipPuzzle2) + { + entity.TypeID = TR2Type.Puzzle3_S_P; + } + + _picker.RandomizeKeyItemLocation( + entity, LocationUtilities.HasPickupTriger(entity, i, level.Data, floorData), + level.Script.OriginalSequence, level.Data.Rooms[entity.Room].Info); + entity.Intensity1 = entity.Intensity2 = -1; + + if (flipPuzzle2) + { + entity.TypeID = TR2Type.Puzzle2_S_P; + } + } + } + + private bool TestKeyItemLocation(Location location, bool hasPickupTrigger, TR2RCombinedLevel level) + { + // Make sure if we're placing on the same tile as an enemy, that the + // enemy can drop the item. + TR2Entity enemy = level.Data.Entities + .FindAll(e => TR2TypeUtilities.IsEnemyType(e.TypeID)) + .Find(e => e.GetLocation().IsEquivalent(location)); + + return enemy == null || (Settings.AllowEnemyKeyDrops && !hasPickupTrigger && TR2TypeUtilities.CanDropPickups + ( + TR2TypeUtilities.GetAliasForLevel(level.Name, enemy.TypeID), + Settings.RandomizeEnemies && !Settings.ProtectMonks, + Settings.RandomizeEnemies && Settings.UnconditionalChickens + )); + } +} diff --git a/TRRandomizerCore/Randomizers/TR2R/TR2RStartPositionRandomizer.cs b/TRRandomizerCore/Randomizers/TR2R/TR2RStartPositionRandomizer.cs new file mode 100644 index 000000000..ce60423db --- /dev/null +++ b/TRRandomizerCore/Randomizers/TR2R/TR2RStartPositionRandomizer.cs @@ -0,0 +1,72 @@ +using Newtonsoft.Json; +using TRRandomizerCore.Helpers; +using TRRandomizerCore.Levels; +using TRGE.Core; +using TRLevelControl.Helpers; +using TRLevelControl.Model; +using TRLevelControl; + +namespace TRRandomizerCore.Randomizers; + +public class TR2RStartPositionRandomizer : BaseTR2RRandomizer +{ + private Dictionary> _startLocations; + + public override void Randomize(int seed) + { + _generator = new(seed); + _startLocations = JsonConvert.DeserializeObject>>(ReadResource(@"TR2\Locations\start_positions.json")); + + foreach (TRRScriptedLevel lvl in Levels) + { + LoadLevelInstance(lvl); + RandomizeStartPosition(_levelInstance); + SaveLevelInstance(); + + if (!TriggerProgress()) + { + break; + } + } + } + + private void RandomizeStartPosition(TR2RCombinedLevel level) + { + if (level.Script.HasStartAnimation) + { + return; + } + + TR2Entity lara = level.Data.Entities.Find(e => e.TypeID == TR2Type.Lara); + + if (level.Data.Entities.Find(e => e.Room == lara.Room + && TR2TypeUtilities.IsSecretType(e.TypeID)) != null) + { + return; + } + + if (!Settings.RotateStartPositionOnly && _startLocations.ContainsKey(level.Name)) + { + List locations = _startLocations[level.Name]; + Location location = locations[_generator.Next(0, locations.Count)]; + lara.Room = (short)location.Room; + lara.X = location.X; + lara.Y = location.Y; + lara.Z = location.Z; + lara.Angle = location.Angle; + } + + short currentAngle = lara.Angle; + do + { + lara.Angle = (short)(_generator.Next(0, 8) * -TRConsts.Angle45); + } + while (lara.Angle == currentAngle); + + if (level.Is(TR2LevelNames.BARTOLI)) + { + TR2Entity boat = level.Data.Entities.Find(e => e.TypeID == TR2Type.Boat); + boat.Angle = lara.Angle; + } + } +} diff --git a/TRRandomizerCore/Randomizers/TR3/TR3StartPositionRandomizer.cs b/TRRandomizerCore/Randomizers/TR3/TR3StartPositionRandomizer.cs index 7c32d31b7..0ecf4d18d 100644 --- a/TRRandomizerCore/Randomizers/TR3/TR3StartPositionRandomizer.cs +++ b/TRRandomizerCore/Randomizers/TR3/TR3StartPositionRandomizer.cs @@ -1,7 +1,7 @@ using Newtonsoft.Json; -using TREnvironmentEditor.Helpers; using TREnvironmentEditor.Model.Types; using TRGE.Core; +using TRLevelControl; using TRLevelControl.Model; using TRRandomizerCore.Helpers; using TRRandomizerCore.Levels; @@ -10,20 +10,17 @@ namespace TRRandomizerCore.Randomizers; public class TR3StartPositionRandomizer : BaseTR3Randomizer { - private static readonly short _rotation = -8192; private Dictionary> _startLocations; public override void Randomize(int seed) { - _generator = new Random(seed); + _generator = new(seed); _startLocations = JsonConvert.DeserializeObject>>(ReadResource(@"TR3\Locations\start_positions.json")); foreach (TR3ScriptedLevel lvl in Levels) { LoadLevelInstance(lvl); - RandomizeStartPosition(_levelInstance); - SaveLevelInstance(); if (!TriggerProgress()) @@ -35,74 +32,50 @@ public override void Randomize(int seed) private void RandomizeStartPosition(TR3CombinedLevel level) { - TR3Entity lara = level.Data.Entities.Find(e => e.TypeID == (short)TR3Type.Lara); + TR3Entity lara = level.Data.Entities.Find(e => e.TypeID == TR3Type.Lara); // If we haven't defined anything for a level, Lara will just be rotated. This is most likely where there are // triggers just after Lara's starting spot, so we just skip them here. if (!Settings.RotateStartPositionOnly && _startLocations.ContainsKey(level.Name)) { List locations = _startLocations[level.Name]; - if (Settings.DevelopmentMode) + Location location; + do { - foreach (Location loc in locations) - { - level.Data.Entities.Add(new() - { - TypeID = (short)TR3Type.Lara, - X = loc.X, - Y = loc.Y, - Z = loc.Z, - Room = (short)loc.Room, - Angle = lara.Angle, - Intensity1 = -1, - Intensity2 = -1, - Flags = 0 - }); - } + location = locations[_generator.Next(0, locations.Count)]; } - else + while (!location.Validated); + + // If there are any triggers below Lara, move them + new EMMoveTriggerFunction { - Location location; - do + BaseLocation = new() { - location = locations[_generator.Next(0, locations.Count)]; - } - while (!location.Validated); - - // If there are any triggers below Lara, move them - new EMMoveTriggerFunction + X = lara.X, + Y = lara.Y, + Z = lara.Z, + Room = lara.Room + }, + NewLocation = new() { - BaseLocation = new EMLocation - { - X = lara.X, - Y = lara.Y, - Z = lara.Z, - Room = lara.Room - }, - NewLocation = new EMLocation - { - X = location.X, - Y = location.Y, - Z = location.Z, - Room = (short)location.Room - } - }.ApplyToLevel(level.Data); + X = location.X, + Y = location.Y, + Z = location.Z, + Room = (short)location.Room + } + }.ApplyToLevel(level.Data); - lara.X = location.X; - lara.Y = location.Y; - lara.Z = location.Z; - lara.Room = (short)location.Room; - lara.Angle = (short)(_generator.Next(0, 8) * _rotation); - } + lara.X = location.X; + lara.Y = location.Y; + lara.Z = location.Z; + lara.Room = (short)location.Room; } - else + + short currentAngle = lara.Angle; + do { - short currentAngle = lara.Angle; - do - { - lara.Angle = (short)(_generator.Next(0, 8) * _rotation); - } - while (lara.Angle == currentAngle); + lara.Angle = (short)(_generator.Next(0, 8) * -TRConsts.Angle45); } + while (lara.Angle == currentAngle); } } diff --git a/TRRandomizerCore/Randomizers/TR3R/BaseTR3RRandomizer.cs b/TRRandomizerCore/Randomizers/TR3R/BaseTR3RRandomizer.cs new file mode 100644 index 000000000..9149ddc94 --- /dev/null +++ b/TRRandomizerCore/Randomizers/TR3R/BaseTR3RRandomizer.cs @@ -0,0 +1,13 @@ +using TRRandomizerCore.Editors; +using TRRandomizerCore.Processors; + +namespace TRRandomizerCore.Randomizers; + +public abstract class BaseTR3RRandomizer : TR3RLevelProcessor, IRandomizer +{ + public RandomizerSettings Settings { get; internal set; } + + protected Random _generator; + + public abstract void Randomize(int seed); +} diff --git a/TRRandomizerCore/Randomizers/TR3R/TR3RAudioRandomizer.cs b/TRRandomizerCore/Randomizers/TR3R/TR3RAudioRandomizer.cs new file mode 100644 index 000000000..475fc2951 --- /dev/null +++ b/TRRandomizerCore/Randomizers/TR3R/TR3RAudioRandomizer.cs @@ -0,0 +1,252 @@ +using Newtonsoft.Json; +using System.Numerics; +using TRFDControl; +using TRFDControl.FDEntryTypes; +using TRFDControl.Utilities; +using TRGE.Core; +using TRLevelControl; +using TRLevelControl.Helpers; +using TRLevelControl.Model; +using TRModelTransporter.Handlers; +using TRRandomizerCore.Helpers; +using TRRandomizerCore.Levels; +using TRRandomizerCore.SFX; + +namespace TRRandomizerCore.Randomizers; + +public class TR3RAudioRandomizer : BaseTR3RRandomizer +{ + private const int _maxSample = 413; + private const int _defaultSecretTrack = 122; + + private AudioRandomizer _audioRandomizer; + + private List> _soundEffects; + private List _sfxCategories; + private List _uncontrolledLevels; + + public override void Randomize(int seed) + { + _generator = new(seed); + + LoadAudioData(); + ChooseUncontrolledLevels(); + + foreach (TRRScriptedLevel lvl in Levels) + { + LoadLevelInstance(lvl); + + RandomizeMusicTriggers(_levelInstance); + RandomizeSoundEffects(_levelInstance); + RandomizeWibble(_levelInstance); + + SaveLevelInstance(); + if (!TriggerProgress()) + { + break; + } + } + } + + private void ChooseUncontrolledLevels() + { + TRRScriptedLevel assaultCourse = Levels.Find(l => l.Is(TR3LevelNames.ASSAULT)); + HashSet exlusions = new () { assaultCourse }; + + _uncontrolledLevels = Levels.RandomSelection(_generator, (int)Settings.UncontrolledSFXCount, exclusions: exlusions); + if (Settings.AssaultCourseWireframe) + { + _uncontrolledLevels.Add(assaultCourse); + } + } + + public bool IsUncontrolledLevel(TRRScriptedLevel level) + { + return _uncontrolledLevels.Contains(level); + } + + private void RandomizeMusicTriggers(TR3RCombinedLevel level) + { + FDControl floorData = new(); + floorData.ParseFromLevel(level.Data); + + if (Settings.ChangeTriggerTracks) + { + RandomizeFloorTracks(level.Data, floorData); + } + + if (Settings.SeparateSecretTracks) + { + RandomizeSecretTracks(level, floorData); + } + + floorData.WriteToLevel(level.Data); + } + + private void RandomizeFloorTracks(TR3Level level, FDControl floorData) + { + _audioRandomizer.ResetFloorMap(); + foreach (TR3Room room in level.Rooms) + { + _audioRandomizer.RandomizeFloorTracks(room.Sectors, floorData, _generator, sectorIndex => + { + return new Vector2 + ( + TRConsts.Step2 + room.Info.X + sectorIndex / room.NumZSectors * TRConsts.Step4, + TRConsts.Step2 + room.Info.Z + sectorIndex % room.NumZSectors * TRConsts.Step4 + ); + }); + } + } + + private void RandomizeSecretTracks(TR3RCombinedLevel level, FDControl floorData) + { + List secretTracks = _audioRandomizer.GetTracks(TRAudioCategory.Secret); + + for (int i = 0; i < level.Script.NumSecrets; i++) + { + TRAudioTrack secretTrack = secretTracks[_generator.Next(0, secretTracks.Count)]; + if (secretTrack.ID == _defaultSecretTrack) + { + continue; + } + + FDActionListItem musicAction = new() + { + TrigAction = FDTrigAction.PlaySoundtrack, + Parameter = secretTrack.ID + }; + + List triggers = FDUtilities.GetSecretTriggers(floorData, i); + foreach (FDTriggerEntry trigger in triggers) + { + FDActionListItem currentMusicAction = trigger.TrigActionList.Find(a => a.TrigAction == FDTrigAction.PlaySoundtrack); + if (currentMusicAction == null) + { + trigger.TrigActionList.Add(musicAction); + } + } + } + } + + private void LoadAudioData() + { + _audioRandomizer = new AudioRandomizer(ScriptEditor.AudioProvider.GetCategorisedTracks()); + _sfxCategories = AudioRandomizer.GetSFXCategories(Settings); + if (_sfxCategories.Count > 0) + { + _soundEffects = JsonConvert.DeserializeObject>>(ReadResource(@"TR3\Audio\sfx.json")); + } + } + + private void RandomizeSoundEffects(TR3RCombinedLevel level) + { + if (_sfxCategories.Count == 0) + { + return; + } + + if (IsUncontrolledLevel(level.Script)) + { + HashSet indices = new(); + while (indices.Count < level.Data.NumSampleIndices) + { + indices.Add((uint)_generator.Next(0, _maxSample + 1)); + } + level.Data.SampleIndices = indices.ToArray(); + } + else + { + for (int internalIndex = 0; internalIndex < level.Data.SoundMap.Length; internalIndex++) + { + TRSFXDefinition definition = _soundEffects.Find(sfx => sfx.InternalIndex == internalIndex); + if (level.Data.SoundMap[internalIndex] == -1 || definition == null || definition.Creature == TRSFXCreatureCategory.Lara || !_sfxCategories.Contains(definition.PrimaryCategory)) + { + continue; + } + + Predicate> pred; + if (Settings.LinkCreatureSFX && definition.Creature > TRSFXCreatureCategory.Lara) + { + pred = sfx => + { + return sfx.Categories.Contains(definition.PrimaryCategory) && + sfx != definition && + ( + sfx.Creature == definition.Creature || + (sfx.Creature == TRSFXCreatureCategory.Lara && definition.Creature == TRSFXCreatureCategory.Human) + ); + }; + } + else + { + pred = sfx => sfx.Categories.Contains(definition.PrimaryCategory) && sfx != definition; + } + + List> otherDefinitions = _soundEffects.FindAll(pred); + if (otherDefinitions.Count > 0) + { + TRSFXDefinition nextDefinition = otherDefinitions[_generator.Next(0, otherDefinitions.Count)]; + short soundDetailsIndex = ImportSoundEffect(level.Data, definition, nextDefinition); + if (soundDetailsIndex != -1) + { + level.Data.SoundMap[internalIndex] = soundDetailsIndex; + } + } + } + } + + SoundUtilities.ResortSoundIndices(level.Data); + } + + private static short ImportSoundEffect(TR3Level level, TRSFXDefinition currentDefinition, TRSFXDefinition newDefinition) + { + if (newDefinition.SampleIndices.Count == 0) + { + return -1; + } + + List levelSamples = level.SampleIndices.ToList(); + List levelSoundDetails = level.SoundDetails.ToList(); + + uint minSample = newDefinition.SampleIndices.Min(); + if (levelSamples.Contains(minSample)) + { + return (short)levelSoundDetails.FindIndex(d => levelSamples[d.Sample] == minSample); + } + + ushort newSampleIndex = (ushort)levelSamples.Count; + List sortedSamples = new(newDefinition.SampleIndices); + sortedSamples.Sort(); + levelSamples.AddRange(sortedSamples); + + level.SampleIndices = levelSamples.ToArray(); + level.NumSampleIndices = (uint)levelSamples.Count; + + levelSoundDetails.Add(new TR3SoundDetails + { + Chance = currentDefinition.Details.Chance, + Characteristics = newDefinition.Details.Characteristics, + Pitch = newDefinition.Details.Pitch, + Range = newDefinition.Details.Range, + Sample = newSampleIndex, + Volume = newDefinition.Details.Volume + }); + + level.SoundDetails = levelSoundDetails.ToArray(); + level.NumSoundDetails++; + + return (short)(level.NumSoundDetails - 1); + } + + private void RandomizeWibble(TR3RCombinedLevel level) + { + if (Settings.RandomizeWibble) + { + foreach (TR3SoundDetails details in level.Data.SoundDetails) + { + details.Wibble = true; + } + } + } +} diff --git a/TRRandomizerCore/Randomizers/TR3R/TR3REnvironmentRandomizer.cs b/TRRandomizerCore/Randomizers/TR3R/TR3REnvironmentRandomizer.cs new file mode 100644 index 000000000..404bc1565 --- /dev/null +++ b/TRRandomizerCore/Randomizers/TR3R/TR3REnvironmentRandomizer.cs @@ -0,0 +1,84 @@ +using TREnvironmentEditor; +using TREnvironmentEditor.Helpers; +using TREnvironmentEditor.Model; +using TRGE.Core; +using TRRandomizerCore.Levels; + +namespace TRRandomizerCore.Randomizers; + +public class TR3REnvironmentRandomizer : BaseTR3RRandomizer +{ + public override void Randomize(int seed) + { + _generator ??= new(seed); + + foreach (TRRScriptedLevel lvl in Levels) + { + LoadLevelInstance(lvl); + RandomizeEnvironment(_levelInstance); + + SaveLevelInstance(); + if (!TriggerProgress()) + { + break; + } + } + } + + public void FinalizeEnvironment() + { + foreach (TRRScriptedLevel lvl in Levels) + { + LoadLevelInstance(lvl); + FinalizeEnvironment(_levelInstance); + + SaveLevelInstance(); + if (!TriggerProgress()) + { + break; + } + } + } + + private EMEditorMapping GetMapping(TR3RCombinedLevel level) + => EMEditorMapping.Get(GetResourcePath($@"TR3\Environment\{level.Name}-Environment.json")); + + private void RandomizeEnvironment(TR3RCombinedLevel level) + { + EMEditorMapping mapping = GetMapping(level); + if (mapping != null) + { + ApplyMappingToLevel(level, mapping); + } + } + + private void ApplyMappingToLevel(TR3RCombinedLevel level, EMEditorMapping mapping) + { + EnvironmentPicker picker = new(Settings.HardEnvironmentMode) + { + Generator = _generator + }; + picker.LoadTags(Settings, true); + picker.Options.ExclusionMode = EMExclusionMode.Individual; + + mapping.All.ApplyToLevel(level.Data, picker.Options); + + // No further mods supported yet + } + + private void FinalizeEnvironment(TR3RCombinedLevel level) + { + EMEditorMapping mapping = GetMapping(level); + EnvironmentPicker picker = new(Settings.HardEnvironmentMode); + picker.Options.ExclusionMode = EMExclusionMode.Individual; + picker.ResetTags(true); + + if (mapping != null) + { + foreach (EMConditionalSingleEditorSet mod in mapping.ConditionalAll) + { + mod.ApplyToLevel(level.Data, picker.Options); + } + } + } +} diff --git a/TRRandomizerCore/Randomizers/TR3R/TR3RItemRandomizer.cs b/TRRandomizerCore/Randomizers/TR3R/TR3RItemRandomizer.cs new file mode 100644 index 000000000..3fec3eaf8 --- /dev/null +++ b/TRRandomizerCore/Randomizers/TR3R/TR3RItemRandomizer.cs @@ -0,0 +1,283 @@ +using Newtonsoft.Json; +using TRFDControl; +using TRFDControl.Utilities; +using TRGE.Core; +using TRLevelControl.Helpers; +using TRLevelControl.Model; +using TRRandomizerCore.Helpers; +using TRRandomizerCore.Levels; +using TRRandomizerCore.Secrets; +using TRRandomizerCore.Utilities; + +namespace TRRandomizerCore.Randomizers; + +public class TR3RItemRandomizer : BaseTR3RRandomizer +{ + private readonly Dictionary> _excludedLocations, _pistolLocations; + private readonly LocationPicker _picker; + + private TRSecretMapping _secretMapping; + private TR3Entity _unarmedLevelPistols; + + public ItemFactory ItemFactory { get; set; } + + public TR3RItemRandomizer() + { + _excludedLocations = JsonConvert.DeserializeObject>>(ReadResource(@"TR3\Locations\invalid_item_locations.json")); + _pistolLocations = JsonConvert.DeserializeObject>>(ReadResource(@"TR3\Locations\unarmed_locations.json")); + _picker = new(GetResourcePath(@"TR3\Locations\routes.json")); + } + + public override void Randomize(int seed) + { + _generator = new(seed); + + foreach (TRRScriptedLevel lvl in Levels) + { + LoadLevelInstance(lvl); + FindUnarmedLevelPistols(_levelInstance); + + _picker.Initialise(_levelInstance.Name, GetItemLocationPool(_levelInstance, false), Settings, _generator); + _secretMapping = TRSecretMapping.Get(GetResourcePath($@"TR3\SecretMapping\{_levelInstance.Name}-SecretMapping.json")); + + if (Settings.RandomizeItemTypes) + { + RandomizeItemTypes(_levelInstance); + } + + if (Settings.RandomizeItemPositions) + { + RandomizeItemLocations(_levelInstance); + } + + if (Settings.RandoItemDifficulty == ItemDifficulty.OneLimit) + { + EnforceOneLimit(_levelInstance); + } + + SaveLevelInstance(); + if (!TriggerProgress()) + { + break; + } + } + } + + public void RandomizeKeyItems() + { + foreach (TRRScriptedLevel lvl in Levels) + { + LoadLevelInstance(lvl); + RandomizeKeyItems(_levelInstance); + + SaveLevelInstance(); + if (!TriggerProgress()) + { + break; + } + } + } + + private void FindUnarmedLevelPistols(TR3RCombinedLevel level) + { + if (level.Script.RemovesWeapons) + { + _unarmedLevelPistols = level.Data.Entities.Find( + e => e.TypeID == TR3Type.Pistols_P + && _pistolLocations[level.Name].Any(l => l.IsEquivalent(e.GetLocation()))); + } + else + { + _unarmedLevelPistols = null; + } + } + + private List GetItemLocationPool(TR3RCombinedLevel level, bool keyItemMode) + { + List exclusions = new(); + if (_excludedLocations.ContainsKey(level.Name)) + { + exclusions.AddRange(_excludedLocations[level.Name]); + } + + FDControl floorData = new(); + floorData.ParseFromLevel(level.Data); + + foreach (TR3Entity entity in level.Data.Entities) + { + if (!TR3TypeUtilities.CanSharePickupSpace(entity.TypeID)) + { + exclusions.Add(entity.GetFloorLocation(loc => + FDUtilities.GetRoomSector(loc.X, loc.Y, loc.Z, (short)loc.Room, level.Data, floorData))); + } + } + + if (level.Script.HasColdWater) + { + // Don't put items underwater if it's too cold + for (int i = 0; i < level.Data.NumRooms; i++) + { + if (level.Data.Rooms[i].ContainsWater) + { + exclusions.Add(new() + { + Room = i, + InvalidatesRoom = true + }); + } + } + } + + TR3LocationGenerator generator = new(); + return generator.Generate(level.Data, exclusions, keyItemMode); + } + + public void RandomizeItemTypes(TR3RCombinedLevel level) + { + if (level.IsAssault) + { + return; + } + + List stdItemTypes = TR3TypeUtilities.GetStandardPickupTypes(); + stdItemTypes.Remove(TR3Type.PistolAmmo_P); + + bool hasPistols = level.Data.Entities.Any(e => e.TypeID == TR3Type.Pistols_P); + + for (int i = 0; i < level.Data.Entities.Count; i++) + { + TR3Entity entity = level.Data.Entities[i]; + TR3Type entityType = entity.TypeID; + if (!TR3TypeUtilities.IsStandardPickupType(entityType) || _secretMapping.RewardEntities.Contains(i)) + { + continue; + } + + if (entity == _unarmedLevelPistols) + { + if (entityType == TR3Type.Pistols_P && Settings.GiveUnarmedItems) + { + do + { + entityType = stdItemTypes[_generator.Next(0, stdItemTypes.Count)]; + } + while (!TR3TypeUtilities.IsWeaponPickup(entityType)); + entity.TypeID = entityType; + } + } + else if (TR3TypeUtilities.IsStandardPickupType(entityType)) + { + TR3Type newType = stdItemTypes[_generator.Next(0, stdItemTypes.Count)]; + if (newType == TR3Type.Pistols_P && (hasPistols || !level.Script.RemovesWeapons)) + { + do + { + newType = stdItemTypes[_generator.Next(0, stdItemTypes.Count)]; + } + while (!TR3TypeUtilities.IsWeaponPickup(newType) || newType == TR3Type.Pistols_P); + } + entity.TypeID = newType; + } + + hasPistols = level.Data.Entities.Any(e => e.TypeID == TR3Type.Pistols_P); + } + } + + public void RandomizeItemLocations(TR3RCombinedLevel level) + { + if (level.IsAssault) + { + return; + } + + FDControl floorData = new(); + floorData.ParseFromLevel(level.Data); + + for (int i = 0; i < level.Data.Entities.Count; i++) + { + TR3Entity entity = level.Data.Entities[i]; + if (!TR3TypeUtilities.IsStandardPickupType(entity.TypeID) + || _secretMapping.RewardEntities.Contains(i) + || ItemFactory.IsItemLocked(level.Name, i) + || entity == _unarmedLevelPistols) + { + continue; + } + + _picker.RandomizePickupLocation(entity); + } + } + + public void EnforceOneLimit(TR3RCombinedLevel level) + { + if (level.IsAssault) + { + return; + } + + HashSet uniqueTypes = new(); + if (_unarmedLevelPistols != null) + { + uniqueTypes.Add(_unarmedLevelPistols.TypeID); + } + + for (int i = 0; i < level.Data.Entities.Count; i++) + { + TR3Entity entity = level.Data.Entities[i]; + if (_secretMapping.RewardEntities.Contains(i) || entity == _unarmedLevelPistols) + { + continue; + } + + if ((TR3TypeUtilities.IsStandardPickupType(entity.TypeID) || TR3TypeUtilities.IsCrystalPickup(entity.TypeID)) + && !uniqueTypes.Add(entity.TypeID)) + { + ItemUtilities.HideEntity(entity); + ItemFactory.FreeItem(level.Name, i); + } + } + } + + private void RandomizeKeyItems(TR3RCombinedLevel level) + { + FDControl floorData = new(); + floorData.ParseFromLevel(level.Data); + + _picker.TriggerTestAction = location => LocationUtilities.HasAnyTrigger(location, level.Data, floorData); + _picker.KeyItemTestAction = (location, hasPickupTrigger) => TestKeyItemLocation(location, hasPickupTrigger, level); + _picker.RoomInfos = level.Data.Rooms + .Select(r => new ExtRoomInfo(r.Info, r.NumXSectors, r.NumZSectors)) + .ToList(); + + _picker.Initialise(_levelInstance.Name, GetItemLocationPool(_levelInstance, true), Settings, _generator); + + for (int i = 0; i < level.Data.Entities.Count; i++) + { + TR3Entity entity = level.Data.Entities[i]; + if (!TR3TypeUtilities.IsKeyItemType(entity.TypeID) + || ItemFactory.IsItemLocked(level.Name, i)) + { + continue; + } + + _picker.RandomizeKeyItemLocation( + entity, LocationUtilities.HasPickupTriger(entity, i, level.Data, floorData), + level.Script.OriginalSequence, level.Data.Rooms[entity.Room].Info); + } + } + + private bool TestKeyItemLocation(Location location, bool hasPickupTrigger, TR3RCombinedLevel level) + { + // Make sure if we're placing on the same tile as an enemy, that the + // enemy can drop the item. + TR3Entity enemy = level.Data.Entities + .FindAll(e => TR3TypeUtilities.IsEnemyType(e.TypeID)) + .Find(e => e.GetLocation().IsEquivalent(location)); + + return enemy == null || (Settings.AllowEnemyKeyDrops && !hasPickupTrigger && TR3TypeUtilities.CanDropPickups + ( + TR3TypeUtilities.GetAliasForLevel(level.Name, enemy.TypeID), + !Settings.RandomizeEnemies || Settings.ProtectMonks + )); + } +} diff --git a/TRRandomizerCore/Randomizers/TR3R/TR3RStartPositionRandomizer.cs b/TRRandomizerCore/Randomizers/TR3R/TR3RStartPositionRandomizer.cs new file mode 100644 index 000000000..08a6de4bd --- /dev/null +++ b/TRRandomizerCore/Randomizers/TR3R/TR3RStartPositionRandomizer.cs @@ -0,0 +1,78 @@ +using Newtonsoft.Json; +using TREnvironmentEditor.Model.Types; +using TRGE.Core; +using TRLevelControl; +using TRLevelControl.Model; +using TRRandomizerCore.Helpers; +using TRRandomizerCore.Levels; + +namespace TRRandomizerCore.Randomizers; + +public class TR3RStartPositionRandomizer : BaseTR3RRandomizer +{ + private Dictionary> _startLocations; + + public override void Randomize(int seed) + { + _generator = new(seed); + _startLocations = JsonConvert.DeserializeObject>>(ReadResource(@"TR3\Locations\start_positions.json")); + + foreach (TRRScriptedLevel lvl in Levels) + { + LoadLevelInstance(lvl); + RandomizeStartPosition(_levelInstance); + SaveLevelInstance(); + + if (!TriggerProgress()) + { + break; + } + } + } + + private void RandomizeStartPosition(TR3RCombinedLevel level) + { + TR3Entity lara = level.Data.Entities.Find(e => e.TypeID == TR3Type.Lara); + + if (!Settings.RotateStartPositionOnly && _startLocations.ContainsKey(level.Name)) + { + List locations = _startLocations[level.Name]; + Location location; + do + { + location = locations[_generator.Next(0, locations.Count)]; + } + while (!location.Validated); + + new EMMoveTriggerFunction + { + BaseLocation = new() + { + X = lara.X, + Y = lara.Y, + Z = lara.Z, + Room = lara.Room + }, + NewLocation = new() + { + X = location.X, + Y = location.Y, + Z = location.Z, + Room = (short)location.Room + } + }.ApplyToLevel(level.Data); + + lara.X = location.X; + lara.Y = location.Y; + lara.Z = location.Z; + lara.Room = (short)location.Room; + } + + short currentAngle = lara.Angle; + do + { + lara.Angle = (short)(_generator.Next(0, 8) * -TRConsts.Angle45); + } + while (lara.Angle == currentAngle); + } +} diff --git a/TRRandomizerCore/Resources/TR1/Audio/audio_tracks.json b/TRRandomizerCore/Resources/TR1/Audio/audio_tracks.json index 8cb20984b..2a7ab09ca 100644 --- a/TRRandomizerCore/Resources/TR1/Audio/audio_tracks.json +++ b/TRRandomizerCore/Resources/TR1/Audio/audio_tracks.json @@ -228,8 +228,7 @@ "Offset": 183093060, "Length": 9212874, "Categories": [ - 7, - 4 + 7 ], "PrimaryCategory": 7 }, @@ -240,7 +239,6 @@ "Length": 6919674, "Categories": [ 8, - 4, 7 ], "PrimaryCategory": 8 @@ -272,6 +270,7 @@ "Length": 2359146, "Categories": [ 5, + 4, 7 ], "PrimaryCategory": 5 diff --git a/TRRandomizerCore/Resources/TR2/Locations/unarmed_locations.json b/TRRandomizerCore/Resources/TR2/Locations/unarmed_locations.json index db876067c..574af7abe 100644 --- a/TRRandomizerCore/Resources/TR2/Locations/unarmed_locations.json +++ b/TRRandomizerCore/Resources/TR2/Locations/unarmed_locations.json @@ -2,8 +2,8 @@ "WALL.TR2": [ { "X": 47648, - "Z": 30256, "Y": -40, + "Z": 30256, "Room": 25 }, { @@ -2202,41 +2202,49 @@ "LEVEL1.TR2": [ { "X": 76274, - "Z": 72159, "Y": -3328, + "Z": 72159, "Room": 3 } ], "LEVEL2.TR2": [ { "X": 73318, - "Z": 63113, "Y": 4864, + "Z": 63113, "Room": 45 } ], "LEVEL3.TR2": [ { "X": 58860, - "Z": 34274, "Y": 0, + "Z": 34274, "Room": 68 } ], "LEVEL4.TR2": [ { "X": 37355, - "Z": 53844, "Y": 2410, + "Z": 53844, "Room": 2 } ], "LEVEL5.TR2": [ { "X": 64060, - "Z": 53754, "Y": 0, + "Z": 53754, "Room": 28 } + ], + "HOUSE.TR2": [ + { + "X": 30208, + "Y": -256, + "Z": 67072, + "Room": 57 + } ] } \ No newline at end of file diff --git a/TRRandomizerCore/TRRandomizerController.cs b/TRRandomizerCore/TRRandomizerController.cs index 09a7e3356..e6bb2b567 100644 --- a/TRRandomizerCore/TRRandomizerController.cs +++ b/TRRandomizerCore/TRRandomizerController.cs @@ -43,9 +43,9 @@ public bool IsRandomizationSupported(TRRandomizerType randomizerType) return TRVersionSupport.IsRandomizationSupported(_editor.Edition, randomizerType); } - public List GetExecutables() + public List GetExecutables(string dataFolder) { - return TRVersionSupport.GetExecutables(_editor.Edition); + return TRVersionSupport.GetExecutables(_editor.Edition, dataFolder); } public bool IsTR1 => _editor.Edition.Version == TRVersion.TR1; @@ -89,7 +89,7 @@ private void SetScriptSequencing() { if (RandomizeGameMode) { - ScriptEditor.LevelSequencingOrganisation = RandomizeSequencing ? Organisation.Random : Organisation.Default; + ScriptEditor.LevelSequencingOrganisation = (RandomizeSequencing || _editor.Edition.Remastered) ? Organisation.Random : Organisation.Default; ScriptEditor.EnabledLevelOrganisation = Organisation.Random; ScriptEditor.GameMode = LevelRandomizer.GameMode; } diff --git a/TRRandomizerCore/TRRandomizerCoord.cs b/TRRandomizerCore/TRRandomizerCoord.cs index 2770bd3f4..813a7b563 100644 --- a/TRRandomizerCore/TRRandomizerCoord.cs +++ b/TRRandomizerCore/TRRandomizerCoord.cs @@ -53,13 +53,12 @@ public void Initialise(string applicationID, string version, string taggedVersio TRInterop.SecretRewardsSupported = true; TRInterop.ChecksumTester = new ChecksumTester(); - TRLevelEditorFactory.RegisterEditor(TRVersion.TR1, typeof(TR1RandoEditor)); - TRLevelEditorFactory.RegisterEditor(TRVersion.TR2, typeof(TR2RandoEditor)); - TRLevelEditorFactory.RegisterEditor(TRVersion.TR3, typeof(TR3RandoEditor)); - - // Not yet fully supported i.e. no locations, textures etc defined - //TRLevelEditorFactory.RegisterEditor(TRVersion.TR2G, typeof(TR2RandoEditor)); - //TRLevelEditorFactory.RegisterEditor(TRVersion.TR3G, typeof(TR3RandoEditor)); + TRLevelEditorFactory.RegisterEditor(TREdition.TR1PC, typeof(TR1ClassicEditor)); + TRLevelEditorFactory.RegisterEditor(TREdition.TR2PC, typeof(TR2ClassicEditor)); + TRLevelEditorFactory.RegisterEditor(TREdition.TR3PC, typeof(TR3ClassicEditor)); + TRLevelEditorFactory.RegisterEditor(TREdition.TR1RM, typeof(TR1RemasteredEditor)); + TRLevelEditorFactory.RegisterEditor(TREdition.TR2RM, typeof(TR2RemasteredEditor)); + TRLevelEditorFactory.RegisterEditor(TREdition.TR3RM, typeof(TR3RemasteredEditor)); // #125 Invoke TRCoord.Instance after defining TRInterop.ExecutingVersionName otherwise // TRGE will not know the config file name to look for. @@ -71,8 +70,8 @@ public void Initialise(string applicationID, string version, string taggedVersio public TRRandomizerController Open(string directoryPath, bool performChecksumTest) { - _openEventArgs = new TROpenRestoreEventArgs(); - return new TRRandomizerController(directoryPath, performChecksumTest); + _openEventArgs = new(); + return new(directoryPath, performChecksumTest); } public static void ClearHistory() diff --git a/TRRandomizerCore/TRRandomizerType.cs b/TRRandomizerCore/TRRandomizerType.cs index 66d674e36..9c72edd4f 100644 --- a/TRRandomizerCore/TRRandomizerType.cs +++ b/TRRandomizerCore/TRRandomizerType.cs @@ -63,4 +63,6 @@ public enum TRRandomizerType ShortcutFixes, KeyContinuity, GameMode, + ItemDrops, + LevelCount, } diff --git a/TRRandomizerCore/TRVersionSupport.cs b/TRRandomizerCore/TRVersionSupport.cs index 1ef434a1d..784bce592 100644 --- a/TRRandomizerCore/TRVersionSupport.cs +++ b/TRRandomizerCore/TRVersionSupport.cs @@ -28,10 +28,12 @@ internal class TRVersionSupport TRRandomizerType.Health, TRRandomizerType.HiddenEnemies, TRRandomizerType.Item, + TRRandomizerType.ItemDrops, TRRandomizerType.ItemSprite, TRRandomizerType.KeyItems, TRRandomizerType.KeyItemTextures, TRRandomizerType.LarsonBehaviour, + TRRandomizerType.LevelCount, TRRandomizerType.LevelSequence, TRRandomizerType.Mediless, TRRandomizerType.MeshSwaps, @@ -54,6 +56,15 @@ internal class TRVersionSupport TRRandomizerType.WaterColour, }; + private static readonly List _tr1RTypes = new() + { + TRRandomizerType.Audio, + TRRandomizerType.Item, + TRRandomizerType.KeyItems, + TRRandomizerType.SecretAudio, + TRRandomizerType.StartPosition, + }; + private static readonly List _tr2Types = new() { TRRandomizerType.AmbientTracks, @@ -71,10 +82,12 @@ internal class TRVersionSupport TRRandomizerType.GlitchedSecrets, TRRandomizerType.HardSecrets, TRRandomizerType.Item, + TRRandomizerType.ItemDrops, TRRandomizerType.KeyContinuity, TRRandomizerType.KeyItems, TRRandomizerType.KeyItemTextures, TRRandomizerType.Ladders, + TRRandomizerType.LevelCount, TRRandomizerType.LevelSequence, TRRandomizerType.MeshSwaps, TRRandomizerType.NightMode, @@ -95,6 +108,17 @@ internal class TRVersionSupport TRRandomizerType.ItemSprite }; + private static readonly List _tr2RTypes = new() + { + TRRandomizerType.Audio, + TRRandomizerType.Item, + TRRandomizerType.ItemDrops, + TRRandomizerType.KeyItems, + TRRandomizerType.SecretAudio, + TRRandomizerType.SFX, + TRRandomizerType.StartPosition, + }; + private static readonly List _tr3Types = new() { TRRandomizerType.AmbientTracks, @@ -109,8 +133,10 @@ internal class TRVersionSupport TRRandomizerType.GlobeDisplay, TRRandomizerType.HardSecrets, TRRandomizerType.Item, + TRRandomizerType.ItemDrops, TRRandomizerType.KeyItems, TRRandomizerType.Ladders, + TRRandomizerType.LevelCount, TRRandomizerType.LevelSequence, TRRandomizerType.NightMode, TRRandomizerType.Outfit, @@ -134,23 +160,38 @@ internal class TRVersionSupport TRRandomizerType.Weather }; + private static readonly List _tr3RTypes = new() + { + TRRandomizerType.Audio, + TRRandomizerType.Item, + TRRandomizerType.ItemDrops, + TRRandomizerType.KeyItems, + TRRandomizerType.SecretAudio, + TRRandomizerType.SFX, + TRRandomizerType.StartPosition, + }; + private static readonly Dictionary _supportedTypes = new() { [TRVersion.TR1] = new() { - DefaultSupport = _tr1Types + DefaultSupport = _tr1Types, + RemasterSupport = _tr1RTypes, }, [TRVersion.TR2] = new() { - DefaultSupport = _tr2Types + DefaultSupport = _tr2Types, + RemasterSupport = _tr2RTypes, }, [TRVersion.TR3] = new() { DefaultSupport = _tr3Types, - PatchSupport = _tr3MainTypes + PatchSupport = _tr3MainTypes, + RemasterSupport = _tr3RTypes, } }; + private static readonly string _trrExe = "tomb123.exe"; private static readonly Dictionary> _versionExes = new() { [TRVersion.TR1] = new() { "TR1X.exe" }, @@ -180,15 +221,27 @@ public static bool IsRandomizationSupported(TREdition edition, TRRandomizerType supported = supportGroup.PatchSupport.Contains(randomizerType); } + // More limited in the Remasters + if (edition.Remastered) + { + supported = supportGroup.HasRemasterSupport + && supportGroup.RemasterSupport.Contains(randomizerType); + } + return supported; } - public static List GetExecutables(TREdition edition) + public static List GetExecutables(TREdition edition, string dataFolder) { List exes = new(); - if (_versionExes.ContainsKey(edition.Version)) + if (edition.Remastered) + { + exes.Add(Path.GetFullPath(Path.Combine(dataFolder, "../../", _trrExe))); + } + else if (_versionExes.ContainsKey(edition.Version)) { - exes.AddRange(_versionExes[edition.Version]); + exes.AddRange(_versionExes[edition.Version].Select( + p => Path.GetFullPath(Path.Combine(dataFolder, "../", p)))); } return exes; } @@ -198,5 +251,7 @@ internal class TRVersionSupportGroup { internal List DefaultSupport { get; set; } internal List PatchSupport { get; set; } + internal List RemasterSupport { get; set; } internal bool HasPatchSupport => PatchSupport != null; + internal bool HasRemasterSupport => RemasterSupport != null; } diff --git a/TRRandomizerView/Controls/EditorControl.xaml b/TRRandomizerView/Controls/EditorControl.xaml index 59698e3be..f3e7b3504 100644 --- a/TRRandomizerView/Controls/EditorControl.xaml +++ b/TRRandomizerView/Controls/EditorControl.xaml @@ -38,6 +38,7 @@ + + - - - - - - - - - - @@ -343,22 +327,10 @@ - - @@ -366,36 +338,10 @@ - - - - - - - - - - @@ -408,6 +354,7 @@ BoolItemsSource="{Binding Data.AudioBoolItemControls, Source={StaticResource proxy}}" HasBoolItems="True" HasAudioOptions="True" + HasSFXOptions="{Binding Data.IsSFXTypeSupported, Source={StaticResource proxy}}" ControllerProxy="{Binding Data, Source={StaticResource proxy}}"> @@ -599,14 +546,14 @@ Command="cmds:WindowCommands.OpenGlobalSettingsCommand"/>