Bond697

Channel Jirachi Searcher

Jul 18th, 2012
652
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.78 KB | None | 0 0
  1. dtypes.h
  2. -----------------------------
  3. #pragma once
  4.  
  5. typedef unsigned long long u64;
  6. typedef unsigned int u32;
  7. typedef unsigned short u16;
  8. typedef unsigned char u8;
  9.  
  10. typedef signed long long s64;
  11. typedef signed int s32;
  12. typedef signed short s16;
  13. typedef signed char s8;
  14.  
  15. 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"};
  16.  
  17.  
  18. typedef struct{
  19.  
  20.     u32 mul;
  21.     u32 add;
  22.     u32 rmul;
  23.     u32 radd;
  24.  
  25. } Rand32;
  26.  
  27.  
  28. main.c
  29. -----------------------------
  30. #include "stdafx.h"
  31. #include "dtypes.h"
  32.  
  33.  
  34. void advanceXD(u32 seed, Rand32* search);
  35. void reverseXD(u32 seed, Rand32* search);
  36. u16 previewHalfReverse(u32 startSeed, u32 frames, Rand32* search);
  37. u16 previewHalfAdvance(u32 startSeed, u32 frames, Rand32* search);
  38. u32 getPID(u32 seed);
  39. u8 getNature(u32 pid);
  40. u32 runsearch(u16 ivseed1, u16 ivseed2, u16 upid, u16 lpid);
  41. u32 runsearch_pid(u16 ivseed1, u16 ivseed2, u16 hpid, u16 lpid);
  42. u32 runsearch_rev(u16 ivseed1, u16 ivseed2, u16 hpid, u16 lpid);
  43. u32 runsearch_pid_rev(u16 ivseed1, u16 ivseed2, u16 hpid, u16 lpid);
  44. void setMagicNumbers(Rand32* search);
  45.  
  46. Rand32 nums;
  47.  
  48.  
  49.  
  50. int _tmain(int argc, _TCHAR* argv[])
  51. {
  52.     int jirachi = 0;
  53.     u32 pid;
  54.     u8 iv1, iv2, iv3, iv4, iv5, iv6;
  55.  
  56.     //i only have 2 jirachis to search, might as well automate the process
  57.     switch(jirachi)
  58.     {
  59.     case 0:
  60.         pid = 0x82F76831;
  61.         iv1 = 28;
  62.         iv2 = 11;
  63.         iv3 = 7;
  64.         iv4 = 29;
  65.         iv5 = 17;
  66.         iv6 = 7;
  67.     break;
  68.  
  69.     case 1:
  70.         pid = 0x7C805A75;
  71.         iv1 = 25;
  72.         iv2 = 0;
  73.         iv3 = 12;
  74.         iv4 = 18;
  75.         iv5 = 26;
  76.         iv6 = 16;
  77.     break;
  78.  
  79.     default:
  80.         pid = 0;
  81.         iv1 = 0;
  82.         iv2 = 0;
  83.         iv3 = 0;
  84.         iv4 = 0;
  85.         iv5 = 0;
  86.         iv6 = 0;
  87.     }
  88.  
  89.  
  90.     //make half seeds out of ivs
  91.     u16 ivseed1 = (iv1 + (iv2 << 5) + (iv3 << 5));
  92.     u16 ivseed2 = (iv6 + (iv4 << 5) + (iv5 << 5));
  93.  
  94.     //split pids into half seeds
  95.     u16 lpid = pid & 0xFFFF;
  96.     u16 hpid = pid >> 16;
  97.  
  98.     setMagicNumbers(&nums);
  99.  
  100.  
  101.     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));
  102.     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));
  103.     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));
  104.     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));
  105.  
  106.     if (searchresult > 0)
  107.     {
  108.         printf_s("%X\n\n", searchresult);
  109.     }
  110.     else
  111.     {
  112.         printf_s("No result.\n\n");
  113.     }
  114.  
  115.  
  116.     while(1);
  117.     return 0;
  118. }
  119.  
  120.  
  121.  
  122. void advanceXD(u32 seed, Rand32* search)
  123. {
  124.  
  125.     seed = (seed * search->mul) + search->add;
  126. }
  127.  
  128.  
  129. void reverseXD(u32 seed, Rand32* search)
  130. {
  131.  
  132.     seed = (seed * search->rmul) + search->radd;
  133. }
  134.  
  135.  
  136. //shows seed on -frames from seed input
  137. u16 previewHalfReverse(u32 startSeed, u32 frames, Rand32* search)
  138. {
  139.     for (u32 i = 0; i < frames; i++)
  140.     {
  141.         startSeed = ((startSeed * search->rmul) + search->radd) & 0xFFFFFFFF;
  142.     }
  143.     return (u16)(startSeed >> 16);
  144. }
  145.  
  146.  
  147. //shows seed on +frames from seed input
  148. u16 previewHalfAdvance(u32 startSeed, u32 frames, Rand32* search)
  149. {
  150.     for (u32 i = 0; i < frames; i++)
  151.     {
  152.         startSeed = ((startSeed * search->mul) + search->add) & 0xFFFFFFFF;
  153.     }
  154.     return (u16)(startSeed >> 16);
  155. }
  156.  
  157.  
  158. //grab xd pid
  159. u32 getPID(u32 seed)
  160. {
  161.     u32 pid;
  162.  
  163.     pid = (u32)((previewHalfAdvance(seed, 3, &nums) << 16) | (previewHalfAdvance(seed, 4, &nums)));
  164.  
  165.     return pid;
  166. }
  167.  
  168.  
  169. u8 getNature(u32 pid)
  170. {
  171.     u8 n = (u8)(pid % 25);
  172.  
  173.     return n;
  174. }
  175.  
  176.  
  177. //search starting w/ ivs, ala colo/xd
  178. u32 runsearch(u16 ivseed1, u16 ivseed2, u16 hpid, u16 lpid)
  179. {
  180.     u32 seed;
  181.  
  182.     for (int i = 0; i < 65536; i++)
  183.     {
  184.         seed = (u32)((ivseed2 << 16) + i);
  185.  
  186.         if ((previewHalfAdvance(seed, 1, &nums) == ivseed1) && (previewHalfAdvance(seed, 2, &nums) == hpid) && (previewHalfAdvance(seed, 3, &nums) == lpid))
  187.             return seed;
  188.     }
  189.  
  190.     return 0;
  191. }
  192.  
  193. //start with pids like the normal games
  194. u32 runsearch_pid(u16 ivseed1, u16 ivseed2, u16 hpid, u16 lpid)
  195. {
  196.     u32 seed;
  197.  
  198.     for (int i = 0; i < 65536; i++)
  199.     {
  200.         seed = (u32)((hpid << 16) + i);
  201.  
  202.         if ((previewHalfAdvance(seed, 1, &nums) == lpid) && (previewHalfAdvance(seed, 2, &nums) == ivseed1) && (previewHalfAdvance(seed, 3, &nums) == ivseed2))
  203.             return seed;
  204.     }
  205.  
  206.     return 0;
  207. }
  208.  
  209. //ivs but going in reverse
  210. u32 runsearch_rev(u16 ivseed1, u16 ivseed2, u16 hpid, u16 lpid)
  211. {
  212.     u32 seed;
  213.  
  214.     for (int i = 0; i < 65536; i++)
  215.     {
  216.         seed = (u32)((ivseed2 << 16) + i);
  217.  
  218.         if ((previewHalfReverse(seed, 1, &nums) == ivseed1) && (previewHalfReverse(seed, 2, &nums) == hpid) && (previewHalfReverse(seed, 3, &nums) == lpid))
  219.             return seed;
  220.     }
  221.  
  222.     return 0;
  223. }
  224.  
  225. //pid but going in reverse
  226. u32 runsearch_pid_rev(u16 ivseed1, u16 ivseed2, u16 hpid, u16 lpid)
  227. {
  228.     u32 seed;
  229.  
  230.     for (int i = 0; i < 65536; i++)
  231.     {
  232.         seed = (u32)((hpid << 16) + i);
  233.  
  234.         if ((previewHalfReverse(seed, 1, &nums) == lpid) && (previewHalfReverse(seed, 2, &nums) == ivseed1) && (previewHalfReverse(seed, 3, &nums) == ivseed2))
  235.             return seed;
  236.     }
  237.  
  238.     return 0;
  239. }
  240.  
  241.  
  242. void setMagicNumbers(Rand32* search)
  243. {
  244.     search->mul =  0x41c64e6d;
  245.     search->add =  0x3039;
  246.     search->rmul = 0xeeb9eb65;
  247.     search->radd = 0xfc77a683;
  248. }
Advertisement
Add Comment
Please, Sign In to add comment