diff --git a/.gitignore b/.gitignore
index a2897ba..f1ae6ac 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
.vs/
bin/
obj/
-.DS_Store
\ No newline at end of file
+.DS_Store
+.idea/
diff --git a/App.config b/App.config
deleted file mode 100644
index 5744095..0000000
--- a/App.config
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Gen3EventChecker.csproj b/Gen3EventChecker.csproj
deleted file mode 100644
index e3a0a1b..0000000
--- a/Gen3EventChecker.csproj
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
-
-
- Debug
- AnyCPU
- {ED21498D-7F99-43AE-969E-17429245DA4B}
- Exe
- Gen3EventChecker
- Gen3EventChecker
- v4.7
- 512
- true
-
-
- AnyCPU
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
-
-
- AnyCPU
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Gen3EventChecker.sln b/Gen3EventChecker.sln
deleted file mode 100644
index cef60ca..0000000
--- a/Gen3EventChecker.sln
+++ /dev/null
@@ -1,41 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.26730.16
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gen3EventChecker", "Gen3EventChecker.csproj", "{ED21498D-7F99-43AE-969E-17429245DA4B}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {ED21498D-7F99-43AE-969E-17429245DA4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {ED21498D-7F99-43AE-969E-17429245DA4B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {ED21498D-7F99-43AE-969E-17429245DA4B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {ED21498D-7F99-43AE-969E-17429245DA4B}.Release|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {D1CA7E5B-3524-41DD-AFD5-05C48B8ACE33}
- EndGlobalSection
- GlobalSection(MonoDevelopProperties) = preSolution
- Policies = $0
- $0.TextStylePolicy = $1
- $1.FileWidth = 80
- $1.TabWidth = 2
- $1.TabsToSpaces = True
- $1.IndentWidth = 2
- $1.NoTabsAfterNonTabs = True
- $1.scope = text/x-csharp
- $0.CSharpFormattingPolicy = $2
- $2.scope = text/x-csharp
- $0.TextStylePolicy = $3
- $3.FileWidth = 80
- $3.TabsToSpaces = True
- $3.scope = text/plain
- EndGlobalSection
-EndGlobal
diff --git a/Gen3EventLegality.csproj b/Gen3EventLegality.csproj
new file mode 100644
index 0000000..d453e9a
--- /dev/null
+++ b/Gen3EventLegality.csproj
@@ -0,0 +1,8 @@
+
+
+
+ Exe
+ netcoreapp3.1
+
+
+
diff --git a/Gen3EventLegality.sln b/Gen3EventLegality.sln
new file mode 100644
index 0000000..2b32da4
--- /dev/null
+++ b/Gen3EventLegality.sln
@@ -0,0 +1,17 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gen3EventLegality", "Gen3EventLegality.csproj", "{CC4EC424-55B4-425F-AAD7-0457A12AF2A8}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {CC4EC424-55B4-425F-AAD7-0457A12AF2A8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CC4EC424-55B4-425F-AAD7-0457A12AF2A8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CC4EC424-55B4-425F-AAD7-0457A12AF2A8}.Debug|Any CPU.ActiveCfg = Release|Any CPU
+ {CC4EC424-55B4-425F-AAD7-0457A12AF2A8}.Debug|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+EndGlobal
diff --git a/Program.cs b/Program.cs
index 9c6b14c..d11529b 100644
--- a/Program.cs
+++ b/Program.cs
@@ -1,896 +1,842 @@
-using System;
-using System.Linq;
-using System.Globalization;
-using System.Collections.Generic;
-
-public class Gen3EventChecker
+using System;
+using System.Linq;
+using System.Globalization;
+using System.Collections.Generic;
+
+namespace Gen3EventLegality
{
- private static string version = "1.2";
-
- [Flags]
- public enum Algo : ulong
- {
- Unknown = 0x00000000,
- WSHMKR = 0x00000010,
- Offset = 0x00000020,
- ForceShiny = 0x00000040,
- RandOTG1 = 0x00000080, // X / 3 & 1
- RandOTG2 = 0x00000100, // X >> 3 & 1
- BACDPIDIV = 0x00000200,
- RandOTG3 = 0x00000400, // X >> 7 & 1
- WCEggs = 0x00000800,
- LimitRange = 0x00001000,
- PokeParkEggs = 0x00002000,
- DSPlay = 0x00004000,
- BerryGlitch = 0x00008000,
- NoIVs = 0x00010000,
- PCJP2003 = 0x00020000,
- CanBeShiny = 0x00040000,
- RandItem1 = 0x00080000, // X / 3 & 1
- RandItem2 = 0x00100000, // X >> 3 & 1
- RandItem3 = 0x00200000, // X >> 7 & 1
- MaleOTG = 0x00400000,
- FemaleOTG = 0x00800000,
- ItemFirst = 0x01000000, // OTG1/2 generally use this
- Stamp = 0x02000000, // Absol Item
- DFABPIDIV = 0x04000000,
- Box = 0x08000000,
- BatchGen = 0x10000000, // Mystry Mew
- ForceAntiShiny = 0x20000000,
- UnknownOTG = 0x40000000,
- }
-
- public static Dictionary EventOptions = new Dictionary
- {
- { "5th Anniv Eggs", Algo.PCJP2003 | Algo.BACDPIDIV | Algo.Offset },
- { "PCJP 2004/PCNY WISH Eggs", Algo.WCEggs },
- { "PokePark 2005 Eggs", Algo.PokeParkEggs | Algo.CanBeShiny },
- { "Pokemon Box Eggs", Algo.Box | Algo.BACDPIDIV },
- { "E-Reader", Algo.DFABPIDIV | Algo.NoIVs | Algo.CanBeShiny },
- { "PCNYbcd", Algo.ForceAntiShiny },
- { "None", Algo.Unknown }
- };
-
- public static Dictionary> EventsByID = new Dictionary> {
- { 30719, Tuple.Create("Wishing Star Jirachi", Algo.BACDPIDIV | Algo.Offset | Algo.RandItem1 | Algo.MaleOTG) },
-
- { 20043, Tuple.Create("Wishmaker/METEOR Jirachi (20043)", Algo.BACDPIDIV | Algo.WSHMKR | Algo.RandItem1 | Algo.CanBeShiny) },
-
- { 30317, Tuple.Create("English Berry Glitch Zigzagoon", Algo.BerryGlitch | Algo.BACDPIDIV | Algo.ForceShiny | Algo.LimitRange) },
-
- { 21121, Tuple.Create("Japanese Berry Glitch Zigzagoon", Algo.BerryGlitch | Algo.BACDPIDIV | Algo.ForceShiny | Algo.LimitRange) },
-
- { 30821, Tuple.Create("Stamp", Algo.BACDPIDIV | Algo.RandItem1 | Algo.FemaleOTG) },
-
- { 40707, Tuple.Create("2004 Tanabata Jirachi", Algo.BACDPIDIV | Algo.RandItem1 | Algo.FemaleOTG) },
-
- { 41205, Tuple.Create("ANA Pikachu", Algo.BACDPIDIV | Algo.MaleOTG) },
-
- { 50319, Tuple.Create("Yokohama Pikachu", Algo.BACDPIDIV | Algo.MaleOTG) },
-
- { 50701, Tuple.Create("Sapporo Pikachu / Sunday Wobbuffet", Algo.BACDPIDIV | Algo.RandOTG2) },
-
- { 50318, Tuple.Create("Pokepark Meowth", Algo.BACDPIDIV | Algo.MaleOTG) },
-
- { 50716, Tuple.Create("Hado Mew", Algo.BACDPIDIV | Algo.RandOTG1) },
-
- { 50707, Tuple.Create("2005 Tanabata Jirachi", Algo.BACDPIDIV | Algo.RandItem1 | Algo.FemaleOTG) },
-
- { 50425, Tuple.Create("GW Pikachu", Algo.BACDPIDIV | Algo.RandOTG2) },
-
- { 2005, Tuple.Create("Festa/ROCKS Metang", Algo.BACDPIDIV | Algo.MaleOTG) },
-
- { 50901, Tuple.Create("Hado Titans", Algo.DSPlay | Algo.ItemFirst | Algo.BACDPIDIV | Algo.UnknownOTG) },
-
- { 60505, Tuple.Create("GCEA 6th Campaign", Algo.BACDPIDIV | Algo.RandOTG3) },
-
- { 60321, Tuple.Create("GCEA 5th Campaign", Algo.BACDPIDIV | Algo.RandOTG3) },
-
- { 60227, Tuple.Create("GCEA 4th Campaign", Algo.BACDPIDIV | Algo.RandOTG3) },
-
- { 60114, Tuple.Create("GCEA 3rd Campaign", Algo.BACDPIDIV | Algo.RandOTG3) },
-
- { 51224, Tuple.Create("GCEA 2nd Campaign", Algo.BACDPIDIV | Algo.RandOTG3) },
-
- { 51126, Tuple.Create("GCEA 1st Campaign", Algo.BACDPIDIV | Algo.RandOTG3) },
-
- { 60707, Tuple.Create("2006 Tanabata Jirachi", Algo.BACDPIDIV | Algo.RandOTG3 | Algo.RandItem3) },
-
- { 60623, Tuple.Create("Pokepark Celebi", Algo.BACDPIDIV | Algo.RandOTG3) },
-
- { 60510, Tuple.Create("Pokepark Mew", Algo.BACDPIDIV | Algo.RandOTG1) },
-
- { 60720, Tuple.Create("Misturin Celebi", Algo.BACDPIDIV | Algo.RandOTG3) },
-
- { 60731, Tuple.Create("Pokepark Jirachi (1st Distribution)", Algo.BACDPIDIV | Algo.RandOTG1) },
-
- { 60830, Tuple.Create("Pokepark Jirachi (2nd Distribution)", Algo.BACDPIDIV | Algo.RandOTG1) },
-
- { 28606, Tuple.Create("DOEL Doexys", Algo.BACDPIDIV | Algo.RandOTG3) },
-
- { 10, Tuple.Create("JAA & SPACE C", Algo.BACDPIDIV | Algo.RandOTG3) },
-
- { 6808, Tuple.Create("Bryant Park", Algo.BACDPIDIV | Algo.RandOTG3) },
-
- { 6227, Tuple.Create("Top 10", Algo.BACDPIDIV | Algo.RandOTG3) },
-
- { 20078, Tuple.Create("Aura Mew", Algo.BACDPIDIV | Algo.RandOTG3) },
-
- { 31121, Tuple.Create("Ageto Celebi, Colos Pikachu", Algo.DFABPIDIV) },
-
- { 10048, Tuple.Create("Mattle Ho-Oh", Algo.DFABPIDIV) },
-
- { 6930, Tuple.Create("Mystery Mew", Algo.BACDPIDIV | Algo.BatchGen | Algo.RandOTG1) }
- };
-
- public static uint[] MystryMewSeeds = {
- 0x5189E6C6, 0x00005E2B, 0x5ADFDAC6, 0x83A723B5, 0x8AF5BCA8,
- 0xA587868F, 0xE8D1A0BF, 0x0000E6CC, 0x39AEB123, 0xF6B75FDE,
- 0xFF889A6D, 0x0ACAC680, 0x00005841, 0xD30AA204, 0x65E00D7B,
- 0x3BCB20D6, 0x077B5585, 0x000020BF, 0x849ED80A, 0xE1289CE9,
- 0x329A3E0C, 0x08027B63, 0x0000E95D, 0xF29915B0, 0x9E85FD77,
- 0xA8502FE2, 0xC9F74B61, 0x000034F3, 0xFB06486E, 0xAA4E84BD,
- 0x322A1B90, 0xDF9B63D7, 0x00005327, 0xBE401AD2, 0x8F25C691,
- 0x464C6B14, 0x8029764B, 0x00009D9C, 0x0DD7C0B3, 0x0A70952E,
- 0xC0F8CE7D, 0x1F3BAE50, 0x0000643F, 0x8B2AED8A, 0xDC15BC69,
- 0xFD76BF8C, 0x547956E3, 0x00005A60, 0x9E22DB67, 0x930C9212,
- 0x84A830D1, 0x0681BC54, 0x0000C2D4, 0xE8905F0B, 0x724F1026,
- 0x1189DB95, 0x61928D08, 0x0000D1E4, 0x15E075DB, 0x0D9EFFB6,
- 0x688670E5, 0x7D10A118, 0x000078D2, 0x726C2C91, 0x60C2B914,
- 0x224A0C4B, 0x21875866, 0x0000A443, 0x8BBF4E7E, 0xB029768D,
- 0x2F283A20, 0x09512C27, 0x00001C09, 0x7AD488AC, 0x71834383,
- 0x3BE940BE, 0x908A2FCD, 0x0000C385, 0xD3135138, 0xC4EC6CDF,
- 0x2675FBAA, 0x3B111A09, 0x0000FE9D, 0x15D825F0, 0xB95EDCB7,
- 0x34076222, 0xF50044A1, 0x000046CE, 0x43CB219D, 0x19DA7CF0,
- 0x0D6597B7, 0xB939F122, 0x0000302D, 0x37277540, 0x48E342C7,
- 0x835833F2, 0x7A14C331, 0x00009C40, 0xBE998DC7, 0xFFE012F2,
- 0x9C2CE631, 0x2583F434, 0x000095A0, 0xB21AF9A7, 0xE3EDC752,
- 0x5E8BE111, 0x9394BB94, 0x00004B63, 0xEDCB211E, 0xB6D7A6AD,
- 0x6852B1C0, 0xB5B4AD47, 0x00007667, 0xB3728112, 0x372A23D1,
- 0xEED0A354, 0xF7BCDD8B, 0x0000EE7F, 0x646DDECA, 0xEE2338A9,
- 0xF9DF5ACC, 0x48505523, 0x000050AB, 0x5990A346, 0x84AAEA35,
- 0x2F300928, 0xC96FC10F, 0x00000C13, 0x9A9D8B0E, 0x02B664DD,
- 0xCE138330, 0xB6FE14F7, 0x00008A92, 0xE12E6751, 0x9850B8D4,
- 0x66CDFD0B, 0x396DB626, 0x00009E86, 0x6F43C875, 0x9A5EFE68,
- 0x85DA314F, 0x58CD4A5A, 0x0000C953, 0x9544A34E, 0xBB992C1D,
- 0xB366FD70, 0x78843637, 0x0000508E, 0xA84B745D, 0x6E7434B0,
- 0x41746077, 0xC9F5C6E2, 0x00009690, 0x994EB2D7, 0x0E8667C2,
- 0x28799BC1, 0x866BB784, 0x000056CC, 0x810C6123, 0x018A4FDE,
- 0xD74BCA6D, 0x89CD3680, 0x0000CD96, 0xC59B7F45, 0xC1800DF8,
- 0x1EAB669F, 0x90F57E6A, 0x0000AFFB, 0xD5C5D956, 0xC49D4C05,
- 0x0B43D7B8, 0xE4D0795F, 0x000067A3, 0x7A03DC5E, 0x984644ED,
- 0x82706700, 0x0702DD87, 0x0000C6CE, 0xE7E9A19D, 0x491EFCF0,
- 0x14B817B7, 0x2BE27122, 0x0000E62C, 0xF4E18B03, 0x84FC4A3E,
- 0xCE3F734D, 0xBE3B73E0, 0x00006E62, 0x0F0A2FE1, 0xA8A80324,
- 0x04D1321B, 0xD62DDAF6, 0x0000B1F2, 0xCFAAC931, 0x955B0B34,
- 0x87CE9DEB, 0x10B30B86, 0x00000652, 0xCF9CE411, 0x307A7294,
- 0x76BD3FCB, 0x8AF69DE6, 0x0000CC43, 0xBF08D67E, 0x1EEEDE8D,
- 0x81720220, 0x2D25D427, 0x000093D0, 0x9DC80B17, 0x80826F02,
- 0x82D15601, 0x9BF518C4, 0x0000A8AC, 0xB606E383, 0x344660BE,
- 0x0FBACFCD, 0xB7247E60, 0x0000EE9F, 0xD896E66A, 0xD1AF09C9,
- 0x6A212F6C, 0x246CFF43, 0x00008B48, 0x65D7C2AF, 0x967BEE3A,
- 0x55446659, 0x2D50BDBC, 0x00000EEE, 0x7026D13D, 0xC8B85610,
- 0x0A735457, 0x632CE342, 0x0000B831, 0x940CFE34, 0x178D84EB,
- 0x49281686, 0x6F6B6075, 0x00005BC1, 0x87877784, 0x492AECFB,
- 0x82FE6256, 0x1A9DF105, 0x0000941D, 0x7D4AC570, 0x6C0ADE37,
- 0x98EFBDA2, 0x659A1221, 0x0000CD47, 0x0ED63472, 0xF7BEE1B1,
- 0xB188E1B4, 0x898EBA6B, 0x0000EBB2, 0x71B68BF1, 0x3BAE72F4,
- 0x1E9C56AB, 0x4C6E1146, 0x00004A0D, 0x24549FA0, 0x46F15BA7,
- 0x48932152, 0x75425311, 0x00009C37, 0x75EE03A2, 0x97E0C021,
- 0x149A6264, 0x8F9BE45B, 0x0000F0E4, 0x9D9FD8DB, 0x7D1196B6,
- 0x284C6BE5, 0xB8D57018, 0x00001614, 0xD311354B, 0x0D841D66,
- 0x0E2803D5, 0x1ED42448, 0x0000E90A, 0x8D4EA9E9, 0x1853570C,
- 0x8D257063, 0x470CF21E, 0x0000BE96, 0x525FEC45, 0x17F606F8,
- 0x7FCFBB9F, 0x6385BF6A, 0x00002389, 0xB472522C, 0xC6484703,
- 0x8B57163E, 0x27420F4D, 0x0000AC08, 0x47D5906F, 0x7793F4FA,
- 0x38A40219, 0x72A6DA7C, 0x000056BA, 0xEFB54CD9, 0x318BAA3C,
- 0xC826C2D3, 0x5DFD16CE, 0x00005240, 0x1FB7EBC7, 0xCC8C78F2,
- 0x03F13431, 0x233A8A34, 0x00006E06, 0x611439F5, 0xBA7609E8,
- 0x6213EECF, 0xBD5B71DA, 0x000045F3, 0xB0D2556E, 0x8C959DBD,
- 0xD5231090, 0xCED5C4D7, 0x00006944, 0x4BBA87BB, 0x157C4216,
- 0x614A41C5, 0xD3586678, 0x0000C962, 0x63B7DEE1, 0xBE42B624,
- 0x4005D91B, 0xC7B1A5F6, 0x0000DFED, 0x307F5600, 0x02C9D087,
- 0x0CE5FAB2, 0x5F831EF1, 0x00002939, 0xD9BD2D1C, 0xB7A1F233,
- 0xFF0A60AE, 0xC65A4BFD, 0x0000EFC8, 0x36B3B52F, 0x3998B6BA,
- 0xE4042CD9, 0x77570A3C, 0x00006457, 0xA249B342, 0x46BE9941,
- 0x11A81F04, 0x398ED67B, 0x00009DE4, 0x533411DB, 0x4A6B2BB6,
- 0xFD8CECE5, 0xCE7C2D18, 0x00004C79, 0xCEEF935C, 0x5FA64F73,
- 0xA78E98EE, 0x3DEDB33D, 0x000013C9, 0x8840916C, 0xC7775943,
- 0x4AF06F7E, 0xD126538D, 0x0000A153, 0x61FB1B4E, 0x4CD3C41D,
- 0x611D3570, 0x54AF8E37, 0x0000E991, 0xCF5BC214, 0x3049314B,
- 0x7EBB2966, 0x0FA5DFD5, 0x000077EF, 0x82691E7A, 0x5A9AE599,
- 0x8DF70FFC, 0x401C0193, 0x0000C92C, 0xAFB2A203, 0x4E46C53E,
- 0x1296C24D, 0x444146E0, 0x00000D43, 0x6A23537E, 0xF466A78D,
- 0x7884E720, 0x620E6527, 0x00008655, 0x369F3CC8, 0x2D140E2F,
- 0x0095EBBA, 0xDA41CDD9, 0x0000FE4E, 0x5F12DB1D, 0xEF9DB070,
- 0xC6E4DD37, 0xED9980A2, 0x0000306E, 0x0B1ACCBD, 0xFF174390,
- 0x8F5DEBD7, 0xD12EFCC2, 0x00001263, 0x04B58C1E, 0x65CB25AD,
- 0x730FF4C0, 0xA2A5A447, 0x00001EA5, 0x53AD07D8, 0x5F89F0FF,
- 0xC347774A, 0x23608F29, 0x0000967D, 0x1C565650, 0x4F6B6397,
- 0xEDD28582, 0xBBBAB281, 0x00005EF3, 0x70E04A6E, 0x51D0FEBD,
- 0x88912D90, 0xC53AADD7, 0x00000932, 0x3F4C9371, 0xA20A3C74,
- 0x8CA75A2B, 0x00006065, 0xFFFAB298, 0x6A8A580A, 0x66461CE9,
- };
-
- public static void Main(string[] args)
- {
- Console.WriteLine("3rd Gen Legality Checker by Sabresite (v{0})", version);
- Tuple option;
- uint TID;
-
- Console.WriteLine("If an egg event or PCNY, press enter");
- Console.Write("TID:");
- bool gotTID = GetNumber(out TID);
- bool foundEvent = EventsByID.TryGetValue(TID, out option);
-
- if (!(gotTID && foundEvent))
- {
- if (gotTID)
- Console.WriteLine("Could not find event by TID. Maybe it is an egg event or PCNY?");
-
- int index;
- Dictionary.KeyCollection keys = EventOptions.Keys;
- do
- {
- int count = 0;
- foreach (string eventName in keys)
- Console.WriteLine("{0}. {1}", (++count).ToString().PadLeft(2), eventName);
-
- Console.Write("----------\nChoose an event by number:");
- } while (!Int32.TryParse(Console.ReadLine(), out index) || index < 0 || index > EventOptions.Keys.Count);
-
- KeyValuePair choice = EventOptions.ElementAt(index - 1);
-
- if (choice.Value == Algo.Unknown)
- return;
-
- option = Tuple.Create(choice.Key, choice.Value);
- }
-
- Algo algo = option.Item2;
-
- bool forcedShiny = Has(algo, Algo.ForceShiny);
- bool WCEggs = Has(algo, Algo.WCEggs);
- bool hasOffset = Has(algo, Algo.Offset);
- bool berryGlitch = Has(algo, Algo.BerryGlitch);
- bool XDAlgo = Has(algo, Algo.DFABPIDIV);
- bool Box = Has(algo, Algo.Box);
- bool mystryMew = TID == 6930;
- bool batchGen = Has(algo, Algo.BatchGen);
- bool noIVs = Has(algo, Algo.NoIVs);
- bool forceAntishiny = Has(algo, Algo.ForceAntiShiny);
-
- List> PIDTIDs = new List>();
- bool finished;
- do
- {
- Console.Write("PID :");
- uint pid, tid, sid;
- finished = !GetNumber(out pid, out tid, out sid);
- if (!finished) PIDTIDs.Add(new Tuple(pid, tid > 0 ? tid : TID, sid));
- } while (!finished);
-
- Console.WriteLine("----------");
-
- uint seedRange = Has(algo, Algo.LimitRange) ? 0x100u : 0x10000u;
-
- uint rand1, rand1a, rand1b, rand2, rand3, rand4, rand5, rand6;
-
- for (int p = 0; p < PIDTIDs.Count; p++)
- {
- uint PID = PIDTIDs[p].Item1;
- TID = PIDTIDs[p].Item2;
- uint SID = PIDTIDs[p].Item3;
-
- bool found = false;
-
- if (XDAlgo)
- {
- bool another = false;
-
- // XD - Do it backwards - DFAB
- for (uint i = 0; XDAlgo && i < seedRange; i++)
- {
- uint pid;
- uint seed = ((PID & 0xFFFF) << 0x10) | i;
-
- do
- {
- rand1 = seed;
- rand2 = Prev(rand1, algo);
- rand3 = Prev(rand2, algo);
+ public class Program
+ {
- pid = ((rand2 >> 0x10) << 0x10) | (rand1 >> 0x10);
+ [Flags]
+ public enum Algo : ulong
+ {
+ Unknown = 0x00000000,
+ WSHMKR = 0x00000010,
+ Offset = 0x00000020,
+ ForceShiny = 0x00000040,
+ RandOTG1 = 0x00000080, // X / 3 & 1
+ RandOTG2 = 0x00000100, // X >> 3 & 1
+ BACDPIDIV = 0x00000200,
+ RandOTG3 = 0x00000400, // X >> 7 & 1
+ WCEggs = 0x00000800,
+ LimitRange = 0x00001000,
+ PokeParkEggs = 0x00002000,
+ DSPlay = 0x00004000,
+ BerryGlitch = 0x00008000,
+ NoIVs = 0x00010000,
+ PCJP2003 = 0x00020000,
+ CanBeShiny = 0x00040000,
+ RandItem1 = 0x00080000, // X / 3 & 1
+ RandItem2 = 0x00100000, // X >> 3 & 1
+ RandItem3 = 0x00200000, // X >> 7 & 1
+ MaleOTG = 0x00400000,
+ FemaleOTG = 0x00800000,
+ ItemFirst = 0x01000000, // OTG1/2 generally use this
+ Stamp = 0x02000000, // Absol Item
+ DFABPIDIV = 0x04000000,
+ Box = 0x08000000,
+ RandOTG4 = 0x10000000, // X >> E & 1 (rng6)
+ BatchGen = 0x20000000, // Mystry Mew\
+ ForceAntiShiny = 0x40000000,
+ UnknownOTG = 0x80000000,
+ }
- seed = rand3;
+ public static Dictionary EventOptions = new Dictionary {
+ { "5th Anniv Eggs", Algo.PCJP2003 | Algo.BACDPIDIV | Algo.Offset },
+ { "PCJP 2004/PCNY WISH Eggs", Algo.WCEggs },
+ { "PokePark 2005 Eggs", Algo.PokeParkEggs | Algo.CanBeShiny },
+ { "Pokemon Box Eggs", Algo.Box | Algo.BACDPIDIV },
+ { "E-Reader", Algo.DFABPIDIV | Algo.NoIVs | Algo.CanBeShiny },
+ { "PCNYabcd", Algo.ForceAntiShiny | Algo.UnknownOTG },
+ { "None", Algo.Unknown }
+ };
- } while (!noIVs && isShiny(pid, TID, SID));
+ public static Dictionary> EventsByID = new Dictionary> {
+ { 30719, Tuple.Create("Wishing Star Jirachi", Algo.BACDPIDIV | Algo.Offset | Algo.ForceAntiShiny | Algo.RandItem1 | Algo.MaleOTG) },
- if (pid == PID)
- {
- if (another)
- Console.WriteLine(" - ");
+ { 20043, Tuple.Create("Wishmaker/METEOR Jirachi (20043)", Algo.BACDPIDIV | Algo.WSHMKR | Algo.RandItem1 | Algo.CanBeShiny) },
- found = true;
+ { 30317, Tuple.Create("English Berry Glitch Zigzagoon", Algo.BerryGlitch | Algo.BACDPIDIV | Algo.ForceShiny | Algo.LimitRange) },
- rand4 = Prev(rand3, algo); // IV2
- rand5 = Prev(rand4, algo); // IV1
+ { 21121, Tuple.Create("Japanese Berry Glitch Zigzagoon", Algo.BerryGlitch | Algo.BACDPIDIV | Algo.ForceShiny | Algo.LimitRange) },
+
+ { 30821, Tuple.Create("Stamp", Algo.BACDPIDIV | Algo.RandItem1 | Algo.RandOTG1) },
+
+ { 40707, Tuple.Create("2004 Tanabata Jirachi", Algo.BACDPIDIV | Algo.RandItem1 | Algo.FemaleOTG) },
+
+ { 41205, Tuple.Create("ANA Pikachu", Algo.BACDPIDIV | Algo.MaleOTG) },
+
+ { 50319, Tuple.Create("Yokohama Pikachu", Algo.BACDPIDIV | Algo.MaleOTG) },
+
+ { 50701, Tuple.Create("Sapporo Pikachu / Sunday Wobbuffet", Algo.BACDPIDIV | Algo.RandOTG2) },
+
+ { 50318, Tuple.Create("Pokepark Meowth", Algo.BACDPIDIV | Algo.MaleOTG) },
+
+ { 50716, Tuple.Create("Hado Mew", Algo.BACDPIDIV | Algo.RandOTG1) },
+
+ { 50707, Tuple.Create("2005 Tanabata Jirachi", Algo.BACDPIDIV | Algo.RandItem1 | Algo.FemaleOTG) },
+
+ { 50425, Tuple.Create("GW Pikachu", Algo.BACDPIDIV | Algo.RandOTG2) },
+
+ { 2005, Tuple.Create("Festa/ROCKS Metang", Algo.BACDPIDIV | Algo.MaleOTG) },
+
+ { 50901, Tuple.Create("Hado Titans", Algo.DSPlay | Algo.ItemFirst | Algo.BACDPIDIV | Algo.RandOTG4) },
+
+ { 60505, Tuple.Create("GCEA 6th Campaign", Algo.BACDPIDIV | Algo.RandOTG3) },
+
+ { 60321, Tuple.Create("GCEA 5th Campaign", Algo.BACDPIDIV | Algo.RandOTG3) },
+
+ { 60227, Tuple.Create("GCEA 4th Campaign", Algo.BACDPIDIV | Algo.RandOTG3) },
+
+ { 60114, Tuple.Create("GCEA 3rd Campaign", Algo.BACDPIDIV | Algo.RandOTG3) },
+
+ { 51224, Tuple.Create("GCEA 2nd Campaign", Algo.BACDPIDIV | Algo.RandOTG3) },
+
+ { 51126, Tuple.Create("GCEA 1st Campaign", Algo.BACDPIDIV | Algo.RandOTG3) },
+
+ { 60707, Tuple.Create("2006 Tanabata Jirachi", Algo.BACDPIDIV | Algo.RandOTG3 | Algo.RandItem3) },
+
+ { 60623, Tuple.Create("Pokepark Celebi", Algo.BACDPIDIV | Algo.RandOTG3) },
+
+ { 60510, Tuple.Create("Pokepark Mew", Algo.BACDPIDIV | Algo.RandOTG1) },
+
+ { 60720, Tuple.Create("Misturin Celebi", Algo.BACDPIDIV | Algo.RandOTG3) },
+
+ { 60731, Tuple.Create("Pokepark Jirachi (1st Distribution)", Algo.BACDPIDIV | Algo.RandOTG1) },
+
+ { 60830, Tuple.Create("Pokepark Jirachi (2nd Distribution)", Algo.BACDPIDIV | Algo.RandOTG1) },
+
+ { 28606, Tuple.Create("DOEL Doexys", Algo.BACDPIDIV | Algo.RandOTG3) },
+
+ { 10, Tuple.Create("JAA & SPACE C", Algo.BACDPIDIV | Algo.RandOTG3) },
+
+ { 6808, Tuple.Create("Bryant Park", Algo.BACDPIDIV | Algo.RandOTG3) },
+
+ { 6227, Tuple.Create("Top 10", Algo.BACDPIDIV | Algo.RandOTG3) },
+
+ { 20078, Tuple.Create("Aura Mew", Algo.BACDPIDIV | Algo.RandOTG3) },
+
+ { 31121, Tuple.Create("Ageto Celebi, Colos Pikachu", Algo.DFABPIDIV) },
+
+ { 10048, Tuple.Create("Mattle Ho-Oh", Algo.DFABPIDIV) },
+
+ { 6930, Tuple.Create("Mystery Mew", Algo.BACDPIDIV | Algo.BatchGen | Algo.RandOTG1) }
+ };
+
+ public static uint[] MystryMewSeeds =
+ {
+ 0x5189E6C6, 0x00005E2B, 0x5ADFDAC6, 0x83A723B5, 0x8AF5BCA8,
+ 0xA587868F, 0xE8D1A0BF, 0x0000E6CC, 0x39AEB123, 0xF6B75FDE,
+ 0xFF889A6D, 0x0ACAC680, 0x00005841, 0xD30AA204, 0x65E00D7B,
+ 0x3BCB20D6, 0x077B5585, 0x000020BF, 0x849ED80A, 0xE1289CE9,
+ 0x329A3E0C, 0x08027B63, 0x0000E95D, 0xF29915B0, 0x9E85FD77,
+ 0xA8502FE2, 0xC9F74B61, 0x000034F3, 0xFB06486E, 0xAA4E84BD,
+ 0x322A1B90, 0xDF9B63D7, 0x00005327, 0xBE401AD2, 0x8F25C691,
+ 0x464C6B14, 0x8029764B, 0x00009D9C, 0x0DD7C0B3, 0x0A70952E,
+ 0xC0F8CE7D, 0x1F3BAE50, 0x0000643F, 0x8B2AED8A, 0xDC15BC69,
+ 0xFD76BF8C, 0x547956E3, 0x00005A60, 0x9E22DB67, 0x930C9212,
+ 0x84A830D1, 0x0681BC54, 0x0000C2D4, 0xE8905F0B, 0x724F1026,
+ 0x1189DB95, 0x61928D08, 0x0000D1E4, 0x15E075DB, 0x0D9EFFB6,
+ 0x688670E5, 0x7D10A118, 0x000078D2, 0x726C2C91, 0x60C2B914,
+ 0x224A0C4B, 0x21875866, 0x0000A443, 0x8BBF4E7E, 0xB029768D,
+ 0x2F283A20, 0x09512C27, 0x00001C09, 0x7AD488AC, 0x71834383,
+ 0x3BE940BE, 0x908A2FCD, 0x0000C385, 0xD3135138, 0xC4EC6CDF,
+ 0x2675FBAA, 0x3B111A09, 0x0000FE9D, 0x15D825F0, 0xB95EDCB7,
+ 0x34076222, 0xF50044A1, 0x000046CE, 0x43CB219D, 0x19DA7CF0,
+ 0x0D6597B7, 0xB939F122, 0x0000302D, 0x37277540, 0x48E342C7,
+ 0x835833F2, 0x7A14C331, 0x00009C40, 0xBE998DC7, 0xFFE012F2,
+ 0x9C2CE631, 0x2583F434, 0x000095A0, 0xB21AF9A7, 0xE3EDC752,
+ 0x5E8BE111, 0x9394BB94, 0x00004B63, 0xEDCB211E, 0xB6D7A6AD,
+ 0x6852B1C0, 0xB5B4AD47, 0x00007667, 0xB3728112, 0x372A23D1,
+ 0xEED0A354, 0xF7BCDD8B, 0x0000EE7F, 0x646DDECA, 0xEE2338A9,
+ 0xF9DF5ACC, 0x48505523, 0x000050AB, 0x5990A346, 0x84AAEA35,
+ 0x2F300928, 0xC96FC10F, 0x00000C13, 0x9A9D8B0E, 0x02B664DD,
+ 0xCE138330, 0xB6FE14F7, 0x00008A92, 0xE12E6751, 0x9850B8D4,
+ 0x66CDFD0B, 0x396DB626, 0x00009E86, 0x6F43C875, 0x9A5EFE68,
+ 0x85DA314F, 0x58CD4A5A, 0x0000C953, 0x9544A34E, 0xBB992C1D,
+ 0xB366FD70, 0x78843637, 0x0000508E, 0xA84B745D, 0x6E7434B0,
+ 0x41746077, 0xC9F5C6E2, 0x00009690, 0x994EB2D7, 0x0E8667C2,
+ 0x28799BC1, 0x866BB784, 0x000056CC, 0x810C6123, 0x018A4FDE,
+ 0xD74BCA6D, 0x89CD3680, 0x0000CD96, 0xC59B7F45, 0xC1800DF8,
+ 0x1EAB669F, 0x90F57E6A, 0x0000AFFB, 0xD5C5D956, 0xC49D4C05,
+ 0x0B43D7B8, 0xE4D0795F, 0x000067A3, 0x7A03DC5E, 0x984644ED,
+ 0x82706700, 0x0702DD87, 0x0000C6CE, 0xE7E9A19D, 0x491EFCF0,
+ 0x14B817B7, 0x2BE27122, 0x0000E62C, 0xF4E18B03, 0x84FC4A3E,
+ 0xCE3F734D, 0xBE3B73E0, 0x00006E62, 0x0F0A2FE1, 0xA8A80324,
+ 0x04D1321B, 0xD62DDAF6, 0x0000B1F2, 0xCFAAC931, 0x955B0B34,
+ 0x87CE9DEB, 0x10B30B86, 0x00000652, 0xCF9CE411, 0x307A7294,
+ 0x76BD3FCB, 0x8AF69DE6, 0x0000CC43, 0xBF08D67E, 0x1EEEDE8D,
+ 0x81720220, 0x2D25D427, 0x000093D0, 0x9DC80B17, 0x80826F02,
+ 0x82D15601, 0x9BF518C4, 0x0000A8AC, 0xB606E383, 0x344660BE,
+ 0x0FBACFCD, 0xB7247E60, 0x0000EE9F, 0xD896E66A, 0xD1AF09C9,
+ 0x6A212F6C, 0x246CFF43, 0x00008B48, 0x65D7C2AF, 0x967BEE3A,
+ 0x55446659, 0x2D50BDBC, 0x00000EEE, 0x7026D13D, 0xC8B85610,
+ 0x0A735457, 0x632CE342, 0x0000B831, 0x940CFE34, 0x178D84EB,
+ 0x49281686, 0x6F6B6075, 0x00005BC1, 0x87877784, 0x492AECFB,
+ 0x82FE6256, 0x1A9DF105, 0x0000941D, 0x7D4AC570, 0x6C0ADE37,
+ 0x98EFBDA2, 0x659A1221, 0x0000CD47, 0x0ED63472, 0xF7BEE1B1,
+ 0xB188E1B4, 0x898EBA6B, 0x0000EBB2, 0x71B68BF1, 0x3BAE72F4,
+ 0x1E9C56AB, 0x4C6E1146, 0x00004A0D, 0x24549FA0, 0x46F15BA7,
+ 0x48932152, 0x75425311, 0x00009C37, 0x75EE03A2, 0x97E0C021,
+ 0x149A6264, 0x8F9BE45B, 0x0000F0E4, 0x9D9FD8DB, 0x7D1196B6,
+ 0x284C6BE5, 0xB8D57018, 0x00001614, 0xD311354B, 0x0D841D66,
+ 0x0E2803D5, 0x1ED42448, 0x0000E90A, 0x8D4EA9E9, 0x1853570C,
+ 0x8D257063, 0x470CF21E, 0x0000BE96, 0x525FEC45, 0x17F606F8,
+ 0x7FCFBB9F, 0x6385BF6A, 0x00002389, 0xB472522C, 0xC6484703,
+ 0x8B57163E, 0x27420F4D, 0x0000AC08, 0x47D5906F, 0x7793F4FA,
+ 0x38A40219, 0x72A6DA7C, 0x000056BA, 0xEFB54CD9, 0x318BAA3C,
+ 0xC826C2D3, 0x5DFD16CE, 0x00005240, 0x1FB7EBC7, 0xCC8C78F2,
+ 0x03F13431, 0x233A8A34, 0x00006E06, 0x611439F5, 0xBA7609E8,
+ 0x6213EECF, 0xBD5B71DA, 0x000045F3, 0xB0D2556E, 0x8C959DBD,
+ 0xD5231090, 0xCED5C4D7, 0x00006944, 0x4BBA87BB, 0x157C4216,
+ 0x614A41C5, 0xD3586678, 0x0000C962, 0x63B7DEE1, 0xBE42B624,
+ 0x4005D91B, 0xC7B1A5F6, 0x0000DFED, 0x307F5600, 0x02C9D087,
+ 0x0CE5FAB2, 0x5F831EF1, 0x00002939, 0xD9BD2D1C, 0xB7A1F233,
+ 0xFF0A60AE, 0xC65A4BFD, 0x0000EFC8, 0x36B3B52F, 0x3998B6BA,
+ 0xE4042CD9, 0x77570A3C, 0x00006457, 0xA249B342, 0x46BE9941,
+ 0x11A81F04, 0x398ED67B, 0x00009DE4, 0x533411DB, 0x4A6B2BB6,
+ 0xFD8CECE5, 0xCE7C2D18, 0x00004C79, 0xCEEF935C, 0x5FA64F73,
+ 0xA78E98EE, 0x3DEDB33D, 0x000013C9, 0x8840916C, 0xC7775943,
+ 0x4AF06F7E, 0xD126538D, 0x0000A153, 0x61FB1B4E, 0x4CD3C41D,
+ 0x611D3570, 0x54AF8E37, 0x0000E991, 0xCF5BC214, 0x3049314B,
+ 0x7EBB2966, 0x0FA5DFD5, 0x000077EF, 0x82691E7A, 0x5A9AE599,
+ 0x8DF70FFC, 0x401C0193, 0x0000C92C, 0xAFB2A203, 0x4E46C53E,
+ 0x1296C24D, 0x444146E0, 0x00000D43, 0x6A23537E, 0xF466A78D,
+ 0x7884E720, 0x620E6527, 0x00008655, 0x369F3CC8, 0x2D140E2F,
+ 0x0095EBBA, 0xDA41CDD9, 0x0000FE4E, 0x5F12DB1D, 0xEF9DB070,
+ 0xC6E4DD37, 0xED9980A2, 0x0000306E, 0x0B1ACCBD, 0xFF174390,
+ 0x8F5DEBD7, 0xD12EFCC2, 0x00001263, 0x04B58C1E, 0x65CB25AD,
+ 0x730FF4C0, 0xA2A5A447, 0x00001EA5, 0x53AD07D8, 0x5F89F0FF,
+ 0xC347774A, 0x23608F29, 0x0000967D, 0x1C565650, 0x4F6B6397,
+ 0xEDD28582, 0xBBBAB281, 0x00005EF3, 0x70E04A6E, 0x51D0FEBD,
+ 0x88912D90, 0xC53AADD7, 0x00000932, 0x3F4C9371, 0xA20A3C74,
+ 0x8CA75A2B
+ };
+
+ public static void Main(string[] args)
+ {
+ Console.WriteLine("If an egg event or PCNY, press enter");
+ Console.Write("TID:");
+ uint[] numbers = GetNumbers();
+ bool gotTID = numbers.Length > 0;
+ uint TID = gotTID ? numbers[0] : 9999;
+
+ bool foundEvent = EventsByID.TryGetValue(TID, out var option);
+
+ if (!foundEvent)
+ {
+ if (!gotTID)
+ Console.WriteLine("Could not find event by TID. Maybe it is an egg event or PCNY?");
+
+ int index;
+ Dictionary.KeyCollection keys = EventOptions.Keys;
+ do
+ {
+ int count = 0;
+ foreach (string eventName in keys)
+ Console.WriteLine("{0}. {1}", (++count).ToString().PadLeft(2), eventName);
+
+ Console.Write("----------\nChoose an event by number:");
+ } while (!int.TryParse(Console.ReadLine(), out index) || index < 0 || index > EventOptions.Keys.Count);
+
+ KeyValuePair choice = EventOptions.ElementAt(index - 1);
+
+ if (choice.Value == Algo.Unknown)
+ return;
+
+ option = Tuple.Create(choice.Key, choice.Value);
+ }
+
+ Algo algo = option.Item2;
+
+ bool forcedShiny = Has(algo, Algo.ForceShiny);
+ bool WCEggs = Has(algo, Algo.WCEggs);
+ bool hasOffset = Has(algo, Algo.Offset);
+ bool berryGlitch = Has(algo, Algo.BerryGlitch);
+ bool XDAlgo = Has(algo, Algo.DFABPIDIV);
+ bool Box = Has(algo, Algo.Box);
+ bool mystryMew = TID == 6930;
+ bool batchGen = Has(algo, Algo.BatchGen);
+ bool noIVs = Has(algo, Algo.NoIVs);
+ bool forceAntishiny = Has(algo, Algo.ForceAntiShiny);
+
+ List> PIDTIDs = new List>();
+ bool finished;
+
+ /*
+ if (!gotTID && forceAntishiny) {
+ Console.Write("TID:");
+ uint fTid;
+ GetNumbers(out fTid);
+ TID = fTid;
+ }
+ */
+
+ do
+ {
+ Console.Write("PID :");
+ numbers = GetNumbers();
+ finished = numbers.Length == 0;
+ if (!finished) PIDTIDs.Add(new Tuple(numbers[0], numbers.Length > 1 ? numbers[1] : TID, numbers.Length > 2 ? numbers[2] : 0));
+ } while (!finished);
+
+ Console.WriteLine("----------");
+
+ uint seedRange = Has(algo, Algo.LimitRange) ? 0x100u : 0x10000u;
+
+ for (int p = 0; p < PIDTIDs.Count; p++)
+ {
+ uint PID = PIDTIDs[p].Item1;
+ TID = PIDTIDs[p].Item2;
+ uint SID = PIDTIDs[p].Item3;
+
+ bool found = false;
+
+ uint rand1;
+ uint rand2;
+ uint rand3;
+ uint rand4;
+ uint rand5;
+ if (XDAlgo)
+ {
+ bool another = false;
+
+ // XD - Do it backwards - DFAB
+ for (uint i = 0; XDAlgo && i < seedRange; i++)
+ {
+ uint pid;
+ var seed = ((PID & 0xFFFF) << 0x10) | i;
+
+ do
+ {
+ rand1 = seed;
+ rand2 = Prev(rand1, algo);
+ rand3 = Prev(rand2, algo);
+
+ pid = ((rand2 >> 0x10) << 0x10) | (rand1 >> 0x10);
+
+ seed = rand3;
+
+ } while (!noIVs && isShiny(pid, TID, SID));
+
+ if (pid == PID)
+ {
+ if (another)
+ Console.WriteLine(" - ");
- Console.WriteLine("Found Seed: {0:X8} ({1:X8}) - {2}{3}", Prev(Prev(rand5, algo), algo), PID, option.Item1, noIVs ? " " + eReaderType(pid) : "");
+ found = true;
- Console.WriteLine("Nature: {0}", index2Nature(PID));
+ rand4 = Prev(rand3, algo); // IV2
+ rand5 = Prev(rand4, algo); // IV1
- if (Has(algo, Algo.CanBeShiny))
- Console.WriteLine("Shiny: Can be shiny");
- else
- Console.WriteLine("Shiny: Cannot be shiny");
+ Console.WriteLine("Found Seed: {0:X8} ({1:X8}) - {2}{3}", Prev(Prev(rand5, algo), algo), PID, option.Item1, noIVs ? " " + eReaderType(pid) : "");
- uint[] ivs;
+ Console.WriteLine("Nature: {0}", index2Nature(PID));
- if (noIVs)
- ivs = new uint[] { 0, 0, 0, 0, 0, 0 };
- else
- ivs = ParseStats((rand5 >> 0x10) & 0x7FFF, (rand4 >> 0x10) & 0x7FFF);
+ if (Has(algo, Algo.CanBeShiny))
+ Console.WriteLine("Shiny: Can be shiny");
+ else
+ Console.WriteLine("Shiny: Cannot be shiny");
- Console.WriteLine("IVs: {0}, {1}, {2}, {4}, {5}, {3}", ivs[0], ivs[1], ivs[2], ivs[3], ivs[4], ivs[5]);
+ uint[] ivs;
- if (TID == 31121) // Ageto/Colos
- Console.WriteLine("OTG: Female (Ageto) - Male (Colos)");
+ if (noIVs)
+ ivs = new uint[] { 0, 0, 0, 0, 0, 0 };
+ else
+ ivs = ParseStats((rand5 >> 0x10) & 0x7FFF, (rand4 >> 0x10) & 0x7FFF);
+
+ Console.WriteLine("IVs: {0}, {1}, {2}, {4}, {5}, {3}", ivs[0], ivs[1], ivs[2], ivs[3], ivs[4], ivs[5]);
- another = true;
- }
- }
+ if (TID == 31121) // Ageto/Colos
+ Console.WriteLine("OTG: Female (Ageto) - Male (Colos)");
+
+ another = true;
+ }
+ }
- Console.WriteLine("----------");
- }
+ Console.WriteLine("----------");
+ }
- if (WCEggs || Has(algo, Algo.PokeParkEggs))
- {
- bool another = false;
+ if (WCEggs || Has(algo, Algo.PokeParkEggs))
+ {
+ bool another = false;
- // Do it backwards, find a ABDE
- for (uint i = 0; i < seedRange; i++)
- {
- rand1 = ((PID & 0xFFFF) << 0x10) | i; // PIDL
- rand2 = Next(rand1, algo); // PIDH
+ // Do it backwards, find a ABDE
+ for (uint i = 0; i < seedRange; i++)
+ {
+ rand1 = (((PID & 0xFFFF) << 0x10)) | i; // PIDL
+ rand2 = Next(rand1, algo); // PIDH
- uint pid = ((rand2 >> 0x10) << 0x10) | (rand1 >> 0x10);
+ uint pid = ((rand2 >> 0x10) << 0x10) | (rand1 >> 0x10);
- if (pid == PID)
- {
- if (another)
- Console.WriteLine(" - ");
+ if (pid == PID)
+ {
+ if (another)
+ Console.WriteLine(" - ");
- found = true;
- Console.WriteLine("Found Wondercard Seed: {0:X8} ({1:X8}) - {2}", Prev(rand1, algo), PID, option.Item1);
+ found = true;
+ Console.WriteLine("Found Wondercard Seed: {0:X8} ({1:X8}) - {2}", Prev(rand1, algo), PID, option.Item1);
- Console.WriteLine("Nature: {0}", index2Nature(PID % 25));
+ Console.WriteLine("Nature: {0}", index2Nature(PID % 25));
- Console.WriteLine("Shiny: Can be shiny");
+ Console.WriteLine("Shiny: Can be shiny");
- rand3 = Next(rand2, algo); // forme (unown), not used.
- rand4 = Next(rand3, algo);
- rand5 = Next(rand4, algo);
+ rand3 = Next(rand2, algo); // forme (unown), not used.
+ rand4 = Next(rand3, algo);
+ rand5 = Next(rand4, algo);
- uint[] ivs = ParseStats((rand4 >> 0x10) & 0x7FFF, (rand5 >> 0x10) & 0x7FFF);
- Console.WriteLine("IVs: {0}, {1}, {2}, {4}, {5}, {3}", ivs[0], ivs[1], ivs[2], ivs[3], ivs[4], ivs[5]);
+ uint[] ivs = ParseStats((rand4 >> 0x10) & 0x7FFF, (rand5 >> 0x10) & 0x7FFF);
+ Console.WriteLine("IVs: {0}, {1}, {2}, {4}, {5}, {3}", ivs[0], ivs[1], ivs[2], ivs[3], ivs[4], ivs[5]);
- another = true;
- }
- }
+ another = true;
+ }
+ }
- if (WCEggs)
- Console.WriteLine("----------");
- }
+ if (WCEggs)
+ Console.WriteLine("----------");
+ }
- if (Box)
- {
- bool another = false;
+ if (Box)
+ {
+ bool another = false;
- // Do it backwards, find a BACD
- for (uint i = 0; i < seedRange; i++)
- {
- rand1 = (PID & 0xFFFF0000) | i;
- rand2 = Next(rand1, algo);
+ // Do it backwards, find a BACD
+ for (uint i = 0; i < seedRange; i++)
+ {
+ rand1 = (PID & 0xFFFF0000) | i;
+ rand2 = Next(rand1, algo);
- uint pid = ((rand1 >> 0x10) << 0x10) | (rand2 >> 0x10);
+ uint pid = ((rand1 >> 0x10) << 0x10) | (rand2 >> 0x10);
- if (pid == PID)
- {
- if (another)
- Console.WriteLine(" - ");
+ if (pid == PID)
+ {
+ if (another)
+ Console.WriteLine(" - ");
- found = true;
- Console.WriteLine("Found Seed: {0:X8} ({1:X8}) - {2}", Prev(rand1, algo), PID, option.Item1);
+ found = true;
+ Console.WriteLine("Found Seed: {0:X8} ({1:X8}) - {2}", Prev(rand1, algo), PID, option.Item1);
- Console.WriteLine("Nature: {0}", index2Nature(PID % 25));
+ Console.WriteLine("Nature: {0}", index2Nature(PID % 25));
- Console.WriteLine("Shiny: Can be shiny");
+ Console.WriteLine("Shiny: Can be shiny");
- rand3 = Next(rand2, algo);
- rand4 = Next(rand3, algo);
+ rand3 = Next(rand2, algo);
+ rand4 = Next(rand3, algo);
- uint[] ivs = ParseStats((rand3 >> 0x10) & 0x7FFF, (rand4 >> 0x10) & 0x7FFF);
- Console.WriteLine("IVs: {0}, {1}, {2}, {4}, {5}, {3}", ivs[0], ivs[1], ivs[2], ivs[3], ivs[4], ivs[5]);
+ uint[] ivs = ParseStats((rand3 >> 0x10) & 0x7FFF, (rand4 >> 0x10) & 0x7FFF);
+ Console.WriteLine("IVs: {0}, {1}, {2}, {4}, {5}, {3}", ivs[0], ivs[1], ivs[2], ivs[3], ivs[4], ivs[5]);
- another = true;
- }
- }
+ another = true;
+ }
+ }
- Console.WriteLine("----------");
- }
+ Console.WriteLine("----------");
+ }
- if (forceAntishiny)
- {
- bool another = false;
+ uint rand6;
+ if (forceAntishiny)
+ {
+ bool another = false;
- for (uint i = 0; i < seedRange; i++)
- {
- rand2 = ((PID & 0xFFFF) << 0x10) | i;
- rand1 = Prev(rand2, algo);
- rand3 = Next(rand2, algo);
- rand4 = Next(rand3, algo);
- //rand5 = Next(rand4, algo);
- //rand6 = Next(rand5, algo);
+ for (uint i = 0; i < seedRange; i++)
+ {
+ rand2 = ((PID & 0xFFFF) << 0x10) | i;
+ rand1 = Prev(rand2, algo);
+ rand3 = Next(rand2, algo);
+ rand4 = Next(rand3, algo);
+ rand5 = Next(rand4, algo);
- if (((rand2 >> 0x10) ^ TID ^ SID ^ (rand1 >> 0x10)) == (PID >> 0x10) && !isShiny(PID, TID, SID))
- {
- if (another)
- Console.WriteLine(" - ");
+ if (((rand2 >> 0x10) ^ TID ^ SID ^ (rand1 >> 0x10)) == (PID >> 0x10) && !isShiny(PID, TID, SID))
+ {
+ if (another)
+ Console.WriteLine(" - ");
- uint seed = Prev(rand1, algo);
+ uint seed = Prev(rand1, algo);
- found = true;
- Console.WriteLine("Found Seed: {0:X8} ({1:X8}) - TID {2}", seed, PID, TID);
+ found = true;
+ Console.WriteLine("Found Seed: {0:X8} ({1:X8}) - TID {2}", seed, PID, TID);
- Console.WriteLine("Nature: {0}", index2Nature(PID % 25));
+ Console.WriteLine("Nature: {0}", index2Nature(PID % 25));
- Console.WriteLine("Shiny: Cannot be shiny");
+ Console.WriteLine("Shiny: Cannot be shiny");
- uint[] ivs = ParseStats((rand3 >> 0x10) & 0x7FFF, (rand4 >> 0x10) & 0x7FFF);
- Console.WriteLine("IVs: {0}, {1}, {2}, {4}, {5}, {3}", ivs[0], ivs[1], ivs[2], ivs[3], ivs[4], ivs[5]);
+ uint[] ivs = ParseStats((rand3 >> 0x10) & 0x7FFF, (rand4 >> 0x10) & 0x7FFF);
+ Console.WriteLine("IVs: {0}, {1}, {2}, {4}, {5}, {3}", ivs[0], ivs[1], ivs[2], ivs[3], ivs[4], ivs[5]);
- // Console.WriteLine("OTG: {0:X} {1}", Prev(seed, algo), Prev(seed, algo) % 100);
+ uint d = Prev(rand1, algo);
+ uint c = Prev(d, algo);
+ uint b = Prev(c, algo);
- // Console.WriteLine("Item: {0}", (((rand6 >> 0x15) / 1) & 1) == 0 ? "Ganlon" : "Salac");
+ another = true;
+ }
+ }
- //uint d = Prev(rand1, algo);
- //uint c = Prev(d, algo);
- //uint b = Prev(c, algo);
- //uint a = Prev(b, algo);
+ Console.WriteLine("----------");
+ }
- // Console.WriteLine("Entry: {0}", GetRandomEntry((c & 0xFFFF0000) | (d >> 0x10), 5));
- // Console.WriteLine("Entry: {0}", (((rand6 >> 0x10) / 1) >> 0) % 3);
- // Console.WriteLine("Entry: {0}", GetRandomEntry(d >> 0x10, 5));
+ if (!WCEggs && !Box && (Has(algo, Algo.BACDPIDIV) || Has(algo, Algo.PokeParkEggs)))
+ {
+ for (uint i = 0; i < seedRange; i++)
+ {
+ uint rand1a;
+ uint rand1b;
+ uint seed = rand1a = rand1b = i;
+ uint originalSeed = seed;
+ Tuple entry = null;
+ uint TSV = 0;
- /*uint newSeed = seed;
+ if (hasOffset)
+ {
+ rand1a = Next(seed, algo);
+ rand1b = Next(rand1a, algo);
- for (int h = 0; h < 1000000; h++)
- {
- if (newSeed == 0xDCA0BCA8)
- {
- Console.WriteLine("Test: {0:X8} - Frame {1}", newSeed, h);
- }
+ uint tempPid = (rand1a & 0xFFFF0000) | (rand1b >> 0x10);
- newSeed = Next(newSeed, algo);
- }*/
+ /* This never actually happens in seed range 0->FFFF
+ if (tempPid == 0)
+ tempPid |= 0x20030000;
- another = true;
- }
- }
+ if ((tempPid & 0xFFFF) == 0)
+ tempPid |= 0x327;
+ */
+
+ entry = GetEggEntry(tempPid, seed);
- Console.WriteLine("----------");
- }
+ forcedShiny = entry.Item4;
+ }
- if (!WCEggs && !Box && (Has(algo, Algo.BACDPIDIV) || Has(algo, Algo.PokeParkEggs)))
- {
- for (uint i = 0; i < seedRange; i++)
- {
- uint seed = rand1b = i;
- uint originalSeed = seed;
- Tuple entry = null;
- uint TSV = 0;
+ uint originalPID, pid, otgRand, itemRand, batchCount = 1;
- if (hasOffset)
- {
- rand1a = Next(seed, algo);
- rand1b = Next(rand1a, algo);
+ do
+ {
+ rand1 = Next(rand1b, algo); // PIDH
+ rand2 = Next(rand1, algo); // PIDL
- uint tempPid = (rand1a & 0xFFFF0000) | (rand1b >> 0x10);
+ pid = ((rand1 >> 0x10) << 0x10) | (rand2 >> 0x10);
- /* This never actually happens in seed range 0->FFFF
- if (tempPid == 0)
- tempPid |= 0x20030000;
+ originalPID = pid;
- if ((tempPid & 0xFFFF) == 0)
- tempPid |= 0x327;
- */
- entry = GetEggEntry(tempPid, seed);
-
- forcedShiny = entry.Item4;
-
- if (forcedShiny && Has(algo, Algo.PCJP2003))
- algo |= Algo.CanBeShiny;
- }
-
- uint originalPID, pid, otgRand, itemRand, batchCount = 1;
-
- do
- {
- rand1 = Next(rand1b, algo); // PIDH
- rand2 = Next(rand1, algo); // PIDL
-
- pid = ((rand1 >> 0x10) << 0x10) | (rand2 >> 0x10);
-
- originalPID = pid;
-
- if (mystryMew)
- {
- while (isShiny(pid, TID, SID))
- {
- rand1 = Next(rand2, algo); // PIDH
- rand2 = Next(rand1, algo); // PIDL
-
- pid = ((rand1 >> 0x10) << 0x10) | (rand2 >> 0x10);
- }
- }
-
- if (Has(algo, Algo.PCJP2003) && PID - pid < 8)
- {
- TSV = getTSVFromPID(pid);
- pid = PID;
- }
-
-
- if (forcedShiny)
- {
- rand2 = Next(rand2, algo);
-
- if (berryGlitch)
- {
- uint epid = forceShinyPID(rand1 >> 0x10, rand2 >> 0x10, 30317, SID);
- uint jpid = forceShinyPID(rand1 >> 0x10, rand2 >> 0x10, 21121, SID);
-
- pid = epid == PID ? epid : jpid;
- }
- else
- {
- TSV = getTSVFromForceShiny(PID);
- pid = forceShinyPID(rand1 >> 0x10, rand2 >> 0x10, TSV, SID);
- originalPID = pid;
- }
- }
-
- rand3 = Next(rand2, algo); // IV1
- rand4 = Next(rand3, algo); // IV2
- rand5 = Next(rand4, algo); // Item if available or OTG if Item not available
- rand6 = Next(rand5, algo); // OTG if Item available
- // rand7 = Next(rand6, algo);
-
- itemRand = Has(algo, Algo.ItemFirst) ? rand5 : rand6;
- otgRand = !Has(algo, Algo.ItemFirst) ? rand5 : rand6;
-
- if (pid != PID)
- {
- // in case of antishiny, we have to go back.
- rand1b = Next(Next(Next(Next(Next(rand1b, algo), algo), algo), algo), algo); // PID, IV, OTG -> next in batch.
- }
-
- batchCount++;
-
- } while (batchGen && pid != PID && batchCount <= 5);
-
- if (batchCount > 6 || pid != PID)
- continue;
-
- found = true;
- string knownSeed = "Found Seed";
-
- if (berryGlitch)
- knownSeed = originalSeed >= 3 && originalSeed <= 180 ? "Known Seed" : "Unknown Seed";
-
- string mystryMewBatch = "";
-
- if (mystryMew)
- {
- knownSeed = MystryMewSeeds.Contains(rand1b) ? "Known Seed" : "Unknown Seed";
-
- if (knownSeed == "Known Seed")
- {
- long mewIndex = Array.IndexOf(MystryMewSeeds, rand1b) + 1;
- string batchSlot;
- if (mewIndex < 426)
- batchSlot = String.Format("{0} Slot {1}", mewIndex < 7 ? "Party" : "PC", mewIndex < 7 ? mewIndex : mewIndex - 6);
- else
- batchSlot = "Unreleased";
-
- mystryMewBatch = String.Format("{0}/{1} {2}", mewIndex, MystryMewSeeds.Length, batchSlot);
- }
- else
- mystryMewBatch = String.Format("({0} of 5)", batchCount - 1);
- }
-
- Console.WriteLine("{0}: {1:X8} - {2} {3}", knownSeed, i, option.Item1, mystryMewBatch);
- Console.WriteLine("PID: {0:X8} ({1})", PID, index2Nature(PID % 25));
-
- uint rtc = seed ^ (seed < 0x5A0u ? 0x10001u : 0x0u);
-
- if (hasOffset)
- {
- uint days = rtc / 1440;
- uint hours = rtc % 1440 / 60;
- uint mins = rtc % 60;
- Console.WriteLine("RTC: {0} day{1}, {2} hour{3}, {4} minute{5}", days, days != 0 ? "s" : "", hours, hours != 0 ? "s" : "", mins, mins != 0 ? "s" : "");
-
- if (Has(algo, Algo.PCJP2003))
- {
- Console.WriteLine("Species: {1}{0} {2}", entry.Item1, entry.Item4 ? "Forced Shiny " : pid - originalPID > 0 && pid - originalPID < 8 ? "Anti-Shiny " : "", entry.Item2);
- Console.WriteLine("TSV: {0:X4}", TSV);
- }
- }
-
- if (Has(algo, Algo.PCJP2003) && !forcedShiny)
- Console.WriteLine("Shiny: Cannot be shiny if hatched by original trainer");
- else if (Has(algo, Algo.CanBeShiny))
- Console.WriteLine("Shiny: Can be shiny");
- else if (forcedShiny)
- Console.WriteLine("Shiny: Must be shiny");
- else
- Console.WriteLine("Shiny: Cannot be shiny");
-
- uint[] ivs;
-
- if (Has(algo, Algo.NoIVs))
- ivs = new uint[] { 0, 0, 0, 0, 0, 0 };
- else
- ivs = ParseStats((rand3 >> 0x10) & 0x7FFF, (rand4 >> 0x10) & 0x7FFF);
-
- Console.WriteLine("IVs: {0}, {1}, {2}, {4}, {5}, {3}", ivs[0], ivs[1], ivs[2], ivs[3], ivs[4], ivs[5]);
-
- if (Has(algo, Algo.BerryGlitch))
- Console.WriteLine("OTG: {0}", ((otgRand >> 0x10) / 3 & 1) == 1 ? "Female (RUBY)" : "Male (SAPHIRE)");
- else if (Has(algo, Algo.RandOTG3))
- Console.WriteLine("OTG: {0}", ((otgRand >> 0x17) / 1 & 1) == 0 ? "Female" : "Male");
- else if (Has(algo, Algo.RandOTG2))
- {
- if (TID == 50701)
- {
- Console.WriteLine("Sunday Wob OTG: {0}", ((otgRand >> 0x13) / 1 & 1) == 1 ? "Female" : "Male");
- Console.WriteLine("Sapporo Pikachu OTG: Male (Always)");
- }
- else
- Console.WriteLine("OTG: {0}", ((otgRand >> 0x13) / 1 & 1) == 1 ? "Female" : "Male");
- }
- else if (Has(algo, Algo.RandOTG1))
- Console.WriteLine("OTG: {0}", ((otgRand >> 0x10) / 3 & 1) == 1 ? "Female" : "Male");
- else if (Has(algo, Algo.MaleOTG))
- Console.WriteLine("OTG: Male (Always)");
- else if (Has(algo, Algo.FemaleOTG))
- Console.WriteLine("OTG: Female (Always)");
- else if (Has(algo, Algo.UnknownOTG))
- Console.WriteLine("OTG: Unknown");
-
- if (Has(algo, Algo.RandItem3))
- Console.WriteLine("Item: {0}", ((itemRand >> 0x17) & 1) == 0 ? "Salac Berry" : "Ganlon Berry");
- else if (Has(algo, Algo.RandItem2))
- Console.WriteLine("Item: {0}", ((itemRand >> 0x13) & 1) == 0 ? "Salac Berry" : "Ganlon Berry");
- else if (Has(algo, Algo.RandItem1))
- {
- if (Has(algo, Algo.WSHMKR))
- Console.WriteLine("Item: {0}", ((itemRand >> 0x10) / 3 & 1) == 0 ? "Salac Berry" : "Ganlon Berry");
- else if (hasOffset)
- {
- string berry = String.Format("Ganlon Berry ({0}), Salac Berry ({1})", (rtc & 0x1) == 0 ? "99.8%" : "0.2%", (rtc & 0x1) == 1 ? "99.8%" : "0.2%");
-
- Console.WriteLine("Item: {0}", berry);
- }
- else
- Console.WriteLine("Item: {0}", ((itemRand >> 0x10) / 3 & 1) == 0 ? "Petaya Berry" : "Apicot Berry");
- }
- }
-
- if (!found)
- Console.WriteLine("No seeds found for {0:X8}", PID);
-
- Console.WriteLine("----------");
- }
- }
-
- Console.WriteLine("Complete. Press enter to exit.");
- Console.ReadLine();
- }
-
- public static bool isShiny(uint pid, uint tid, uint sid)
- {
- return ((pid >> 16) ^ (pid & 0xFFFF) ^ tid ^ sid) < 8;
- }
-
- public static uint forceShinyPID(uint seed, uint shiny, uint tid, uint sid)
- {
- return (seed << 0x10) | ((seed ^ tid ^ sid) & 0xFFF8) | (shiny & 7);
- }
-
- public static uint getTSVFromForceShiny(uint pid)
- {
- return (pid >> 0x10) ^ (pid & 0xFFF8);
- }
-
- public static uint getTSVFromPID(uint pid)
- {
- return (pid >> 0x10) ^ (pid & 0xFFFF);
- }
-
- public static bool Has(Algo algo, Algo option)
- {
- return (algo & option) != 0;
- }
-
- public static bool GetNumber(out uint number)
- {
-
- return GetNumber(out number, out _, out _);
- }
-
- public static bool GetNumber(out uint pid, out uint tid, out uint sid)
- {
- string[] line = Console.ReadLine().Trim().Split(' ');
-
- if (String.IsNullOrEmpty(line[0]))
- {
- pid = tid = sid = 0;
- return false;
- }
-
- bool fail = false;
-
- if (line[0].StartsWith("0x", StringComparison.Ordinal))
- fail = UInt32.TryParse(line[0].Replace("0x", ""), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out pid) && fail;
- else
- fail = UInt32.TryParse(line[0], out pid) && fail;
-
- if (line.Length > 1 && line[1].StartsWith("0x", StringComparison.Ordinal))
- fail = UInt32.TryParse(line[1].Replace("0x", ""), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out tid) && fail;
- else if (line.Length > 1)
- fail = UInt32.TryParse(line[1], out tid) && fail;
- else
- tid = 0;
-
- if (line.Length > 2 && line[2].StartsWith("0x", StringComparison.Ordinal))
- fail = UInt32.TryParse(line[2].Replace("0x", ""), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out sid) && fail;
- else if (line.Length > 2)
- fail = UInt32.TryParse(line[2], out sid) && fail;
- else
- sid = 0;
-
- return !fail;
- }
-
- public static uint GetRandomEntry(uint randVal, uint max)
- {
- uint high = randVal >> 16;
- uint first = ((high << 2) & 0xFFFF) + high;
- uint second = ((randVal & 0xFFFF) << 1) + (first >> 16);
-
- second += high + (second >> 16);
-
- return (max * (second & 0xFFFF)) >> 16;
- }
-
- public static Tuple GetEggEntry(uint randVal, uint seed)
- {
- uint result = GetRandomEntry(randVal, 1000);
- int count = 0;
-
- while (true)
- {
- if (result < PCJP2003Types[count].Item3)
- return PCJP2003Types[count];
-
- result -= PCJP2003Types[count++].Item3;
- }
- }
-
- public static Tuple[] PCJP2003Types = {
- new Tuple("Pichu", "Teeter Dance", 100, false),
- new Tuple("Pichu", "Teeter Dance", 25, true),
- new Tuple("Pichu", "Wish", 100, false),
- new Tuple("Pichu", "Wish", 25, true),
- new Tuple("Bagon", "Iron Defense", 125, false),
- new Tuple("Bagon", "Wish", 125, false),
- new Tuple("Absol", "Spite", 125, false),
- new Tuple("Absol", "Wish", 125, false),
- new Tuple("Ralts", "Charm", 125, false),
- new Tuple("Ralts", "Wish", 125, false),
- };
-
- public static uint Prev(uint seed, Algo algo)
- {
- return Has(algo, Algo.BACDPIDIV) || Has(algo, Algo.PokeParkEggs) || Has(algo, Algo.WCEggs) || Has(algo, Algo.ForceAntiShiny) ? PrevGBA(seed) : PrevXD(seed);
- }
-
- public static uint Next(uint seed, Algo algo)
- {
- return Has(algo, Algo.BACDPIDIV) || Has(algo, Algo.PokeParkEggs) || Has(algo, Algo.WCEggs) || Has(algo, Algo.ForceAntiShiny) ? NextGBA(seed) : NextXD(seed);
- }
-
- public static uint PrevXD(uint seed)
- {
- return seed * 0xB9B33155u + 0xA170F641u;
- }
-
- public static uint NextXD(uint seed)
- {
- return seed * 0x343FDu + 0x269EC3u;
- }
-
- public static uint PrevGBA(uint seed)
- {
- return seed * 0xEEB9EB65u + 0xA3561A1u;
- }
-
- public static uint NextGBA(uint seed)
- {
- return seed * 0x41C64E6Du + 0x00006073u;
- }
-
- public static string eReaderType(uint pid)
- {
- uint nature = pid % 25;
-
- if (nature == 16 && pid % 256 < 128) // Mareep
- return "Mareep";
- if (nature == 11 && pid % 256 >= 128) // Scizor
- return "Scizor";
- if (nature == 22 && pid % 256 < 32) // Togepi
- return "Togepi";
-
- return "HACKED";
- }
-
- public static string index2Nature(uint nature)
- {
- switch (nature)
- {
- default: return "Hardy";
- case 1: return "Lonely";
- case 2: return "Brave";
- case 3: return "Adamant";
- case 4: return "Naughty";
- case 5: return "Bold";
- case 6: return "Docile";
- case 7: return "Relaxed";
- case 8: return "Impish";
- case 9: return "Lax";
- case 10: return "Timid";
- case 11: return "Hasty";
- case 12: return "Serious";
- case 13: return "Jolly";
- case 14: return "Naive";
- case 15: return "Modest";
- case 16: return "Mild";
- case 17: return "Quiet";
- case 18: return "Bashful";
- case 19: return "Rash";
- case 20: return "Calm";
- case 21: return "Gentle";
- case 22: return "Sassy";
- case 23: return "Careful";
- case 24: return "Quirky";
- }
- }
-
- public static uint[] ParseStats(uint first, uint second)
- {
- uint[] stats = new uint[6];
-
- stats[0] = first & 0x1F; //HP
- stats[1] = (first & 0x3E0) >> 0x5; //Attack
- stats[2] = (first & 0x7C00) >> 0xA; //Defense
-
- stats[3] = second & 0x1F; //Speed
- stats[4] = (second & 0x3E0) >> 0x5; //Sp. Attack
- stats[5] = (second & 0x7C00) >> 0xA; //Sp. Defense
-
- return stats;
- }
-}
+ if (mystryMew)
+ while (isShiny(pid, TID, SID))
+ {
+ rand1 = Next(rand2, algo); // PIDH
+ rand2 = Next(rand1, algo); // PIDL
+
+ pid = ((rand1 >> 0x10) << 0x10) | (rand2 >> 0x10);
+ }
+
+ if (Has(algo, Algo.PCJP2003) && PID - pid < 8)
+ {
+ TSV = getTSVFromPID(pid);
+ pid = PID;
+ }
+
+ uint jpid;
+ uint epid;
+
+ if (forcedShiny)
+ {
+ rand2 = Next(rand2, algo);
+
+ if (berryGlitch)
+ {
+ epid = forceShinyPID(rand1 >> 0x10, rand2 >> 0x10, 30317, SID);
+ jpid = forceShinyPID(rand1 >> 0x10, rand2 >> 0x10, 21121, SID);
+
+ pid = epid == PID ? epid : jpid;
+ }
+ else
+ {
+ TSV = getTSVFromForceShiny(PID);
+ pid = forceShinyPID(rand1 >> 0x10, rand2 >> 0x10, TSV, SID);
+ originalPID = pid;
+ }
+ }
+
+ rand3 = Next(rand2, algo); // IV1
+ rand4 = Next(rand3, algo); // IV2
+ rand5 = Next(rand4, algo); // Item if available or OTG if Item not available
+ rand6 = Next(rand5, algo); // OTG if Item available
+ Next(rand6, algo);
+
+ itemRand = Has(algo, Algo.ItemFirst) ? rand5 : rand6;
+ otgRand = !Has(algo, Algo.ItemFirst) ? rand5 : rand6;
+
+ if (pid != PID)
+ // in case of antishiny, we have to go back.
+ rand1b = Next(Next(Next(Next(Next(rand1b, algo), algo), algo), algo), algo); // PID, IV, OTG -> next in batch.
+
+ batchCount++;
+
+ } while (batchGen && pid != PID && batchCount <= 5);
+
+ if (batchCount > 6 || pid != PID)
+ continue;
+
+ found = true;
+ string knownSeed = "Found Seed";
+
+ if (berryGlitch)
+ knownSeed = originalSeed >= 3 && originalSeed <= 180 ? "Known Seed" : "Unknown Seed";
+
+ string mystryMewBatch = "";
+
+ if (mystryMew)
+ {
+ knownSeed = MystryMewSeeds.Contains(rand1b) ? "Known Seed" : "Unknown Seed";
+
+ if (knownSeed == "Known Seed")
+ {
+ long mewIndex = Array.IndexOf(MystryMewSeeds, rand1b) + 1;
+ mystryMewBatch = string.Format("{0}/{1} {2}", mewIndex, MystryMewSeeds.Length, string.Format("{0} Slot {1}", mewIndex < 7 ? "Party" : "PC", mewIndex < 7 ? mewIndex : mewIndex - 6));
+ }
+ else
+ mystryMewBatch = string.Format(" ({0} of 5)", batchCount);
+ }
+
+ Console.WriteLine("{0}: {1:X8} - {2} {3}", knownSeed, i, option.Item1, mystryMewBatch);
+ Console.WriteLine("PID: {0:X8} ({1})", PID, index2Nature(PID % 25));
+
+ uint rtc = seed ^ (seed < 0x5A0u ? 0x10001u : 0x0u);
+
+ if (hasOffset)
+ {
+ uint days = rtc / 1440;
+ uint hours = rtc % 1440 / 60;
+ uint mins = rtc % 60;
+ Console.WriteLine("RTC: {0} day{1}, {2} hour{3}, {4} minute{5}", days, days != 0 ? "s" : "", hours, hours != 0 ? "s" : "", mins, mins != 0 ? "s" : "");
+
+ if (Has(algo, Algo.PCJP2003))
+ {
+ Console.WriteLine("Species: {1}{0} {2}", entry.Item1, entry.Item4 ? "Forced Shiny " : pid - originalPID > 0 && pid - originalPID < 8 ? "Anti-Shiny " : "", entry.Item2);
+ Console.WriteLine("TSV: {0:X4}", TSV);
+ }
+ }
+
+ if (Has(algo, Algo.PCJP2003) && !forcedShiny)
+ Console.WriteLine("Shiny: Cannot be shiny if hatched by original trainer");
+ else if (Has(algo, Algo.CanBeShiny))
+ Console.WriteLine("Shiny: Can be shiny");
+ else if (forcedShiny)
+ Console.WriteLine("Shiny: Must be shiny");
+ else
+ Console.WriteLine("Shiny: Cannot be shiny");
+
+ uint[] ivs;
+
+ if (Has(algo, Algo.NoIVs))
+ ivs = new uint[] { 0, 0, 0, 0, 0, 0 };
+ else
+ ivs = ParseStats((rand3 >> 0x10) & 0x7FFF, (rand4 >> 0x10) & 0x7FFF);
+
+ Console.WriteLine("IVs: {0}, {1}, {2}, {4}, {5}, {3}", ivs[0], ivs[1], ivs[2], ivs[3], ivs[4], ivs[5]);
+
+ if (Has(algo, Algo.BerryGlitch))
+ Console.WriteLine("OTG: {0}", ((otgRand >> 0x10) / 3 & 1) == 1 ? "Female (RUBY)" : "Male (SAPHIRE)");
+ else if (Has(algo, Algo.RandOTG3))
+ Console.WriteLine("OTG: {0}", ((otgRand >> 0x17) / 1 & 1) == 0 ? "Female" : "Male");
+ else if (Has(algo, Algo.RandOTG2))
+ {
+ if (TID == 50701)
+ {
+ Console.WriteLine("Sunday Wob OTG: {0}", ((otgRand >> 0x13) / 1 & 1) == 1 ? "Female" : "Male");
+ Console.WriteLine("Sapporo Pikachu OTG: Male (Always)");
+ }
+ else
+ Console.WriteLine("OTG: {0}", ((otgRand >> 0x13) / 1 & 1) == 1 ? "Female" : "Male");
+ }
+ else if (Has(algo, Algo.RandOTG1))
+ Console.WriteLine("OTG: {0}", ((otgRand >> 0x10) / 3 & 1) == 1 ? "Female" : "Male");
+ else if (Has(algo, Algo.MaleOTG))
+ Console.WriteLine("OTG: Male (Always)");
+ else if (Has(algo, Algo.FemaleOTG))
+ Console.WriteLine("OTG: Female (Always)");
+
+ if (Has(algo, Algo.RandItem3))
+ Console.WriteLine("Item: {0}", ((itemRand >> 0x17) & 1) == 0 ? "Salac Berry" : "Ganlon Berry");
+ else if (Has(algo, Algo.RandItem2))
+ Console.WriteLine("Item: {0}", ((itemRand >> 0x13) & 1) == 0 ? "Salac Berry" : "Ganlon Berry");
+ else if (Has(algo, Algo.RandItem1))
+ {
+ if (Has(algo, Algo.WSHMKR))
+ Console.WriteLine("Item: {0}", ((itemRand >> 0x10) / 3 & 1) == 0 ? "Salac Berry" : "Ganlon Berry");
+ else if (hasOffset)
+ {
+ string berry =
+ $"Ganlon Berry ({((rtc & 0x1) == 0 ? "99.8%" : "0.2%")}), Salac Berry ({((rtc & 0x1) == 1 ? "99.8%" : "0.2%")})";
+
+ Console.WriteLine("Item: {0}", berry);
+ }
+ else
+ Console.WriteLine("Item: {0}", ((itemRand >> 0x10) / 3 & 1) == 0 ? "Petaya Berry" : "Apicot Berry");
+ }
+ }
+
+ if (!found)
+ Console.WriteLine("No seeds found for {0:X8}", PID);
+
+ Console.WriteLine("----------");
+ }
+ }
+
+ Console.WriteLine("Complete. Press enter to exit.");
+ Console.ReadLine();
+ }
+
+ public static bool isShiny(uint pid, uint tid, uint sid) => ((pid >> 16) ^ (pid & 0xFFFF) ^ tid ^ sid) < 8;
+
+ public static uint forceShinyPID(uint seed, uint shiny, uint tid, uint sid) => (seed << 0x10) | ((seed ^ tid ^ sid) & 0xFFF8) | (shiny & 7);
+
+ public static uint getTSVFromForceShiny(uint pid) => (pid >> 0x10) ^ (pid & 0xFFF8);
+
+ public static uint getTSVFromPID(uint pid) => (pid >> 0x10) ^ (pid & 0xFFFF);
+
+ public static bool Has(Algo algo, Algo option) => (algo & option) != 0;
+
+ public static uint[] GetNumbers()
+ {
+ string[] lines = Console.ReadLine()?.Trim().Split(' ');
+
+ if (string.IsNullOrEmpty(lines?[0])) return new uint[]{};
+
+ List numbers = new List();
+
+ foreach (string str in lines)
+ {
+ uint number;
+ bool success = str.StartsWith("0x") ?
+ uint.TryParse(str.Replace("0x", ""), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out number) :
+ uint.TryParse(str, out number);
+
+ if (!success)
+ return new uint[] { };
+
+ numbers.Add(number);
+ }
+
+ return numbers.ToArray();
+ }
+
+ public static uint GetRandomEntry(uint randVal, uint max)
+ {
+ uint high = randVal >> 16;
+ uint first = ((high << 2) & 0xFFFF) + high;
+ uint second = ((randVal & 0xFFFF) << 1) + (first >> 16);
+
+ second += high + (second >> 16);
+
+ return (max * (second & 0xFFFF)) >> 16;
+ }
+
+ public static Tuple GetEggEntry(uint randVal, uint seed)
+ {
+ uint result = GetRandomEntry(randVal, 1000);
+ int count = 0;
+
+ while (true)
+ {
+ if (result < PCJP2003Types[count].Item3)
+ return PCJP2003Types[count];
+
+ result -= PCJP2003Types[count++].Item3;
+ }
+ }
+
+ public static Tuple[] PCJP2003Types = new Tuple[]
+ {
+ new Tuple("Pichu","Teeter Dance",100, false),
+ new Tuple("Pichu","Teeter Dance",25, true),
+ new Tuple("Pichu","Wish",100, false),
+ new Tuple("Pichu","Wish",25, true),
+ new Tuple("Bagon","Iron Defense",125, false),
+ new Tuple("Bagon","Wish",125, false),
+ new Tuple("Absol","Spite",125, false),
+ new Tuple("Absol","Wish",125, false),
+ new Tuple("Ralts","Charm",125, false),
+ new Tuple("Ralts","Wish",125, false),
+ };
+
+ public static uint Prev(uint seed, Algo algo) =>
+ Has(algo, Algo.BACDPIDIV) ||
+ Has(algo, Algo.PokeParkEggs) ||
+ Has(algo, Algo.WCEggs) ||
+ Has(algo, Algo.ForceAntiShiny) ? PrevGBA(seed) : PrevXD(seed);
+
+ public static uint Next(uint seed, Algo algo) =>
+ Has(algo, Algo.BACDPIDIV) ||
+ Has(algo, Algo.PokeParkEggs) ||
+ Has(algo, Algo.WCEggs) ||
+ Has(algo, Algo.ForceAntiShiny) ? NextGBA(seed) : NextXD(seed);
+
+ public static uint PrevXD(uint seed) => seed * 0xB9B33155u + 0xA170F641u;
+
+ public static uint NextXD(uint seed) => seed * 0x343FDu + 0x269EC3u;
+
+ public static uint PrevGBA(uint seed) => seed * 0xEEB9EB65u + 0xA3561A1u;
+
+ public static uint NextGBA(uint seed) => seed * 0x41C64E6Du + 0x00006073u;
+
+ public static string eReaderType(uint pid)
+ {
+ uint nature = pid % 25;
+
+ if (nature == 16 && pid % 256 < 128) // Mareep
+ return "Mareep";
+ if (nature == 11 && pid % 256 >= 128) // Scizor
+ return "Scizor";
+ if (nature == 22 && pid % 256 < 32) // Togepi
+ return "Togepi";
+
+ return "HACKED";
+ }
+
+ public static string index2Nature(uint nature)
+ {
+ return nature switch
+ {
+ 0 => "Hardy",
+ 1 => "Lonely",
+ 2 => "Brave",
+ 3 => "Adamant",
+ 4 => "Naughty",
+ 5 => "Bold",
+ 6 => "Docile",
+ 7 => "Relaxed",
+ 8 => "Impish",
+ 9 => "Lax",
+ 10 => "Timid",
+ 11 => "Hasty",
+ 12 => "Serious",
+ 13 => "Jolly",
+ 14 => "Naive",
+ 15 => "Modest",
+ 16 => "Mild",
+ 17 => "Quiet",
+ 18 => "Bashful",
+ 19 => "Rash",
+ 20 => "Calm",
+ 21 => "Gentle",
+ 22 => "Sassy",
+ 23 => "Careful",
+ 24 => "Quirky",
+ _ => "Hardy"
+ };
+ }
+
+ public static uint[] ParseStats(uint first, uint second)
+ {
+ uint[] stats = new uint[6];
+
+ stats[0] = first & 0x1F; //HP
+ stats[1] = (first & 0x3E0) >> 0x5; //Attack
+ stats[2] = (first & 0x7C00) >> 0xA; //Defense
+
+ stats[3] = second & 0x1F; //Speed
+ stats[4] = (second & 0x3E0) >> 0x5; //Sp. Attack
+ stats[5] = (second & 0x7C00) >> 0xA; //Sp. Defense
+
+ return stats;
+ }
+ }
+}
diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs
deleted file mode 100644
index b4bb312..0000000
--- a/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("Gen3EventChecker")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("Gen3EventChecker")]
-[assembly: AssemblyCopyright("Copyright © 2017")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("ed21498d-7f99-43ae-969e-17429245da4b")]
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]