Skip to content

Instantly share code, notes, and snippets.

@Lusamine
Created August 20, 2022 19:23
Show Gist options
  • Save Lusamine/aa7eb430f3e818df1cc5b81cc798c8ae to your computer and use it in GitHub Desktop.
Save Lusamine/aa7eb430f3e818df1cc5b81cc798c8ae to your computer and use it in GitHub Desktop.
__int64 __fastcall capture_shake_check(capture_info *a1)
{
unsigned int evaluation_num; // w20
__int64 result; // x0
int random_value_max; // w0 MAPDST
unsigned __int8 v5; // w8
__int64 *xoro; // x8
unsigned int v7; // w9
__int64 v8; // x10
__int64 v9; // x11
unsigned __int64 v10; // x10
unsigned __int64 v11; // x11
unsigned __int64 v12; // x10
__int64 v13; // x12
__int64 v14; // x13
__int64 v15; // x14
int v16; // w11
__int64 v17; // x12
int v18; // w11
float rand; // s8
unsigned int v20; // w8
__int64 v21; // x10
__int64 v22; // x10
unsigned __int64 v24; // [xsp+0h] [xbp-40h] BYREF
const char *v25; // [xsp+8h] [xbp-38h]
__int64 v26; // [xsp+10h] [xbp-30h]
__int64 v27; // [xsp+18h] [xbp-28h]
v24 = 0x2C9E96DA352A7FC0LL;
v25 = "evaluation_num";
v26 = 14LL;
v27 = 0LL;
evaluation_num = get_capture_value_from_hash(&v24);
result = (unsigned int)a1->capture_result;
switch ( (_DWORD)result )
{
case 1:
v24 = 0x8A148DC1A556BECDLL;
v25 = "random_value_max";
v26 = 16LL;
v27 = 0LL;
random_value_max = get_capture_value_from_hash(&v24);
v5 = atomic_load((unsigned __int8 *)&qword_71042A7010);
if ( (v5 & 1) == 0 )
{
if ( _cxa_guard_acquire_0(&qword_71042A7010) )
{
sub_7100000250((__int64)sub_71007B42F8, (__int64)&qword_71042A7000, (__int64)&off_710401A000);
_cxa_guard_release_0(&qword_71042A7010);
}
}
qword_71042A6FF8 = qword_71042A7000;
if ( random_value_max )
{
xoro = *(__int64 **)(qword_71042A7000 + 0xD8);
v7 = random_value_max + 1;
if ( random_value_max == -1 )
{
v21 = xoro[1];
v18 = v21 + *xoro;
v22 = v21 ^ *xoro;
*xoro = v22 ^ __ROR8__(*xoro, 40) ^ (v22 << 16);
xoro[1] = __ROR8__(v22, 27);
}
else
{
v8 = __clz(v7);
v9 = 31LL;
if ( ((0x7FFFFFFFu >> v8) & v7) != 0 )
v9 = 32LL;
v10 = v9 - v8;
v11 = v10 >> 6;
if ( (v10 & 0x3F) != 0 )
++v11;
if ( v11 > v10 )
LODWORD(v12) = 0;
else
v12 = 0xFFFFFFFFFFFFFFFFLL >> -(char)(v10 / v11);
v13 = *xoro;
v14 = xoro[1];
do
{
v15 = v13 ^ v14;
v16 = v13 + v14;
v17 = v13 ^ v14 ^ __ROR8__(v13, 40);
v14 = __ROR8__(v15, 27);
v18 = v16 & v12;
v13 = v17 ^ (v15 << 16);
}
while ( v7 <= v18 );
*xoro = v13;
xoro[1] = v14;
}
}
else
{
v18 = 0;
}
rand = (float)v18;
if ( v27 )
(*(void (__fastcall **)(__int64))(*(_QWORD *)v27 + 32LL))(v27);
if ( a1->shake_chance <= rand ) // Fail to catch.
{
v20 = a1->shake_checks_failed + 1;
a1->shake_checks_failed = v20;
if ( evaluation_num > v20 ) // Still have more chances.
{
result = 1LL;
a1->capture_result = 1;
return result;
}
a1->capture_result = 2;
LABEL_24:
if ( a1->catch_type != 1 )
return 2LL;
return 0LL;
}
a1->capture_result = 0; // If we get here, we should catch it unless overridden.
LABEL_20:
if ( a1->catch_type == 2 ) // catch_type was 1 for the tutorial starters that catch, returned 0
// catch_type was 2 for the tutorial starter that fails, returned 2
return 2LL;
return 0LL;
case 0:
goto LABEL_20;
case 2:
goto LABEL_24;
}
return result;
}
----
.text:00000071018065E8 ; __int64 __fastcall capture_shake_check(capture_info *a1)
.text:00000071018065E8 capture_shake_check ; CODE XREF: judge_capture_in_battle+298↑p
.text:00000071018065E8 ; judge_capture_in_overworld+88C↓p
.text:00000071018065E8
.text:00000071018065E8 var_40 = -0x40
.text:00000071018065E8 anonymous_0 = -0x38
.text:00000071018065E8 var_30 = -0x30
.text:00000071018065E8 var_28 = -0x28
.text:00000071018065E8 var_20 = -0x20
.text:00000071018065E8 var_14 = -0x14
.text:00000071018065E8 var_10 = -0x10
.text:00000071018065E8 var_s0 = 0
.text:00000071018065E8
.text:00000071018065E8 SUB SP, SP, #0x50
.text:00000071018065EC STR D8, [SP,#0x40+var_20]
.text:00000071018065F0 STP X20, X19, [SP,#0x40+var_10]
.text:00000071018065F4 STP X29, X30, [SP,#0x40+var_s0]
.text:00000071018065F8 ADD X29, SP, #0x40
.text:00000071018065FC MOV X9, #0x352A7FC0
.text:0000007101806604 ADRL X8, aEvaluationNum ; "evaluation_num"
.text:000000710180660C MOVK X9, #0x96DA,LSL#32
.text:0000007101806610 MOVK X9, #0x2C9E,LSL#48
.text:0000007101806614 STP X9, X8, [SP,#0x40+var_40]
.text:0000007101806618 MOV X19, X0
.text:000000710180661C MOV W8, #0xE
.text:0000007101806620 STP X8, XZR, [SP,#0x40+var_30]
.text:0000007101806624 MOV X0, SP
.text:0000007101806628 BL get_capture_value_from_hash
.text:000000710180662C MOV W20, W0
.text:0000007101806630 LDR W0, [X19,#0x94]
.text:0000007101806634 CMP W0, #1
.text:0000007101806638 B.NE loc_7101806790
.text:000000710180663C MOV X9, #0xA556BECD
.text:0000007101806644 ADRL X8, aRandomValueMax ; "random_value_max"
.text:000000710180664C MOVK X9, #0x8DC1,LSL#32
.text:0000007101806650 MOVK X9, #0x8A14,LSL#48
.text:0000007101806654 STP X9, X8, [SP,#0x40+var_40]
.text:0000007101806658 MOV W8, #0x10
.text:000000710180665C MOV X0, SP
.text:0000007101806660 STP X8, XZR, [SP,#0x40+var_30]
.text:0000007101806664 BL get_capture_value_from_hash
.text:0000007101806668 ADRP X8, #off_7104279678@PAGE
.text:000000710180666C LDR X8, [X8,#off_7104279678@PAGEOFF]
.text:0000007101806670 LDARB W8, [X8]
.text:0000007101806674 TBZ W8, #0, loc_71018067CC
.text:0000007101806678
.text:0000007101806678 loc_7101806678 ; CODE XREF: capture_shake_check+200↓j
.text:0000007101806678 ; capture_shake_check+230↓j
.text:0000007101806678 ADRP X8, #off_7104279680@PAGE
.text:000000710180667C LDR X8, [X8,#off_7104279680@PAGEOFF]
.text:0000007101806680 ADRP X9, #off_7104279688@PAGE
.text:0000007101806684 LDR X8, [X8]
.text:0000007101806688 LDR X9, [X9,#off_7104279688@PAGEOFF]
.text:000000710180668C STR X8, [X9]
.text:0000007101806690 CBZ W0, loc_71018067A0
.text:0000007101806694 LDR X8, [X8,#0xD8]
.text:0000007101806698 ADD W9, W0, #1
.text:000000710180669C CBZ W9, loc_71018067A8
.text:00000071018066A0 CLZ W10, W9
.text:00000071018066A4 MOV W11, #0x7FFFFFFF
.text:00000071018066A8 LSR W11, W11, W10
.text:00000071018066AC TST W11, W9
.text:00000071018066B0 MOV W11, #0x1F
.text:00000071018066B4 CINC X11, X11, NE
.text:00000071018066B8 SUB X10, X11, X10
.text:00000071018066BC LSR X11, X10, #6
.text:00000071018066C0 TST X10, #0x3F
.text:00000071018066C4 CINC X11, X11, NE
.text:00000071018066C8 CMP X11, X10
.text:00000071018066CC B.HI loc_710180681C
.text:00000071018066D0 UDIV X10, X10, X11
.text:00000071018066D4 MOV X11, #0xFFFFFFFFFFFFFFFF
.text:00000071018066D8 NEG X10, X10
.text:00000071018066DC LSR X10, X11, X10
.text:00000071018066E0
.text:00000071018066E0 loc_71018066E0 ; CODE XREF: capture_shake_check+238↓j
.text:00000071018066E0 LDP X12, X13, [X8]
.text:00000071018066E4
.text:00000071018066E4 loc_71018066E4 ; CODE XREF: capture_shake_check+118↓j
.text:00000071018066E4 EOR X14, X12, X13
.text:00000071018066E8 ADD X11, X12, X13
.text:00000071018066EC EOR X12, X14, X12,ROR#40
.text:00000071018066F0 EXTR X13, X14, X14, #0x1B
.text:00000071018066F4 AND X11, X11, X10
.text:00000071018066F8 CMP W9, W11
.text:00000071018066FC EOR X12, X12, X14,LSL#16
.text:0000007101806700 B.LS loc_71018066E4
.text:0000007101806704 STP X12, X13, [X8]
.text:0000007101806708
.text:0000007101806708 loc_7101806708 ; CODE XREF: capture_shake_check+1BC↓j
.text:0000007101806708 ; capture_shake_check+1E0↓j
.text:0000007101806708 SCVTF S8, W11
.text:000000710180670C LDR X0, [SP,#0x40+var_28]
.text:0000007101806710 CBZ X0, loc_7101806720
.text:0000007101806714 LDR X8, [X0]
.text:0000007101806718 LDR X8, [X8,#0x20]
.text:000000710180671C BLR X8
.text:0000007101806720
.text:0000007101806720 loc_7101806720 ; CODE XREF: capture_shake_check+128↑j
.text:0000007101806720 LDR S0, [X19,#0x88]
.text:0000007101806724 FCMP S0, S8
.text:0000007101806728 B.GT loc_710180674C
.text:000000710180672C LDR W8, [X19,#0x90]
.text:0000007101806730 ADD W8, W8, #1
.text:0000007101806734 CMP W20, W8
.text:0000007101806738 STR W8, [X19,#0x90]
.text:000000710180673C B.LS loc_7101806774
.text:0000007101806740 MOV W0, #1
.text:0000007101806744 STR W0, [X19,#0x94]
.text:0000007101806748 B loc_7101806760
.text:000000710180674C ; ---------------------------------------------------------------------------
.text:000000710180674C
.text:000000710180674C loc_710180674C ; CODE XREF: capture_shake_check+140↑j
.text:000000710180674C STR WZR, [X19,#0x94]
.text:0000007101806750
.text:0000007101806750 loc_7101806750 ; CODE XREF: capture_shake_check:loc_7101806790↓j
.text:0000007101806750 LDR W8, [X19,#0x80]
.text:0000007101806754 CMP W8, #2
.text:0000007101806758 B.EQ loc_7101806788
.text:000000710180675C
.text:000000710180675C loc_710180675C ; CODE XREF: capture_shake_check+19C↓j
.text:000000710180675C MOV W0, WZR
.text:0000007101806760
.text:0000007101806760 loc_7101806760 ; CODE XREF: capture_shake_check+160↑j
.text:0000007101806760 ; capture_shake_check+1A4↓j ...
.text:0000007101806760 LDR D8, [SP,#0x40+var_20]
.text:0000007101806764 LDP X29, X30, [SP,#0x40+var_s0]
.text:0000007101806768 LDP X20, X19, [SP,#0x40+var_10]
.text:000000710180676C ADD SP, SP, #0x50 ; 'P'
.text:0000007101806770 RET
.text:0000007101806774 ; ---------------------------------------------------------------------------
.text:0000007101806774
.text:0000007101806774 loc_7101806774 ; CODE XREF: capture_shake_check+154↑j
.text:0000007101806774 MOV W8, #2
.text:0000007101806778 STR W8, [X19,#0x94]
.text:000000710180677C
.text:000000710180677C loc_710180677C ; CODE XREF: capture_shake_check+1B4↓j
.text:000000710180677C LDR W8, [X19,#0x80]
.text:0000007101806780 CMP W8, #1
.text:0000007101806784 B.EQ loc_710180675C
.text:0000007101806788
.text:0000007101806788 loc_7101806788 ; CODE XREF: capture_shake_check+170↑j
.text:0000007101806788 MOV W0, #2
.text:000000710180678C B loc_7101806760
.text:0000007101806790 ; ---------------------------------------------------------------------------
.text:0000007101806790
.text:0000007101806790 loc_7101806790 ; CODE XREF: capture_shake_check+50↑j
.text:0000007101806790 CBZ W0, loc_7101806750
.text:0000007101806794 CMP W0, #2
.text:0000007101806798 B.NE loc_7101806760
.text:000000710180679C B loc_710180677C
.text:00000071018067A0 ; ---------------------------------------------------------------------------
.text:00000071018067A0
.text:00000071018067A0 loc_71018067A0 ; CODE XREF: capture_shake_check+A8↑j
.text:00000071018067A0 MOV W11, WZR
.text:00000071018067A4 B loc_7101806708
.text:00000071018067A8 ; ---------------------------------------------------------------------------
.text:00000071018067A8
.text:00000071018067A8 loc_71018067A8 ; CODE XREF: capture_shake_check+B4↑j
.text:00000071018067A8 LDP X9, X10, [X8]
.text:00000071018067AC ADD W11, W10, W9
.text:00000071018067B0 EOR X10, X10, X9
.text:00000071018067B4 EOR X9, X10, X9,ROR#40
.text:00000071018067B8 EOR X9, X9, X10,LSL#16
.text:00000071018067BC STR X9, [X8]
.text:00000071018067C0 EXTR X9, X10, X10, #0x1B
.text:00000071018067C4 STR X9, [X8,#8]
.text:00000071018067C8 B loc_7101806708
.text:00000071018067CC ; ---------------------------------------------------------------------------
.text:00000071018067CC
.text:00000071018067CC loc_71018067CC ; CODE XREF: capture_shake_check+8C↑j
.text:00000071018067CC ADRP X8, #off_7104279678@PAGE
.text:00000071018067D0 LDR X8, [X8,#off_7104279678@PAGEOFF]
.text:00000071018067D4 STUR W0, [X29,#var_14]
.text:00000071018067D8 MOV X0, X8 ; __guard *
.text:00000071018067DC BL __cxa_guard_acquire_0
.text:00000071018067E0 MOV W8, W0
.text:00000071018067E4 LDUR W0, [X29,#var_14]
.text:00000071018067E8 CBZ W8, loc_7101806678
.text:00000071018067EC ADRP X0, #off_7104279A10@PAGE
.text:00000071018067F0 ADRP X1, #off_7104279680@PAGE
.text:00000071018067F4 LDR X0, [X0,#off_7104279A10@PAGEOFF]
.text:00000071018067F8 LDR X1, [X1,#off_7104279680@PAGEOFF]
.text:00000071018067FC ADRL X2, off_710401A000
.text:0000007101806804 BL sub_7100000250
.text:0000007101806808 ADRP X0, #off_7104279678@PAGE
.text:000000710180680C LDR X0, [X0,#off_7104279678@PAGEOFF] ; __guard *
.text:0000007101806810 BL __cxa_guard_release_0
.text:0000007101806814 LDUR W0, [X29,#var_14]
.text:0000007101806818 B loc_7101806678
.text:000000710180681C ; ---------------------------------------------------------------------------
.text:000000710180681C
.text:000000710180681C loc_710180681C ; CODE XREF: capture_shake_check+E4↑j
.text:000000710180681C MOV X10, XZR
.text:0000007101806820 B loc_71018066E0
.text:0000007101806820 ; End of function capture_shake_check
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment