Untitled

 avatar
unknown
c_cpp
5 months ago
15 kB
20
Indexable
undefined4 __thiscall BMD::LoadBMD(BMD *this,CHAR *folder,char *fileName,char param_3)

{
  short sVar1;
  longlong lVar2;
  char cVar3;
  undefined4 uVar4;
  FILE *_File;
  BYTE *itemTempVar;
  undefined4 *puVar5;
  int iVar6;
  uint uVar7;
  void *pvVar8;
  undefined LEA_KEY [772];
  char local_170 [64];
  undefined4 local_130;
  void *idk;
  void *local_128;
  undefined4 local_124;
  undefined4 local_120;
  undefined4 local_11c;
  undefined4 local_118;
  undefined4 local_114;
  undefined4 local_110;
  int local_10c;
  undefined4 local_108;
  undefined4 local_104;
  undefined4 local_100;
  undefined4 local_fc;
  undefined4 local_f8;
  int numMeshsBuffer;
  BYTE *local_f0;
  BYTE *local_ec;
  BYTE *local_e8;
  BYTE *actionsBuffer;
  BYTE *bonesBuffer;
  BYTE *local_dc;
  void *local_d8;
  void *decryptedBuffer;
  void *local_d0;
  void *local_cc;
  undefined4 local_c8;
  void *local_c4;
  void *local_c0;
  undefined local_bc [8];
  void *local_b4;
  undefined4 local_b0;
  void *local_ac;
  int local_a8;
  uint local_a4;
  uint local_a0;
  uint local_9c;
  uint actionsCount;
  uint bonesCount;
  BYTE *local_90;
  uint local_8c;
  uint meshsCount;
  void *local_84;
  undefined4 decryptedSize;
  void *local_7c;
  undefined4 local_78;
  undefined4 local_74;
  size_t LENGHT;
  BYTE *meshsBuffer;
  byte mk [32];
  int local_44;
  int local_40;
  int x;
  int i;
  void *encryptedBuffer;
  int readOffset;
  void *local_10;
  undefined *puStack_c;
  undefined4 local_8;
  
  local_8 = 0xffffffff;
  puStack_c = &LAB_01a28514;
  local_10 = ExceptionList;
  if (param_3 == 1) {
    ExceptionList = &local_10;
    FUN_013df841();
    FUN_0199d8d0(local_170,folder);
    FUN_0199d8e0(local_170,fileName);
    _File = _fopen(local_170,"rb");
    if (_File == (FILE *)0x0) {
      uVar4 = 0;
    }
    else {
      _fseek(_File,0,2);
      LENGHT = len(_File);
      _fseek(_File,0,0);
      encryptedBuffer = (void *)malloc(LENGHT);
      idk = encryptedBuffer;
      _fread(encryptedBuffer,1,LENGHT,_File);
      _fclose(_File);
      this->Version = *(BYTE *)((int)encryptedBuffer + 3);
      readOffset = 4;
      if (this->Version == 12) {
        local_74 = *(undefined4 *)((int)encryptedBuffer + 4);
        local_130 = FUN_00997e52(0,(int)encryptedBuffer + 8,local_74);
        local_c0 = (void *)malloc(local_130);
        local_b4 = local_c0;
        FUN_00997e52(local_c0,(int)encryptedBuffer + 8,local_74);
        local_c4 = encryptedBuffer;
        FID_conflict:_free(encryptedBuffer);
        encryptedBuffer = local_b4;
        readOffset = 0;
      }
      else if (this->Version == 14) {
        local_78 = *(undefined4 *)((int)encryptedBuffer + 4);
        local_c8 = FUN_017711fa(0,(int)encryptedBuffer + 8,local_78);
        local_cc = (void *)malloc(local_c8);
        local_7c = local_cc;
        FUN_017711fa(local_cc,(int)encryptedBuffer + 8,local_78);
        local_d0 = encryptedBuffer;
        FID_conflict:_free(encryptedBuffer);
        encryptedBuffer = local_7c;
        readOffset = 0;
      }
      else if (this->Version == 15) {
        mk[0] = 0xcc;
        mk[1] = 0x50;
        mk[2] = 0x45;
        mk[3] = 0x13;
        mk[4] = 0xc2;
        mk[5] = 0xa6;
        mk[6] = 0x57;
        mk[7] = 0x4e;
        mk[8] = 0xd6;
        mk[9] = 0x9a;
        mk[10] = 0x45;
        mk[0xb] = 0x89;
        mk[0xc] = 0xbf;
        mk[0xd] = 0x2f;
        mk[0xe] = 0xbc;
        mk[0xf] = 0xd9;
        mk[0x10] = 0x39;
        mk[0x11] = 0xb3;
        mk[0x12] = 0xb3;
        mk[0x13] = 0xbd;
        mk[0x14] = 0x50;
        mk[0x15] = 0xbd;
        mk[0x16] = 0xcc;
        mk[0x17] = 0xb6;
        mk[0x18] = 0x85;
        mk[0x19] = 0x46;
        mk[0x1a] = 0xd1;
        mk[0x1b] = 0xd6;
        mk[0x1c] = 0x16;
        mk[0x1d] = 0x54;
        mk[0x1e] = 0xe0;
        mk[0x1f] = 0x87;
        LEA_roundkeyGen(LEA_KEY,mk,0x20);
        decryptedSize = *(undefined4 *)((int)encryptedBuffer + 4);
        decryptedBuffer = (void *)malloc(decryptedSize);
        local_84 = decryptedBuffer;
        DecryptWIthLea(decryptedBuffer,(int)encryptedBuffer + 8,decryptedSize,LEA_KEY);
        if (encryptedBuffer != (void *)0x0) {
          local_d8 = encryptedBuffer;
          FID_conflict:_free(encryptedBuffer);
        }
        encryptedBuffer = local_84;
        readOffset = 0;
      }
      memcpy(this,(int)encryptedBuffer + readOffset,32);
      this->NumMeshs = *(short *)((int)encryptedBuffer + readOffset + 0x20);
      this->NumBones = *(short *)((int)encryptedBuffer + readOffset + 0x22);
      this->NumActions = *(short *)((int)encryptedBuffer + readOffset + 0x24);
      readOffset = readOffset + 38;
      if (this->NumMeshs < 1) {
        meshsCount = 1;
      }
      else {
        meshsCount = (uint)this->NumMeshs;
      }
      local_8c = meshsCount;
      meshsBuffer = (BYTE *)malloc(-(uint)((int)((ulonglong)meshsCount * 32 >> 0x20) != 0) |
                                   (uint)((ulonglong)meshsCount * 32));
      local_8 = 0;
      if (meshsBuffer == (BYTE *)0x0) {
        local_90 = (BYTE *)0x0;
      }
      else {
        FUN_009915cb(meshsBuffer,0x20,local_8c,FUN_011567c9);
        local_90 = meshsBuffer;
      }
      local_dc = local_90;
      local_8 = 0xffffffff;
      this->Meshs = local_90;
      if (this->NumBones < 1) {
        bonesCount = 1;
      }
      else {
        bonesCount = (uint)this->NumBones;
      }
      bonesBuffer = (BYTE *)malloc(-(uint)((int)((ulonglong)bonesCount * 140 >> 0x20) != 0) |
                                   (uint)((ulonglong)bonesCount * 140));
      this->Bones = bonesBuffer;
      if (this->NumActions < 1) {
        actionsCount = 1;
      }
      else {
        actionsCount = (uint)this->NumActions;
      }
      actionsBuffer =
           (BYTE *)malloc(-(uint)((int)((ulonglong)actionsCount * 16 >> 0x20) != 0) |
                          (uint)((ulonglong)actionsCount * 16));
      this->Actions = actionsBuffer;
      if (this->NumMeshs < 1) {
        local_9c = 1;
      }
      else {
        local_9c = (uint)this->NumMeshs;
      }
      local_e8 = (BYTE *)malloc(-(uint)((int)((ulonglong)local_9c * 32 >> 0x20) != 0) |
                                (uint)((ulonglong)local_9c * 32));
      this->ptr1 = local_e8;
      if (this->NumMeshs < 1) {
        local_a0 = 1;
      }
      else {
        local_a0 = (uint)this->NumMeshs;
      }
      local_ec = (BYTE *)malloc(-(uint)((int)((ulonglong)local_a0 * 4 >> 0x20) != 0) |
                                (uint)((ulonglong)local_a0 * 4));
      this->ptr2 = local_ec;
      if (this->NumMeshs < 1) {
        local_a4 = 1;
      }
      else {
        local_a4 = (uint)this->NumMeshs;
      }
      local_f0 = (BYTE *)malloc(-(uint)((int)((ulonglong)local_a4 * 4 >> 0x20) != 0) |
                                (uint)((ulonglong)local_a4 * 4));
      this->ptr3 = local_f0;
      this->field12_0x40 = 0;
      if (this->NumMeshs < 1) {
        local_a8 = 1;
      }
      else {
        local_a8 = (int)this->NumMeshs;
      }
      numMeshsBuffer = local_a8;
      local_f8 = 0;
                    /* this basically is zeroing the entire object
                        */
      FUN_0115674d(this->ptr3,&local_f8,&numMeshsBuffer);
      for (i = 0; i < this->NumMeshs; i = i + 1) {
        itemTempVar = this->Meshs + i * 0x20;
        *(undefined2 *)(itemTempVar + 4) = *(undefined2 *)((int)encryptedBuffer + readOffset);
        *(undefined2 *)(itemTempVar + 6) = *(undefined2 *)((int)encryptedBuffer + readOffset + 2);
        *(undefined2 *)(itemTempVar + 8) = *(undefined2 *)((int)encryptedBuffer + readOffset + 4);
        *(undefined2 *)(itemTempVar + 10) = *(undefined2 *)((int)encryptedBuffer + readOffset + 6);
        *(undefined2 *)(itemTempVar + 2) = *(undefined2 *)((int)encryptedBuffer + readOffset + 8);
        *itemTempVar = 0;
        local_fc = malloc(-(uint)((int)((ulonglong)(uint)(int)*(short *)(itemTempVar + 4) * 0x10 >>
                                       0x20) != 0) |
                          (uint)((ulonglong)(uint)(int)*(short *)(itemTempVar + 4) * 0x10));
        *(undefined4 *)(itemTempVar + 0xc) = local_fc;
        local_100 = malloc(-(uint)((int)((ulonglong)(uint)(int)*(short *)(itemTempVar + 6) * 0x14 >>
                                        0x20) != 0) |
                           (uint)((ulonglong)(uint)(int)*(short *)(itemTempVar + 6) * 0x14));
        *(undefined4 *)(itemTempVar + 0x10) = local_100;
        local_104 = malloc(-(uint)((int)((ulonglong)(uint)(int)*(short *)(itemTempVar + 8) * 8 >>
                                        0x20) != 0) |
                           (uint)((ulonglong)(uint)(int)*(short *)(itemTempVar + 8) * 8));
        *(undefined4 *)(itemTempVar + 0x14) = local_104;
        local_108 = malloc(-(uint)((int)((ulonglong)(uint)(int)*(short *)(itemTempVar + 10) * 0x24
                                        >> 0x20) != 0) |
                           (uint)((ulonglong)(uint)(int)*(short *)(itemTempVar + 10) * 0x24));
        *(undefined4 *)(itemTempVar + 0x18) = local_108;
        sVar1 = *(short *)(itemTempVar + 4);
        memcpy(*(undefined4 *)(itemTempVar + 0xc),(int)encryptedBuffer + readOffset + 10,
               sVar1 * 0x10);
        readOffset = readOffset + 10 + sVar1 * 0x10;
        sVar1 = *(short *)(itemTempVar + 6);
        memcpy(*(undefined4 *)(itemTempVar + 0x10),(int)encryptedBuffer + readOffset,sVar1 * 0x14);
        readOffset = readOffset + sVar1 * 0x14;
        sVar1 = *(short *)(itemTempVar + 8);
        memcpy(*(undefined4 *)(itemTempVar + 0x14),(int)encryptedBuffer + readOffset,sVar1 * 8);
        readOffset = readOffset + sVar1 * 8;
        local_10c = 0x40;
        for (local_44 = 0; local_44 < *(short *)(itemTempVar + 10); local_44 = local_44 + 1) {
          memcpy(local_44 * 0x24 + *(int *)(itemTempVar + 0x18),(int)encryptedBuffer + readOffset,
                 0x24);
          readOffset = readOffset + local_10c;
        }
        memcpy(this->ptr1 + i * 0x20,(int)encryptedBuffer + readOffset,0x20);
        readOffset = readOffset + 0x20;
        FUN_011567ac();
        local_8 = 1;
        cVar3 = FUN_012a4ea8(this->ptr1 + i * 0x20);
        if (cVar3 == '\0') {
          *(undefined4 *)(itemTempVar + 0x1c) = 0;
        }
        else {
          local_ac = operator_new(5);
          local_8._0_1_ = 2;
          if (local_ac == (void *)0x0) {
            local_b0 = 0;
          }
          else {
            local_b0 = FUN_0115677c();
          }
          local_110 = local_b0;
          local_8 = CONCAT31(local_8._1_3_,1);
          *(undefined4 *)(itemTempVar + 0x1c) = local_b0;
          FUN_012a4e61(local_bc);
        }
        local_8 = 0xffffffff;
        FUN_01156838();
      }
      for (i = 0; i < this->NumActions; i = i + 1) {
        itemTempVar = this->Actions + i * 16;
        *itemTempVar = '\0';
        *(undefined2 *)(itemTempVar + 8) = *(undefined2 *)((int)encryptedBuffer + readOffset);
        itemTempVar[10] = *(BYTE *)((int)encryptedBuffer + readOffset + 2);
        readOffset = readOffset + 3;
        if (itemTempVar[10] == '\0') {
          *(undefined4 *)(itemTempVar + 0xc) = 0;
        }
        else {
          lVar2 = (ulonglong)
                  (-(uint)((int)((ulonglong)(uint)(int)*(short *)(itemTempVar + 8) * 3 >> 0x20) != 0
                          ) | (uint)((ulonglong)(uint)(int)*(short *)(itemTempVar + 8) * 3)) * 4;
          local_114 = malloc(-(uint)((int)((ulonglong)lVar2 >> 0x20) != 0) | (uint)lVar2);
          *(undefined4 *)(itemTempVar + 0xc) = local_114;
          sVar1 = *(short *)(itemTempVar + 8);
          memcpy(*(undefined4 *)(itemTempVar + 0xc),(int)encryptedBuffer + readOffset,sVar1 * 0xc);
          readOffset = readOffset + sVar1 * 0xc;
        }
      }
      for (i = 0; i < this->NumBones; i = i + 1) {
        itemTempVar = this->Bones + i * 140;
        itemTempVar[0x22] = *(BYTE *)((int)encryptedBuffer + readOffset);
        iVar6 = readOffset + 1;
        if (itemTempVar[0x22] == '\0') {
          memcpy(itemTempVar,(int)encryptedBuffer + readOffset + 1,0x20);
          *(undefined2 *)(itemTempVar + 0x20) =
               *(undefined2 *)((int)encryptedBuffer + readOffset + 0x21);
          readOffset = readOffset + 0x23;
          lVar2 = (ulonglong)(uint)(int)this->NumActions * 0xc;
          local_118 = malloc(-(uint)((int)((ulonglong)lVar2 >> 0x20) != 0) | (uint)lVar2);
          *(undefined4 *)(itemTempVar + 0x24) = local_118;
          for (x = 0; iVar6 = readOffset, x < this->NumActions; x = x + 1) {
            puVar5 = (undefined4 *)(x * 0xc + *(int *)(itemTempVar + 0x24));
            iVar6 = *(short *)(this->Actions + x * 0x10 + 8) * 0xc;
            uVar7 = (uint)*(short *)(this->Actions + x * 0x10 + 8);
            lVar2 = (ulonglong)
                    (-(uint)((int)((ulonglong)uVar7 * 3 >> 0x20) != 0) |
                    (uint)((ulonglong)uVar7 * 3)) * 4;
            local_11c = malloc(-(uint)((int)((ulonglong)lVar2 >> 0x20) != 0) | (uint)lVar2);
            *puVar5 = local_11c;
            lVar2 = (ulonglong)
                    (-(uint)((int)((ulonglong)uVar7 * 3 >> 0x20) != 0) |
                    (uint)((ulonglong)uVar7 * 3)) * 4;
            local_120 = malloc(-(uint)((int)((ulonglong)lVar2 >> 0x20) != 0) | (uint)lVar2);
            puVar5[1] = local_120;
            lVar2 = (ulonglong)
                    (-(uint)((int)((ulonglong)uVar7 * 4 >> 0x20) != 0) |
                    (uint)((ulonglong)uVar7 * 4)) * 4;
            local_124 = malloc(-(uint)((int)((ulonglong)lVar2 >> 0x20) != 0) | (uint)lVar2);
            puVar5[2] = local_124;
            memcpy(*puVar5,(int)encryptedBuffer + readOffset,iVar6);
            memcpy(puVar5[1],(int)encryptedBuffer + readOffset + iVar6,iVar6);
            readOffset = readOffset + iVar6 + iVar6;
            for (local_40 = 0; local_40 < (int)uVar7; local_40 = local_40 + 1) {
              FUN_00d8899c(local_40 * 0xc + puVar5[1],local_40 * 0x10 + puVar5[2]);
            }
          }
        }
        readOffset = iVar6;
      }
      local_128 = encryptedBuffer;
      FID_conflict:_free(encryptedBuffer);
      FUN_013de12a(0);
      pvVar8 = _memset(this->field82_0xb6,-1,20);
      uVar4 = CONCAT31((int3)((uint)pvVar8 >> 8),1);
    }
  }
  else {
    uVar4 = 1;
  }
  ExceptionList = local_10;
  return uVar4;
}

Editor is loading...
Leave a Comment