Mystery setup
This commit is contained in:
@@ -24,8 +24,9 @@
|
|||||||
await BlobClient.UploadBlobAsync(name, data);
|
await BlobClient.UploadBlobAsync(name, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task UploadFile(string name, BinaryData data) {
|
public async Task UploadFile(string name, BinaryData data, bool overwrite = false) {
|
||||||
await BlobClient.UploadBlobAsync(name, data);
|
var client = BlobClient.GetBlobClient(name);
|
||||||
|
await client.UploadAsync(data, overwrite);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task UploadFileFromSource(string name, string filepath) {
|
public async Task UploadFileFromSource(string name, string filepath) {
|
||||||
|
|||||||
@@ -14,6 +14,9 @@
|
|||||||
[NoSettingName]
|
[NoSettingName]
|
||||||
public RaceMode Race { get; set; } = RaceMode.Normal;
|
public RaceMode Race { get; set; } = RaceMode.Normal;
|
||||||
|
|
||||||
|
[NoSettingName]
|
||||||
|
public MysteryMode Mystery { get; set; } = MysteryMode.Normal;
|
||||||
|
|
||||||
[ForbiddenSetting([Apr2025], Mode.Inverted)]
|
[ForbiddenSetting([Apr2025], Mode.Inverted)]
|
||||||
[RequiredSetting([Pikit], Mode.Open)]
|
[RequiredSetting([Pikit], Mode.Open)]
|
||||||
public Mode Mode { get; set; } = Mode.Open;
|
public Mode Mode { get; set; } = Mode.Open;
|
||||||
@@ -204,6 +207,12 @@
|
|||||||
|
|
||||||
[NoSettingName]
|
[NoSettingName]
|
||||||
public Hints Hints { get; set; } = Hints.Off;
|
public Hints Hints { get; set; } = Hints.Off;
|
||||||
|
|
||||||
|
public SeedSettings Clone() {
|
||||||
|
var newSettings = (SeedSettings) this.MemberwiseClone();
|
||||||
|
|
||||||
|
return newSettings;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum RandomizerInstance {
|
public enum RandomizerInstance {
|
||||||
@@ -218,6 +227,11 @@
|
|||||||
[AdditionalSetting("--securerandom")] Race,
|
[AdditionalSetting("--securerandom")] Race,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum MysteryMode {
|
||||||
|
Normal,
|
||||||
|
[AdditionalSetting("--mystery")] Mystery,
|
||||||
|
}
|
||||||
|
|
||||||
public enum Mode {
|
public enum Mode {
|
||||||
Open,
|
Open,
|
||||||
Standard,
|
Standard,
|
||||||
|
|||||||
@@ -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);
|
Logger.LogDebug("Recieved request for id {id} to randomize settings {@settings}", id, settings);
|
||||||
|
|
||||||
var args = this.GetArgs(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) {
|
if (uploadSettings) {
|
||||||
var settingsJson = JsonSerializer.SerializeToDocument(settings, JsonOptions.Default);
|
var settingsJson = JsonSerializer.SerializeToDocument(settings, JsonOptions.Default);
|
||||||
var settingsOut = string.Format("{0}/settings.json", id);
|
var settingsOut = string.Format("{0}/settings.json", id);
|
||||||
await AzureStorage.UploadFile(settingsOut, new BinaryData(settingsJson));
|
await AzureStorage.UploadFile(settingsOut, new BinaryData(settingsJson), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,6 @@
|
|||||||
public interface IRandomizer {
|
public interface IRandomizer {
|
||||||
public void Validate(SeedSettings settings);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,28 +14,16 @@
|
|||||||
public class SeedController : Controller {
|
public class SeedController : Controller {
|
||||||
public SeedController(
|
public SeedController(
|
||||||
RandomizeService randomizeService,
|
RandomizeService randomizeService,
|
||||||
MysteryRandomizer mysteryRandomizer,
|
|
||||||
SeedService seedService,
|
SeedService seedService,
|
||||||
ILogger<SeedController> logger) {
|
ILogger<SeedController> logger) {
|
||||||
this.RandomizeService = randomizeService;
|
this.RandomizeService = randomizeService;
|
||||||
this.MysteryRandomizer = mysteryRandomizer;
|
|
||||||
this.SeedService = seedService;
|
this.SeedService = seedService;
|
||||||
this.Logger = logger;
|
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 RandomizeService RandomizeService { get; }
|
||||||
private MysteryRandomizer MysteryRandomizer { get; }
|
|
||||||
private SeedService SeedService { get; }
|
private SeedService SeedService { get; }
|
||||||
private ILogger<SeedController> Logger { get; }
|
private ILogger<SeedController> Logger { get; }
|
||||||
private ISerializer YamlSerializer { get; }
|
|
||||||
|
|
||||||
[Route("/generate")]
|
[Route("/generate")]
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
@@ -43,6 +31,7 @@
|
|||||||
if (!ModelState.IsValid) {
|
if (!ModelState.IsValid) {
|
||||||
return BadRequest(ModelState);
|
return BadRequest(ModelState);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
var id = await this.RandomizeService.RandomizeSeed(settings);
|
var id = await this.RandomizeService.RandomizeSeed(settings);
|
||||||
var url = string.Format("/seed/{0}", id);
|
var url = string.Format("/seed/{0}", id);
|
||||||
@@ -54,15 +43,24 @@
|
|||||||
|
|
||||||
[Route("/mystery/{randomizer}")]
|
[Route("/mystery/{randomizer}")]
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public ActionResult RollMystery([FromBody] MysterySettings mysterySettings, RandomizerInstance randomizer) {
|
public async Task<ObjectResult> RollMystery([FromBody] MysterySettings mysterySettings, RandomizerInstance randomizer, bool race) {
|
||||||
if (!ModelState.IsValid) {
|
if (!ModelState.IsValid) {
|
||||||
return BadRequest(ModelState);
|
return BadRequest(ModelState);
|
||||||
}
|
}
|
||||||
|
|
||||||
var seedSettings = new SeedSettings() { Randomizer = randomizer };
|
var baseSettings = new SeedSettings() {
|
||||||
this.MysteryRandomizer.Roll(mysterySettings, 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")]
|
[Route("/multiworld")]
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
using ALttPRandomizer.Azure;
|
using ALttPRandomizer.Azure;
|
||||||
using ALttPRandomizer.Model;
|
using ALttPRandomizer.Model;
|
||||||
using ALttPRandomizer.Randomizers;
|
using ALttPRandomizer.Randomizers;
|
||||||
|
using ALttPRandomizer.Settings;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
@@ -11,10 +12,12 @@
|
|||||||
public RandomizeService(
|
public RandomizeService(
|
||||||
IdGenerator idGenerator,
|
IdGenerator idGenerator,
|
||||||
BaseRandomizer baseRandomizer,
|
BaseRandomizer baseRandomizer,
|
||||||
|
MysteryRandomizer mysteryRandomizer,
|
||||||
AzureStorage azureStorage,
|
AzureStorage azureStorage,
|
||||||
ILogger<RandomizeService> logger) {
|
ILogger<RandomizeService> logger) {
|
||||||
this.IdGenerator = idGenerator;
|
this.IdGenerator = idGenerator;
|
||||||
this.BaseRandomizer = baseRandomizer;
|
this.BaseRandomizer = baseRandomizer;
|
||||||
|
this.MysteryRandomizer = mysteryRandomizer;
|
||||||
this.AzureStorage = azureStorage;
|
this.AzureStorage = azureStorage;
|
||||||
this.Logger = logger;
|
this.Logger = logger;
|
||||||
}
|
}
|
||||||
@@ -23,6 +26,7 @@
|
|||||||
|
|
||||||
private IdGenerator IdGenerator { get; }
|
private IdGenerator IdGenerator { get; }
|
||||||
private BaseRandomizer BaseRandomizer { get; }
|
private BaseRandomizer BaseRandomizer { get; }
|
||||||
|
private MysteryRandomizer MysteryRandomizer { get; }
|
||||||
private AzureStorage AzureStorage { get; }
|
private AzureStorage AzureStorage { get; }
|
||||||
|
|
||||||
public async Task<string> RandomizeSeed(SeedSettings settings, string? seedId = null) {
|
public async Task<string> RandomizeSeed(SeedSettings settings, string? seedId = null) {
|
||||||
@@ -35,6 +39,31 @@
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<string> 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<string> RandomizeMultiworld(IList<SeedSettings> settings, string? multiId = null) {
|
public async Task<string> RandomizeMultiworld(IList<SeedSettings> settings, string? multiId = null) {
|
||||||
var id = multiId ?? this.IdGenerator.GenerateId();
|
var id = multiId ?? this.IdGenerator.GenerateId();
|
||||||
this.Logger.LogInformation("Generating multiworld {seedId} with settings {@settings}", id, settings);
|
this.Logger.LogInformation("Generating multiworld {seedId} with settings {@settings}", id, settings);
|
||||||
|
|||||||
+1
-1
Submodule BetaRandomizer updated: cd5bc9a206...5f1c08920f
Reference in New Issue
Block a user