Fix code handling of mutually exclusive codes.

This commit is contained in:
Ottermandias 2023-07-24 02:33:08 +02:00
parent 463f4da7ab
commit eea7396946
2 changed files with 43 additions and 1 deletions

View file

@ -103,6 +103,7 @@ public class SettingsTab : ITab
{
action(state);
_config.Codes[i] = (code, state);
_codeService.VerifyState();
_config.Save();
}
}

View file

@ -45,7 +45,8 @@ public class CodeService
}
else
{
enabled(_config.Codes[i].Enabled);
var value = _config.Codes[i].Enabled;
enabled(value);
}
}
@ -87,6 +88,46 @@ public class CodeService
};
}
public void VerifyState()
{
if (EnabledSizing == Sizing.None && EnabledOops == Race.Unknown)
return;
for (var i = 0; i < _config.Codes.Count; ++i)
{
var (code, enabled) = _config.Codes[i];
if (!enabled)
continue;
using var stream = new MemoryStream(Encoding.UTF8.GetBytes(code));
var sha = (ReadOnlySpan<byte>)_hasher.ComputeHash(stream);
var _ = EnabledSizing switch
{
Sizing.Dwarf when sha.SequenceEqual(CodeGiant) => _config.Codes[i] = (code, false),
Sizing.Giant when sha.SequenceEqual(CodeDwarf) => _config.Codes[i] = (code, false),
_ => (string.Empty, false),
};
var race = OopsRace(sha);
if (race is not Race.Unknown && race != EnabledOops)
_config.Codes[i] = (code, false);
}
}
private static Race OopsRace(ReadOnlySpan<byte> sha)
=> sha switch
{
_ when CodeOops1.SequenceEqual(sha) => Race.Hyur,
_ when CodeOops2.SequenceEqual(sha) => Race.Elezen,
_ when CodeOops3.SequenceEqual(sha) => Race.Lalafell,
_ when CodeOops4.SequenceEqual(sha) => Race.Miqote,
_ when CodeOops5.SequenceEqual(sha) => Race.Roegadyn,
_ when CodeOops6.SequenceEqual(sha) => Race.AuRa,
_ when CodeOops7.SequenceEqual(sha) => Race.Hrothgar,
_ when CodeOops8.SequenceEqual(sha) => Race.Viera,
_ => Race.Unknown,
};
// @formatter:off
private static ReadOnlySpan<byte> CodeClown => new byte[] { 0xC4, 0xEE, 0x1D, 0x6F, 0xC5, 0x5D, 0x47, 0xBE, 0x78, 0x63, 0x66, 0x86, 0x81, 0x15, 0xEB, 0xFA, 0xF6, 0x4A, 0x90, 0xEA, 0xC0, 0xE4, 0xEE, 0x86, 0x69, 0x01, 0x8E, 0xDB, 0xCC, 0x69, 0xD1, 0xBD };
private static ReadOnlySpan<byte> CodeEmperor => new byte[] { 0xE2, 0x2D, 0x3E, 0x57, 0x16, 0x82, 0x65, 0x98, 0x7E, 0xE6, 0x8F, 0x45, 0x14, 0x7D, 0x65, 0x31, 0xE9, 0xD8, 0xDB, 0xEA, 0xDC, 0xBF, 0xEE, 0x2A, 0xBA, 0xD5, 0x69, 0x96, 0x78, 0x34, 0x3B, 0x57 };