Mercurial > might-and-magic-trilogy
changeset 121:6c67511e2f71
11.11.12
author | Ritor1 |
---|---|
date | Wed, 14 Nov 2012 09:13:59 +0600 |
parents | 7b4725cdb74e |
children | 2546de5c70dd |
files | LOD.cpp mm7_3.cpp |
diffstat | 2 files changed, 261 insertions(+), 95 deletions(-) [+] |
line wrap: on
line diff
--- a/LOD.cpp Thu Nov 08 09:27:41 2012 +0600 +++ b/LOD.cpp Wed Nov 14 09:13:59 2012 +0600 @@ -1644,16 +1644,16 @@ } // 6A0CA8: using guessed type int 6A0CA8_lod_unused; - -unsigned int LODWriteableFile::Write(const LOD::Directory *pDir, const void *pDirData, int a4) +//----- (00461B48) -------------------------------------------------------- +/*unsigned int LODWriteableFile::Write(const LOD::Directory *pDir, const void *pDirData, int a4) { - //LODWriteableFile *v4; // ebx@1 + LODWriteableFile *v4; // ebx@1 int v5; // esi@1 - //unsigned __int8 v7; // zf@7 - //unsigned __int8 v8; // sf@7 + 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 __int8 v11; // of@15 unsigned __int16 v12; // dx@17 LOD::Directory *v13; // eax@17 unsigned __int16 v14; // cx@17 @@ -1675,7 +1675,7 @@ 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 + 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 @@ -1683,81 +1683,63 @@ size_t Countb; // [sp+244h] [bp+8h]@47 FILE *pFile; // [sp+24Ch] [bp+10h]@22 - //v4 = this; - //v5 = 0; - - if (!isFileOpened) + v4 = this; + v5 = 0; + if ( !this->isFileOpened ) return 1; - if (!pSubIndices) + if ( !this->pSubIndices ) return 2; - if (!pIOBuffer || !uIOBufferSize) + if ( !this->pIOBuffer || !this->uIOBufferSize ) return 3; - - //v7 = this->uNumSubIndices == 0; - //v8 = (this->uNumSubIndices & 0x80000000u) != 0; - v35 = 0; + v7 = this->uNumSubIndices == 0; + v8 = (this->uNumSubIndices & 0x80000000u) != 0; v36 = 0; - //v34 = 0; - for (v5 = 0; v5 < uNumSubIndices; ++v5) - /*if ( v8 | v7 ) + v34 = 0; + if ( v8 | v7 ) { v9 = pDir; goto LABEL_22; } - while ( 1 )*/ + v35 = 0; + while ( 1 ) { v9 = pDir; - v10 = _strcmpi(pSubIndices[v5].pFilename, pDir->pFilename); - if (v10 > 0) - break; - else if (v10 < 0) - continue; - /*if ( v10 ) + v10 = _strcmpi((const char *)v4->pSubIndices + v35, (const char *)pDir); + if ( v10 ) { if ( v10 > 0 ) goto LABEL_22; goto LABEL_15; - }*/ + } if ( !a4 ) - { - v36 = 1; - break; - } + goto LABEL_20; if ( a4 == 1 ) - { - v12 = pDir->uNumSubIndices; - v13 = &pSubIndices[v5]; - v14 = v13->uNumSubIndices; - if ( v14 >= v12 && (v14 != v12 || (unsigned __int16)v13->word_00001E >= pDir->word_00001E) ) - return 4; - v36 = 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; +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; + 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:*/ +LABEL_22: strcpy(pFilename, "lod.tmp"); pFile = fopen(pFilename, "wb+"); if ( !pFile ) return 5; if ( v36 ) - v35 = pSubIndices[v5].uDataSize; + v35 = v4->pSubIndices[v5].uDataSize; else v35 = 0; v33 = v9->uDataSize; @@ -1766,9 +1748,9 @@ LOD::Directory Str; // [sp+20Ch] [bp-30h]@27 //LOD::Directory::LOD::Directory(&Str); - strcpy(Str.pFilename, "chapter"); - v16 = uLODDataSize; - Str.uNumSubIndices = uNumSubIndices; + strcpy((char *)&Str, "chapter"); + v16 = v4->uLODDataSize; + Str.uNumSubIndices = LOWORD(v4->uNumSubIndices); Str.dword_000018 = 0; Str.word_00001E = 0; if ( !v36 ) @@ -1776,76 +1758,263 @@ ++Str.uNumSubIndices; v15 += 32; } - //v7 = v36 == 0; + v7 = v36 == 0; Str.uDataSize = v15 + v16; Str.uOfsetFromSubindicesStart = 288; v17 = (signed __int16)Str.uNumSubIndices; - uNumSubIndices = (signed __int16)Str.uNumSubIndices; - if ( !v36 && v17 > v5 ) + v4->uNumSubIndices = (signed __int16)Str.uNumSubIndices; + if ( v7 && v17 > v5 ) { v18 = v17; v19 = v17 - v5; do { - v20 = &pSubIndices[v18]; + v20 = &v4->pSubIndices[v18]; --v18; --v19; memcpy(v20, (char *)v20 - 32, 0x20u); } while ( v19 ); - //v5 = v34; + v5 = v34; } - //v34 = 32 * v5; - memcpy(&pSubIndices[v5], pDir, sizeof(LOD::Directory)); - v23 = 32 * uNumSubIndices; - if ( (signed int)uNumSubIndices > 0 ) + 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)uNumSubIndices; ++i) + for (int i = 0; i < (signed int)v4->uNumSubIndices; ++i) { - pSubIndices[i].uOfsetFromSubindicesStart = v23; - v23 += pSubIndices[i].uDataSize; + v4->pSubIndices[i].uOfsetFromSubindicesStart = v23; + v23 += v4->pSubIndices[i].uDataSize; } } - fwrite(&header, 0x100, 1, pFile); + fwrite(&v4->header, 0x100, 1, pFile); fwrite(&Str, 0x20, 1, pFile); - fseek(pFile, Str.uOfsetFromSubindicesStart, 0); - fwrite(pSubIndices, 0x20u, uNumSubIndices, pFile); - v26 = 32 * uNumSubIndices; + fseek(v4->pFile, Str.uOfsetFromSubindicesStart, 0); + fwrite(v4->pSubIndices, 0x20u, v4->uNumSubIndices, pFile); + v26 = 32 * v4->uNumSubIndices; if ( !v36 ) v26 -= 32; - fseek(pFile, v26, 1); - for ( i = pSubIndices[v5].uOfsetFromSubindicesStart - - pSubIndices->uOfsetFromSubindicesStart; i > 0; i -= Count ) + fseek(v4->pFile, v26, 1); + for ( i = *(unsigned int *)((char *)&v4->pSubIndices->uOfsetFromSubindicesStart + v34) + - v4->pSubIndices->uOfsetFromSubindicesStart; i > 0; i -= Count ) { - Count = uIOBufferSize; - if ( i <= (signed int)uIOBufferSize ) + Count = v4->uIOBufferSize; + if ( i <= (signed int)v4->uIOBufferSize ) Count = i; - fread(pIOBuffer, 1u, Count, pFile); - fwrite(pIOBuffer, 1u, Count, pFile); + fread(v4->pIOBuffer, 1u, Count, v4->pFile); + fwrite(v4->pIOBuffer, 1u, Count, pFile); } fwrite(pDirData, 1u, v33, pFile); if ( v36 ) - fseek(pFile, v35, 1); - Countc = ftell(pFile); - fseek(pFile, 0, 2); - v28 = ftell(pFile) - Countc; - fseek(pFile, Countc, 0); + 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 = uIOBufferSize; - if ( v28 <= (signed int)uIOBufferSize ) + Countb = v4->uIOBufferSize; + if ( v28 <= (signed int)v4->uIOBufferSize ) Countb = v28; - fread(pIOBuffer, 1u, Countb, pFile); - fwrite(pIOBuffer, 1u, Countb, pFile); + fread(v4->pIOBuffer, 1u, Countb, v4->pFile); + fwrite(v4->pIOBuffer, 1u, Countb, pFile); v28 -= Countb; } - strcpy(NewFilename, (const char *)pLODName); + strcpy(NewFilename, (const char *)v4->pLODName); fclose(pFile); - CloseWriteFile(); + v4->CloseWriteFile(); remove(NewFilename); rename(pFilename, NewFilename); - CloseWriteFile(); - LoadFile(pLODName, 0); + 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 + 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; }
--- a/mm7_3.cpp Thu Nov 08 09:27:41 2012 +0600 +++ b/mm7_3.cpp Wed Nov 14 09:13:59 2012 +0600 @@ -9176,14 +9176,13 @@ v4 = stru_76E5C8; // v4: 0 -> 65536 do { - band3a = 256; v8 = (double)(signed int)((char *)v4 + 256 - (int)stru_76E5C8); - do // band3a: 0 -> 128 + for (band3a = 256; band3a < 65792; band3a += 512) // band3a: 0 -> 128 { v5 = pow((double)band3a, 2.0); v6 = pow(v8, 2.0); *((float *)&v5 + 1) = sqrt(v6 + v5); - v7 = *((float *)&v5 + 1) + 6.7553994e15; + v7 = *((float *)&v5 + 1) + 6.755399441055744e15; if ( SLODWORD(v7) >= v10 ) { if ( SLODWORD(v7) >= v9 ) @@ -9195,11 +9194,9 @@ { v4->field_0 = 1; } - band3a += 512; v4->distance = LOWORD(v7); ++v4; } - while ( band3a < 65792 ); } while ( (signed int)v4 < (signed int)arary_77E5C8 ); }