diff --git a/Directory.Build.props b/Directory.Build.props index ab78b25..eed3379 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,8 +1,8 @@ - net8.0 + net9.0 win-x64 - 12 + 13 enable en false @@ -10,13 +10,11 @@ true $([System.DateTime]::UtcNow.ToString("yyMMddHHmmss")) - none false - portable - + \ No newline at end of file diff --git a/RaidCrawler.Core/Connection/ConnectionWrapper.cs b/RaidCrawler.Core/Connection/ConnectionWrapper.cs index 5f18891..e672ad2 100644 --- a/RaidCrawler.Core/Connection/ConnectionWrapper.cs +++ b/RaidCrawler.Core/Connection/ConnectionWrapper.cs @@ -318,7 +318,7 @@ await Click(DDOWN, config.NavigateToSettingsDelay + BaseDelay, token) .ConfigureAwait(false); UpdateProgressBar(action, steps); - for (int i = 0; i < 5; i++) + for (int i = 0; i < 7; i++) { await Click(DRIGHT, config.NavigateToSettingsDelay + BaseDelay, token) .ConfigureAwait(false); diff --git a/RaidCrawler.Core/Discord/NotificationHandler.cs b/RaidCrawler.Core/Discord/NotificationHandler.cs index 42ac50c..eb921f4 100644 --- a/RaidCrawler.Core/Discord/NotificationHandler.cs +++ b/RaidCrawler.Core/Discord/NotificationHandler.cs @@ -76,22 +76,25 @@ public async Task SendScreenshot(ISwitchConnectionAsync nx, CancellationToken to private object GenerateWebhook(ITeraRaid encounter, Raid raid, RaidFilter filter, string time, IReadOnlyList<(int, int, int)> rewardsList, string hexColor, string spriteName) { - var strings = GameInfo.GetStrings(1); + var strings = GameInfo.GetStrings("en"); var param = encounter.GetParam(); var blank = new PK9 { Species = encounter.Species, Form = encounter.Form }; - Encounter9RNG.GenerateData(blank, param, EncounterCriteria.Unrestricted, raid.Seed); + raid.GenerateDataPK9(blank, param, encounter.Shiny, raid.Seed); + var form = Utils.GetFormString(blank.Species, blank.Form, strings); var species = $"{strings.Species[encounter.Species]}{form}"; var difficulty = Difficulty(encounter.Stars, raid.IsEvent); - var nature = $"{strings.Natures[blank.Nature]}"; + var nature = $"{strings.Natures[(int)blank.Nature]}"; var ability = $"{strings.Ability[blank.Ability]}"; var shiny = Shiny(raid.CheckIsShiny(encounter), ShinyExtensions.IsSquareShinyExist(blank)); var gender = GenderEmoji(blank.Gender); var teratype = raid.GetTeraType(encounter); var tera = $"{strings.types[teratype]}"; var teraemoji = TeraEmoji(strings.types[teratype]); - var ivs = IVsStringEmoji(ToSpeedLast(blank.IVs)); + Span _ivs = stackalloc int[6]; + blank.GetIVs(_ivs); + var ivs = IVsStringEmoji(ToSpeedLast(_ivs)); ushort[] moves = [ encounter.Move1, diff --git a/RaidCrawler.Core/RaidCrawler.Core.csproj b/RaidCrawler.Core/RaidCrawler.Core.csproj index ce15269..284ee25 100644 --- a/RaidCrawler.Core/RaidCrawler.Core.csproj +++ b/RaidCrawler.Core/RaidCrawler.Core.csproj @@ -12,7 +12,7 @@ - + deps\SysBot.Base.dll diff --git a/RaidCrawler.Core/Structures/Raid.cs b/RaidCrawler.Core/Structures/Raid.cs index ed78e0d..ab6182e 100644 --- a/RaidCrawler.Core/Structures/Raid.cs +++ b/RaidCrawler.Core/Structures/Raid.cs @@ -13,26 +13,26 @@ public class Raid(Span Data, TeraRaidMapParent MapParent = TeraRaidMapPare public readonly TeraRaidMapParent MapParent = MapParent; - public bool IsValid => Validate(); - public bool IsActive => ReadUInt32LittleEndian(Data.AsSpan(0x00)) == 1; - public uint Area => ReadUInt32LittleEndian(Data.AsSpan(0x04)); + public bool IsValid => Validate(); + public bool IsActive => ReadUInt32LittleEndian(Data.AsSpan(0x00)) == 1; + public uint Area => ReadUInt32LittleEndian(Data.AsSpan(0x04)); public uint LotteryGroup => ReadUInt32LittleEndian(Data.AsSpan(0x08)); - public uint Den => ReadUInt32LittleEndian(Data.AsSpan(0x0C)); - public uint Seed => ReadUInt32LittleEndian(Data.AsSpan(0x10)); - public uint Flags => ReadUInt32LittleEndian(Data.AsSpan(0x18)); - public bool IsBlack => Flags == 1; - public bool IsEvent => Flags >= 2; + public uint Den => ReadUInt32LittleEndian(Data.AsSpan(0x0C)); + public uint Seed => ReadUInt32LittleEndian(Data.AsSpan(0x10)); + public uint Flags => ReadUInt32LittleEndian(Data.AsSpan(0x18)); + public bool IsBlack => Flags == 1; + public bool IsEvent => Flags >= 2; - public int TeraType => GetTeraType(Seed); - public uint Difficulty => GetDifficulty(Seed); + public int TeraType => GetTeraType(Seed); + public uint Difficulty => GetDifficulty(Seed); - public uint EC => GenericRaidData[0]; - public uint PID => GenericRaidData[2]; - public bool IsShiny => GenericRaidData[3] == 1; + public uint EC => GenericRaidData[0]; + public uint PID => GenericRaidData[2]; + public bool IsShiny => GenericRaidData[3] == 1; private uint[] GenericRaidData => GenerateGenericRaidData(Seed); - public byte[] GetData() => Data; + public byte[] GetData() => Data; private bool Validate() { @@ -47,13 +47,13 @@ private bool Validate() private bool IsValidMap() { - if (MapParent == TeraRaidMapParent.Paldea) - return Area <= 22; - if (MapParent == TeraRaidMapParent.Kitakami) - return Area <= 11; - if (MapParent == TeraRaidMapParent.Blueberry) - return Area <= 8; - return false; + return MapParent switch + { + TeraRaidMapParent.Paldea => Area <= 22, + TeraRaidMapParent.Kitakami => Area <= 11, + TeraRaidMapParent.Blueberry => Area <= 8, + _ => false + }; } private static int GetTeraType(uint Seed) @@ -68,7 +68,7 @@ private static uint[] GenerateGenericRaidData(uint Seed) uint EC = (uint)rng.NextInt(); uint TIDSID = (uint)rng.NextInt(); uint PID = (uint)rng.NextInt(); - bool IsShiny = (((PID >> 16) ^ (PID & 0xFFFF)) >> 4) == ((TIDSID >> 16) ^ (TIDSID & 0xFFFF)) >> 4; + bool IsShiny = ((PID >> 16) ^ (PID & 0xFFFF)) >> 4 == ((TIDSID >> 16) ^ (TIDSID & 0xFFFF)) >> 4; var Shiny = IsShiny ? 1u : 0; return [EC, TIDSID, PID, Shiny]; } @@ -78,4 +78,15 @@ private static uint GetDifficulty(uint Seed) var rng = new Xoroshiro128Plus(Seed); return (uint)rng.NextInt(100); } + + public void GenerateDataPK9(PK9 pk, GenerateParam9 param, Shiny isShiny, uint seed) + { + var criteria = new EncounterCriteria { Shiny = isShiny }; + bool check = Encounter9RNG.GenerateData(pk, param, criteria, seed); + if (!check) + { + criteria = new EncounterCriteria { Shiny = pk.IsShiny ? Shiny.Always : Shiny.Random }; + Encounter9RNG.GenerateData(pk, param, criteria, seed); + } + } } diff --git a/RaidCrawler.Core/Structures/RaidContainer.cs b/RaidCrawler.Core/Structures/RaidContainer.cs index f6ab948..ed5fd10 100644 --- a/RaidCrawler.Core/Structures/RaidContainer.cs +++ b/RaidCrawler.Core/Structures/RaidContainer.cs @@ -58,7 +58,7 @@ public record RaidContainer public RaidContainer(string game) { Game = game; - Strings = GameInfo.GetStrings(1); + Strings = GameInfo.GetStrings("en"); GemTeraRaidsBase = TeraEncounter.GetAllEncounters(RaidDataBase, TeraRaidMapParent.Paldea); GemTeraRaidsKitakami = TeraEncounter.GetAllEncounters(RaidDataKitakami, TeraRaidMapParent.Kitakami); GemTeraRaidsBlueberry = TeraEncounter.GetAllEncounters(RaidDataBlueberry, TeraRaidMapParent.Blueberry); diff --git a/RaidCrawler.Core/Structures/RaidFilter.cs b/RaidCrawler.Core/Structures/RaidFilter.cs index ce25405..6d5da40 100644 --- a/RaidCrawler.Core/Structures/RaidFilter.cs +++ b/RaidCrawler.Core/Structures/RaidFilter.cs @@ -1,4 +1,5 @@ using PKHeX.Core; +using System.Diagnostics.Metrics; namespace RaidCrawler.Core.Structures; @@ -132,7 +133,9 @@ public bool IsIVsSatisfied(PK9 blank) if (IVBin == 0) return true; - var ivs = Utils.ToSpeedLast(blank.IVs); + Span _ivs = stackalloc int[6]; + blank.GetIVs(_ivs); + var ivs = Utils.ToSpeedLast(_ivs); for (int i = 0; i < 6; i++) { var iv = IVVals >> i * 5 & 31; @@ -186,7 +189,8 @@ int SandwichBoost { var param = enc.GetParam(); var blank = new PK9 { Species = enc.Species, Form = enc.Form }; - Encounter9RNG.GenerateData(blank, param, EncounterCriteria.Unrestricted, raid.Seed); + + raid.GenerateDataPK9(blank, param, enc.Shiny, raid.Seed); return Enabled && IsIVsSatisfied(blank) @@ -195,7 +199,7 @@ int SandwichBoost && IsRareECSatisfied(blank) && IsSpeciesSatisfied(blank.Species) && IsFormSatisfied(blank.Form) - && IsNatureSatisfied(blank.Nature) + && IsNatureSatisfied((int)blank.Nature) && IsStarsSatisfied(enc) && IsTeraTypeSatisfied(raid, enc) && IsRewardsSatisfied(container, enc, raid, SandwichBoost) diff --git a/RaidCrawler.Core/Structures/Utils.cs b/RaidCrawler.Core/Structures/Utils.cs index 2c4285d..f92a08f 100644 --- a/RaidCrawler.Core/Structures/Utils.cs +++ b/RaidCrawler.Core/Structures/Utils.cs @@ -1,4 +1,5 @@ using PKHeX.Core; +using System.Numerics; using System.Reflection; namespace RaidCrawler.Core.Structures; @@ -64,6 +65,30 @@ public static byte[] GetBinaryResource(string name) return reader.ReadToEnd(); } + public static Version? GetLatestVersion() + { + const string endpoint = "https://api.github.com/repos/LegoFigure11/RaidCrawler/releases/latest"; + var response = NetUtil.GetStringFromURL(new Uri(endpoint)); + if (response is null) return null; + + const string tag = "tag_name"; + var index = response.IndexOf(tag, StringComparison.Ordinal); + if (index == -1) return null; + + var first = response.IndexOf('"', index + tag.Length + 1) + 1; + if (first == 0) return null; + + var second = response.IndexOf('"', first); + if (second == -1) return null; + + var tagString = response.AsSpan()[first..second].TrimStart('v'); + + var patchIndex = tagString.IndexOf('-'); + if (patchIndex != -1) tagString = tagString.ToString().Remove(patchIndex).AsSpan(); + + return !Version.TryParse(tagString, out var latestVersion) ? null : latestVersion; + } + public static string GetFormString(ushort species, byte form, GameStrings formStrings, EntityContext context = EntityContext.Gen9) { var result = ShowdownParsing.GetStringFromForm(form, formStrings, species, context); diff --git a/RaidCrawler.Tests/RaidCrawler.Tests.csproj b/RaidCrawler.Tests/RaidCrawler.Tests.csproj index b000dd3..a32dee2 100644 --- a/RaidCrawler.Tests/RaidCrawler.Tests.csproj +++ b/RaidCrawler.Tests/RaidCrawler.Tests.csproj @@ -94,6 +94,7 @@ + runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/RaidCrawler.Tests/RaidStatTests.cs b/RaidCrawler.Tests/RaidStatTests.cs index df2112d..d85a10e 100644 --- a/RaidCrawler.Tests/RaidStatTests.cs +++ b/RaidCrawler.Tests/RaidStatTests.cs @@ -2,6 +2,7 @@ using PKHeX.Core; using RaidCrawler.Core.Structures; using System.ComponentModel; +using System.Diagnostics.Metrics; using Xunit; namespace RaidCrawler.Tests; @@ -33,10 +34,13 @@ public void StatsCorrect(string path, int storyPrg, int denIndex, Species specie var param = enc.GetParam(); var blank = new PK9 { Species = enc.Species, Form = enc.Form }; - Encounter9RNG.GenerateData(blank, param, EncounterCriteria.Unrestricted, raid.Seed); - var encIVs = Utils.ToSpeedLast(blank.IVs); + raid.GenerateDataPK9(blank, param, enc.Shiny, raid.Seed); + + Span _ivs = stackalloc int[6]; + blank.GetIVs(_ivs); + var encIVs = Utils.ToSpeedLast(_ivs); encIVs.SequenceEqual(ivs).Should().BeTrue(); - blank.Nature.Should().Be((int)nature); + blank.Nature.Should().Be(nature); blank.IsShiny.Should().Be(shiny); } } diff --git a/RaidCrawler.WinForms/MainWindow.cs b/RaidCrawler.WinForms/MainWindow.cs index c655a2a..c5e7db3 100644 --- a/RaidCrawler.WinForms/MainWindow.cs +++ b/RaidCrawler.WinForms/MainWindow.cs @@ -62,6 +62,8 @@ public partial class MainWindow : Form private bool StopAdvances => !Config.EnableFilters || RaidFilters.Count == 0 || RaidFilters.All(x => !x.Enabled); + private readonly Version CurrentVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version!; + public MainWindow() { Config = new ClientConfig(); @@ -71,7 +73,7 @@ public MainWindow() #else var build = ""; #endif - var v = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version!; + var v = CurrentVersion; var filterPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "filters.json"); if (File.Exists(filterPath)) RaidFilters = JsonSerializer.Deserialize>(File.ReadAllText(filterPath)) ?? []; @@ -195,6 +197,7 @@ private void MainWindow_Load(object sender, EventArgs e) DefaultColor = IVs.BackColor; RaidBoost.SelectedIndex = 0; ToggleStreamerView(); + CheckForUpdates(); } private void InputSwitchIP_Changed(object sender, EventArgs e) @@ -933,9 +936,10 @@ private void DisplayRaid() var param = encounter.GetParam(); var blank = new PK9 { Species = encounter.Species, Form = encounter.Form }; - Encounter9RNG.GenerateData(blank, param, EncounterCriteria.Unrestricted, raid.Seed); + raid.GenerateDataPK9(blank, param, encounter.Shiny, raid.Seed); + var img = blank.Sprite(); - img = ApplyTeraColor((byte)teraType, img, SpriteBackgroundType.BottomStripe); + img = (Bitmap)ApplyTeraColor((byte)teraType, img, SpriteBackgroundType.BottomStripe); var form = ShowdownParsing.GetStringFromForm( encounter.Form, @@ -952,7 +956,7 @@ private void DisplayRaid() Gender.Text = $"{(Gender)blank.Gender}"; var nature = blank.Nature; - Nature.Text = $"{RaidContainer.Strings.Natures[nature]}"; + Nature.Text = $"{RaidContainer.Strings.Natures[(int)nature]}"; Ability.Text = $"{RaidContainer.Strings.Ability[blank.Ability]}"; var extraMoves = new ushort[] { 0, 0, 0, 0 }; @@ -975,8 +979,10 @@ private void DisplayRaid() ? RaidContainer.Strings.Move[extraMoves[3]] : RaidContainer.Strings.Move[encounter.Move4]; - IVs.Text = IVsString(Utils.ToSpeedLast(blank.IVs)); - toolTip.SetToolTip(IVs, IVsString(Utils.ToSpeedLast(blank.IVs), true)); + Span _ivs = stackalloc int[6]; + blank.GetIVs(_ivs); + IVs.Text = IVsString(Utils.ToSpeedLast(_ivs)); + toolTip.SetToolTip(IVs, IVsString(Utils.ToSpeedLast(_ivs), true)); PID.BackColor = raid.CheckIsShiny(encounter) ? Color.Gold : DefaultColor; IVs.BackColor = IVs.Text is "31/31/31/31/31/31" ? Color.YellowGreen : DefaultColor; @@ -1086,7 +1092,8 @@ await this var param = encounter.GetParam(); var blank = new PK9 { Species = encounter.Species, Form = encounter.Form }; - Encounter9RNG.GenerateData(blank, param, EncounterCriteria.Unrestricted, raid.Seed); + raid.GenerateDataPK9(blank, param, encounter.Shiny, raid.Seed); + var img = blank.Sprite(); teraRaidView.picBoxPokemon.Image = img; @@ -1097,7 +1104,7 @@ await this teraRaidView.Gender.Text = $"{(Gender)blank.Gender}"; var nature = blank.Nature; - teraRaidView.Nature.Text = $"{RaidContainer.Strings.Natures[nature]}"; + teraRaidView.Nature.Text = $"{RaidContainer.Strings.Natures[(int)nature]}"; teraRaidView.Ability.Text = $"{RaidContainer.Strings.Ability[blank.Ability]}"; teraRaidView.Move1.Text = @@ -1123,7 +1130,9 @@ await this teraRaidView.Move8.Text = extraMoves[3] > 0 ? RaidContainer.Strings.Move[extraMoves[3]] : "---"; - var ivs = Utils.ToSpeedLast(blank.IVs); + Span _ivs = stackalloc int[6]; + blank.GetIVs(_ivs); + var ivs = Utils.ToSpeedLast(_ivs); // HP teraRaidView.HP.Text = $"{ivs[0]:D2}"; @@ -1818,4 +1827,36 @@ private void B_DateTools_Click(object sender, EventArgs e) } }); } + + + private void CheckForUpdates() + { + Task.Run(async () => + { + Version? latestVersion; + try { latestVersion = Utils.GetLatestVersion(); } + catch (Exception ex) + { + Debug.WriteLine($"Exception while checking for latest version: {ex}"); + return; + } + + if (latestVersion is null || latestVersion <= CurrentVersion) + return; + + while (!IsHandleCreated) // Wait for form to be ready + await Task.Delay(2_000).ConfigureAwait(false); + await InvokeAsync(() => NotifyNewVersionAvailable(latestVersion)); + }); + } + + private void NotifyNewVersionAvailable(Version version) + { + Text += $" - Update v{version.Major}.{version.Minor}.{version.Build} available!"; + UpdateStatus($"Update v{version.Major}.{version.Minor}.{version.Build} available!"); +#if !DEBUG + MessageBox.Show($"Update available! v{version.Major}.{version.Minor}.{version.Build}"); + Process.Start(new ProcessStartInfo("https://github.com/LegoFigure11/RaidCrawler/releases/") { UseShellExecute = true }); +#endif + } } diff --git a/RaidCrawler.WinForms/RaidCrawler.WinForms.csproj b/RaidCrawler.WinForms/RaidCrawler.WinForms.csproj index 2957d3d..6aeccaf 100644 --- a/RaidCrawler.WinForms/RaidCrawler.WinForms.csproj +++ b/RaidCrawler.WinForms/RaidCrawler.WinForms.csproj @@ -2,8 +2,8 @@ WinExe - net8.0-windows - 12 + net9.0-windows + 13 enable true enable @@ -177,6 +177,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/RaidCrawler.WinForms/SubForms/EmojiConfig.cs b/RaidCrawler.WinForms/SubForms/EmojiConfig.cs index fb8c1be..ede8702 100644 --- a/RaidCrawler.WinForms/SubForms/EmojiConfig.cs +++ b/RaidCrawler.WinForms/SubForms/EmojiConfig.cs @@ -26,7 +26,7 @@ private static DataTable EmojiLoad(Dictionary emoji) private void EmojiGrid_Changed(object sender, EventArgs e) { var dict = new Dictionary(); - var dt = (DataTable)EmojiGrid.DataSource; + var dt = (DataTable)EmojiGrid.DataSource!; dt.AsEnumerable().ToList().ForEach(row => dict.Add((string)row[0], (string)row[1])); c.Emoji = dict; } diff --git a/RaidCrawler.WinForms/SubForms/FilterSettings.cs b/RaidCrawler.WinForms/SubForms/FilterSettings.cs index 61932fd..6965c75 100644 --- a/RaidCrawler.WinForms/SubForms/FilterSettings.cs +++ b/RaidCrawler.WinForms/SubForms/FilterSettings.cs @@ -13,13 +13,11 @@ public FilterSettings(ref List filters) { InitializeComponent(); this.filters = filters; - Species.DataSource = Enum.GetValues(typeof(Species)) - .Cast() + Species.DataSource = Enum.GetValues() .Where(z => z != PKHeX.Core.Species.MAX_COUNT) .ToArray(); - Nature.DataSource = Enum.GetValues(typeof(Nature)); - TeraType.DataSource = Enum.GetValues(typeof(MoveType)) - .Cast() + Nature.DataSource = Enum.GetValues(); + TeraType.DataSource = Enum.GetValues() .Where(z => z != MoveType.Any) .ToArray(); diff --git a/RaidCrawler.WinForms/SubForms/ItemIDs.cs b/RaidCrawler.WinForms/SubForms/ItemIDs.cs index 866be51..7bc59b3 100644 --- a/RaidCrawler.WinForms/SubForms/ItemIDs.cs +++ b/RaidCrawler.WinForms/SubForms/ItemIDs.cs @@ -1,4 +1,4 @@ -namespace RaidCrawler.WinForms.SubForms; +namespace RaidCrawler.WinForms.SubForms; public partial class ItemIDs : Form { @@ -8,22 +8,33 @@ public ItemIDs(List IDs) foreach (int ID in IDs) { - if (ID == 645) - CheckAbilityCapsule.Checked = true; - else if (ID == 795) - CheckBottleCap.Checked = true; - else if (ID == 1606) - CheckAbilityPatch.Checked = true; - else if (ID == 1904) - CheckSweet.Checked = true; - else if (ID == 1905) - CheckSalty.Checked = true; - else if (ID == 1906) - CheckSour.Checked = true; - else if (ID == 1907) - CheckBitter.Checked = true; - else if (ID == 1908) - CheckSpicy.Checked = true; + switch (ID) + { + case 645: + CheckAbilityCapsule.Checked = true; + break; + case 795: + CheckBottleCap.Checked = true; + break; + case 1606: + CheckAbilityPatch.Checked = true; + break; + case 1904: + CheckSweet.Checked = true; + break; + case 1905: + CheckSalty.Checked = true; + break; + case 1906: + CheckSour.Checked = true; + break; + case 1907: + CheckBitter.Checked = true; + break; + case 1908: + CheckSpicy.Checked = true; + break; + } } PicCapsule.Image = (Image?) PKHeX.Drawing.PokeSprite.Properties.Resources.ResourceManager.GetObject( @@ -38,4 +49,4 @@ public ItemIDs(List IDs) "aitem_1606" ); } -} \ No newline at end of file +} diff --git a/RaidCrawler.WinForms/deps/PKHeX.Drawing.Misc.dll b/RaidCrawler.WinForms/deps/PKHeX.Drawing.Misc.dll index f8a1f69..1eb2e71 100644 Binary files a/RaidCrawler.WinForms/deps/PKHeX.Drawing.Misc.dll and b/RaidCrawler.WinForms/deps/PKHeX.Drawing.Misc.dll differ diff --git a/RaidCrawler.WinForms/deps/PKHeX.Drawing.PokeSprite.dll b/RaidCrawler.WinForms/deps/PKHeX.Drawing.PokeSprite.dll index e4e526b..fc8517d 100644 Binary files a/RaidCrawler.WinForms/deps/PKHeX.Drawing.PokeSprite.dll and b/RaidCrawler.WinForms/deps/PKHeX.Drawing.PokeSprite.dll differ diff --git a/RaidCrawler.WinForms/deps/PKHeX.Drawing.dll b/RaidCrawler.WinForms/deps/PKHeX.Drawing.dll index a51e6b9..5de1eb2 100644 Binary files a/RaidCrawler.WinForms/deps/PKHeX.Drawing.dll and b/RaidCrawler.WinForms/deps/PKHeX.Drawing.dll differ