changeset 112:8feb2dfd2f89

6.11.12b
author Ritor1
date Wed, 07 Nov 2012 17:55:13 +0600
parents e5d6903a077a
children 8e802a11b20d 6e0346bc7014 d2ca891da89f
files LOD.cpp
diffstat 1 files changed, 193 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/LOD.cpp	Wed Nov 07 13:03:58 2012 +0600
+++ b/LOD.cpp	Wed Nov 07 17:55:13 2012 +0600
@@ -1645,6 +1645,193 @@
 // 6A0CA8: using guessed type int 6A0CA8_lod_unused;
 
 //----- (00461B48) --------------------------------------------------------
+/*unsigned int LODWriteableFile::Write(const LOD::Directory *pDir, const void *pDirData, int a4)
+{
+  LODWriteableFile *v4; // ebx@1
+  int v5; // esi@1
+  unsigned __int8 v7; // zf@7
+  unsigned __int8 v8; // sf@7
+  const LOD::Directory *v9; // edi@9
+  int v10; // eax@9
+  unsigned __int8 v11; // of@15
+  unsigned __int16 v12; // dx@17
+  LOD::Directory *v13; // eax@17
+  unsigned __int16 v14; // cx@17
+  int v15; // edi@27
+  unsigned int v16; // eax@27
+  int v17; // eax@29
+  int v18; // edx@31
+  int v19; // eax@31
+  void *v20; // edi@32
+  LOD::Directory *v21; // edi@34
+  signed int v22; // esi@34
+  int v23; // eax@34
+  LOD::Directory *v24; // ecx@35
+  int v25; // edx@35
+  __int32 v26; // eax@37
+  int i; // esi@39
+  __int32 v28; // esi@46
+  char pFilename[256]; // [sp+Ch] [bp-230h]@22
+  char NewFilename[256]; // [sp+10Ch] [bp-130h]@51
+  //LOD::Directory Str; // [sp+20Ch] [bp-30h]@27
+  size_t v33; // [sp+22Ch] [bp-10h]@27
+  int v34; // [sp+230h] [bp-Ch]@7
+  __int32 v35; // [sp+234h] [bp-8h]@8
+  int v36; // [sp+238h] [bp-4h]@7
+  size_t Count; // [sp+244h] [bp+8h]@40
+  __int32 Countc; // [sp+244h] [bp+8h]@46
+  size_t Countb; // [sp+244h] [bp+8h]@47
+  FILE *pFile; // [sp+24Ch] [bp+10h]@22
+
+  v4 = this;
+  v5 = 0;
+  if ( !this->isFileOpened )
+    return 1;
+  if ( !this->pSubIndices )
+    return 2;
+  if ( !this->pIOBuffer || !this->uIOBufferSize )
+    return 3;
+  v7 = this->uNumSubIndices == 0;
+  v8 = (this->uNumSubIndices & 0x80000000u) != 0;
+  v36 = 0;
+  v34 = 0;
+  if ( v8 | v7 )
+  {
+    v9 = pDir;
+    goto LABEL_22;
+  }
+  v35 = 0;
+  while ( 1 )
+  {
+    v9 = pDir;
+    v10 = _strcmpi((const char *)v4->pSubIndices + v35, (const char *)pDir);
+    if ( v10 )
+    {
+      if ( v10 > 0 )
+        goto LABEL_22;
+      goto LABEL_15;
+    }
+    if ( !a4 )
+      goto LABEL_20;
+    if ( a4 == 1 )
+      break;
+    if ( a4 == 2 )
+      return 4;
+LABEL_15:
+    v35 += 32;
+    ++v5;
+    v11 = __OFSUB__(v5, v4->uNumSubIndices);
+    v8 = ((v5 - v4->uNumSubIndices) & 0x80000000u) != 0;
+    v34 = v5;
+    if ( !(v8 ^ v11) )
+      goto LABEL_22;
+  }
+  v12 = pDir->uNumSubIndices;
+  v13 = &v4->pSubIndices[v5];
+  v14 = v13->uNumSubIndices;
+  if ( v14 >= v12 && (v14 != v12 || (unsigned __int16)v13->word_00001E >= pDir->word_00001E) )
+    return 4;
+LABEL_20:
+  v36 = 1;
+LABEL_22:
+  strcpy(pFilename, "lod.tmp");
+  pFile = fopen(pFilename, "wb+");
+  if ( !pFile )
+    return 5;
+  if ( v36 )
+    v35 = v4->pSubIndices[v5].uDataSize;
+  else
+    v35 = 0;
+  v33 = v9->uDataSize;
+  v15 = v33 - v35;
+
+  LOD::Directory Str; // [sp+20Ch] [bp-30h]@27
+  //LOD::Directory::LOD::Directory(&Str);
+
+  strcpy((char *)&Str, "chapter");
+  v16 = v4->uLODDataSize;
+  Str.uNumSubIndices = LOWORD(v4->uNumSubIndices);
+  Str.dword_000018 = 0;
+  Str.word_00001E = 0;
+  if ( !v36 )
+  {
+    ++Str.uNumSubIndices;
+    v15 += 32;
+  }
+  v7 = v36 == 0;
+  Str.uDataSize = v15 + v16;
+  Str.uOfsetFromSubindicesStart = 288;
+  v17 = (signed __int16)Str.uNumSubIndices;
+  v4->uNumSubIndices = (signed __int16)Str.uNumSubIndices;
+  if ( v7 && v17 > v5 )
+  {
+    v18 = v17;
+    v19 = v17 - v5;
+    do
+    {
+      v20 = &v4->pSubIndices[v18];
+      --v18;
+      --v19;
+      memcpy(v20, (char *)v20 - 32, 0x20u);
+    }
+    while ( v19 );
+    v5 = v34;
+  }
+  v34 = 32 * v5;
+  memcpy(&v4->pSubIndices[v5], pDir, sizeof(v4->pSubIndices[v5]));
+  v23 = 32 * v4->uNumSubIndices;
+  if ( (signed int)v4->uNumSubIndices > 0 )
+  {
+    for (int i =  0; i < (signed int)v4->uNumSubIndices; ++i)
+    {
+      v4->pSubIndices[i].uOfsetFromSubindicesStart = v23;
+      v23 += v4->pSubIndices[i].uDataSize;
+    }
+  }
+  fwrite(&v4->header, 0x100, 1, pFile);
+  fwrite(&Str, 0x20, 1, pFile);
+  fseek(v4->pFile, Str.uOfsetFromSubindicesStart, 0);
+  fwrite(v4->pSubIndices, 0x20u, v4->uNumSubIndices, pFile);
+  v26 = 32 * v4->uNumSubIndices;
+  if ( !v36 )
+    v26 -= 32;
+  fseek(v4->pFile, v26, 1);
+  for ( i = *(unsigned int *)((char *)&v4->pSubIndices->uOfsetFromSubindicesStart + v34)
+          - v4->pSubIndices->uOfsetFromSubindicesStart; i > 0; i -= Count )
+  {
+    Count = v4->uIOBufferSize;
+    if ( i <= (signed int)v4->uIOBufferSize )
+      Count = i;
+    fread(v4->pIOBuffer, 1u, Count, v4->pFile);
+    fwrite(v4->pIOBuffer, 1u, Count, pFile);
+  }
+  fwrite(pDirData, 1u, v33, pFile);
+  if ( v36 )
+    fseek(v4->pFile, v35, 1);
+  Countc = ftell(v4->pFile);
+  fseek(v4->pFile, 0, 2);
+  v28 = ftell(v4->pFile) - Countc;
+  fseek(v4->pFile, Countc, 0);
+  while ( v28 > 0 )
+  {
+    Countb = v4->uIOBufferSize;
+    if ( v28 <= (signed int)v4->uIOBufferSize )
+      Countb = v28;
+    fread(v4->pIOBuffer, 1u, Countb, v4->pFile);
+    fwrite(v4->pIOBuffer, 1u, Countb, pFile);
+    v28 -= Countb;
+  }
+  strcpy(NewFilename, (const char *)v4->pLODName);
+  fclose(pFile);
+  v4->CloseWriteFile();
+  remove(NewFilename);
+  rename(pFilename, NewFilename);
+  v4->CloseWriteFile();
+  v4->LoadFile(v4->pLODName, 0);
+  return 0;
+}
+*/
+
 unsigned int LODWriteableFile::Write(const LOD::Directory *pDir, const void *pDirData, int a4)
 {
   LODWriteableFile *v4; // ebx@1
@@ -1777,27 +1964,19 @@
     while ( v19 );
     v5 = v34;
   }
