Skip to content

Instantly share code, notes, and snippets.

@Lusamine
Last active November 29, 2025 08:09
Show Gist options
  • Select an option

  • Save Lusamine/b583cafcd5d01f1ef3202600ce9a6312 to your computer and use it in GitHub Desktop.

Select an option

Save Lusamine/b583cafcd5d01f1ef3202600ce9a6312 to your computer and use it in GitHub Desktop.
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.