From 3fae7e5b4cb54b12c53624bd8ad220bae924b720 Mon Sep 17 00:00:00 2001 From: Kara Alexandra Date: Mon, 25 May 2026 00:23:10 -0500 Subject: [PATCH] Mystery setup --- ALttPRandomizer/Azure/AzureStorage.cs | 5 ++-- ALttPRandomizer/Model/SeedSettings.cs | 14 +++++++++ ALttPRandomizer/Randomizers/BaseRandomizer.cs | 10 +++++-- ALttPRandomizer/Randomizers/IRandomizer.cs | 2 +- ALttPRandomizer/SeedController.cs | 30 +++++++++---------- ALttPRandomizer/Service/RandomizeService.cs | 29 ++++++++++++++++++ BetaRandomizer | 2 +- 7 files changed, 70 insertions(+), 22 deletions(-) diff --git a/ALttPRandomizer/Azure/AzureStorage.cs b/ALttPRandomizer/Azure/AzureStorage.cs index 459fb7c..c135ab2 100644 --- a/ALttPRandomizer/Azure/AzureStorage.cs +++ b/ALttPRandomizer/Azure/AzureStorage.cs @@ -24,8 +24,9 @@ await BlobClient.UploadBlobAsync(name, data); } - public async Task UploadFile(string name, BinaryData data) { - await BlobClient.UploadBlobAsync(name, data); + public async Task UploadFile(string name, BinaryData data, bool overwrite = false) { + var client = BlobClient.GetBlobClient(name); + await client.UploadAsync(data, overwrite); } public async Task UploadFileFromSource(string name, string filepath) { diff --git a/ALttPRandomizer/Model/SeedSettings.cs b/ALttPRandomizer/Model/SeedSettings.cs index 30b11cb..1d46826 100644 --- a/ALttPRandomizer/Model/SeedSettings.cs +++ b/ALttPRandomizer/Model/SeedSettings.cs @@ -14,6 +14,9 @@ [NoSettingName] public RaceMode Race { get; set; } = RaceMode.Normal; + [NoSettingName] + public MysteryMode Mystery { get; set; } = MysteryMode.Normal; + [ForbiddenSetting([Apr2025], Mode.Inverted)] [RequiredSetting([Pikit], Mode.Open)] public Mode Mode { get; set; } = Mode.Open; @@ -204,6 +207,12 @@ [NoSettingName] public Hints Hints { get; set; } = Hints.Off; + + public SeedSettings Clone() { + var newSettings = (SeedSettings) this.MemberwiseClone(); + + return newSettings; + } } public enum RandomizerInstance { @@ -218,6 +227,11 @@ [AdditionalSetting("--securerandom")] Race, } + public enum MysteryMode { + Normal, + [AdditionalSetting("--mystery")] Mystery, + } + public enum Mode { Open, Standard, diff --git a/ALttPRandomizer/Randomizers/BaseRandomizer.cs b/ALttPRandomizer/Randomizers/BaseRandomizer.cs index 0f05f98..d2fa71a 100644 --- a/ALttPRandomizer/Randomizers/BaseRandomizer.cs +++ b/ALttPRandomizer/Randomizers/BaseRandomizer.cs @@ -113,7 +113,7 @@ }; } - public async Task Randomize(string id, SeedSettings settings, bool uploadSettings = true) { + public async Task Randomize(string id, SeedSettings settings, bool uploadSettings = true, MysterySettings? mysterySettings = null) { Logger.LogDebug("Recieved request for id {id} to randomize settings {@settings}", id, settings); var args = this.GetArgs(settings); @@ -133,10 +133,16 @@ } }); + if (mysterySettings != null) { + var mysteryJson = JsonSerializer.SerializeToDocument(mysterySettings, JsonOptions.Default); + var mysteryOut = string.Format("{0}/mystery.json", id); + await AzureStorage.UploadFile(mysteryOut, new BinaryData(mysteryJson)); + } + if (uploadSettings) { var settingsJson = JsonSerializer.SerializeToDocument(settings, JsonOptions.Default); var settingsOut = string.Format("{0}/settings.json", id); - await AzureStorage.UploadFile(settingsOut, new BinaryData(settingsJson)); + await AzureStorage.UploadFile(settingsOut, new BinaryData(settingsJson), true); } } diff --git a/ALttPRandomizer/Randomizers/IRandomizer.cs b/ALttPRandomizer/Randomizers/IRandomizer.cs index c784015..50d754f 100644 --- a/ALttPRandomizer/Randomizers/IRandomizer.cs +++ b/ALttPRandomizer/Randomizers/IRandomizer.cs @@ -5,6 +5,6 @@ public interface IRandomizer { public void Validate(SeedSettings settings); - public Task Randomize(string id, SeedSettings settings, bool uploadSettings = true); + public Task Randomize(string id, SeedSettings settings, bool uploadSettings = true, MysterySettings? mysterySettings = null); } } diff --git a/ALttPRandomizer/SeedController.cs b/ALttPRandomizer/SeedController.cs index b92cb75..05c11d3 100644 --- a/ALttPRandomizer/SeedController.cs +++ b/ALttPRandomizer/SeedController.cs @@ -14,28 +14,16 @@ public class SeedController : Controller { public SeedController( RandomizeService randomizeService, - MysteryRandomizer mysteryRandomizer, SeedService seedService, ILogger logger) { this.RandomizeService = randomizeService; - this.MysteryRandomizer = mysteryRandomizer; this.SeedService = seedService; this.Logger = logger; - - this.YamlSerializer = - new SerializerBuilder() - .WithNamingConvention(UnderscoredNamingConvention.Instance) - .WithTypeConverter(new YamlStringEnumConverter()) - .WithTypeConverter(new RandomizableWeightsYamlConverters()) - .ConfigureDefaultValuesHandling(DefaultValuesHandling.OmitNull | DefaultValuesHandling.OmitEmptyCollections) - .Build(); } private RandomizeService RandomizeService { get; } - private MysteryRandomizer MysteryRandomizer { get; } private SeedService SeedService { get; } private ILogger Logger { get; } - private ISerializer YamlSerializer { get; } [Route("/generate")] [HttpPost] @@ -43,6 +31,7 @@ if (!ModelState.IsValid) { return BadRequest(ModelState); } + try { var id = await this.RandomizeService.RandomizeSeed(settings); var url = string.Format("/seed/{0}", id); @@ -54,15 +43,24 @@ [Route("/mystery/{randomizer}")] [HttpPost] - public ActionResult RollMystery([FromBody] MysterySettings mysterySettings, RandomizerInstance randomizer) { + public async Task RollMystery([FromBody] MysterySettings mysterySettings, RandomizerInstance randomizer, bool race) { if (!ModelState.IsValid) { return BadRequest(ModelState); } - var seedSettings = new SeedSettings() { Randomizer = randomizer }; - this.MysteryRandomizer.Roll(mysterySettings, seedSettings); + var baseSettings = new SeedSettings() { + Randomizer = randomizer, + Race = race ? RaceMode.Race : RaceMode.Normal, + Mystery = MysteryMode.Mystery, + }; - return StatusCode(200, this.YamlSerializer.Serialize(mysterySettings)); + try { + var id = await this.RandomizeService.RandomizeMystery(mysterySettings, baseSettings); + var url = string.Format("/seed/{0}", id); + return Accepted(url, id); + } catch (InvalidSettingsException ex) { + return BadRequest(ex.Message); + } } [Route("/multiworld")] diff --git a/ALttPRandomizer/Service/RandomizeService.cs b/ALttPRandomizer/Service/RandomizeService.cs index 774c246..a2ff3dd 100644 --- a/ALttPRandomizer/Service/RandomizeService.cs +++ b/ALttPRandomizer/Service/RandomizeService.cs @@ -2,6 +2,7 @@ using ALttPRandomizer.Azure; using ALttPRandomizer.Model; using ALttPRandomizer.Randomizers; + using ALttPRandomizer.Settings; using Microsoft.Extensions.Logging; using System.Collections.Generic; using System.Text.Json; @@ -11,10 +12,12 @@ public RandomizeService( IdGenerator idGenerator, BaseRandomizer baseRandomizer, + MysteryRandomizer mysteryRandomizer, AzureStorage azureStorage, ILogger logger) { this.IdGenerator = idGenerator; this.BaseRandomizer = baseRandomizer; + this.MysteryRandomizer = mysteryRandomizer; this.AzureStorage = azureStorage; this.Logger = logger; } @@ -23,6 +26,7 @@ private IdGenerator IdGenerator { get; } private BaseRandomizer BaseRandomizer { get; } + private MysteryRandomizer MysteryRandomizer { get; } private AzureStorage AzureStorage { get; } public async Task RandomizeSeed(SeedSettings settings, string? seedId = null) { @@ -35,6 +39,31 @@ return id; } + public async Task RandomizeMystery(MysterySettings mysterySettings, SeedSettings baseSettings, string? seedId = null) { + var id = seedId ?? this.IdGenerator.GenerateId(); + this.Logger.LogDebug("Rolling mystery seed {seedId} with mystery {@settings}", id, mysterySettings); + + SeedSettings seedSettings; + + for (var i = 0; i < 10; i++) { + seedSettings = baseSettings.Clone(); + this.MysteryRandomizer.Roll(mysterySettings, seedSettings); + this.Logger.LogInformation("Mystery seed {seedId} rolled settings {@settings}", id, seedSettings); + + try { + this.BaseRandomizer.Validate(seedSettings); + } catch (InvalidSettingsException) { + this.Logger.LogWarning("Mystery seed {seedId} settings {@settings} failed validation; retrying", id, seedSettings); + continue; + } + + await this.BaseRandomizer.Randomize(id, seedSettings, true, seedId == null ? mysterySettings : null); + return id; + } + + throw new InvalidSettingsException("Could not roll settings that pass validation"); + } + public async Task RandomizeMultiworld(IList settings, string? multiId = null) { var id = multiId ?? this.IdGenerator.GenerateId(); this.Logger.LogInformation("Generating multiworld {seedId} with settings {@settings}", id, settings); diff --git a/BetaRandomizer b/BetaRandomizer index cd5bc9a..5f1c089 160000 --- a/BetaRandomizer +++ b/BetaRandomizer @@ -1 +1 @@ -Subproject commit cd5bc9a2061694513d327484d2cf07971a00116e +Subproject commit 5f1c08920feb86201d9bb84f91bab891723ca375