{"type": "func", "start": 336344, "end": 336968, "name": "sub_521D8", "pseudocode": "// \n// sub_521D8 from 0x521d8 to 0x52448 (624 bytes)\n// \n// 1 xrefs:\n// > <???> @ 0x10c058\n// \n// This function is hookable on this platform!\n// \n// Using BromaIDA 8.0.0 @ https://github.com/Stazzical/BromaIDA\n// Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings\n// \n\n__int64 __fastcall sub_521D8(__int64 a1, int a2)\n{\n  __int64 result; // x0\n  __int64 v5; // x0\n  __int64 v6; // x21\n  _QWORD *v7; // x10\n  __int64 v8; // x8\n  int v9; // w8\n  __int64 v10; // x10\n  int v11; // w9\n  __int64 v12; // x10\n  float v13; // s0\n  unsigned int v14; // w11\n  unsigned int v15; // w12\n  int v16; // w13\n  unsigned int v17; // w11\n  int v18; // w11\n  unsigned int v19; // w8\n  int v20; // w8\n  unsigned int v21; // w8\n  int v22; // w9\n  _BYTE v23[4]; // [xsp+4h] [xbp-2Ch] BYREF\n  __int64 v24; // [xsp+8h] [xbp-28h] BYREF\n  unsigned __int64 v25; // [xsp+18h] [xbp-18h] BYREF\n\n  result = ((__int64 (*)(void))loc_5251C)();\n  if ( (_DWORD)result )\n    return result;\n  if ( (*(_DWORD *)(a1 + 60) & 0x60) != 0x40 )\n    return 0;\n  v5 = *(_QWORD *)(a1 + 24);\n  if ( (*(_DWORD *)(v5 + 72) & 0x30000) == 0x10000 || (*(_DWORD *)(a1 + 56) & 0x80000000) != 0 )\n    return 0;\n  v25 = 0;\n  v24 = 0;\n  v23[0] = 0;\n  v6 = *(_QWORD *)(v5 + 96);\n  result = (*(__int64 (__fastcall **)(__int64, unsigned __int64 *, __int64 *, _BYTE *))(*(_QWORD *)v5 + 232LL))(\n             v5,\n             &v25,\n             &v24,\n             v23);\n  if ( (_DWORD)result )\n    return result;\n  if ( v24 | v25 )\n  {\n    if ( v6 )\n    {\n      v7 = *(_QWORD **)(v6 + 56);\n      if ( v7 )\n        v7 = (_QWORD *)*v7;\n    }\n    else\n    {\n      v7 = nullptr;\n    }\n    if ( (unsigned __int64)v7 < v25 )\n    {\nLABEL_12:\n      a2 = 0;\n      if ( !v6 )\n        goto LABEL_20;\n      goto LABEL_18;\n    }\n    if ( v24 - 1 < (unsigned __int64)v7 )\n    {\n      if ( !v23[0] )\n        goto LABEL_12;\n      a2 = 0;\n      *(_DWORD *)(a1 + 60) &= ~0x40u;\n    }\n  }\n  if ( !v6 )\n    goto LABEL_20;\nLABEL_18:\n  if ( *(_BYTE *)(v6 + 49) )\n    *(_DWORD *)(a1 + 60) &= ~0x40u;\nLABEL_20:\n  if ( a2 )\n  {\n    v8 = *(_QWORD *)(a1 + 24);\n    if ( *(_DWORD *)(a1 + 80) == 1 )\n      v9 = a2\n         * (int)(float)(*(float *)(v8 + 52)\n                      * (float)((float)(*(float *)(v8 + 556)\n                                      * (float)((float)(1.0 - *(float *)(v8 + 240))\n                                              + (float)(*(float *)(v8 + 124) * *(float *)(v8 + 240))))\n                              * *(float *)(*(_QWORD *)(v8 + 32) + 504LL)))\n         / -1000;\n    else\n      v9 = a2\n         * (int)(float)(*(float *)(v8 + 52)\n                      * (float)((float)(*(float *)(v8 + 556)\n                                      * (float)((float)(1.0 - *(float *)(v8 + 240))\n                                              + (float)(*(float *)(v8 + 124) * *(float *)(v8 + 240))))\n                              * *(float *)(*(_QWORD *)(v8 + 32) + 504LL)))\n         / 1000;\n    *(_DWORD *)(a1 + 76) += v9;\n  }\n  else\n  {\n    v9 = 0;\n  }\n  v10 = *(_QWORD *)(a1 + 40);\n  if ( !v10 )\n    return 0;\n  v11 = *(_DWORD *)(a1 + 56);\n  if ( (v11 & 2) != 0 || (v11 & 4) != 0 && *(_DWORD *)(a1 + 84) )\n  {\n    v12 = *(_QWORD *)(a1 + 24);\n    while ( 1 )\n    {\n      v13 = *(float *)(v12 + 556);\n      if ( v13 <= 0.0 || (v14 = *(_DWORD *)(a1 + 88), v15 = *(_DWORD *)(a1 + 76), v15 < *(_DWORD *)(a1 + 92) + v14) )\n      {\n        if ( v13 >= 0.0 )\n          return 0;\n        v15 = *(_DWORD *)(a1 + 76);\n        v14 = *(_DWORD *)(a1 + 88);\n        if ( v15 > v14 )\n          return 0;\n      }\n      v16 = *(_DWORD *)(a1 + 84);\n      if ( !v16 )\n      {\n        if ( !*(_DWORD *)(a1 + 80) && v13 > 0.0 )\n          v14 += *(_DWORD *)(a1 + 92);\n        v20 = *(_DWORD *)(a1 + 60);\n        result = 0;\n        *(_DWORD *)(a1 + 76) = v14;\n        v21 = v20 & 0xFFFFFFBF;\n        goto LABEL_53;\n      }\n      if ( (v11 & 2) != 0 )\n        break;\n      if ( (v11 & 4) != 0 )\n      {\n        *(_DWORD *)(a1 + 80) = *(_DWORD *)(a1 + 80) == 0;\n        v17 = v15 - v9;\nLABEL_42:\n        *(_DWORD *)(a1 + 76) = v17;\n      }\n      if ( (v16 & 0x80000000) == 0 )\n        *(_DWORD *)(a1 + 84) = v16 - 1;\n    }\n    v18 = *(_DWORD *)(a1 + 92);\n    if ( v13 <= 0.0 )\n      v17 = v15 + v18;\n    else\n      v17 = v15 - v18;\n    goto LABEL_42;\n  }\n  v19 = *(_DWORD *)(v10 + 68);\n  if ( *(_DWORD *)(a1 + 76) < v19 )\n    return 0;\n  v22 = *(_DWORD *)(a1 + 60);\n  result = 0;\n  *(_DWORD *)(a1 + 76) = v19;\n  v21 = v22 & 0xFFFFFFBF;\nLABEL_53:\n  *(_DWORD *)(a1 + 60) = v21;\n  return result;\n}", "assembly": "; \n; sub_521D8 from 0x521d8 to 0x52448 (624 bytes)\n; \n; 1 xrefs:\n; > <???> @ 0x10c058\n; \n; This function is hookable on this platform!\n; \n; Using BromaIDA 8.0.0 @ https:;github.com/Stazzical/BromaIDA\n; Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https:;github.com/geode-sdk/bindings\n; \n\nSUB             SP, SP, #0x40                                          ; +0x0, 0x521d8\nSTR             X21, [SP,#0x30+var_20]                                 ; +0x4, 0x521dc\nSTP             X20, X19, [SP,#0x30+var_10]                            ; +0x8, 0x521e0\nSTP             X29, X30, [SP,#0x30+var_s0]                            ; +0xc, 0x521e4\nADD             X29, SP, #0x30                                         ; +0x10, 0x521e8\nMOV             W20, W1                                                ; +0x14, 0x521ec\nMOV             X19, X0                                                ; +0x18, 0x521f0\nBL              loc_5251C                                              ; +0x1c, 0x521f4\nCBNZ            W0, loc_523F0                                          ; +0x20, 0x521f8\nLDR             W8, [X19,#0x3C]                                        ; +0x24, 0x521fc\nAND             W8, W8, #0x60 ; '`'                                    ; +0x28, 0x52200\nCMP             W8, #0x40 ; '@'                                        ; +0x2c, 0x52204\nB.NE            loc_523EC                                              ; +0x30, 0x52208\nLDR             X0, [X19,#0x18]                                        ; +0x34, 0x5220c\nLDR             W8, [X0,#0x48]                                         ; +0x38, 0x52210\nAND             W8, W8, #0x30000                                       ; +0x3c, 0x52214\nCMP             W8, #0x10,LSL#12                                       ; +0x40, 0x52218\nB.EQ            loc_523EC                                              ; +0x44, 0x5221c\nLDR             W8, [X19,#0x38]                                        ; +0x48, 0x52220\nTBNZ            W8, #0x1F, loc_523EC                                   ; +0x4c, 0x52224\nSTR             XZR, [SP,#0x30+var_18]                                 ; +0x50, 0x52228\nSTR             XZR, [SP,#0x30+var_28]                                 ; +0x54, 0x5222c\nSTRB            WZR, [SP,#0x30+var_2C]                                 ; +0x58, 0x52230\nLDR             X8, [X0]                                               ; +0x5c, 0x52234\nLDR             X21, [X0,#0x60]                                        ; +0x60, 0x52238\nADD             X1, SP, #0x30+var_18                                   ; +0x64, 0x5223c\nADD             X2, SP, #0x30+var_28                                   ; +0x68, 0x52240\nLDR             X8, [X8,#0xE8]                                         ; +0x6c, 0x52244\nADD             X3, SP, #0x30+var_2C                                   ; +0x70, 0x52248\nBLR             X8                                                     ; +0x74, 0x5224c\nCBNZ            W0, loc_523F0                                          ; +0x78, 0x52250\nLDR             X9, [SP,#0x30+var_18]                                  ; +0x7c, 0x52254\nLDR             X8, [SP,#0x30+var_28]                                  ; +0x80, 0x52258\nORR             X10, X8, X9                                            ; +0x84, 0x5225c\nCBZ             X10, loc_522B4                                         ; +0x88, 0x52260\nCBZ             X21, loc_52278                                         ; +0x8c, 0x52264\nLDR             X10, [X21,#0x38]                                       ; +0x90, 0x52268\nCBZ             X10, loc_5227C                                         ; +0x94, 0x5226c\nLDR             X10, [X10]                                             ; +0x98, 0x52270\nB               loc_5227C                                              ; +0x9c, 0x52274\nMOV             X10, XZR                                               ; +0xa0, 0x52278\nCMP             X10, X9                                                ; +0xa4, 0x5227c\nB.CS            loc_52290                                              ; +0xa8, 0x52280\nMOV             W20, WZR                                               ; +0xac, 0x52284\nCBNZ            X21, loc_522B8                                         ; +0xb0, 0x52288\nB               loc_522CC                                              ; +0xb4, 0x5228c\nSUB             X8, X8, #1                                             ; +0xb8, 0x52290\nCMP             X8, X10                                                ; +0xbc, 0x52294\nB.CS            loc_522B4                                              ; +0xc0, 0x52298\nLDRB            W8, [SP,#0x30+var_2C]                                  ; +0xc4, 0x5229c\nCBZ             W8, loc_52284                                          ; +0xc8, 0x522a0\nLDR             W8, [X19,#0x3C]                                        ; +0xcc, 0x522a4\nMOV             W20, WZR                                               ; +0xd0, 0x522a8\nAND             W8, W8, #0xFFFFFFBF                                    ; +0xd4, 0x522ac\nSTR             W8, [X19,#0x3C]                                        ; +0xd8, 0x522b0\nCBZ             X21, loc_522CC                                         ; +0xdc, 0x522b4\nLDRB            W8, [X21,#0x31]                                        ; +0xe0, 0x522b8\nCBZ             W8, loc_522CC                                          ; +0xe4, 0x522bc\nLDR             W8, [X19,#0x3C]                                        ; +0xe8, 0x522c0\nAND             W8, W8, #0xFFFFFFBF                                    ; +0xec, 0x522c4\nSTR             W8, [X19,#0x3C]                                        ; +0xf0, 0x522c8\nCBZ             W20, loc_5232C                                         ; +0xf4, 0x522cc\nLDR             X8, [X19,#0x18]                                        ; +0xf8, 0x522d0\nFMOV            S0, #1.0                                               ; +0xfc, 0x522d4\nMOV             W11, #0x3E8                                            ; +0x100, 0x522d8\nLDR             S1, [X8,#0xF0]                                         ; +0x104, 0x522dc\nLDR             S2, [X8,#0x7C]                                         ; +0x108, 0x522e0\nLDR             X9, [X8,#0x20]                                         ; +0x10c, 0x522e4\nLDR             S3, [X8,#0x22C]                                        ; +0x110, 0x522e8\nFSUB            S0, S0, S1                                             ; +0x114, 0x522ec\nFMADD           S0, S2, S1, S0                                         ; +0x118, 0x522f0\nLDR             S2, [X9,#0x1F8]                                        ; +0x11c, 0x522f4\nLDR             S1, [X8,#0x34]                                         ; +0x120, 0x522f8\nFMUL            S0, S3, S0                                             ; +0x124, 0x522fc\nLDP             W9, W8, [X19,#0x4C]                                    ; +0x128, 0x52300\nFMUL            S0, S0, S2                                             ; +0x12c, 0x52304\nFMUL            S0, S1, S0                                             ; +0x130, 0x52308\nFCVTZS          W10, S0                                                ; +0x134, 0x5230c\nMUL             W10, W20, W10                                          ; +0x138, 0x52310\nSDIV            W10, W10, W11                                          ; +0x13c, 0x52314\nCMP             W8, #1                                                 ; +0x140, 0x52318\nCNEG            W8, W10, EQ                                            ; +0x144, 0x5231c\nADD             W9, W8, W9                                             ; +0x148, 0x52320\nSTR             W9, [X19,#0x4C]                                        ; +0x14c, 0x52324\nB               loc_52330                                              ; +0x150, 0x52328\nMOV             W8, WZR                                                ; +0x154, 0x5232c\nLDR             X10, [X19,#0x28]                                       ; +0x158, 0x52330\nCBZ             X10, loc_523EC                                         ; +0x15c, 0x52334\nLDR             W9, [X19,#0x38]                                        ; +0x160, 0x52338\nTBNZ            W9, #1, loc_5234C                                      ; +0x164, 0x5233c\nTBZ             W9, #2, loc_523DC                                      ; +0x168, 0x52340\nLDR             W11, [X19,#0x54]                                       ; +0x16c, 0x52344\nCBZ             W11, loc_523DC                                         ; +0x170, 0x52348\nLDR             X10, [X19,#0x18]                                       ; +0x174, 0x5234c\nLDR             S0, [X10,#0x22C]                                       ; +0x178, 0x52350\nFCMP            S0, #0.0                                               ; +0x17c, 0x52354\nB.LE            loc_52370                                              ; +0x180, 0x52358\nLDP             W11, W13, [X19,#0x58]                                  ; +0x184, 0x5235c\nLDR             W12, [X19,#0x4C]                                       ; +0x188, 0x52360\nADD             W13, W13, W11                                          ; +0x18c, 0x52364\nCMP             W12, W13                                               ; +0x190, 0x52368\nB.CS            loc_52388                                              ; +0x194, 0x5236c\nFCMP            S0, #0.0                                               ; +0x198, 0x52370\nB.GE            loc_523EC                                              ; +0x19c, 0x52374\nLDR             W12, [X19,#0x4C]                                       ; +0x1a0, 0x52378\nLDR             W11, [X19,#0x58]                                       ; +0x1a4, 0x5237c\nCMP             W12, W11                                               ; +0x1a8, 0x52380\nB.HI            loc_523EC                                              ; +0x1ac, 0x52384\nLDR             W13, [X19,#0x54]                                       ; +0x1b0, 0x52388\nCBZ             W13, loc_52404                                         ; +0x1b4, 0x5238c\nTBNZ            W9, #1, loc_523B0                                      ; +0x1b8, 0x52390\nTBZ             W9, #2, loc_523CC                                      ; +0x1bc, 0x52394\nLDR             W11, [X19,#0x50]                                       ; +0x1c0, 0x52398\nCMP             W11, #0                                                ; +0x1c4, 0x5239c\nCSET            W11, EQ                                                ; +0x1c8, 0x523a0\nSTR             W11, [X19,#0x50]                                       ; +0x1cc, 0x523a4\nSUB             W11, W12, W8                                           ; +0x1d0, 0x523a8\nB               loc_523C8                                              ; +0x1d4, 0x523ac\nLDR             W11, [X19,#0x5C]                                       ; +0x1d8, 0x523b0\nFCMP            S0, #0.0                                               ; +0x1dc, 0x523b4\nB.LE            loc_523C4                                              ; +0x1e0, 0x523b8\nSUB             W11, W12, W11                                          ; +0x1e4, 0x523bc\nB               loc_523C8                                              ; +0x1e8, 0x523c0\nADD             W11, W12, W11                                          ; +0x1ec, 0x523c4\nSTR             W11, [X19,#0x4C]                                       ; +0x1f0, 0x523c8\nTBNZ            W13, #0x1F, loc_52350                                  ; +0x1f4, 0x523cc\nSUB             W11, W13, #1                                           ; +0x1f8, 0x523d0\nSTR             W11, [X19,#0x54]                                       ; +0x1fc, 0x523d4\nB               loc_52350                                              ; +0x200, 0x523d8\nLDR             W9, [X19,#0x4C]                                        ; +0x204, 0x523dc\nLDR             W8, [X10,#0x44]                                        ; +0x208, 0x523e0\nCMP             W9, W8                                                 ; +0x20c, 0x523e4\nB.CS            loc_52430                                              ; +0x210, 0x523e8\nMOV             W0, WZR                                                ; +0x214, 0x523ec\nLDP             X29, X30, [SP,#0x30+var_s0]                            ; +0x218, 0x523f0\nLDP             X20, X19, [SP,#0x30+var_10]                            ; +0x21c, 0x523f4\nLDR             X21, [SP,#0x30+var_20]                                 ; +0x220, 0x523f8\nADD             SP, SP, #0x40 ; '@'                                    ; +0x224, 0x523fc\nRET                                                                    ; +0x228, 0x52400\nLDR             W8, [X19,#0x50]                                        ; +0x22c, 0x52404\nCBNZ            W8, loc_5241C                                          ; +0x230, 0x52408\nFCMP            S0, #0.0                                               ; +0x234, 0x5240c\nB.LE            loc_5241C                                              ; +0x238, 0x52410\nLDR             W8, [X19,#0x5C]                                        ; +0x23c, 0x52414\nADD             W11, W8, W11                                           ; +0x240, 0x52418\nLDR             W8, [X19,#0x3C]                                        ; +0x244, 0x5241c\nMOV             W0, WZR                                                ; +0x248, 0x52420\nSTR             W11, [X19,#0x4C]                                       ; +0x24c, 0x52424\nAND             W8, W8, #0xFFFFFFBF                                    ; +0x250, 0x52428\nB               loc_52440                                              ; +0x254, 0x5242c\nLDR             W9, [X19,#0x3C]                                        ; +0x258, 0x52430\nMOV             W0, WZR                                                ; +0x25c, 0x52434\nSTR             W8, [X19,#0x4C]                                        ; +0x260, 0x52438\nAND             W8, W9, #0xFFFFFFBF                                    ; +0x264, 0x5243c\nSTR             W8, [X19,#0x3C]                                        ; +0x268, 0x52440\nB               loc_523F0                                              ; +0x26c, 0x52444", "xrefs": ["<???> @ 0x10c058"], "is_objc": false, "is_arm32": false, "is_arm64": false, "bida_info": "8.0.0 @ https://github.com/Stazzical/BromaIDA", "bindings_info": "commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings"}