Mercurial > mm7
changeset 838:d061180f2b42
Merge
author | Gloval |
---|---|
date | Thu, 28 Mar 2013 00:37:58 +0400 |
parents | bebc19f3d2af (diff) b66abf8b7d50 (current diff) |
children | ae8f83e1b0cf 6dd2b94efce7 710cf848ad24 |
files | GUIButton.h SpriteObject.cpp mm7_2.cpp mm7_3.cpp mm7_5.cpp mm7_data.h |
diffstat | 8 files changed, 368 insertions(+), 566 deletions(-) [+] |
line wrap: on
line diff
--- a/Indoor.h Wed Mar 27 23:20:27 2013 +0600 +++ b/Indoor.h Thu Mar 28 00:37:58 2013 +0400 @@ -470,7 +470,8 @@ struct SpawnPointMM7 *pSpawnPoints; struct DDM_DLV_Header dlv; LocationTime_stru1 stru1; - char _visible_outlines[876]; + char _visible_outlines[875]; + char padding; }; #pragma pack(pop)
--- a/LOD.cpp Wed Mar 27 23:20:27 2013 +0600 +++ b/LOD.cpp Thu Mar 28 00:37:58 2013 +0400 @@ -975,23 +975,16 @@ //----- (00461431) -------------------------------------------------------- void LOD::File::Close() { - LOD::File *v1; // esi@1 - LOD::Directory **v2; // edi@2 - FILE *v3; // ST00_4@2 - - v1 = this; - if ( this->isFileOpened ) + if (isFileOpened ) { this->pContainerName[0] = 0; this->uCurrentIndexDir = 0; - v2 = &this->pSubIndices; - pAllocator->FreeChunk(this->pSubIndices); - pAllocator->FreeChunk(v1->pRoot); - v3 = v1->pFile; - *v2 = 0; - v1->pRoot = 0; - fclose(v3); - v1->isFileOpened = 0; + pAllocator->FreeChunk(pSubIndices); + pAllocator->FreeChunk(pRoot); + pSubIndices = NULL; + pRoot = NULL; + fclose(pFile); + isFileOpened = 0; _6A0CA8_lod_unused = 0; } } @@ -999,7 +992,7 @@ //----- (00461492) -------------------------------------------------------- -int LODWriteableFile::_461492(LOD::FileHeader *pHeader, LOD::Directory *pDir, const char *Source) +int LODWriteableFile::CreateNewLod(LOD::FileHeader *pHeader, LOD::Directory *pDir, const char *lod_name) { if (isFileOpened) return 1; @@ -1011,14 +1004,13 @@ pDir->pFilename[15] = 0; pDir->uDataSize = 0; pDir->uOfsetFromSubindicesStart = 288; - strcpy(pLODName, Source); + strcpy(pLODName, lod_name); pFile = fopen(pLODName, "wb+"); if (!pFile) return 3; - - fwrite(pHeader, 0x100, 1, pFile); - fwrite(pDir, 0x20, 1, pFile); + fwrite(pHeader,sizeof(LOD::FileHeader), 1, pFile); + fwrite(pDir, sizeof(LOD::Directory), 1, pFile); fclose(pFile); pFile = 0; return 0; @@ -1027,29 +1019,18 @@ //----- (0046153F) -------------------------------------------------------- void LOD::File::ResetSubIndices() { - LOD::Directory **pSubIndices_dup2; // esi@2 - LOD::Directory *pSubIndices_dup; // ST00_4@2 - - if ( this->isFileOpened ) + if ( isFileOpened ) { - pSubIndices_dup2 = &this->pSubIndices; - this->pContainerName[0] = 0; - this->uCurrentIndexDir = 0; - pSubIndices_dup = this->pSubIndices; - this->uOffsetToSubIndex = 0; - this->uNumSubIndices = 0; - this->uLODDataSize = 0; - pAllocator->FreeChunk(pSubIndices_dup); - *pSubIndices_dup2 = 0; + pContainerName[0] = 0; + uCurrentIndexDir = 0; + uOffsetToSubIndex = 0; + uNumSubDirs = 0; + uLODDataSize = 0; + pAllocator->FreeChunk(pSubIndices); + pSubIndices = NULL; } } - - - - - - //----- (00450C8B) -------------------------------------------------------- void LODFile_Sprites::DeleteSomeSprites() { @@ -1331,11 +1312,11 @@ v1 = this; if ( !(HIBYTE(this->word_1A) & 4) ) { - pAllocator->FreeChunk(this->pDecompressedBytes); - pAllocator->FreeChunk(v1->pSpriteLines); + pAllocator->FreeChunk(pDecompressedBytes); + pAllocator->FreeChunk(pSpriteLines); } - v1->pDecompressedBytes = 0; - v1->pSpriteLines = 0; + pDecompressedBytes = NULL; + pSpriteLines = NULL; } //----- (004623E5) -------------------------------------------------------- @@ -1447,169 +1428,109 @@ return LoadFile(pLODName, 0); } - -//----- (00461FD4) -------------------------------------------------------- -int LODWriteableFile::Save() -{ - LODWriteableFile *v1; // esi@1 - int v2; // edi@1 - unsigned int v3; // edx@1 - LOD::Directory *v4; // eax@2 - unsigned int v5; // ecx@2 - int v6; // eax@2 - signed int v7; // ebx@5 - int v8; // ecx@5 - LOD::Directory **v9; // edi@6 - int v10; // edx@6 - LOD::Directory *v11; // eax@6 - FILE *v12; // eax@9 - FILE *v13; // ebx@9 - signed int result; // eax@10 - unsigned int v15; // eax@11 - FILE *v16; // ST00_4@11 - size_t v17; // edi@12 - char OldFilename[256]; // [sp+Ch] [bp-228h]@9 - char NewFilename[256]; // [sp+10Ch] [bp-128h]@15 - //LOD::Directory v0; // [sp+20Ch] [bp-28h]@11 - unsigned int v21; // [sp+22Ch] [bp-8h]@5 - int v22; // [sp+230h] [bp-4h]@1 - - v1 = this; - v2 = 0; - v3 = this->uNumSubIndices; - v22 = 0; - if ( (signed int)v3 > 0 ) - { - v4 = this->pSubIndices; - v5 = v3; - v6 = (int)&v4->uDataSize; - do - { - v2 += *(int *)v6; - v6 += 32; - --v5; - } - while ( v5 ); - v22 = v2; - } - v7 = 0; - v21 = 32 * v3 + v2; - v8 = 32 * v3; - if ( (signed int)v3 > 0 ) - { - v9 = &v1->pSubIndices; - v10 = 0; - v11 = v1->pSubIndices; - do +//----- (00461FD4) ---LODFile_sub_461FD4---text:004632EA -------------------------------------------------- +int LODWriteableFile::FixDirectoryOffsets() { - v11[v10].uOfsetFromSubindicesStart = v8; - v11 = *v9; - v8 += (*v9)[v10].uDataSize; - ++v7; - ++v10; - } - while ( v7 < (signed int)v1->uNumSubIndices ); - v2 = v22; - } - strcpy(OldFilename, "lod.tmp"); - v12 = fopen(OldFilename, "wb+"); - v13 = v12; - if ( v12 ) - { - fwrite(&v1->header, 0x100, 1, v12); + LOD::Directory Lindx; + int total_size; // edi@1 + int temp_offset; // ecx@5 + FILE *tmp_file; // eax@9 + size_t write_size; // edi@12 + int result; + char Filename[256]; // [sp+Ch] [bp-228h]@9 + char NewFilename[256]; // [sp+10Ch] [bp-128h]@15 + int i; - LOD::Directory v0; // [sp+20Ch] [bp-28h]@11 - //LOD::Directory::LOD::Directory(&v0); + total_size = 0; + for (i=0;i<uNumSubDirs;i++) + total_size+=pSubIndices[i].uDataSize; + //fix offsets + temp_offset = sizeof(LOD::Directory) * uNumSubDirs; + for (i=0;i<uNumSubDirs;i++) + { + pSubIndices[i].uOfsetFromSubindicesStart=temp_offset; + temp_offset+=pSubIndices[i].uDataSize; + } + strcpy(Filename, "lod.tmp"); + tmp_file = fopen(Filename, "wb+"); - strcpy((char *)&v0, "chapter"); - v15 = v1->uOffsetToSubIndex; - v0.dword_000018 = 0; - v0.uOfsetFromSubindicesStart = v15; - v0.word_00001E = 0; - v0.uDataSize = v21; - v0.uNumSubIndices = LOWORD(v1->uNumSubIndices); - fwrite(&v0, 0x20, 1, v13); - fwrite(v1->pSubIndices, 0x20, v1->uNumSubIndices, v13); - v16 = v1->pOutputFileHandle; - v22 = v2; - fseek(v16, 0, 0); - if ( v2 > 0 ) - { - do - { - v17 = v1->uIOBufferSize; - if ( v22 <= (signed int)v17 ) - v17 = v22; - fread(v1->pIOBuffer, 1, v17, v1->pOutputFileHandle); - fwrite(v1->pIOBuffer, 1, v17, v13); - v22 -= v17; - } - while ( v22 > 0 ); + if ( tmp_file ) + { + fwrite((const void *)&header, sizeof(LOD::FileHeader), 1, tmp_file); + Lindx.Reset(); + strcpy(Lindx.pFilename, "chapter"); + Lindx.uOfsetFromSubindicesStart=uOffsetToSubIndex; //10h 16 + Lindx.uDataSize=sizeof(LOD::Directory) * uNumSubDirs + total_size; //14h 20 + Lindx.dword_000018=0; //18h 24 + Lindx.uNumSubIndices=uNumSubDirs; //1ch 28 + Lindx.word_00001E=0; // 1Eh 30 + fwrite(&Lindx, sizeof(LOD::Directory), 1, tmp_file); + fwrite(pSubIndices, sizeof(LOD::Directory), uNumSubDirs, tmp_file); + fseek(pOutputFileHandle, 0, 0); + if ( total_size > 0 ) + { + do + { + write_size = uIOBufferSize; + if ( total_size <= (signed int)uIOBufferSize ) + write_size =total_size; + fread(pIOBuffer, 1, write_size, pOutputFileHandle); + fwrite(pIOBuffer, 1, write_size, tmp_file); + total_size -= write_size; + } + while ( total_size > 0 ); + } + strcpy(NewFilename, (const char *)&pLODName); + fclose(tmp_file); + fclose(pOutputFileHandle); + CloseWriteFile(); + remove("lodapp.tmp"); + remove(NewFilename); + rename(Filename, NewFilename); + CloseWriteFile(); + LoadFile( (const char *)&pLODName, 0); + result = 0; + } + else + { + result = 5; + } + return result; } - strcpy(NewFilename, (const char *)v1->pLODName); - fclose(v13); - fclose(v1->pOutputFileHandle); - v1->CloseWriteFile(); - remove("lodapp.tmp"); - remove(NewFilename); - rename(OldFilename, NewFilename); - v1->CloseWriteFile(); - v1->LoadFile(v1->pLODName, 0); - result = 0; - } - else - { - result = 5; - } - return result; -} - //----- (00461F71) -------------------------------------------------------- bool LOD::File::AppendDirectory(LOD::Directory *pDir, const void *pData) { - unsigned int v3; // edi@1 - bool result; // eax@2 - FILE *v5; // ST0C_4@3 - - v3 = this->uNumSubIndices; - if ( (signed int)v3 < 299 ) + if ( uNumSubDirs < 299 ) { - memcpy(&this->pSubIndices[v3], pDir, sizeof(this->pSubIndices[v3])); - v5 = this->pOutputFileHandle; - ++this->uNumSubIndices; - fwrite(pData, 1u, pDir->uDataSize, v5); - result = 1; + memcpy(&pSubIndices[uNumSubDirs], pDir, sizeof(LOD::Directory)); + ++uNumSubDirs; + fwrite(pData, 1u, pDir->uDataSize, pOutputFileHandle); + return true; } else { MessageBoxA(0, "Unable to append item!", "LOD::File", 0x30u); - result = 0; + return false; } - return result; } //----- (00461F1E) -------------------------------------------------------- int LODWriteableFile::CreateTempFile() { - LODWriteableFile *v1; // esi@1 int result; // eax@2 - FILE *pFile; // eax@5 - int v4; // eax@5 - - v1 = this; - if ( this->isFileOpened ) + FILE *pFile; // eax@5; + if ( isFileOpened ) { - if ( this->pIOBuffer && this->uIOBufferSize ) + if (pIOBuffer && uIOBufferSize ) { - this->uCurrentIndexDir = 0; - this->uNumSubIndices = 0; + uCurrentIndexDir = 0; + uNumSubDirs = 0; pFile = fopen("lodapp.tmp", "wb+"); - v1->pOutputFileHandle = pFile; - v4 = -(pFile != 0); - LOBYTE(v4) = v4 & 0xF9; - result = v4 + 7; + pOutputFileHandle = pFile; + result =pFile? 1:7; + } else { @@ -1645,264 +1566,202 @@ //----- (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 + { + LOD::Directory Lindx; + char Filename[256]; + char NewFilename[256]; + FILE *tmp_file; + int comp_res; + bool bRewrite_data; + int offset_to_data; + int total_data_size; + int size_correction; + int to_copy_size; + int read_size; + int curr_position; + int insert_index; + + //insert new data in sorted index lod file + bRewrite_data = false; + insert_index=0; + if (!isFileOpened) + return 1; + if ( !pSubIndices) + return 2; + if (!pIOBuffer||!uIOBufferSize) + return 3; + + for (int i=0;i<uNumSubDirs; i++) + { + comp_res=_stricmp(pSubIndices[i].pFilename,pDir->pFilename); + if(comp_res==0) + { + insert_index=i; + if (a4==0) + { + bRewrite_data=true; - 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 = false;//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(v4->pSubIndices[v5].pFilename + v35, pDir->pFilename); - if ( v10 ) - { - if ( v10 > 0 ) - goto LABEL_22; - goto LABEL_15; + break; + } + if (a4==1) + { + if(pSubIndices[i].uNumSubIndices<pDir->uNumSubIndices) + { + if (pSubIndices[i].word_00001E<pDir->word_00001E) + return 4; + } + else + bRewrite_data=true; + break; + } + if (a4==2) + return 4; + } + else if (comp_res>0) + { + if (insert_index==0) + insert_index=i; + } + } + strcpy(Filename, "lod.tmp"); + tmp_file = fopen(Filename, "wb+"); + if ( !tmp_file ) + return 5; + if (!bRewrite_data) + size_correction=0; + else + size_correction=pSubIndices[insert_index].uDataSize; + //create chapter index + Lindx.Reset(); + strcpy(Lindx.pFilename, "chapter"); + Lindx.dword_000018=0; + Lindx.word_00001E=0; + Lindx.uNumSubIndices= uNumSubDirs; + Lindx.uOfsetFromSubindicesStart=sizeof(LOD::FileHeader)+sizeof(LOD::Directory); + total_data_size=uLODDataSize+pDir->uDataSize-size_correction; + if (!bRewrite_data) + { + total_data_size+=sizeof(LOD::Directory); + Lindx.uNumSubIndices++; + } + + Lindx.uDataSize=total_data_size; + uNumSubDirs= Lindx.uNumSubIndices; + //move indexes +1 after insert point + if (!bRewrite_data&&(insert_index<uNumSubDirs)) + { + for(int i=uNumSubDirs;i>insert_index; --i) + memcpy(&pSubIndices[i],&pSubIndices[i-1],sizeof(LOD::Directory)); + + } + //insert + memcpy(&pSubIndices[insert_index],pDir,sizeof(LOD::Directory)); + //correct offsets to data + if (uNumSubDirs>0) + { + offset_to_data=sizeof(LOD::Directory)*uNumSubDirs; + for (int i=0;i<uNumSubDirs; i++) + { + pSubIndices[i].uOfsetFromSubindicesStart=offset_to_data; + offset_to_data+=pSubIndices[i].uDataSize; + } + } + + //construct lod file with added data + fwrite( &header, sizeof(LOD::FileHeader), 1, tmp_file); + fwrite(&Lindx, sizeof(LOD::Directory), 1, tmp_file); + fseek(pFile,Lindx.uOfsetFromSubindicesStart, SEEK_SET); + fwrite(pSubIndices, sizeof(LOD::Directory), uNumSubDirs, tmp_file); + + offset_to_data = sizeof(LOD::Directory) * uNumSubDirs; + if ( !bRewrite_data ) + offset_to_data -= sizeof(LOD::Directory); + + fseek(pFile, offset_to_data, SEEK_CUR); + //copy from open lod to temp lod first half + to_copy_size=pSubIndices[insert_index].uOfsetFromSubindicesStart-pSubIndices[0].uOfsetFromSubindicesStart; + while(to_copy_size>0) + { + read_size = uIOBufferSize; + if ( to_copy_size <= uIOBufferSize ) + read_size = to_copy_size; + fread(pIOBuffer, 1, read_size, pFile); + fwrite(pIOBuffer, 1, read_size, tmp_file); + to_copy_size-=read_size; + } + // add container data + fwrite(pDirData, 1, pDir->uDataSize, tmp_file); + if ( bRewrite_data ) + fseek(pFile,size_correction , SEEK_CUR); + + //add remainng data last half + curr_position = ftell(pFile); + fseek(pFile, 0, SEEK_END); + to_copy_size = ftell(pFile) - curr_position; + fseek(pFile, curr_position, SEEK_SET); + while ( to_copy_size > 0 ) + { + read_size = uIOBufferSize; + if ( to_copy_size <= uIOBufferSize ) + read_size = to_copy_size; + fread(pIOBuffer, 1, read_size, pFile); + fwrite(pIOBuffer, 1, read_size, tmp_file); + to_copy_size-=read_size; + } + //replace old file by new with added data + strcpy(NewFilename, pLODName); + fclose(tmp_file); + CloseWriteFile(); + remove(NewFilename); + rename(Filename, NewFilename); + CloseWriteFile(); + //reload new + LoadFile(pLODName, 0); + return 0; } - if ( !a4 ) - goto LABEL_20; - if ( a4 == 1 ) - break; - if ( a4 == 2 ) - return 4; -LABEL_15: - v35 += 32; - ++v5; - v11 = v5 >= v4->uNumSubIndices; - v8 = (v5 - v4->uNumSubIndices) != 0;//v8 = ((v5 - v4->uNumSubIndices) & 0x80000000u) != 0; - v34 = v5; - //if ( !(v8 ^ v11) ) - if (v5 >= v4->uNumSubIndices) - 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; - } - v21 = v4->pSubIndices; - v34 = 32 * v5; - memcpy(&v21[v5], pDir, sizeof(v21[v5])); - v22 = 0; - v23 = 32 * v4->uNumSubIndices; - if ( (signed int)v4->uNumSubIndices > 0 ) - { - v24 = v4->pSubIndices; - v25 = 0; - do - { - v24[v25].uOfsetFromSubindicesStart = v23; - v24 = v4->pSubIndices; - v23 += v24[v25].uDataSize; - ++v22; - ++v25; - } - while ( v22 < (signed int)v4->uNumSubIndices ); - } - fwrite(&v4->header, 0x100u, 1u, 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; -} //----- (00461A43) -------------------------------------------------------- bool LODWriteableFile::LoadFile(const char *pFilename, bool bWriting) -{ - LODWriteableFile *v3; // esi@1 - FILE *pFile_dup; // eax@4 - unsigned int v5; // ecx@5 - __int32 v6; // eax@5 - FILE *v7; // ST00_4@5 - size_t v8; // edi@5 - const char *v10; // [sp-4h] [bp-30h]@2 + { + LOD::Directory lod_indx ; + + if (bWriting & 1) + pFile = fopen(pFilename, "rb"); + else + pFile = fopen(pFilename, "rb+"); + if (!pFile) + return false; - v3 = this; - if ( bWriting & 1 ) - v10 = "rb"; - else - v10 = "rb+"; - pFile_dup = fopen(pFilename, v10); - v3->pFile = pFile_dup; - if ( !pFile_dup ) - { - isFileOpened = false; - return 0; - } - strcpy(pLODName, pFilename); - fread(&header, 0x100u, 1u, v3->pFile); - - LOD::Directory dir; // [sp+Ch] [bp-20h]@5 - //LOD::Directory::LOD::Directory(&dir); + strcpy(pLODName, pFilename); + fread(&header, sizeof(LOD::FileHeader), 1, pFile); + lod_indx.Reset(); + fread( &lod_indx,sizeof(LOD::Directory), 1, pFile); + fseek(pFile, 0, SEEK_SET); + isFileOpened = true; + strcpy(pContainerName, "chapter"); + uCurrentIndexDir = 0; + uLODDataSize = lod_indx.uDataSize; + uNumSubDirs = lod_indx.uNumSubIndices; + uOffsetToSubIndex = lod_indx.uOfsetFromSubindicesStart; + fseek(pFile, uOffsetToSubIndex, SEEK_SET); - fread(&dir, 0x20u, 1u, v3->pFile); - fseek(v3->pFile, 0, 0); - isFileOpened = 1; - strcpy((char *)v3->pContainerName, "chapter"); - v5 = (signed __int16)dir.uNumSubIndices; - v6 = dir.uOfsetFromSubindicesStart; - v3->uCurrentIndexDir = 0; - v3->uOffsetToSubIndex = v6; - v7 = v3->pFile; - v3->uNumSubIndices = v5; - v3->uLODDataSize = dir.uDataSize; - fseek(v7, v6, SEEK_SET); - v8 = v3->uNumSubIndices; - if ( (signed int)v8 > 300 ) - { - MessageBoxA(0, "LODchapterPages exceed 300", "LOD::File", MB_ICONEXCLAMATION); - fclose(v3->pFile); - return 0; - } - fread(pSubIndices, 0x20u, v8, v3->pFile); - return 1; -} + if (uNumSubDirs > 300) + { + MessageBoxW(0, L"LODchapterPages exceed 300", L"LODFile", MB_ICONEXCLAMATION); + fclose(pFile); + return false; + } + + fread(pSubIndices, sizeof(LOD::Directory), uNumSubDirs, pFile); + return true; + } //----- (00461A11) -------------------------------------------------------- void LOD::File::FreeSubIndexAndIO() { - void *v1; // edi@1 - LOD::Directory **v2; // esi@1 - - v1 = this; - v2 = &this->pSubIndices; - pAllocator->FreeChunk(this->pSubIndices); - v1 = (char *)v1 + 264; + pAllocator->FreeChunk(pSubIndices); pAllocator->FreeChunk(pIOBuffer);// delete [] pIOBuffer; pIOBuffer = nullptr; pSubIndices = nullptr; @@ -1912,28 +1771,18 @@ //----- (00461954) -------------------------------------------------------- void LOD::File::AllocSubIndicesAndIO(unsigned int uNumSubIndices, unsigned int uBufferSize) { - //LOD::File *v3; // esi@1 - LOD::Directory *pSubIndices_dup; // eax@3 - char v5; // zf@3 - - //v3 = this; if (pSubIndices) { MessageBoxA(0, "Attempt to reset a LOD subindex!", "MM6", MB_ICONEXCLAMATION); pAllocator->FreeChunk(pSubIndices); pSubIndices = nullptr; } - pSubIndices_dup = (LOD::Directory *)pAllocator->AllocNamedChunk( - pSubIndices, - 32 * uNumSubIndices, - "LODsub"); - v5 = pIOBuffer == 0; - pSubIndices = pSubIndices_dup; - if ( !v5 ) + pSubIndices =(LOD::Directory *)pAllocator->AllocNamedChunk( pSubIndices, 32 * uNumSubIndices,"LODsub"); + if (pIOBuffer) { MessageBoxA(0, "Attempt to reset a LOD IObuffer!", "MM6", MB_ICONEXCLAMATION); pAllocator->FreeChunk(pIOBuffer); - pIOBuffer = 0; + pIOBuffer = NULL; uIOBufferSize = 0; } if ( uBufferSize ) @@ -1952,69 +1801,57 @@ unsigned int uDir; // edi@1 LOD::Directory *curr_index; // eax@7 - ResetSubIndices(); uDir = 0; - if ( header.uNumIndices <= 0) - return 3; - else - { - while (stricmp(pContainer, pRoot[uDir].pFilename)) - { - ++uDir; - if (uDir >= header.uNumIndices ) - return 3; - } - strcpy( pContainerName, pContainer); + for (uDir=0; uDir <header.uNumIndices;++uDir) + { + if (!_stricmp(pContainer, pRoot[uDir].pFilename)) + { + strcpy( pContainerName, pContainer); uCurrentIndexDir = uDir; curr_index=(LOD::Directory *)&pRoot[uDir]; uOffsetToSubIndex =curr_index->uOfsetFromSubindicesStart ; - uNumSubIndices =curr_index->uNumSubIndices;// *(_WORD *)(v8 + 28); - fseek( pFile, uOffsetToSubIndex, 0); - pSubIndices = (LOD::Directory *)pAllocator->AllocNamedChunk(pSubIndices, sizeof(LOD::Directory)*(uNumSubIndices + 5), "LOD Index"); + uNumSubDirs =curr_index->uNumSubIndices;// *(_WORD *)(v8 + 28); + fseek( pFile, uOffsetToSubIndex, SEEK_SET); + pSubIndices = (LOD::Directory *)pAllocator->AllocNamedChunk(pSubIndices, sizeof(LOD::Directory)*(uNumSubDirs + 5), "LOD Index"); if ( pSubIndices) - fread( pSubIndices, sizeof(LOD::Directory), uNumSubIndices, pFile); + fread( pSubIndices, sizeof(LOD::Directory), uNumSubDirs, pFile); return 0; - } + } + } + return 3; } //----- (004617D5) -------------------------------------------------------- bool LOD::File::LoadHeader(const char *pFilename, bool bWriting) { - LOD::File *this_dup; // esi@1 - FILE *pFile_dup; // eax@6 - void *pRoot_dup; // eax@7 const char *v6; // [sp-4h] [bp-Ch]@4 - FILE *v7; // [sp-4h] [bp-Ch]@7 - this_dup = this; if ( this->isFileOpened ) Close(); if ( bWriting & 1 ) v6 = "rb"; else v6 = "rb+"; - pFile_dup = fopen(pFilename, v6); - this_dup->pFile = pFile_dup; - if ( pFile_dup ) + + pFile = fopen(pFilename, v6); + if ( pFile ) { - strcpy(this_dup->pLODName, pFilename); - fread(&this_dup->header, 0x100u, 1u, this_dup->pFile); - pRoot_dup = pAllocator->AllocNamedChunk(this_dup->pRoot, 0xA0u, "LOD CArray"); - this_dup->pRoot = (LOD::Directory *)pRoot_dup; - v7 = this_dup->pFile; - if ( pRoot_dup ) + strcpy(pLODName, pFilename); + fread(&header, sizeof(LOD::FileHeader), 1u, pFile); + pRoot = (LOD::Directory *)pAllocator->AllocNamedChunk(pRoot, 160, "LOD CArray"); + if ( pRoot ) { - fread(pRoot_dup, 0x20u, this_dup->header.uNumIndices, v7); - fseek(this_dup->pFile, 0, 0); - this_dup->isFileOpened = 1; + fread(pRoot, sizeof(LOD::Directory), header.uNumIndices, pFile); + fseek(pFile, 0, SEEK_SET); + isFileOpened = 1; return false; } else { - fclose(v7); + fclose(pFile); return true; } } @@ -2177,7 +2014,7 @@ this_dup = this; i = 0; i_dup = 0; - if ( (signed int)this->uNumSubIndices <= 0 ) + if ( (signed int)this->uNumSubDirs <= 0 ) { LABEL_4: result = 0; @@ -2188,7 +2025,7 @@ { ++i_dup; ++i; - if ( i_dup >= (signed int)this_dup->uNumSubIndices ) + if ( i_dup >= (signed int)this_dup->uNumSubDirs ) goto LABEL_4; } result = 1; @@ -2218,7 +2055,7 @@ } //----- (00461580) -------------------------------------------------------- -FILE *LOD::File::FindContainer(const char *pContainerName, bool bLinearSearch) +FILE *LOD::File::FindContainer(const char *pContainer_Name, bool bLinearSearch) { unsigned int v4; // eax@4 if (!isFileOpened) @@ -2227,8 +2064,8 @@ if (bLinearSearch) { - for (uint i = 0; i < uNumSubIndices; ++i) - if (!strcmpi(pContainerName, pSubIndices[i].pFilename)) + for (uint i = 0; i < uNumSubDirs; ++i) + if (!strcmpi(pContainer_Name, pSubIndices[i].pFilename)) { v4 = pSubIndices[i].uOfsetFromSubindicesStart; fseek(pFile, uOffsetToSubIndex + v4, SEEK_SET); @@ -2239,7 +2076,7 @@ } else { - CalcIndexFast(0, uNumSubIndices, pContainerName); + CalcIndexFast(0, uNumSubDirs, pContainer_Name); if ( _6A0CA4_lod_binary_search < 0 ) return 0; v4 = pSubIndices[_6A0CA4_lod_binary_search].uOfsetFromSubindicesStart;
--- a/LOD.h Wed Mar 27 23:20:27 2013 +0600 +++ b/LOD.h Thu Mar 28 00:37:58 2013 +0400 @@ -88,7 +88,7 @@ char pContainerName[16]; unsigned int uCurrentIndexDir; unsigned int uLODDataSize; - unsigned int uNumSubIndices; + unsigned int uNumSubDirs; struct Directory *pSubIndices; unsigned int uOffsetToSubIndex; FILE *pOutputFileHandle; @@ -109,9 +109,9 @@ unsigned int Write(const LOD::Directory *pDir, const void *pDirData, int a4); void CloseWriteFile(); int CreateTempFile(); - int Save(); + int FixDirectoryOffsets(); bool _4621A7(); - int _461492(LOD::FileHeader *pHeader, LOD::Directory *pDir, const char *Source); + int CreateNewLod(LOD::FileHeader *pHeader, LOD::Directory *pDir, const char *Source); /*FILE *pFile; char pLODName[256];
--- a/SaveLoad.cpp Wed Mar 27 23:20:27 2013 +0600 +++ b/SaveLoad.cpp Thu Mar 28 00:37:58 2013 +0400 @@ -270,7 +270,7 @@ CHAR Buffer; // [sp+Ch] [bp-264h]@59 char Dir[255]; // [sp+8Ch] [bp-1E4h]@51 char Drive[255]; // [sp+ACh] [bp-1C4h]@51 - SavegameHeader header; // [sp+CCh] [bp-1A4h]@10 + SavegameHeader save_header; // [sp+CCh] [bp-1A4h]@10 //int v43; // [sp+CCh] [bp-1A4h]@10 //char Dest[20]; // [sp+E0h] [bp-190h]@10 //unsigned __int64 pTimePlayed; // [sp+F4h] [bp-17Ch]@10 @@ -283,7 +283,7 @@ int pPositionX; // [sp+20Ch] [bp-64h]@2 int v53; // [sp+210h] [bp-60h]@2 int v54; // [sp+214h] [bp-5Ch]@2 - ODMHeader Src; // [sp+218h] [bp-58h]@30 + ODMHeader odm_data; // [sp+218h] [bp-58h]@30 char v56; // [sp+21Ch] [bp-54h]@30 char v57; // [sp+21Dh] [bp-53h]@30 char v58; // [sp+21Eh] [bp-52h]@30 @@ -347,14 +347,14 @@ } assert(sizeof(SavegameHeader) == 100); - memset(header.pName, 0, 20); - memset(header.pLocationName, 0, 20); - memset(header.field_30, 0, 52); - strcpy(header.pLocationName, pCurrentMapName); - header.uWordTime = pParty->uTimePlayed; + memset(save_header.pName, 0, 20); + memset(save_header.pLocationName, 0, 20); + memset(save_header.field_30, 0, 52); + strcpy(save_header.pLocationName, pCurrentMapName); + save_header.uWordTime = pParty->uTimePlayed; strcpy(pLodDirectory.pFilename, "header.bin"); pLodDirectory.uDataSize = sizeof(SavegameHeader); - if (pNew_LOD->Write(&pLodDirectory, &header, 0)) + if (pNew_LOD->Write(&pLodDirectory, &save_header, 0)) { sprintf(Str, pGlobalTXT_LocalizationStrings[612], 201); MessageBoxA(nullptr, Str, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:784", 0); @@ -426,23 +426,22 @@ //__debugbreak(); CompactLayingItemsList(); compressed_buf = (char*)malloc(1000000); - // v71 = (std::string *)compressed_buf; - Src.uVersion = 91969; - Src.pMagic[0] = 'm'; - Src.pMagic[1] = 'v'; - Src.pMagic[2] = 'i'; - Src.pMagic[3] = 'i'; - Src.uCompressedSize = 0; - Src.uDecompressedSize = 0; + odm_data.uVersion = 91969; + odm_data.pMagic[0] = 'm'; + odm_data.pMagic[1] = 'v'; + odm_data.pMagic[2] = 'i'; + odm_data.pMagic[3] = 'i'; + odm_data.uCompressedSize = 0; + odm_data.uDecompressedSize = 0; data_write_pos = uncompressed_buff; - memcpy((void *)compressed_buf, &Src, 0x10); + memcpy((void *)compressed_buf, &odm_data, 0x10); if ( uCurrentlyLoadedLevelType == LEVEL_Indoor ) { pIndoor->dlv.uNumFacesInBModels = pIndoor->uNumFaces; pIndoor->dlv.uNumBModels = 0; pIndoor->dlv.uNumDecorations = uNumLevelDecorations; - memcpy(data_write_pos, &pIndoor->dlv, 0x28); - data_write_pos += 40; + memcpy(data_write_pos, &pIndoor->dlv,sizeof(DDM_DLV_Header) );//0x28 + data_write_pos += sizeof(DDM_DLV_Header); memcpy(data_write_pos, pIndoor->_visible_outlines, 0x36B); data_write_pos += 875; @@ -482,13 +481,11 @@ } else { - v18 = 0; pOutdoor->ddm.uNumFacesInBModels = 0; for (int i=0; i<pOutdoor->uNumBModels;++i) { - v18 +=pOutdoor->pBModels[i].uNumFaces; + pOutdoor->ddm.uNumFacesInBModels +=pOutdoor->pBModels[i].uNumFaces; } - pOutdoor->ddm.uNumFacesInBModels = v18; pOutdoor->ddm.uNumBModels = pOutdoor->uNumBModels; pOutdoor->ddm.uNumDecorations = uNumLevelDecorations; memcpy(data_write_pos, &pOutdoor->ddm, sizeof(DDM_DLV_Header));//0x28 @@ -497,39 +494,18 @@ data_write_pos += 968; memcpy(data_write_pos, pOutdoor->uDicovered_area, 0x3C8); data_write_pos += 968; - if ( (signed int)pOutdoor->uNumBModels > 0 ) - { - v23 = pOutdoor->pBModels; - v24 = 76; - for (int i = 0; i < (signed int)pOutdoor->uNumBModels ; ++i) - { - //v25 = v23[i].uNumFaces == 0;//*(int *)&v23->pModelName[v24] == 0; - // v26 = v23[i].uNumFaces < 0;//*(int *)&v23->pModelName[v24] < 0; - if ( pOutdoor->pBModels[i].uNumFaces>0) - { - v68 = 0; + for (int i = 0; i < pOutdoor->uNumBModels ; ++i) for (int j = 0; j < pOutdoor->pBModels[i].uNumFaces;++j)//*(int *)&pOutdoor->pBModels->pModelName[v24]; ++j) - { - v38 = &(v23[i].pFaces[j].uAttributes); //(char *)v68 + *(int *)&v23->pModelName[v24 + 8] + 28; - memcpy(data_write_pos, v38, 4); - v23 = pOutdoor->pBModels; - v68 += 154; + { + memcpy(data_write_pos, &(pOutdoor->pBModels[i].pFaces[j].uAttributes), 4); data_write_pos += 4; } - } - v24 += 188; - } - } - if ( (signed int)uNumLevelDecorations > 0 ) - { - v66 = &pLevelDecorations[0].field_2; + for (int i = 0; i <= (signed int)uNumLevelDecorations; ++i) { - memcpy(data_write_pos, v66, 2); - v66 += 16; + memcpy(data_write_pos, &pLevelDecorations[i].field_2, 2); data_write_pos += 2; } - } memcpy(data_write_pos, &uNumActors, 4); data_write_pos += 4; memcpy(data_write_pos, pActors, 836 * uNumActors); @@ -546,8 +522,6 @@ data_write_pos += 200; memcpy(data_write_pos, &pOutdoor->loc_time, 0x38); data_write_pos += 56; - - //compressed_buf = (int)v71; } strcpy(Source, pCurrentMapName); _splitpath(Source, Drive, Dir, Filename, Ext);
--- a/SpriteObject.cpp Wed Mar 27 23:20:27 2013 +0600 +++ b/SpriteObject.cpp Thu Mar 28 00:37:58 2013 +0400 @@ -1089,23 +1089,13 @@ //----- (0042F933) -------------------------------------------------------- void SpriteObject::OnInteraction(unsigned int uLayingItemID) { - unsigned int v1; // ecx@1 - unsigned __int16 *pAttributes; // ecx@2 - unsigned __int16 v3; // ax@2 - - //__debugbreak(); // find out what's going on - - v1 = uLayingItemID; - pSpriteObjects[v1].uObjectDescID = 0; + pSpriteObjects[uLayingItemID].uObjectDescID = 0; if ( pParty->bTurnBasedModeOn == 1 ) { - pAttributes = &pSpriteObjects[v1].uAttributes; - v3 = *pAttributes; - if ( *pAttributes & 4 ) + if (pSpriteObjects[uLayingItemID].uAttributes & 4 ) { - v3 = v3 & 0xFB; + pSpriteObjects[uLayingItemID].uAttributes &= 0xFB; --pTurnEngine->field_1C; - *pAttributes = v3; } } }
--- a/mm7_2.cpp Wed Mar 27 23:20:27 2013 +0600 +++ b/mm7_2.cpp Thu Mar 28 00:37:58 2013 +0400 @@ -6488,25 +6488,25 @@ if (pGames_LOD->LoadFile("data\\games.lod", 1)) { pNew_LOD = new LODWriteableFile; - pNew_LOD->AllocSubIndicesAndIO(300, 0x186A0u); + pNew_LOD->AllocSubIndicesAndIO(300, 100000); return true; } return false; } //----- (0046086A) -------------------------------------------------------- -void Autosave() +void SaveNewGame() { FILE *v3; // eax@7 LOD::FileHeader this_; // [sp+Ch] [bp-16Ch]@3 LOD::Directory pDir; // [sp+10Ch] [bp-6Ch]@4 - LOD::Directory v7; // [sp+12Ch] [bp-4Ch]@9 + LOD::Directory save_game_dir; // [sp+12Ch] [bp-4Ch]@9 LOD::Directory a3; // [sp+14Ch] [bp-2Ch]@3 void *pSave; // [sp+170h] [bp-8h]@3 if ( pVideoPlayer->AnyMovieLoaded() ) pVideoPlayer->Unload(); - pSave = pAllocator->AllocNamedChunk(0, 0xF4240, 0); + pSave = pAllocator->AllocNamedChunk(0, 1000000, 0); pNew_LOD->CloseWriteFile(); remove("data\\new.lod"); this_.Reset(); @@ -6517,26 +6517,26 @@ a3.dword_000018 = 0; a3.word_00001E = 0; strcpy(a3.pFilename, "current"); - pNew_LOD->_461492(&this_, &a3, "data\\new.lod"); + pNew_LOD->CreateNewLod(&this_, &a3, "data\\new.lod"); if ( pNew_LOD->LoadFile("data\\new.lod", 0) ) { pNew_LOD->CreateTempFile(); - pNew_LOD->uNumSubIndices = 0; + pNew_LOD->uNumSubDirs = 0; pDir.Reset(); - for (int i = pGames_LOD->uNumSubIndices / 2; i < pGames_LOD->uNumSubIndices; ++i) + for (int i = pGames_LOD->uNumSubDirs / 2; i < pGames_LOD->uNumSubDirs; ++i) { memcpy(&pDir, &pGames_LOD->pSubIndices[i], sizeof(pDir)); v3 = pGames_LOD->FindContainer(pGames_LOD->pSubIndices[i].pFilename, 1); fread(pSave, pGames_LOD->pSubIndices[i].uDataSize, 1, v3); pNew_LOD->AppendDirectory(&pDir, pSave); } - v7.Reset(); - strcpy(pSavegameHeader->pLocationName, "out01.odm"); - strcpy(v7.pFilename, "header.bin"); - v7.uDataSize = 100; - pNew_LOD->AppendDirectory(&v7, &pSavegameHeader); - pNew_LOD->Save(); + save_game_dir.Reset(); + strcpy(pSavegameHeader[0].pLocationName, "out01.odm"); + strcpy(save_game_dir.pFilename, "header.bin"); + save_game_dir.uDataSize = 100; + pNew_LOD->AppendDirectory(&save_game_dir, &pSavegameHeader[0]); + pNew_LOD->FixDirectoryOffsets(); pParty->vPrevPosition.y = 0; pParty->vPrevPosition.x = 12552; pParty->vPosition.x = 12552; @@ -9049,7 +9049,7 @@ DeleteCCharFont(); bFlashQuestBook = true; pGame->pCShow->PlayMovie(MOVIE_Emerald, 0); - Autosave(); + SaveNewGame(); pGame->Loop(); if ( uGameState == GAME_STATE_NEWGAME_OUT_GAMEMENU ) {
--- a/mm7_5.cpp Wed Mar 27 23:20:27 2013 +0600 +++ b/mm7_5.cpp Thu Mar 28 00:37:58 2013 +0400 @@ -516,7 +516,7 @@ if ( pGUIWindow_CurrentMenu->field_40 == v0 ) { pKeyActionMap->_459ED1(0); - strcpy((char *)&pSavegameHeader + 100 * uLoadGameUI_SelectedSlot, (const char *)pKeyActionMap->pPressedKeysBuffer); + strcpy((char *)&pSavegameHeader[uLoadGameUI_SelectedSlot], (const char *)pKeyActionMap->pPressedKeysBuffer); } DoSavegame(uLoadGameUI_SelectedSlot); stru_506E40.Release(); @@ -2050,14 +2050,14 @@ pNPCData2->rep = pParty->vPosition.z; LOWORD(pNPCData2->Location2D) = LOWORD(pParty->sRotationY); HIWORD(pNPCData2->Location2D) = LOWORD(pParty->sRotationX); - if ( (signed int)pGames_LOD->uNumSubIndices / 2 <= 0 ) + if ( (signed int)pGames_LOD->uNumSubDirs / 2 <= 0 ) continue; uAction = 0; while ( _strcmpi((const char *)pGames_LOD->pSubIndices + uAction, pCurrentMapName) ) { ++thisg; uAction += 32; - if ( thisg >= (signed int)pGames_LOD->uNumSubIndices / 2 ) + if ( thisg >= (signed int)pGames_LOD->uNumSubDirs / 2 ) continue; } HIWORD(pNPCData4->uProfession) = thisg; @@ -2265,7 +2265,7 @@ memcpy(&v216, txt_file_frametable_parser((const char *)pKeyActionMap->pPressedKeysBuffer, &v218), sizeof(v216)); if ( v216.uPropCount == 1 ) { - pNPCData4 = (NPCData *)((signed int)pGames_LOD->uNumSubIndices / 2); + pNPCData4 = (NPCData *)((signed int)pGames_LOD->uNumSubDirs / 2); v70 = atoi(v216.pProperties[0]); if ( v70 <= 0 || v70 >= 77 ) {
--- a/mm7_data.h Wed Mar 27 23:20:27 2013 +0600 +++ b/mm7_data.h Thu Mar 28 00:37:58 2013 +0400 @@ -1885,7 +1885,7 @@ void __cdecl TryLoadLevelFromLOD(); void __cdecl sub_46080D(); bool __cdecl Initialize_GamesLOD_NewLOD(); -void Autosave(); +void SaveNewGame(); void __thiscall PrepareToLoadBLV(unsigned int bLoading); void __fastcall PrepareToLoadODM(unsigned int bLoading, struct OutdoorCamera *a2); void __cdecl sub_461103();