diff --git a/TRDataControl/Environment/EMEditorMapping.cs b/TRDataControl/Environment/EMEditorMapping.cs index 81541c2c..808168ea 100644 --- a/TRDataControl/Environment/EMEditorMapping.cs +++ b/TRDataControl/Environment/EMEditorMapping.cs @@ -61,16 +61,10 @@ public void AlternateTextures() } public void SetCommunityPatch(bool isCommunityPatch) - { - All?.SetCommunityPatch(isCommunityPatch); - ConditionalAll?.ForEach(s => s.SetCommunityPatch(isCommunityPatch)); - Any?.ForEach(s => s.SetCommunityPatch(isCommunityPatch)); - AllWithin?.ForEach(a => a.ForEach(s => s.SetCommunityPatch(isCommunityPatch))); - ConditionalAllWithin?.ForEach(s => s.SetCommunityPatch(isCommunityPatch)); - OneOf?.ForEach(s => s.SetCommunityPatch(isCommunityPatch)); - ConditionalOneOf?.ForEach(s => s.SetCommunityPatch(isCommunityPatch)); - Mirrored?.SetCommunityPatch(isCommunityPatch); - } + => Scan(e => e.SetCommunityPatch(isCommunityPatch)); + + public void SetRemastered(bool isRemastered) + => Scan(e => e.SetRemastered(isRemastered)); public List FindAll(Predicate predicate = null) { diff --git a/TRDataControl/Environment/Helpers/EMOptions.cs b/TRDataControl/Environment/Helpers/EMOptions.cs index 801c4650..49cd4b2f 100644 --- a/TRDataControl/Environment/Helpers/EMOptions.cs +++ b/TRDataControl/Environment/Helpers/EMOptions.cs @@ -3,6 +3,6 @@ public class EMOptions { public bool EnableHardMode { get; set; } - public IEnumerable ExcludedTags { get; set; } + public List ExcludedTags { get; set; } public EMExclusionMode ExclusionMode { get; set; } } diff --git a/TRDataControl/Environment/Helpers/EMTag.cs b/TRDataControl/Environment/Helpers/EMTag.cs index d65a6e91..07b29a27 100644 --- a/TRDataControl/Environment/Helpers/EMTag.cs +++ b/TRDataControl/Environment/Helpers/EMTag.cs @@ -15,4 +15,6 @@ public enum EMTag GeneralBugFix, ShortcutFix, KeyItemFix, + RemasteredOnly, + ClassicOnly, } diff --git a/TRDataControl/Environment/Model/BaseEMFunction.cs b/TRDataControl/Environment/Model/BaseEMFunction.cs index fe2f941a..f7418708 100644 --- a/TRDataControl/Environment/Model/BaseEMFunction.cs +++ b/TRDataControl/Environment/Model/BaseEMFunction.cs @@ -14,7 +14,7 @@ public abstract class BaseEMFunction public BaseEMFunction HardVariant { get; set; } public List Tags { get; set; } - protected bool _isCommunityPatch; + protected bool _isCommunityPatch, _isRemastered; public abstract void ApplyToLevel(TR1Level level); public abstract void ApplyToLevel(TR2Level level); @@ -23,6 +23,9 @@ public abstract class BaseEMFunction public void SetCommunityPatch(bool isCommunityPatch) => _isCommunityPatch = isCommunityPatch; + public void SetRemastered(bool isRemasterd) + => _isRemastered = isRemasterd; + /// /// Gets the expected vertices for a flat tile. /// asCeiling = true => looking up diff --git a/TRRandomizerCore/Randomizers/Shared/EnvironmentPicker.cs b/TRRandomizerCore/Randomizers/Shared/EnvironmentPicker.cs index 9f4c0972..cecb5470 100644 --- a/TRRandomizerCore/Randomizers/Shared/EnvironmentPicker.cs +++ b/TRRandomizerCore/Randomizers/Shared/EnvironmentPicker.cs @@ -1,4 +1,5 @@ using TRDataControl.Environment; +using TRGE.Core; using TRRandomizerCore.Editors; using TRRandomizerCore.Helpers; @@ -6,81 +7,82 @@ namespace TRRandomizerCore.Randomizers; public class EnvironmentPicker { + private readonly Random _generator; + private readonly RandomizerSettings _settings; + private readonly TREdition _gfEdition; + public EMOptions Options { get; set; } - public Random Generator { get; set; } - public EnvironmentPicker(bool hardMode) + public EnvironmentPicker(Random generator, RandomizerSettings settings, TREdition gfEdition) { - Options = new EMOptions + Options = new() { - EnableHardMode = hardMode, - ExcludedTags = new List() + EnableHardMode = settings.HardEnvironmentMode, + ExcludedTags = new() }; - } - public void LoadTags(RandomizerSettings settings, bool isCommunityPatch) - { - List excludedTags = new(); - if (!settings.AddReturnPaths) + _generator = generator; + _settings = settings; + _gfEdition = gfEdition; + + ResetTags(); + + if (!_settings.AddReturnPaths) { - excludedTags.Add(EMTag.ReturnPath); + Options.ExcludedTags.Add(EMTag.ReturnPath); } - if (!settings.FixOGBugs) + if (!_settings.FixOGBugs) { - excludedTags.Add(EMTag.GeneralBugFix); + Options.ExcludedTags.Add(EMTag.GeneralBugFix); } - if (!settings.BlockShortcuts) + if (!_settings.BlockShortcuts) { - excludedTags.Add(EMTag.ShortcutFix); + Options.ExcludedTags.Add(EMTag.ShortcutFix); } - if (!settings.RandomizeLadders) + if (!_settings.RandomizeLadders) { - excludedTags.Add(EMTag.LadderChange); + Options.ExcludedTags.Add(EMTag.LadderChange); } - if (!settings.RandomizeWaterLevels) + if (!_settings.RandomizeWaterLevels) { - excludedTags.Add(EMTag.WaterChange); + Options.ExcludedTags.Add(EMTag.WaterChange); } - if (!settings.RandomizeSlotPositions) + if (!_settings.RandomizeSlotPositions) { - excludedTags.Add(EMTag.SlotChange); + Options.ExcludedTags.Add(EMTag.SlotChange); } - if (!settings.RandomizeTraps) + if (!_settings.RandomizeTraps) { - excludedTags.Add(EMTag.TrapChange); + Options.ExcludedTags.Add(EMTag.TrapChange); } - if (!settings.RandomizeChallengeRooms) + if (!_settings.RandomizeChallengeRooms) { - excludedTags.Add(EMTag.PuzzleRoom); + Options.ExcludedTags.Add(EMTag.PuzzleRoom); } - if (!settings.RandomizeItems || !settings.IncludeKeyItems) + if (!_settings.RandomizeItems || !_settings.IncludeKeyItems) { - excludedTags.Add(EMTag.KeyItemFix); + Options.ExcludedTags.Add(EMTag.KeyItemFix); } - - // If we're using a community patch, exclude mods that - // only apply to non-community patch and vice-versa. - excludedTags.Add(isCommunityPatch - ? EMTag.NonCommunityPatchOnly - : EMTag.CommunityPatchOnly); - - Options.ExcludedTags = excludedTags; } - public void ResetTags(bool isCommunityPatch) + public void ResetTags() { - Options.ExcludedTags = new List + // If we're using a community patch, exclude mods that only apply to non-community patch and vice-versa. + // Same idea for classic/remastered only. + Options.ExcludedTags = new() { - isCommunityPatch - ? EMTag.NonCommunityPatchOnly - : EMTag.CommunityPatchOnly + _gfEdition.IsCommunityPatch + ? EMTag.NonCommunityPatchOnly + : EMTag.CommunityPatchOnly, + _gfEdition.Remastered + ? EMTag.ClassicOnly + : EMTag.RemasteredOnly }; } public List GetRandomAny(EMEditorMapping mapping) { - List sets = new(); - + List sets = new(); List pool = Options.EnableHardMode ? mapping.Any : mapping.Any.FindAll(e => !e.IsHard); @@ -88,7 +90,7 @@ public List GetRandomAny(EMEditorMapping mapping) if (pool.Count > 0) { // Pick a random number of packs to apply, but at least 1 - sets = pool.RandomSelection(Generator, Generator.Next(1, pool.Count + 1)); + sets = pool.RandomSelection(_generator, _generator.Next(1, pool.Count + 1)); } return sets; @@ -99,7 +101,7 @@ public EMEditorSet GetModToRun(List modList) if (Options.EnableHardMode) { // Anything goes. - return modList[Generator.Next(0, modList.Count)]; + return modList[_generator.Next(0, modList.Count)]; } if (modList.Any(e => !e.IsHard)) @@ -108,7 +110,7 @@ public EMEditorSet GetModToRun(List modList) EMEditorSet set; do { - set = modList[Generator.Next(0, modList.Count)]; + set = modList[_generator.Next(0, modList.Count)]; } while (set.IsHard); diff --git a/TRRandomizerCore/Randomizers/TR1/Classic/TR1EnvironmentRandomizer.cs b/TRRandomizerCore/Randomizers/TR1/Classic/TR1EnvironmentRandomizer.cs index e7f4c4a8..3f0a17d8 100644 --- a/TRRandomizerCore/Randomizers/TR1/Classic/TR1EnvironmentRandomizer.cs +++ b/TRRandomizerCore/Randomizers/TR1/Classic/TR1EnvironmentRandomizer.cs @@ -119,11 +119,7 @@ private void ApplyMappingToLevel(TR1CombinedLevel level, EMEditorMapping mapping level.Data.SoundEffects[TR1SFX.PendulumBlades] = vilcabamba.SoundEffects[TR1SFX.PendulumBlades]; } - EnvironmentPicker picker = new(Settings.HardEnvironmentMode) - { - Generator = _generator - }; - picker.LoadTags(Settings, true); + EnvironmentPicker picker = new(_generator, Settings, ScriptEditor.Edition); picker.Options.ExclusionMode = EMExclusionMode.Individual; // These are applied whether or not environment randomization is enabled, @@ -224,9 +220,9 @@ private static void UpdateDoppelgangerScript(TR1CombinedLevel level) private void FinalizeEnvironment(TR1CombinedLevel level) { EMEditorMapping mapping = EMEditorMapping.Get(GetResourcePath($@"TR1\Environment\{level.Name}-Environment.json")); - EnvironmentPicker picker = new(Settings.HardEnvironmentMode); + EnvironmentPicker picker = new(_generator, Settings, ScriptEditor.Edition); picker.Options.ExclusionMode = EMExclusionMode.Individual; - picker.ResetTags(true); + picker.ResetTags(); if (mapping != null) { diff --git a/TRRandomizerCore/Randomizers/TR1/Remastered/TR1REnvironmentRandomizer.cs b/TRRandomizerCore/Randomizers/TR1/Remastered/TR1REnvironmentRandomizer.cs index ec99b80f..ab5d831d 100644 --- a/TRRandomizerCore/Randomizers/TR1/Remastered/TR1REnvironmentRandomizer.cs +++ b/TRRandomizerCore/Randomizers/TR1/Remastered/TR1REnvironmentRandomizer.cs @@ -39,7 +39,11 @@ public void FinalizeEnvironment() } private EMEditorMapping GetMapping(TR1RCombinedLevel level) - => EMEditorMapping.Get(GetResourcePath($@"TR1\Environment\{level.Name}-Environment.json")); + { + EMEditorMapping mapping = EMEditorMapping.Get(GetResourcePath($@"TR1\Environment\{level.Name}-Environment.json")); + mapping?.SetRemastered(true); + return mapping; + } private void RandomizeEnvironment(TR1RCombinedLevel level) { @@ -52,24 +56,18 @@ private void RandomizeEnvironment(TR1RCombinedLevel level) private void ApplyMappingToLevel(TR1RCombinedLevel level, EMEditorMapping mapping) { - EnvironmentPicker picker = new(Settings.HardEnvironmentMode) - { - Generator = _generator - }; - picker.LoadTags(Settings, true); + EnvironmentPicker picker = new(_generator, Settings, ScriptEditor.Edition); 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); + EnvironmentPicker picker = new(_generator, Settings, ScriptEditor.Edition); picker.Options.ExclusionMode = EMExclusionMode.Individual; - picker.ResetTags(true); + picker.ResetTags(); if (mapping != null) { diff --git a/TRRandomizerCore/Randomizers/TR2/Classic/TR2EnvironmentRandomizer.cs b/TRRandomizerCore/Randomizers/TR2/Classic/TR2EnvironmentRandomizer.cs index f5967d96..31c88241 100644 --- a/TRRandomizerCore/Randomizers/TR2/Classic/TR2EnvironmentRandomizer.cs +++ b/TRRandomizerCore/Randomizers/TR2/Classic/TR2EnvironmentRandomizer.cs @@ -112,11 +112,7 @@ private void RandomizeEnvironment(TR2CombinedLevel level) private void ApplyMappingToLevel(TR2CombinedLevel level, EMEditorMapping mapping) { - EnvironmentPicker picker = new(Settings.HardEnvironmentMode) - { - Generator = _generator - }; - picker.LoadTags(Settings, ScriptEditor.Edition.IsCommunityPatch); + EnvironmentPicker picker = new(_generator, Settings, ScriptEditor.Edition); picker.Options.ExclusionMode = EMExclusionMode.Individual; mapping.All.ApplyToLevel(level.Data, picker.Options); @@ -168,9 +164,8 @@ private void ApplyMappingToLevel(TR2CombinedLevel level, EMEditorMapping mapping private void FinalizeEnvironment(TR2CombinedLevel level) { EMEditorMapping mapping = EMEditorMapping.Get(GetResourcePath($@"TR2\Environment\{level.Name}-Environment.json")); - EnvironmentPicker picker = new(Settings.HardEnvironmentMode); + EnvironmentPicker picker = new(_generator, Settings, ScriptEditor.Edition); picker.Options.ExclusionMode = EMExclusionMode.Individual; - picker.ResetTags(ScriptEditor.Edition.IsCommunityPatch); if (mapping != null) { diff --git a/TRRandomizerCore/Randomizers/TR2/Remastered/TR2REnvironmentRandomizer.cs b/TRRandomizerCore/Randomizers/TR2/Remastered/TR2REnvironmentRandomizer.cs index 67d5f59b..4491a69f 100644 --- a/TRRandomizerCore/Randomizers/TR2/Remastered/TR2REnvironmentRandomizer.cs +++ b/TRRandomizerCore/Randomizers/TR2/Remastered/TR2REnvironmentRandomizer.cs @@ -39,7 +39,11 @@ public void FinalizeEnvironment() } private EMEditorMapping GetMapping(TR2RCombinedLevel level) - => EMEditorMapping.Get(GetResourcePath($@"TR2\Environment\{level.Name}-Environment.json")); + { + EMEditorMapping mapping = EMEditorMapping.Get(GetResourcePath($@"TR2\Environment\{level.Name}-Environment.json")); + mapping?.SetRemastered(true); + return mapping; + } private void RandomizeEnvironment(TR2RCombinedLevel level) { @@ -52,24 +56,17 @@ private void RandomizeEnvironment(TR2RCombinedLevel level) private void ApplyMappingToLevel(TR2RCombinedLevel level, EMEditorMapping mapping) { - EnvironmentPicker picker = new(Settings.HardEnvironmentMode) - { - Generator = _generator - }; - picker.LoadTags(Settings, true); + EnvironmentPicker picker = new(_generator, Settings, ScriptEditor.Edition); 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); + EnvironmentPicker picker = new(_generator, Settings, ScriptEditor.Edition); picker.Options.ExclusionMode = EMExclusionMode.Individual; - picker.ResetTags(true); if (mapping != null) { diff --git a/TRRandomizerCore/Randomizers/TR3/Classic/TR3EnvironmentRandomizer.cs b/TRRandomizerCore/Randomizers/TR3/Classic/TR3EnvironmentRandomizer.cs index 35102f75..e9001ec3 100644 --- a/TRRandomizerCore/Randomizers/TR3/Classic/TR3EnvironmentRandomizer.cs +++ b/TRRandomizerCore/Randomizers/TR3/Classic/TR3EnvironmentRandomizer.cs @@ -116,11 +116,7 @@ private void RandomizeEnvironment(TR3CombinedLevel level) private void ApplyMappingToLevel(TR3CombinedLevel level, EMEditorMapping mapping) { - EnvironmentPicker picker = new(Settings.HardEnvironmentMode) - { - Generator = _generator - }; - picker.LoadTags(Settings, ScriptEditor.Edition.IsCommunityPatch); + EnvironmentPicker picker = new(_generator, Settings, ScriptEditor.Edition); picker.Options.ExclusionMode = EMExclusionMode.Individual; mapping.All.ApplyToLevel(level.Data, picker.Options); @@ -172,9 +168,8 @@ private void ApplyMappingToLevel(TR3CombinedLevel level, EMEditorMapping mapping private void FinalizeEnvironment(TR3CombinedLevel level) { EMEditorMapping mapping = EMEditorMapping.Get(GetResourcePath($@"TR3\Environment\{level.Name}-Environment.json")); - EnvironmentPicker picker = new(Settings.HardEnvironmentMode); + EnvironmentPicker picker = new(_generator, Settings, ScriptEditor.Edition); picker.Options.ExclusionMode = EMExclusionMode.Individual; - picker.ResetTags(ScriptEditor.Edition.IsCommunityPatch); if (mapping != null) { diff --git a/TRRandomizerCore/Randomizers/TR3/Remastered/TR3REnvironmentRandomizer.cs b/TRRandomizerCore/Randomizers/TR3/Remastered/TR3REnvironmentRandomizer.cs index cc5e3b75..69c9e93b 100644 --- a/TRRandomizerCore/Randomizers/TR3/Remastered/TR3REnvironmentRandomizer.cs +++ b/TRRandomizerCore/Randomizers/TR3/Remastered/TR3REnvironmentRandomizer.cs @@ -39,7 +39,11 @@ public void FinalizeEnvironment() } private EMEditorMapping GetMapping(TR3RCombinedLevel level) - => EMEditorMapping.Get(GetResourcePath($@"TR3\Environment\{level.Name}-Environment.json")); + { + EMEditorMapping mapping = EMEditorMapping.Get(GetResourcePath($@"TR3\Environment\{level.Name}-Environment.json")); + mapping?.SetRemastered(true); + return mapping; + } private void RandomizeEnvironment(TR3RCombinedLevel level) { @@ -52,24 +56,17 @@ private void RandomizeEnvironment(TR3RCombinedLevel level) private void ApplyMappingToLevel(TR3RCombinedLevel level, EMEditorMapping mapping) { - EnvironmentPicker picker = new(Settings.HardEnvironmentMode) - { - Generator = _generator - }; - picker.LoadTags(Settings, true); + EnvironmentPicker picker = new(_generator, Settings, ScriptEditor.Edition); 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); + EnvironmentPicker picker = new(_generator, Settings, ScriptEditor.Edition); picker.Options.ExclusionMode = EMExclusionMode.Individual; - picker.ResetTags(true); if (mapping != null) {