Kaphotics

BreedingMethod

Oct 21st, 2016
778
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. signed int __fastcall sub_22EBB8(int a1, int OUTPKM, int a3, _DWORD *a4)
  2. {
  3.   int outpkm; // r4@1
  4.   pml::pokepara::CoreParam **v5; // r5@1
  5.   _DWORD *v6; // r7@1
  6.   pml::pokepara::CoreParam *v7; // r0@2
  7.   int v8; // r0@4
  8.   gfl2::math::Random *v9; // r6@4
  9.   pml::pokepara::CoreParam *v10; // r0@5
  10.   int species; // r0@7
  11.   bool nidoU; // zf@7
  12.   bool nidoM; // zf@10
  13.   signed __int16 v14; // r1@15
  14.   gfl2::math::Random *v15; // r10@18
  15.   pml::pokepara::CoreParam *v16; // r0@19
  16.   int v17; // r0@21
  17.   signed __int16 v18; // r6@21
  18.   bool illuvolbeat; // zf@21
  19.   pml::pokepara::CoreParam *v20; // r0@29
  20.   int v21; // r0@31
  21.   bool v22; // zf@31
  22.   int v23; // r6@35
  23.   int v24; // r9@35
  24.   int v25; // r0@35
  25.   int v26; // r2@37
  26.   pml::pokepara::CoreParam *v27; // r6@42
  27.   int v28; // r2@44
  28.   int v29; // r0@44
  29.   pml::pokepara::CoreParam *bredParent; // r0@49
  30.   int v31; // r0@51
  31.   int v32; // r0@51
  32.   bool v33; // zf@51
  33.   gfl2::math::Random *v34; // r9@55
  34.   unsigned int v35; // r0@55
  35.   int v36; // r6@62
  36.   int v37; // r9@62
  37.   __int16 v38; // r11@62
  38.   unsigned int v39; // r6@69
  39.   pml::pokepara::CoreParam *v40; // r0@70
  40.   signed int v41; // r0@72
  41.   int v42; // r6@85
  42.   int v43; // r0@85
  43.   bool destiny; // zf@85
  44.   signed int IVsToInherit; // r0@88
  45.   signed int v46; // r11@90
  46.   int v47; // r1@90
  47.   int v48; // r6@90
  48.   int v49; // r0@90
  49.   int v50; // r1@94
  50.   unsigned int v51; // r9@94
  51.   unsigned int v52; // r0@94
  52.   signed int v53; // r0@96
  53.   gfl2::math::Random *v54; // r9@106
  54.   int v55; // r0@107
  55.   int v56; // r6@107
  56.   int v57; // r0@107
  57.   bool v58; // zf@107
  58.   gfl2::math::Random *v59; // r8@111
  59.   unsigned int v60; // r6@111
  60.   __int16 v61; // r0@112
  61.   int v62; // r1@112
  62.   unsigned int IVctr; // r6@113
  63.   pml::pokepara::CoreParam *v64; // r0@115
  64.   int charm; // r6@120
  65.   int v66; // r10@120
  66.   unsigned int PIDReRolls; // r8@120
  67.   int pkm0Language; // r9@120
  68.   unsigned int rrCtr; // r6@124
  69.   int pid; // r0@125
  70.   unsigned int v71; // r9@135
  71.   unsigned int v72; // r6@135
  72.   unsigned int v73; // r8@136
  73.   int v74; // r1@136
  74.   unsigned int v75; // r12@138
  75.   unsigned int v76; // r2@139
  76.   int v77; // r3@139
  77.   int v78; // r3@143
  78.   int v79; // r8@143
  79.   bool v80; // zf@143
  80.   __int16 v81; // r3@149
  81.   __int16 v82; // r12@149
  82.   int v83; // r0@151
  83.   gfl2::math::Random *v84; // r9@155
  84.   int v85; // r7@155
  85.   int v86; // r8@155
  86.   int v87; // r6@155
  87.   int v88; // r0@155
  88.   int v89; // r5@155
  89.   signed int result; // r0@162
  90.   bool v91; // zf@162
  91.   int v92; // [sp+0h] [bp-E0h]@35
  92.   char v93; // [sp+8h] [bp-D8h]@151
  93.   int v94; // [sp+10h] [bp-D0h]@62
  94.   gfl2::math::Random *v95; // [sp+14h] [bp-CCh]@62
  95.   int v96[4]; // [sp+18h] [bp-C8h]@90
  96.   int v97; // [sp+28h] [bp-B8h]@90
  97.   int v98; // [sp+2Ch] [bp-B4h]@90
  98.   int v99; // [sp+6Ch] [bp-74h]@35
  99.   int v100; // [sp+70h] [bp-70h]@35
  100.   int v101; // [sp+74h] [bp-6Ch]@35
  101.   int v102; // [sp+78h] [bp-68h]@35
  102.   int v103; // [sp+7Ch] [bp-64h]@35
  103.   int v104; // [sp+80h] [bp-60h]@35
  104.   int v105; // [sp+84h] [bp-5Ch]@35
  105.   int v106; // [sp+88h] [bp-58h]@35
  106.   int v107; // [sp+8Ch] [bp-54h]@35
  107.   int v108; // [sp+ACh] [bp-34h]@1
  108.   int v109; // [sp+B0h] [bp-30h]@1
  109.   int v110; // [sp+B4h] [bp-2Ch]@1
  110.   _DWORD *v111; // [sp+B8h] [bp-28h]@1
  111.  
  112.   v108 = a1;
  113.   v109 = OUTPKM;
  114.   v110 = a3;
  115.   v111 = a4;
  116.   outpkm = OUTPKM;
  117.   v5 = a3;
  118.   v6 = a4;
  119.   *(OUTPKM + 16) = *a4;
  120.   *(OUTPKM + 28) = 1;
  121.   if ( pml::pokepara::CoreParam::GetMonsNo(*(a3 + 4)) == 132 )// ditto
  122.     v7 = *v5;
  123.   else
  124.     v7 = v5[1];
  125.   v8 = pml::pokepara::CoreParam::GetMonsNo(v7);
  126.   *(outpkm + 24) = sub_2954E4(v8);
  127.   v9 = v6[3];
  128.   if ( pml::pokepara::CoreParam::GetMonsNo(v5[1]) == 132 )// ditto
  129.     v10 = *v5;
  130.   else
  131.     v10 = v5[1];
  132.   species = pml::pokepara::CoreParam::GetMonsNo(v10);
  133.   nidoU = species == 29;                        // nidoran F
  134.   if ( species != 29 )
  135.     nidoU = species == 32;                      // nidoran M
  136.   if ( nidoU )
  137.     goto nidoranGenderDetermination;
  138.   nidoM = species == 33;                        // nidorino
  139.   if ( species != 33 )
  140.     nidoM = species == 34;                      // nidoking
  141.   if ( nidoM )
  142.   {
  143. nidoranGenderDetermination:
  144.     if ( gfl2::math::Random::Next(v9, 2u) )     // 50%
  145.       v14 = 29;                                 // F
  146.     else
  147.       v14 = 32;                                 // M
  148.     *(outpkm + 0x18) = v14;                     // set species
  149.   }
  150.   v15 = v6[3];
  151.   if ( pml::pokepara::CoreParam::GetMonsNo(v5[1]) == 132 )// ditto
  152.     v16 = *v5;
  153.   else
  154.     v16 = v5[1];
  155.   v17 = pml::pokepara::CoreParam::GetMonsNo(v16);
  156.   v18 = 313;
  157.   illuvolbeat = v17 == 313;                     // isVolbeat
  158.   if ( v17 != 313 )
  159.     illuvolbeat = v17 == 314;                   // isIllumise
  160.   if ( illuvolbeat )                            // illumise/volbeat species
  161.   {
  162.     if ( gfl2::math::Random::Next(v15, 2u) )    // 50%
  163.       v18 = 314;                                // if 1 => Illumise (Basically M/F)
  164.     *(outpkm + 0x18) = v18;                     // set species
  165.   }
  166.   if ( pml::pokepara::CoreParam::GetMonsNo(v5[1]) == 132 )// ditto
  167.     v20 = *v5;
  168.   else
  169.     v20 = v5[1];
  170.   v21 = pml::pokepara::CoreParam::GetMonsNo(v20);
  171.   v22 = v21 == 490;                             // manaphy
  172.   if ( v21 == 490 )
  173.     LOWORD(v21) = 489;                          // breed phione
  174.   if ( v22 )
  175.     *(outpkm + 24) = v21;                       // set species to phione
  176.   v99 = 0;
  177.   v100 = 0;
  178.   v101 = 0;
  179.   v102 = 0;
  180.   v103 = 0;
  181.   v104 = 0;
  182.   v105 = 0;
  183.   v106 = 0;
  184.   v107 = 0;
  185.   _aeabi_memcpy4(&v92, &incenseTable, 108);
  186.   v23 = pml::pokepara::CoreParam::GetItem(*v5);
  187.   v24 = pml::pokepara::CoreParam::GetItem(v5[1]);
  188.   v25 = 0;
  189.   while ( 1 )
  190.   {
  191.     if ( *(outpkm + 0x18) == *(&v92 + 3 * v25) )
  192.     {
  193.       v26 = *(&v92 + 3 * v25 + 1);
  194.       if ( v26 != v23 && v26 != v24 )
  195.         break;
  196.     }
  197.     if ( ++v25 >= 0xC )
  198.       goto LABEL_41;
  199.   }
  200.   *(outpkm + 24) = *(&v92 + 3 * v25 + 2);
  201. LABEL_41:
  202.   *(outpkm + 0x1A) = 0;
  203.   if ( pml::pokepara::CoreParam::GetMonsNo(v5[1]) == 132 )// ditto
  204.     v27 = *v5;
  205.   else
  206.     v27 = v5[1];
  207.   v28 = pml::pokepara::CoreParam::GetMonsNo(v27);
  208.   v29 = 0;
  209.   while ( cosmeticFormSpec[v29] != v28 )        // check to see if it's a cosmetic formed species
  210.   {
  211.     if ( ++v29 >= 0xE )                         // legal length
  212.       goto LABEL_48;
  213.   }
  214.   *(outpkm + 26) = pml::pokepara::CoreParam::GetFormNo(v27);
  215. LABEL_48:
  216.   if ( pml::pokepara::CoreParam::GetMonsNo(v5[1]) == 132 )// ditto
  217.     bredParent = *v5;
  218.   else
  219.     bredParent = v5[1];
  220.   v31 = pml::pokepara::CoreParam::GetMonsNo(bredParent);
  221.   v32 = sub_2954E4(v31);                        // getChildSpecies
  222.   v33 = v32 == 664;
  223.   if ( v32 == 664 )                             // scatterbug
  224.     LOBYTE(v32) = *(v6 + 0x10);                 // form TID?
  225.   if ( v33 )
  226.     *(outpkm + 26) = v32;
  227.   sub_22FA68(v108, outpkm, v5);
  228.   v34 = v6[3];
  229.   pml::personal::LoadPersonalData(*(outpkm + 24), *(outpkm + 26));
  230.   v35 = pml::personal::GetPersonalParam(20);    // gender
  231.   if ( v35 )
  232.   {
  233.     if ( v35 == 254 )
  234.     {
  235.       *(outpkm + 0x1E) = 1;                     // female
  236.     }
  237.     else if ( v35 == 255 )
  238.     {
  239.       *(outpkm + 0x1E) = 2;                     // genderless
  240.     }
  241.     else
  242.     {
  243.       *(outpkm + 0x1E) = gfl2::math::Random::Next(v34, 0xFCu) + 1 < v35;// random gender
  244.     }
  245.   }
  246.   else
  247.   {
  248.     *(outpkm + 0x1E) = 0;                       // male
  249.   }
  250.   *(outpkm + 0x20) = gfl2::math::Random::Next(v6[3], 25u);// nature
  251.   v95 = v6[3];
  252.   v36 = pml::pokepara::CoreParam::GetItem(*v5) == 229;// check if parents holding everstone
  253.   v37 = pml::pokepara::CoreParam::GetItem(v5[1]) == 229;// everstone
  254.   v38 = pml::pokepara::CoreParam::GetSeikaku(*v5);
  255.   v94 = pml::pokepara::CoreParam::GetSeikaku(v5[1]);
  256.   if ( !(v36 & v37) )
  257.   {
  258.     if ( !v36 )
  259.     {
  260.       if ( !v37 )
  261.         goto LABEL_69;
  262.       goto LABEL_68;
  263.     }
  264. LABEL_66:
  265.     *(outpkm + 32) = v38;
  266.     goto LABEL_69;
  267.   }
  268.   if ( !gfl2::math::Random::Next(v95, 2u) )
  269.     goto LABEL_66;
  270. LABEL_68:
  271.   *(outpkm + 32) = v94;
  272. LABEL_69:
  273.   v39 = gfl2::math::Random::Next(v6[3], 100u);
  274.   if ( pml::pokepara::CoreParam::GetMonsNo(v5[1]) == 132 )// ditto
  275.     v40 = *v5;
  276.   else
  277.     v40 = v5[1];
  278.   v41 = sub_3AC0A4(v40);
  279.   if ( !v41 )
  280.   {
  281.     if ( v39 < 80 )                             // ability 1
  282.       goto LABEL_76;
  283. setAbil1:
  284.     *(outpkm + 0x22) = 1;
  285.     goto LABEL_85;
  286.   }
  287.   if ( v41 == 1 )
  288.   {
  289.     if ( v39 < 20 )
  290.       goto LABEL_76;
  291.     goto setAbil1;
  292.   }
  293.   if ( v41 == 2 )
  294.   {
  295.     if ( v39 < 20 )                             // ability 0
  296.       goto LABEL_76;
  297.     if ( v39 >= 40 )                            // hidden ability inherited
  298.     {
  299.       *(outpkm + 0x22) = 2;                     // index 2
  300.       goto LABEL_85;
  301.     }
  302.     goto setAbil1;
  303.   }
  304.   if ( v39 >= 0x32 )
  305.     goto setAbil1;
  306. LABEL_76:
  307.   *(outpkm + 0x22) = 0;
  308. LABEL_85:
  309.   pml::personal::LoadPersonalData(*(outpkm + 0x18), *(outpkm + 0x1A));
  310.   *(outpkm + 48) = pml::personal::GetPersonalParam(21);// hatch cycles total
  311.   v42 = pml::pokepara::CoreParam::GetItem(*v5); // check parents for destiny knot
  312.   v43 = pml::pokepara::CoreParam::GetItem(v5[1]);
  313.   destiny = v42 == 280;
  314.   if ( v42 != 280 )
  315.     destiny = v43 == 280;
  316.   if ( destiny )
  317.     IVsToInherit = 5;
  318.   else
  319.     IVsToInherit = 3;
  320.   *(outpkm + 0x58) = IVsToInherit;
  321.   v46 = 0;
  322.   v95 = v6[3];                                  // one byte worth of rand data
  323.   v98 = 0x125;                                  // power items
  324.   v97 = 0x124;
  325.   v96[0] = 0x126;
  326.   v96[1] = 0x121;
  327.   v96[2] = 0x122;
  328.   v96[3] = 0x123;
  329.   v47 = pml::pokepara::CoreParam::GetItem(*v5);
  330.   v48 = 0;
  331.   v49 = 0;
  332.   while ( v96[v49] != v47 )
  333.   {
  334.     if ( ++v49 >= 6 )
  335.       goto LABEL_94;
  336.   }
  337.   v48 = v49;
  338.   v46 = 1;
  339. LABEL_94:
  340.   v94 = 0;
  341.   v50 = pml::pokepara::CoreParam::GetItem(v5[1]);// parent item
  342.   v51 = 0;
  343.   v52 = 0;
  344.   do
  345.   {
  346.     if ( v96[v52] == v50 )                      // power item match
  347.     {
  348.       v51 = v52;
  349.       v53 = 1;
  350.       v94 = 1;                                  // result = 1
  351.       goto LABEL_99;
  352.     }
  353.     ++v52;
  354.   }
  355.   while ( v52 < 6 );
  356.   v53 = v94;                                    // result = 0
  357. LABEL_99:
  358.   if ( v53 & v46 )
  359.   {
  360.     if ( gfl2::math::Random::Next(v95, 2u) )
  361.       goto LABEL_105;
  362.     goto LABEL_103;
  363.   }
  364.   if ( v46 )
  365.   {
  366. LABEL_103:
  367.     *(outpkm + v48 + 0x48) = 1;
  368.     ++*(outpkm + 0x54);
  369.     goto LABEL_106;
  370.   }
  371.   if ( v94 )
  372.   {
  373. LABEL_105:
  374.     *(outpkm + v51 + 0x4E) = 1;
  375.     ++*(outpkm + 0x54);
  376.   }
  377. LABEL_106:
  378.   v54 = v6[3];
  379.   while ( *(outpkm + 0x54) < (*(outpkm + 0x54) >> 32) )
  380.   {
  381.     v55 = gfl2::math::Random::Next(v54, 6u);    // IV slot
  382.     v56 = outpkm + v55;
  383.     v57 = *(outpkm + v55 + 0x48);
  384.     v58 = v57 == 0;
  385.     if ( !v57 )
  386.       v58 = *(v56 + 0x4E) == 0;
  387.     if ( v58 )
  388.     {
  389.       if ( gfl2::math::Random::Next(v54, 2u) )
  390.         *(v56 + 0x4E) = 1;
  391.       else
  392.         *(v56 + 0x48) = 1;
  393.       ++*(outpkm + 0x54);
  394.     }
  395.   }
  396.   v59 = v6[3];
  397.   v60 = 0;
  398.   do
  399.   {                                             // get 6 random IVs
  400.     v61 = gfl2::math::Random::Next(v59, 32u);   // random IV
  401.     v62 = outpkm + 2 * v60++;
  402.     *(v62 + 0x24) = v61;
  403.   }
  404.   while ( v60 < 6 );
  405.   IVctr = 0;
  406.   do
  407.   {
  408.     if ( *(outpkm + IVctr + 0x48) )
  409.     {
  410.       v64 = *v5;
  411.     }
  412.     else
  413.     {
  414.       if ( !*(outpkm + IVctr + 0x4E) )
  415.         goto LABEL_119;
  416.       v64 = v5[1];
  417.     }
  418.     if ( v64 )
  419.       *(outpkm + 2 * IVctr + 0x24) = pml::pokepara::CoreParam::GetNativeTalentPower(v64, IVctr);
  420. LABEL_119:
  421.     ++IVctr;
  422.   }
  423.   while ( IVctr < 6 );
  424.   *outpkm = sub_296154(v6[3]);
  425.   charm = *(v6 + 8);
  426.   v66 = v6[3];
  427.   PIDReRolls = 0;
  428.   pkm0Language = pml::pokepara::CoreParam::GetLangId(*v5);
  429.   if ( pkm0Language != pml::pokepara::CoreParam::GetLangId(v5[1]) )
  430.     PIDReRolls = 6;
  431.   if ( charm )
  432.     PIDReRolls += 2;
  433.   rrCtr = 0;
  434.   if ( PIDReRolls )                             // generate PIDs
  435.   {
  436.     do
  437.     {
  438.       pid = sub_296154(v66);                    // get new PID
  439.       *(outpkm + 8) = pid;                      // assign PID to baby
  440.       if ( getIsShiny(*(outpkm + 0x10), pid) )  // if shiny, stop rerolling
  441.         break;
  442.       ++rrCtr;                                  // increment before the while check
  443.     }
  444.     while ( rrCtr < PIDReRolls );               // while we have rolls left
  445.   }
  446.   sub_295388(*(outpkm + 0x18), *(outpkm + 0x1A));
  447.   v71 = sub_295378();
  448.   v72 = 0;
  449.   if ( v71 )
  450.   {
  451.     do
  452.     {
  453.       v73 = sub_295364(v72);
  454.       v74 = sub_295350(v72);
  455.       if ( v73 > *(outpkm + 0x1C) )
  456.         break;
  457.       if ( v74 )
  458.       {
  459.         v75 = *(outpkm + 0x38);
  460.         if ( !v75 )
  461.           goto LABEL_169;
  462.         v76 = *(outpkm + 0x38) & 1;
  463.         v77 = 0;
  464.         if ( v75 & 1 )
  465.         {
  466.           while ( *(outpkm + 2 * v77 + 0x3C) != v74 )
  467.           {
  468.             if ( v76 <= ++v77 )
  469.               goto LABEL_142;
  470.           }
  471.           goto LABEL_150;
  472.         }
  473. LABEL_142:
  474.         while ( v75 > v76 )
  475.         {
  476.           v78 = outpkm + 2 * v76;
  477.           v79 = *(v78 + 0x3C);
  478.           v80 = v79 == v74;
  479.           if ( v79 != v74 )
  480.             v80 = *(v78 + 0x3E) == v74;
  481.           if ( v80 )
  482.             goto LABEL_150;
  483.           v76 += 2;
  484.         }
  485.         if ( v75 >= 4 )
  486.         {
  487.           v81 = *(outpkm + 0x40);
  488.           v82 = *(outpkm + 0x42);
  489.           *(outpkm + 0x3C) = *(outpkm + 0x3E);
  490.           *(outpkm + 0x3E) = v81;
  491.           *(outpkm + 0x40) = v82;
  492.           *(outpkm + 0x42) = v74;
  493.         }
  494.         else
  495.         {
  496. LABEL_169:
  497.           *(outpkm + 2 * v75 + 60) = v74;
  498.           ++*(outpkm + 56);
  499.         }
  500.       }
  501. LABEL_150:
  502.       ++v72;
  503.     }
  504.     while ( v72 < v71 );
  505.   }
  506.   sub_22F910(outpkm, v5);
  507.   v83 = (*(*v108 + 0x34))();
  508.   sub_22EAEC(&v93, v83);
  509.   sub_22E9A0(&v93, *(dword_4DE720 + 0x14), *(outpkm + 0x18), *(outpkm + 0x1A));
  510.   sub_22F7E4(outpkm, *v5, &v93);
  511.   sub_22F7E4(outpkm, v5[1], &v93);
  512.   if ( *(outpkm + 24) == 172                    // pichu
  513.     && (pml::pokepara::CoreParam::GetItem(*v5) == 236 || pml::pokepara::CoreParam::GetItem(v5[1]) == 236) )// light ball
  514.   {
  515.     addMovetoMovepool(outpkm, 344);             // volt tackle
  516.   }
  517.   v84 = v6[3];
  518.   v85 = pml::pokepara::CoreParam::GetMonsNo(v5[1]);
  519.   v86 = pml::pokepara::CoreParam::GetMonsNo(*v5);
  520.   v87 = pml::pokepara::CoreParam::GetMemories(v5[1], 8);
  521.   v88 = pml::pokepara::CoreParam::GetMemories(*v5, 8);
  522.   v89 = v88;
  523.   if ( v85 == 132 )                             // ditto
  524.   {
  525.     *(outpkm + 0x44) = v88;                     // inherit not-ditto
  526.   }
  527.   else if ( v85 == v86 )                        // parent species match
  528.   {
  529.     if ( (gfl2::math::Random::Next(v84, 100u) + 1) <= 50 )
  530.       v89 = v87;
  531.     *(outpkm + 0x44) = v89;                     // inherit 50% from either
  532.   }
  533.   else
  534.   {
  535.     *(outpkm + 0x44) = v87;
  536.   }
  537.   result = *(outpkm + 0x44);                    // check the set memory
  538.   v91 = result == 1;
  539.   if ( result != 1 )
  540.     v91 = result == 16;
  541.   if ( v91 )                                    // set to 4 if 1 or 16
  542.   {
  543.     result = 4;
  544.     *(outpkm + 0x44) = 4;
  545.   }
  546.   return result;
  547. }
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×