-  v21 = v4->pSubIndices;
   v34 = 32 * v5;
-  memcpy(&v21[v5], pDir, sizeof(v21[v5]));
-  v22 = 0;
+  memcpy(&v4->pSubIndices[v5], pDir, sizeof(v4->pSubIndices[v5]));
   v23 = 32 * v4->uNumSubIndices;
   if ( (signed int)v4->uNumSubIndices > 0 )
   {
-    v24 = v4->pSubIndices;
-    v25 = 0;
-    do
+    for (int i =  0; i < (signed int)v4->uNumSubIndices; ++i)
     {
-      v24[v25].uOfsetFromSubindicesStart = v23;
-      v24 = v4->pSubIndices;
-      v23 += v24[v25].uDataSize;
-      ++v22;
-      ++v25;
+      v4->pSubIndices[i].uOfsetFromSubindicesStart = v23;
+      v23 += v4->pSubIndices[i].uDataSize;
     }
-    while ( v22 < (signed int)v4->uNumSubIndices );
   }
-  fwrite(&v4->header, 0x100u, 1u, pFile);
-  fwrite(&Str, 0x20u, 1u, pFile);
+  fwrite(&v4->header, 0x100, 1, pFile);
+  fwrite(&Str, 0x20, 1, pFile);
   fseek(v4->pFile, Str.uOfsetFromSubindicesStart, 0);
   fwrite(v4->pSubIndices, 0x20u, v4->uNumSubIndices, pFile);
   v26 = 32 * v4->uNumSubIndices;