Bond697 icon

Channel Jirachi Searcher

Bond697 | PRO | 07/18/12 12:24:05 PM UTC | 0 ⭐ | 613 👁️ | Never ⏰ | []
C++ |

5.78 KB

|

None

|

0 👍

/

0 👎

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