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;
}
Comments