dtypes.h ----------------------------- #pragma once typedef unsigned long long u64; typedef unsigned int u32; typedef unsigned short u16; typedef unsigned char u8; typedef signed long long s64; typedef signed int s32; typedef signed short s16; typedef signed char s8; const char *natures[25] = {"Hardy", "Lonely", "Brave", "Adamant", "Naughty", "Bold", "Docile", "Relaxed", "Impish", "Lax", "Timid", "Hasty", "Serious", "Jolly", "Naive", "Modest", "Mild", "Quiet", "Bashful", "Rash", "Calm", "Gentle", "Sassy", "Careful", "Quirky"}; typedef struct{ u32 mul; u32 add; u32 rmul; u32 radd; } Rand32; main.c ----------------------------- #include "stdafx.h" #include "dtypes.h" void advanceXD(u32 seed, Rand32* search); void reverseXD(u32 seed, Rand32* search); u16 previewHalfReverse(u32 startSeed, u32 frames, Rand32* search); u16 previewHalfAdvance(u32 startSeed, u32 frames, Rand32* search); u32 getPID(u32 seed); u8 getNature(u32 pid); u32 runsearch(u16 ivseed1, u16 ivseed2, u16 upid, u16 lpid); u32 runsearch_pid(u16 ivseed1, u16 ivseed2, u16 hpid, u16 lpid); u32 runsearch_rev(u16 ivseed1, u16 ivseed2, u16 hpid, u16 lpid); u32 runsearch_pid_rev(u16 ivseed1, u16 ivseed2, u16 hpid, u16 lpid); void setMagicNumbers(Rand32* search); Rand32 nums; int _tmain(int argc, _TCHAR* argv[]) { int jirachi = 0; u32 pid; u8 iv1, iv2, iv3, iv4, iv5, iv6; //i only have 2 jirachis to search, might as well automate the process switch(jirachi) { case 0: pid = 0x82F76831; iv1 = 28; iv2 = 11; iv3 = 7; iv4 = 29; iv5 = 17; iv6 = 7; break; case 1: pid = 0x7C805A75; iv1 = 25; iv2 = 0; iv3 = 12; iv4 = 18; iv5 = 26; iv6 = 16; break; default: pid = 0; iv1 = 0; iv2 = 0; iv3 = 0; iv4 = 0; iv5 = 0; iv6 = 0; } //make half seeds out of ivs u16 ivseed1 = (iv1 + (iv2 << 5) + (iv3 << 5)); u16 ivseed2 = (iv6 + (iv4 << 5) + (iv5 << 5)); //split pids into half seeds u16 lpid = pid & 0xFFFF; u16 hpid = pid >> 16; setMagicNumbers(&nums); u32 searchresult = (runsearch(ivseed1, ivseed2, hpid, lpid) || runsearch(ivseed1 + 0x8000, ivseed2, hpid, lpid) || runsearch(ivseed1, ivseed2 + 0x8000, hpid, lpid) || runsearch(ivseed1 + 0x8000, ivseed2 + 0x8000, hpid, lpid)); searchresult += (runsearch_pid(ivseed1, ivseed2, hpid, lpid) || runsearch_pid(ivseed1 + 0x8000, ivseed2, hpid, lpid) || runsearch_pid(ivseed1, ivseed2 + 0x8000, hpid, lpid) || runsearch_pid(ivseed1 + 0x8000, ivseed2 + 0x8000, hpid, lpid)); searchresult += (runsearch_rev(ivseed1, ivseed2, hpid, lpid) || runsearch_rev(ivseed1 + 0x8000, ivseed2, hpid, lpid) || runsearch_rev(ivseed1, ivseed2 + 0x8000, hpid, lpid) || runsearch_rev(ivseed1 + 0x8000, ivseed2 + 0x8000, hpid, lpid)); searchresult += (runsearch_pid_rev(ivseed1, ivseed2, hpid, lpid) || runsearch_pid_rev(ivseed1 + 0x8000, ivseed2, hpid, lpid) || runsearch_pid_rev(ivseed1, ivseed2 + 0x8000, hpid, lpid) || runsearch_pid_rev(ivseed1 + 0x8000, ivseed2 + 0x8000, hpid, lpid)); if (searchresult > 0) { printf_s("%X\n\n", searchresult); } else { printf_s("No result.\n\n"); } while(1); return 0; } void advanceXD(u32 seed, Rand32* search) { seed = (seed * search->mul) + search->add; } void reverseXD(u32 seed, Rand32* search) { seed = (seed * search->rmul) + search->radd; } //shows seed on -frames from seed input u16 previewHalfReverse(u32 startSeed, u32 frames, Rand32* search) { for (u32 i = 0; i < frames; i++) { startSeed = ((startSeed * search->rmul) + search->radd) & 0xFFFFFFFF; } return (u16)(startSeed >> 16); } //shows seed on +frames from seed input u16 previewHalfAdvance(u32 startSeed, u32 frames, Rand32* search) { for (u32 i = 0; i < frames; i++) { startSeed = ((startSeed * search->mul) + search->add) & 0xFFFFFFFF; } return (u16)(startSeed >> 16); } //grab xd pid u32 getPID(u32 seed) { u32 pid; pid = (u32)((previewHalfAdvance(seed, 3, &nums) << 16) | (previewHalfAdvance(seed, 4, &nums))); return pid; } u8 getNature(u32 pid) { u8 n = (u8)(pid % 25); return n; } //search starting w/ ivs, ala colo/xd u32 runsearch(u16 ivseed1, u16 ivseed2, u16 hpid, u16 lpid) { u32 seed; for (int i = 0; i < 65536; i++) { seed = (u32)((ivseed2 << 16) + i); if ((previewHalfAdvance(seed, 1, &nums) == ivseed1) && (previewHalfAdvance(seed, 2, &nums) == hpid) && (previewHalfAdvance(seed, 3, &nums) == lpid)) return seed; } return 0; } //start with pids like the normal games u32 runsearch_pid(u16 ivseed1, u16 ivseed2, u16 hpid, u16 lpid) { u32 seed; for (int i = 0; i < 65536; i++) { seed = (u32)((hpid << 16) + i); if ((previewHalfAdvance(seed, 1, &nums) == lpid) && (previewHalfAdvance(seed, 2, &nums) == ivseed1) && (previewHalfAdvance(seed, 3, &nums) == ivseed2)) return seed; } return 0; } //ivs but going in reverse u32 runsearch_rev(u16 ivseed1, u16 ivseed2, u16 hpid, u16 lpid) { u32 seed; for (int i = 0; i < 65536; i++) { seed = (u32)((ivseed2 << 16) + i); if ((previewHalfReverse(seed, 1, &nums) == ivseed1) && (previewHalfReverse(seed, 2, &nums) == hpid) && (previewHalfReverse(seed, 3, &nums) == lpid)) return seed; } return 0; } //pid but going in reverse u32 runsearch_pid_rev(u16 ivseed1, u16 ivseed2, u16 hpid, u16 lpid) { u32 seed; for (int i = 0; i < 65536; i++) { seed = (u32)((hpid << 16) + i); if ((previewHalfReverse(seed, 1, &nums) == lpid) && (previewHalfReverse(seed, 2, &nums) == ivseed1) && (previewHalfReverse(seed, 3, &nums) == ivseed2)) return seed; } return 0; } void setMagicNumbers(Rand32* search) { search->mul = 0x41c64e6d; search->add = 0x3039; search->rmul = 0xeeb9eb65; search->radd = 0xfc77a683; }