Advertisement
Kaphotics

BreedingMethod

Oct 21st, 2016
959
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 14.99 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement