Last active
November 29, 2025 08:09
-
-
Save Lusamine/b583cafcd5d01f1ef3202600ce9a6312 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| void __fastcall pml::Capture::JudgeCapture(pml::Capture *a1) | |
| { | |
| pml::Capture::Result *__shifted(pml::Capture,0x38) p_result; // x20 | |
| unsigned int item_id; // w0 | |
| pml::CapturePoke *target_pokemon; // x0 | |
| float capture_indicator; // s8 | |
| unsigned int dex_capture_count; // w9 | |
| float v7; // s0 | |
| float v8; // s1 | |
| bool v9; // w8 | |
| _BOOL4 is_skip_random_shake_check; // w9 | |
| int failed_catch; // w8 | |
| _BOOL4 is_critical_capture; // w22 | |
| int catch_chance; // w21 | |
| int rand1; // w0 | |
| char v15; // w8 | |
| unsigned int shake_count; // w8 | |
| *(_DWORD *)&a1->result.is_captured = 0; | |
| a1->result.friendship = 0; | |
| p_result = &a1->result; | |
| item_id = (unsigned __int16)a1->capture_param.item_id; | |
| ADJ(p_result)->result.catch_fail_value = 0; | |
| ADJ(p_result)->result.indicator.hp_ratio = 1.0; | |
| ADJ(p_result)->result.indicator.dex_ratio = 1.0; | |
| ADJ(p_result)->result.indicator.capture_value_ratio = 1.0; | |
| ADJ(p_result)->result.indicator.ball_capture_ratio = 1.0; | |
| ADJ(p_result)->result.indicator.alpha_ko_ratio = 1.0; | |
| ADJ(p_result)->result.indicator.sick_ratio = 1.0; | |
| ADJ(p_result)->result.indicator.shiny_ratio = 1.0; | |
| ADJ(p_result)->result.indicator.behavior_ratio = 1.0; | |
| ADJ(p_result)->result.indicator.backstrike_ratio = 1.0; | |
| ADJ(p_result)->result.indicator.alpha_ratio = 1.0; | |
| ADJ(p_result)->result.indicator.za_level_ratio = 1.0; | |
| ADJ(p_result)->result.indicator.plush_ratio = 1.0; | |
| if ( pml::pokepara::CalcTool::GetBallNo(item_id) == BallID_Master ) | |
| { | |
| a1->result.is_captured = 1; | |
| a1->result.shake_count = 3; | |
| return; | |
| } | |
| target_pokemon = a1->capture_param.target_pokemon; | |
| if ( target_pokemon && !target_pokemon->IsCapturable(target_pokemon) ) | |
| return; | |
| capture_indicator = pml::Capture::CalcCaptureIndicator(a1, &ADJ(p_result)->capture_param); | |
| if ( a1->capture_param.can_critical_capture ) // always false | |
| { | |
| dex_capture_count = (unsigned __int16)a1->capture_param.dex_capture_count; | |
| if ( dex_capture_count <= 600 ) | |
| { | |
| if ( dex_capture_count <= 450 ) | |
| { | |
| if ( dex_capture_count <= 300 ) | |
| { | |
| if ( dex_capture_count <= 150 ) | |
| { | |
| if ( dex_capture_count < 31 ) | |
| { | |
| v9 = 0; | |
| LABEL_22: | |
| a1->result.is_critical_capture = v9; | |
| goto LABEL_23; | |
| } | |
| v7 = 0.5; | |
| } | |
| else | |
| { | |
| v7 = 1.0; | |
| } | |
| } | |
| else | |
| { | |
| v7 = 1.5; | |
| } | |
| } | |
| else | |
| { | |
| v7 = 2.0; | |
| } | |
| } | |
| else | |
| { | |
| v7 = 2.5; | |
| } | |
| if ( a1->capture_param.has_catching_charm ) | |
| v7 = v7 + v7; | |
| v8 = 255.0; | |
| if ( capture_indicator <= 255.0 ) | |
| v8 = capture_indicator; | |
| v9 = (float)((float)(v8 * v7) / 6.0) > (float)(unsigned int)pml::local::Random::GetValue(0x100u); | |
| goto LABEL_22; | |
| } | |
| LABEL_23: | |
| if ( pml::pokepara::CalcTool::GetBallNo((unsigned __int16)a1->capture_param.item_id) == BallID_Friend ) | |
| a1->result.friendship = 150; | |
| if ( capture_indicator >= 255.0 ) | |
| { | |
| a1->result.is_captured = 1; | |
| if ( a1->result.is_critical_capture ) | |
| v15 = 1; | |
| else | |
| v15 = 3; | |
| a1->result.shake_count = v15; | |
| } | |
| else | |
| { | |
| is_skip_random_shake_check = a1->capture_param.is_skip_random_shake_check; | |
| failed_catch = (int)(float)(65535.0 | |
| - (float)((float)((float)(capture_indicator + 1.0) * (float)(capture_indicator + 1.0)) | |
| + -1.0)); | |
| a1->result.catch_fail_value = failed_catch; | |
| if ( is_skip_random_shake_check ) // Used for calculating the carets and success isn't needed. | |
| return; | |
| is_critical_capture = a1->result.is_critical_capture; | |
| a1->result.is_captured = 0; | |
| a1->result.shake_count = 0; | |
| catch_chance = 0xFFFF - failed_catch; | |
| rand1 = pml::local::Random::GetValue(0x10000u); | |
| if ( is_critical_capture ) | |
| { | |
| if ( rand1 >= catch_chance ) | |
| return; | |
| } | |
| else if ( rand1 >= catch_chance | |
| && (int)pml::local::Random::GetValue(0x10000u) >= catch_chance | |
| && (int)pml::local::Random::GetValue(0x10000u) >= catch_chance ) | |
| { | |
| return; | |
| } | |
| shake_count = (unsigned __int8)a1->result.shake_count; | |
| if ( shake_count <= 2 ) | |
| a1->result.shake_count = shake_count + 1; | |
| ADJ(p_result)->result.is_captured = 1; | |
| } | |
| } | |
| ------ | |
| .text:0000007100446B4C ; void __fastcall pml::Capture::JudgeCapture(pml::Capture *a1) | |
| .text:0000007100446B4C pml__Capture__JudgeCapture ; CODE XREF: sub_71004464C8+4C↑p | |
| .text:0000007100446B4C ; sub_7100AC6858+34↓p | |
| .text:0000007100446B4C | |
| .text:0000007100446B4C var_10 = -0x10 | |
| .text:0000007100446B4C var_s0 = 0 | |
| .text:0000007100446B4C var_s10 = 0x10 | |
| .text:0000007100446B4C var_s20 = 0x20 | |
| .text:0000007100446B4C | |
| .text:0000007100446B4C STP D9, D8, [SP,#-0x30+var_10]! | |
| .text:0000007100446B50 STP X29, X30, [SP,#0x10+var_s0] | |
| .text:0000007100446B54 STP X22, X21, [SP,#0x10+var_s10] | |
| .text:0000007100446B58 STP X20, X19, [SP,#0x10+var_s20] | |
| .text:0000007100446B5C ADD X29, SP, #0x10 | |
| .text:0000007100446B60 MOV X20, X0 | |
| .text:0000007100446B64 MOV X19, X0 | |
| .text:0000007100446B68 MOV X8, #0x3F8000003F800000 | |
| .text:0000007100446B6C STR XZR, [X20,#0x38]! | |
| .text:0000007100446B70 LDURH W0, [X20,#-0x20] | |
| .text:0000007100446B74 STR WZR, [X20,#8] | |
| .text:0000007100446B78 STUR X8, [X20,#0xC] | |
| .text:0000007100446B7C STUR X8, [X20,#0x14] | |
| .text:0000007100446B80 STUR X8, [X20,#0x1C] | |
| .text:0000007100446B84 STUR X8, [X20,#0x24] | |
| .text:0000007100446B88 STUR X8, [X20,#0x2C] | |
| .text:0000007100446B8C STUR X8, [X20,#0x34] | |
| .text:0000007100446B90 BL pml__pokepara__CalcTool__GetBallNo | |
| .text:0000007100446B94 AND W8, W0, #0xFF | |
| .text:0000007100446B98 CMP W8, #1 | |
| .text:0000007100446B9C B.NE loc_7100446BC0 | |
| .text:0000007100446BA0 STRB W8, [X19,#0x38] | |
| .text:0000007100446BA4 MOV W8, #3 | |
| .text:0000007100446BA8 STRB W8, [X19,#0x3B] | |
| .text:0000007100446BAC | |
| .text:0000007100446BAC loc_7100446BAC ; CODE XREF: pml__Capture__JudgeCapture+88↓j | |
| .text:0000007100446BAC ; pml__Capture__JudgeCapture+194↓j ... | |
| .text:0000007100446BAC LDP X20, X19, [SP,#0x10+var_s20] | |
| .text:0000007100446BB0 LDP X22, X21, [SP,#0x10+var_s10] | |
| .text:0000007100446BB4 LDP X29, X30, [SP,#0x10+var_s0] | |
| .text:0000007100446BB8 LDP D9, D8, [SP+0x10+var_10],#0x40 | |
| .text:0000007100446BBC RET | |
| .text:0000007100446BC0 ; --------------------------------------------------------------------------- | |
| .text:0000007100446BC0 | |
| .text:0000007100446BC0 loc_7100446BC0 ; CODE XREF: pml__Capture__JudgeCapture+50↑j | |
| .text:0000007100446BC0 LDR X0, [X19,#0x10] | |
| .text:0000007100446BC4 CBZ X0, loc_7100446BD8 | |
| .text:0000007100446BC8 LDR X8, [X0] | |
| .text:0000007100446BCC LDR X8, [X8,#0xD0] | |
| .text:0000007100446BD0 BLR X8 | |
| .text:0000007100446BD4 TBZ W0, #0, loc_7100446BAC | |
| .text:0000007100446BD8 | |
| .text:0000007100446BD8 loc_7100446BD8 ; CODE XREF: pml__Capture__JudgeCapture+78↑j | |
| .text:0000007100446BD8 SUB X1, X20, #0x30 ; '0' | |
| .text:0000007100446BDC MOV X0, X19 | |
| .text:0000007100446BE0 BL pml__Capture__CalcCaptureIndicator | |
| .text:0000007100446BE4 LDRB W8, [X19,#0x30] | |
| .text:0000007100446BE8 FMOV S8, S0 | |
| .text:0000007100446BEC CBZ W8, loc_7100446C84 | |
| .text:0000007100446BF0 LDRH W9, [X19,#0x22] | |
| .text:0000007100446BF4 CMP W9, #0x258 | |
| .text:0000007100446BF8 LDRB W8, [X19,#0x2A] | |
| .text:0000007100446BFC B.LS loc_7100446C08 | |
| .text:0000007100446C00 FMOV S0, #2.5 | |
| .text:0000007100446C04 B loc_7100446C44 | |
| .text:0000007100446C08 ; --------------------------------------------------------------------------- | |
| .text:0000007100446C08 | |
| .text:0000007100446C08 loc_7100446C08 ; CODE XREF: pml__Capture__JudgeCapture+B0↑j | |
| .text:0000007100446C08 CMP W9, #0x1C2 | |
| .text:0000007100446C0C B.LS loc_7100446C18 | |
| .text:0000007100446C10 FMOV S0, #2.0 | |
| .text:0000007100446C14 B loc_7100446C44 | |
| .text:0000007100446C18 ; --------------------------------------------------------------------------- | |
| .text:0000007100446C18 | |
| .text:0000007100446C18 loc_7100446C18 ; CODE XREF: pml__Capture__JudgeCapture+C0↑j | |
| .text:0000007100446C18 CMP W9, #0x12C | |
| .text:0000007100446C1C B.LS loc_7100446C28 | |
| .text:0000007100446C20 FMOV S0, #1.5 | |
| .text:0000007100446C24 B loc_7100446C44 | |
| .text:0000007100446C28 ; --------------------------------------------------------------------------- | |
| .text:0000007100446C28 | |
| .text:0000007100446C28 loc_7100446C28 ; CODE XREF: pml__Capture__JudgeCapture+D0↑j | |
| .text:0000007100446C28 CMP W9, #0x96 | |
| .text:0000007100446C2C B.LS loc_7100446C38 | |
| .text:0000007100446C30 FMOV S0, #1.0 | |
| .text:0000007100446C34 B loc_7100446C44 | |
| .text:0000007100446C38 ; --------------------------------------------------------------------------- | |
| .text:0000007100446C38 | |
| .text:0000007100446C38 loc_7100446C38 ; CODE XREF: pml__Capture__JudgeCapture+E0↑j | |
| .text:0000007100446C38 CMP W9, #0x1F | |
| .text:0000007100446C3C B.CC loc_7100446D98 | |
| .text:0000007100446C40 FMOV S0, #0.5 | |
| .text:0000007100446C44 | |
| .text:0000007100446C44 loc_7100446C44 ; CODE XREF: pml__Capture__JudgeCapture+B8↑j | |
| .text:0000007100446C44 ; pml__Capture__JudgeCapture+C8↑j ... | |
| .text:0000007100446C44 FADD S1, S0, S0 | |
| .text:0000007100446C48 CMP W8, #0 | |
| .text:0000007100446C4C MOV W8, #0x437F0000 | |
| .text:0000007100446C50 MOV W0, #0x100 | |
| .text:0000007100446C54 FCSEL S0, S0, S1, EQ | |
| .text:0000007100446C58 FMOV S1, W8 | |
| .text:0000007100446C5C FCMP S8, S1 | |
| .text:0000007100446C60 FCSEL S1, S1, S8, GT | |
| .text:0000007100446C64 FMUL S0, S1, S0 | |
| .text:0000007100446C68 FMOV S1, #6.0 | |
| .text:0000007100446C6C FDIV S9, S0, S1 | |
| .text:0000007100446C70 BL pml__local__Random__GetValue | |
| .text:0000007100446C74 UCVTF S0, W0 | |
| .text:0000007100446C78 FCMP S9, S0 | |
| .text:0000007100446C7C CSET W8, GT | |
| .text:0000007100446C80 | |
| .text:0000007100446C80 loc_7100446C80 ; CODE XREF: pml__Capture__JudgeCapture+250↓j | |
| .text:0000007100446C80 STRB W8, [X19,#0x39] | |
| .text:0000007100446C84 | |
| .text:0000007100446C84 loc_7100446C84 ; CODE XREF: pml__Capture__JudgeCapture+A0↑j | |
| .text:0000007100446C84 LDRH W0, [X19,#0x18] | |
| .text:0000007100446C88 BL pml__pokepara__CalcTool__GetBallNo | |
| .text:0000007100446C8C AND W8, W0, #0xFF | |
| .text:0000007100446C90 CMP W8, #0x16 | |
| .text:0000007100446C94 B.NE loc_7100446CA0 | |
| .text:0000007100446C98 MOV W8, #0x96 | |
| .text:0000007100446C9C STR W8, [X19,#0x3C] | |
| .text:0000007100446CA0 | |
| .text:0000007100446CA0 loc_7100446CA0 ; CODE XREF: pml__Capture__JudgeCapture+148↑j | |
| .text:0000007100446CA0 MOV W8, #0x437F0000 | |
| .text:0000007100446CA4 FMOV S0, W8 | |
| .text:0000007100446CA8 FCMP S8, S0 | |
| .text:0000007100446CAC B.GE loc_7100446D10 | |
| .text:0000007100446CB0 FMOV S0, #1.0 | |
| .text:0000007100446CB4 FMOV S1, #-1.0 | |
| .text:0000007100446CB8 MOV W8, #0x477FFF00 | |
| .text:0000007100446CC0 LDRB W9, [X19,#0x2E] | |
| .text:0000007100446CC4 FADD S0, S8, S0 | |
| .text:0000007100446CC8 FMUL S0, S0, S0 | |
| .text:0000007100446CCC FADD S0, S0, S1 | |
| .text:0000007100446CD0 FMOV S1, W8 | |
| .text:0000007100446CD4 FSUB S0, S1, S0 | |
| .text:0000007100446CD8 FCVTZS W8, S0 | |
| .text:0000007100446CDC STR W8, [X19,#0x40] | |
| .text:0000007100446CE0 CBNZ W9, loc_7100446BAC | |
| .text:0000007100446CE4 LDRB W22, [X19,#0x39] | |
| .text:0000007100446CE8 MOV W9, #0xFFFF | |
| .text:0000007100446CEC MOV W0, #0x10000 | |
| .text:0000007100446CF0 STRB WZR, [X19,#0x38] | |
| .text:0000007100446CF4 STRB WZR, [X19,#0x3B] | |
| .text:0000007100446CF8 SUB W21, W9, W8 | |
| .text:0000007100446CFC BL pml__local__Random__GetValue | |
| .text:0000007100446D00 CBZ W22, loc_7100446D40 | |
| .text:0000007100446D04 CMP W0, W21 | |
| .text:0000007100446D08 B.GE loc_7100446BAC | |
| .text:0000007100446D0C B loc_7100446D68 | |
| .text:0000007100446D10 ; --------------------------------------------------------------------------- | |
| .text:0000007100446D10 | |
| .text:0000007100446D10 loc_7100446D10 ; CODE XREF: pml__Capture__JudgeCapture+160↑j | |
| .text:0000007100446D10 MOV W8, #1 | |
| .text:0000007100446D14 STRB W8, [X19,#0x38] | |
| .text:0000007100446D18 LDRB W8, [X19,#0x39] | |
| .text:0000007100446D1C CMP W8, #0 | |
| .text:0000007100446D20 MOV W8, #3 | |
| .text:0000007100446D24 CSINC W8, W8, WZR, EQ | |
| .text:0000007100446D28 STRB W8, [X19,#0x3B] | |
| .text:0000007100446D2C LDP X20, X19, [SP,#0x10+var_s20] | |
| .text:0000007100446D30 LDP X22, X21, [SP,#0x10+var_s10] | |
| .text:0000007100446D34 LDP X29, X30, [SP,#0x10+var_s0] | |
| .text:0000007100446D38 LDP D9, D8, [SP+0x10+var_10],#0x40 | |
| .text:0000007100446D3C RET | |
| .text:0000007100446D40 ; --------------------------------------------------------------------------- | |
| .text:0000007100446D40 | |
| .text:0000007100446D40 loc_7100446D40 ; CODE XREF: pml__Capture__JudgeCapture+1B4↑j | |
| .text:0000007100446D40 CMP W0, W21 | |
| .text:0000007100446D44 B.LT loc_7100446D68 | |
| .text:0000007100446D48 MOV W0, #0x10000 | |
| .text:0000007100446D4C BL pml__local__Random__GetValue | |
| .text:0000007100446D50 CMP W0, W21 | |
| .text:0000007100446D54 B.LT loc_7100446D68 | |
| .text:0000007100446D58 MOV W0, #0x10000 | |
| .text:0000007100446D5C BL pml__local__Random__GetValue | |
| .text:0000007100446D60 CMP W0, W21 | |
| .text:0000007100446D64 B.GE loc_7100446BAC | |
| .text:0000007100446D68 | |
| .text:0000007100446D68 loc_7100446D68 ; CODE XREF: pml__Capture__JudgeCapture+1C0↑j | |
| .text:0000007100446D68 ; pml__Capture__JudgeCapture+1F8↑j ... | |
| .text:0000007100446D68 LDRB W8, [X19,#0x3B] | |
| .text:0000007100446D6C CMP W8, #2 | |
| .text:0000007100446D70 B.HI loc_7100446D7C | |
| .text:0000007100446D74 ADD W8, W8, #1 | |
| .text:0000007100446D78 STRB W8, [X19,#0x3B] | |
| .text:0000007100446D7C | |
| .text:0000007100446D7C loc_7100446D7C ; CODE XREF: pml__Capture__JudgeCapture+224↑j | |
| .text:0000007100446D7C MOV W8, #1 | |
| .text:0000007100446D80 STRB W8, [X20] | |
| .text:0000007100446D84 LDP X20, X19, [SP,#0x10+var_s20] | |
| .text:0000007100446D88 LDP X22, X21, [SP,#0x10+var_s10] | |
| .text:0000007100446D8C LDP X29, X30, [SP,#0x10+var_s0] | |
| .text:0000007100446D90 LDP D9, D8, [SP+0x10+var_10],#0x40 | |
| .text:0000007100446D94 RET | |
| .text:0000007100446D98 ; --------------------------------------------------------------------------- | |
| .text:0000007100446D98 | |
| .text:0000007100446D98 loc_7100446D98 ; CODE XREF: pml__Capture__JudgeCapture+F0↑j | |
| .text:0000007100446D98 MOV W8, WZR | |
| .text:0000007100446D9C B loc_7100446C80 | |
| .text:0000007100446D9C ; End of function pml__Capture__JudgeCapture |
Comments are disabled for this gist.