diff --git a/Bundle/Linux/scenes b/Bundle/Linux/scenes index de70c6f..9696b26 100644 Binary files a/Bundle/Linux/scenes and b/Bundle/Linux/scenes differ diff --git a/Bundle/OSX/scenes b/Bundle/OSX/scenes index d6419d8..608b752 100644 Binary files a/Bundle/OSX/scenes and b/Bundle/OSX/scenes differ diff --git a/Bundle/Win64/scenes b/Bundle/Win64/scenes index 343a892..ad539a0 100644 Binary files a/Bundle/Win64/scenes and b/Bundle/Win64/scenes differ diff --git a/Core/RenderManager.cs b/Core/RenderManager.cs index e185660..9618f52 100644 --- a/Core/RenderManager.cs +++ b/Core/RenderManager.cs @@ -379,7 +379,7 @@ namespace ADOFAIRenderer.Core GCS.nextSpeedRun = 1; GCS.customLevelIndex = 0; - if (Configuration.RandomSeed.HasValue) Random.InitState(Configuration.RandomSeed.Value); + if (Configuration.AdvancedConfig.RandomSeed.HasValue) Random.InitState(Configuration.AdvancedConfig.RandomSeed.Value); ADOBase.loader.LoadSceneWithTransition(WipeDirection.StartsFromRight, "scnGame"); skipPressToStart = true; _renderSetup = true; @@ -387,7 +387,7 @@ namespace ADOFAIRenderer.Core private IEnumerator SetupPlay() { - if (Configuration.AudioConfig.RenderAudio && GetOutputExtension(Configuration.VideoConfig!.Codec) != ".mp4") + if (Configuration.AudioConfig.RenderAudio && GetOutputExtension(Configuration.VideoConfig.Codec) != ".mp4") { Configuration.AudioConfig.AudioSampleRate = 48000; } @@ -430,7 +430,7 @@ namespace ADOFAIRenderer.Core scrController.instance.levelWasSkipped = true; if (!scrConductor.instance || !scrConductor.instance.song) yield break; - if (Configuration.ProcessAudio) + if (Configuration.AdvancedConfig.ProcessAudio) { AudioSpectrumGenerator.Initialize(scrConductor.instance.song.clip); } diff --git a/Data/PresetManager.cs b/Data/PresetManager.cs index 20a89ea..746148f 100644 --- a/Data/PresetManager.cs +++ b/Data/PresetManager.cs @@ -120,6 +120,30 @@ namespace ADOFAIRenderer.Data { configObj.Remove("AudioConfig"); } + + // 4. legacy top-level Advanced properties -> AdvancedConfig + string[] legacyAdvancedProps = { "RandomSeed", "ProcessAudio", "NonTile" }; + foreach (var prop in legacyAdvancedProps) + { + var legacyToken = configObj[prop]; + if (legacyToken != null && legacyToken.Type != JTokenType.Null) + { + if (configObj["AdvancedConfig"] == null || configObj["AdvancedConfig"]!.Type == JTokenType.Null) + { + configObj["AdvancedConfig"] = new JObject(); + } + + var advancedConfigObj = (JObject)configObj["AdvancedConfig"]!; + advancedConfigObj[prop] ??= legacyToken; + } + + configObj.Remove(prop); + } + + if (configObj["AdvancedConfig"] != null && configObj["AdvancedConfig"]!.Type == JTokenType.Null) + { + configObj.Remove("AdvancedConfig"); + } } var preset = jObject.ToObject(); diff --git a/Data/RenderConfig.cs b/Data/RenderConfig.cs index bd68dc4..533c389 100644 --- a/Data/RenderConfig.cs +++ b/Data/RenderConfig.cs @@ -10,14 +10,19 @@ namespace ADOFAIRenderer.Data public int RenderWidth { get; set; } public int RenderHeight { get; set; } - public VideoEncodingConfig VideoConfig { get; set; } = new VideoEncodingConfig(); - public AudioEncodingConfig AudioConfig { get; set; } = new AudioEncodingConfig(); + public VideoEncodingConfig VideoConfig { get; set; } = new(); + public AudioEncodingConfig AudioConfig { get; set; } = new(); + public AdvancedConfig AdvancedConfig { get; set; } = new(); public double DelayAfterLevelEnd { get; set; } public bool ShowJudgementText { get; set; } + } + public class AdvancedConfig + { public int? RandomSeed { get; set; } = null; - public bool ProcessAudio { get; set; } + public bool ProcessAudio { get; set; } = true; + public bool NonTile { get; set; } = false; } public class VideoEncodingConfig diff --git a/Patch/Engine/RenderEnvironmentPatches.cs b/Patch/Engine/RenderEnvironmentPatches.cs index 0fe972a..8160ff2 100644 --- a/Patch/Engine/RenderEnvironmentPatches.cs +++ b/Patch/Engine/RenderEnvironmentPatches.cs @@ -148,7 +148,7 @@ namespace ADOFAIRenderer.Patch.Engine [SuppressMessage("ReSharper", "InconsistentNaming")] public static bool Prefix(AudioSource __instance, float[] samples, int channel, FFTWindow window) { - if (!RenderManager.IsCapturingActive || !RenderPatch || !RenderManager.Instance.Configuration.ProcessAudio) return true; + if (!RenderManager.IsCapturingActive || !RenderPatch || !RenderManager.Instance.Configuration.AdvancedConfig.ProcessAudio) return true; AudioSpectrumGenerator.GetSpectrumData(samples, channel, window); return false; } @@ -160,7 +160,7 @@ namespace ADOFAIRenderer.Patch.Engine [SuppressMessage("ReSharper", "InconsistentNaming")] public static void Prefix(ref bool stream) { - if (RenderManager.Instance && RenderManager.Instance.OverrideLoading && RenderManager.Instance.Configuration.ProcessAudio) + if (RenderManager.Instance && RenderManager.Instance.OverrideLoading && RenderManager.Instance.Configuration.AdvancedConfig.ProcessAudio) stream = false; } } diff --git a/UI/RenderConfigUIManager.cs b/UI/RenderConfigUIManager.cs index 0bfa8f7..7d8d386 100644 --- a/UI/RenderConfigUIManager.cs +++ b/UI/RenderConfigUIManager.cs @@ -24,6 +24,9 @@ namespace ADOFAIRenderer.UI private Button _audioEncodingConfigButton = null!; private VisualElement _audioEncodingConfigContainer = null!; + private Button _advancedSettingsButton = null!; + private VisualElement? _advancedConfigContainer; + private void Awake() { _root = uiDocument.rootVisualElement; @@ -84,6 +87,161 @@ namespace ADOFAIRenderer.UI { Melon.Logger.Error("Button 'PresetSettingsButton'을(를) 찾을 수 없습니다."); } + + _advancedSettingsButton = _root.Q