Mercurial > might-and-magic-trilogy
changeset 28:18f7a1b94448
Indoor::Load
author | Nomad |
---|---|
date | Tue, 16 Oct 2012 19:31:34 +0200 |
parents | be2066176d89 |
children | e62134245ab0 431e26f265a0 |
files | GUIProgressBar.cpp Indoor.cpp Indoor.h Outdoor.cpp SaveLoad.cpp mm7_2.cpp mm7_3.cpp |
diffstat | 7 files changed, 835 insertions(+), 904 deletions(-) [+] |
line wrap: on
line diff
--- a/GUIProgressBar.cpp Tue Oct 16 01:31:05 2012 +0200 +++ b/GUIProgressBar.cpp Tue Oct 16 19:31:34 2012 +0200 @@ -102,9 +102,9 @@ //----- (004435BB) -------------------------------------------------------- void GUIProgressBar::Reset(unsigned __int8 uMaxProgress) { - this->field_9 = 0; - this->uProgressCurrent = 0; - this->uProgressMax = uMaxProgress; + field_9 = 0; + uProgressCurrent = 0; + uProgressMax = uMaxProgress; } //----- (004435CD) --------------------------------------------------------
--- a/Indoor.cpp Tue Oct 16 01:31:05 2012 +0200 +++ b/Indoor.cpp Tue Oct 16 19:31:34 2012 +0200 @@ -1,3 +1,5 @@ +#include <assert.h> + #include "Outdoor.h" #include "Render.h" #include "LayingItem.h" @@ -16,6 +18,7 @@ #include "GUIProgressBar.h" #include "stru123.h" #include "AudioPlayer.h" +#include "Log.h" #include "mm7_data.h" @@ -27,8 +30,8 @@ -IndoorLocation *pIndoor; -BLVRenderParams *pBLVRenderParams; +IndoorLocation *pIndoor = new IndoorLocation; +BLVRenderParams *pBLVRenderParams = new BLVRenderParams; struct DecorationList *pDecorationList; @@ -1816,7 +1819,7 @@ v1->pNodes = (BSPNode *)v14; v16 = pAllocator->AllocNamedChunk(v15, 0x14824u, "L.Map"); v17 = v1->pVertices; - v1->pMapVertices = (unsigned int *)v16; + v1->pMapVertices = (BLVMapVertices *)v16; if ( v17 && v1->pFaces && v1->pFaceExtras && v1->pSectors && v1->pLights && v1->pDoors && v1->pNodes && v16 ) { memset(v17, 90000, 0); @@ -1875,16 +1878,16 @@ //----- (00498E0A) -------------------------------------------------------- -bool IndoorLocation::Load(char *pFilename, int a3, size_t i, char *pDest) +bool IndoorLocation::Load(char *pFilename, int a3, size_t _i, char *pDest) { - unsigned int v5; // ebx@1 - IndoorLocation *v6; // esi@1 + /*unsigned int v5; // ebx@1 + //IndoorLocation *v6; // esi@1 FILE *v7; // edi@3 bool result; // eax@3 char *v9; // ecx@4 void *v10; // eax@4 - unsigned __int8 v11; // zf@4 - unsigned __int8 v12; // sf@4 + //unsigned __int8 v11; // zf@4 + //unsigned __int8 v12; // sf@4 int v13; // eax@5 size_t v14; // ecx@6 char *v15; // ecx@6 @@ -1953,131 +1956,67 @@ unsigned __int16 v78; // ax@50 void *v79; // eax@52 void **v80; // esi@52 - size_t v81; // eax@56 - FILE *v82; // eax@56 - unsigned int v83; // edi@67 - void *v84; // eax@67 - void *v85; // ebx@67 - const void *v86; // ebx@72 - const void *v87; // ebx@72 - const void *v88; // ebx@72 - void *v89; // eax@72 - size_t v90; // ecx@72 - const void *v91; // ebx@72 - int v92; // eax@72 - BLVFace *v93; // ecx@73 - BLVSector *v94; // ecx@73 - unsigned __int16 *v95; // edx@73 - int v96; // ecx@73 - BLVSector *v97; // ecx@73 - unsigned __int16 *v98; // edx@73 - unsigned __int16 *v99; // edx@73 - unsigned __int16 *v100; // edx@73 - unsigned __int16 *v101; // edx@73 - __int16 v102; // ax@77 - BLVSector *v103; // ecx@77 - __int16 v104; // ax@77 - __int16 v105; // ax@78 - BLVSector *v106; // ecx@78 - const void *v107; // ebx@82 - const void *v108; // ebx@82 - unsigned __int16 v109; // ax@86 - BLVFaceExtra *v110; // ecx@86 - int v111; // edx@86 - BLVFaceExtra *v112; // ecx@89 - const void *v113; // ebx@94 - const void *v114; // ebx@94 - void *v115; // eax@94 - size_t v116; // ecx@94 - const void *v117; // ebx@94 - int v118; // eax@94 - unsigned __int16 *v119; // edx@95 - int v120; // ecx@95 - BLVFace *v121; // ecx@95 - unsigned __int16 *v122; // edx@95 - int v123; // ecx@95 - BLVFace *v124; // ecx@95 - unsigned __int16 *v125; // edx@95 - unsigned __int16 *v126; // edx@95 - unsigned __int16 *v127; // edx@95 - unsigned __int16 *v128; // edx@95 - unsigned __int16 *v129; // edx@95 - int v130; // ecx@95 - unsigned __int16 *v131; // edx@95 - void *v132; // eax@96 - size_t v133; // ecx@96 - const void *v134; // ebx@96 - BLVSector *v135; // eax@97 - FILE *v136; // ecx@97 - unsigned __int16 *v137; // edx@99 - const void *v138; // ebx@100 - const void *v139; // ebx@100 - unsigned __int16 v140; // ax@102 - FILE *v141; // ecx@102 - const void *v142; // ebx@103 - const void *v143; // ebx@103 - const void *v144; // ebx@103 unsigned int v145; // eax@103 void *v146; // eax@103 unsigned int v147; // ecx@103 int v148; // ebx@103 - unsigned int *v149; // ecx@103 - size_t v150; // eax@103 - unsigned int v151; // ebx@109 - unsigned int v152; // ecx@116 - unsigned int v153; // eax@117 - size_t v154; // ebx@126 - unsigned int v155; // ebx@134 - size_t v156; // eax@140 - signed int v157; // ebx@142 - int v158; // ebx@148 - BLVFace *v159; // eax@149 - BLVFaceExtra *v160; // ecx@149 - BLVFaceExtra *v161; // ecx@149 - signed int v162; // ebx@154 - unsigned int v163; // ebx@157 - unsigned int v164; // ebx@157 - unsigned int v165; // edx@158 - char *v166; // ecx@158 - unsigned __int16 v167; // ax@161 - __int16 v168; // ax@165 - unsigned int v169; // ebx@168 - void *v170; // eax@168 - size_t v171; // ebx@168 - int v172; // edx@168 - BLVDoor *v173; // ecx@169 - int k; // eax@169 - BLVDoor *v175; // ecx@172 - int v176; // edx@172 - BLVDoor *v177; // ecx@172 - int v178; // edx@172 - BLVDoor *v179; // ecx@172 - int v180; // edx@172 - BLVDoor *v181; // ecx@172 - int v182; // edx@172 - BLVDoor *v183; // ecx@172 - int v184; // edx@172 - BLVDoor *v185; // ecx@172 - int v186; // edx@172 - BLVDoor *v187; // ecx@172 - int v188; // edx@172 - unsigned __int16 *v189; // ebx@172 - char *v190; // edx@173 - BLVDoor *v191; // ecx@174 - BLVDoor *l; // eax@175 - signed int v193; // ebx@176 - int v194; // ecx@176 - BLVFaceExtra *v195; // ecx@176 - BLVFace *v196; // ebx@178 - std::string v197; // [sp-18h] [bp-680h]@66 - void *v198; // [sp-14h] [bp-67Ch]@72 - size_t v199; // [sp-10h] [bp-678h]@72 - size_t v200; // [sp-Ch] [bp-674h]@72 - const char *v201; // [sp-8h] [bp-670h]@4 - int v202; // [sp-4h] [bp-66Ch]@4 + unsigned int *v149; // ecx@103*/ + //size_t v150; // eax@103 + //unsigned int v151; // ebx@109 + //unsigned int v152; // ecx@116 + //unsigned int v153; // eax@117 + //size_t v154; // ebx@126 + //unsigned int v155; // ebx@134 + //size_t v156; // eax@140 + //signed int v157; // ebx@142 + //int v158; // ebx@148 + //BLVFace *v159; // eax@149 +// BLVFaceExtra *v160; // ecx@149 + //BLVFaceExtra *v161; // ecx@149 + //signed int v162; // ebx@154 + //unsigned int v163; // ebx@157 + //unsigned int v164; // ebx@157 + //unsigned int v165; // edx@158 + //char *v166; // ecx@158 + //unsigned __int16 v167; // ax@161 + //__int16 v168; // ax@165 + //unsigned int v169; // ebx@168 + //void *v170; // eax@168 + //size_t v171; // ebx@168 + //int v172; // edx@168 + //BLVDoor *v173; // ecx@169 + //int k; // eax@169 + //BLVDoor *v175; // ecx@172 + //int v176; // edx@172 + //BLVDoor *v177; // ecx@172 + //int v178; // edx@172 + //BLVDoor *v179; // ecx@172 + //int v180; // edx@172 + //BLVDoor *v181; // ecx@172 + //int v182; // edx@172 + //BLVDoor *v183; // ecx@172 + //int v184; // edx@172 + //BLVDoor *v185; // ecx@172 + //int v186; // edx@172 + //BLVDoor *v187; // ecx@172 + //int v188; // edx@172 + //unsigned __int16 *v189; // ebx@172 + //char *v190; // edx@173 + //BLVDoor *v191; // ecx@174 + //BLVDoor *l; // eax@175 + //signed int v193; // ebx@176 + //int v194; // ecx@176 + //BLVFaceExtra *v195; // ecx@176 + //BLVFace *v196; // ebx@178 + //std::string v197; // [sp-18h] [bp-680h]@66 + //void *v198; // [sp-14h] [bp-67Ch]@72 + //size_t v199; // [sp-10h] [bp-678h]@72 + //size_t v200; // [sp-Ch] [bp-674h]@72 + //const char *v201; // [sp-8h] [bp-670h]@4 + //int v202; // [sp-4h] [bp-66Ch]@4 char v203[875]; // [sp+Ch] [bp-65Ch]@130 char FileName[260]; // [sp+378h] [bp-2F0h]@1 - char DstBuf; // [sp+47Ch] [bp-1ECh]@4 + //char DstBuf; // [sp+47Ch] [bp-1ECh]@4 __int32 Offset; // [sp+480h] [bp-1E8h]@4 __int32 v207; // [sp+48Ch] [bp-1DCh]@4 __int32 v208; // [sp+498h] [bp-1D0h]@4 @@ -2107,18 +2046,18 @@ __int32 v232; // [sp+5B8h] [bp-B0h]@52 __int32 v233; // [sp+5C4h] [bp-A4h]@52 __int32 v234; // [sp+5D0h] [bp-98h]@52 - char pName[40]; // [sp+5FCh] [bp-6Ch]@42 - size_t pSource; // [sp+624h] [bp-44h]@67 - char Dst[12]; // [sp+628h] [bp-40h]@9 - char *v238; // [sp+634h] [bp-34h]@38 + //char pName[40]; // [sp+5FCh] [bp-6Ch]@42 + //size_t pSource; // [sp+624h] [bp-44h]@67 + //char Dst[12]; // [sp+628h] [bp-40h]@9 + //char *v238; // [sp+634h] [bp-34h]@38 ODMHeader header; // [sp+638h] [bp-30h]@61 - void *ptr; // [sp+648h] [bp-20h]@66 - size_t Count; // [sp+64Ch] [bp-1Ch]@109 - int uSourceLen; // [sp+653h] [bp-15h]@66 + //void *ptr; // [sp+648h] [bp-20h]@66 + //size_t Count; // [sp+64Ch] [bp-1Ch]@109 + //int uSourceLen; // [sp+653h] [bp-15h]@66 FILE *File; // [sp+658h] [bp-10h]@56 - BLVSector *v244; // [sp+65Ch] [bp-Ch]@72 - int v245; // [sp+660h] [bp-8h]@72 - BLVFace *Src; // [sp+664h] [bp-4h]@73 + //BLVSector *v244; // [sp+65Ch] [bp-Ch]@72 + //int v245; // [sp+660h] [bp-8h]@72 + //BLVFace *Src; // [sp+664h] [bp-4h]@73 signed int Argsa; // [sp+670h] [bp+8h]@4 signed int Argsb; // [sp+670h] [bp+8h]@7 signed int Argsc; // [sp+670h] [bp+8h]@15 @@ -2129,46 +2068,48 @@ int Argsh; // [sp+670h] [bp+8h]@35 signed int Argsi; // [sp+670h] [bp+8h]@40 signed int Argsj; // [sp+670h] [bp+8h]@45 - int Argsk; // [sp+670h] [bp+8h]@143 - void *Argsl; // [sp+670h] [bp+8h]@155 - signed int Argsm; // [sp+670h] [bp+8h]@161 - signed int Argsn; // [sp+670h] [bp+8h]@175 + //int Argsk; // [sp+670h] [bp+8h]@143 + //void *Argsl; // [sp+670h] [bp+8h]@155 + //signed int Argsm; // [sp+670h] [bp+8h]@161 + //signed int Argsn; // [sp+670h] [bp+8h]@175 - v5 = 0; - v6 = this; + //v5 = 0; + //v6 = this; _6807E0_num_decorations_6807B8 = 0; - sprintfex(FileName, "levels\\%s", pFilename); + + #pragma region "loading from txt" + /*sprintf(FileName, "levels\\%s", pFilename); if ( GetFileAttributesA(FileName) != -1 ) { - v6->Release(); - if ( v6->Alloc() ) + Release(); + if ( Alloc() ) { v7 = fopen(FileName, "rb"); result = 1; if ( !v7 ) return result; v9 = pDest; - v6->bLoaded = 1; + bLoaded = 1; v202 = (int)v7; v201 = (const char *)1; *(int *)v9 = 1; fread(&DstBuf, 0x180u, (size_t)v201, (FILE *)v202); fseek(v7, Offset, 0); - fread(&v6->blv, 0x88u, 1u, v7); + fread(&blv, 0x88u, 1u, v7); fseek(v7, v207, 0); - fread(&v6->uNumVertices, 1u, 4u, v7); + fread(&uNumVertices, 1u, 4u, v7); fseek(v7, v208, 0); - fread(v6->pVertices, 6u, v6->uNumVertices, v7); + fread(pVertices, 6u, uNumVertices, v7); fseek(v7, v209, 0); - fread(&v6->uNumFaces, 4u, 1u, v7); + fread(&uNumFaces, 4u, 1u, v7); fseek(v7, v210, 0); - fread(v6->pFaces, 0x60u, v6->uNumFaces, v7); - v10 = pAllocator->AllocNamedChunk(v6->ptr_2AC, v6->blv.uFaces_fdata_Size, "L.FData"); + fread(pFaces, 0x60u, uNumFaces, v7); + v10 = pAllocator->AllocNamedChunk(ptr_2AC, blv.uFaces_fdata_Size, "L.FData"); v202 = (int)v7; - v6->ptr_2AC = (unsigned __int16 *)v10; - fread(v10, 1u, v6->blv.uFaces_fdata_Size, (FILE *)v202); - v11 = v6->uNumFaces == 0; - v12 = (v6->uNumFaces & 0x80000000u) != 0; + ptr_2AC = (unsigned __int16 *)v10; + fread(v10, 1u, blv.uFaces_fdata_Size, (FILE *)v202); + v11 = uNumFaces == 0; + v12 = (uNumFaces & 0x80000000u) != 0; pDest = 0; Argsa = 0; if ( !(v12 | v11) ) @@ -2176,50 +2117,50 @@ v13 = 0; do { - v6->pFaces[v13].pVertexIDs = (unsigned __int16 *)&pDest[(unsigned int)v6->ptr_2AC]; - v14 = (size_t)&v6->pFaces[v13]; + pFaces[v13].pVertexIDs = (unsigned __int16 *)&pDest[(unsigned int)ptr_2AC]; + v14 = (size_t)&pFaces[v13]; i = v14; v15 = &pDest[2 * *(char *)(v14 + 93) + 2]; - v16 = (int)&v15[(unsigned int)v6->ptr_2AC]; + v16 = (int)&v15[(unsigned int)ptr_2AC]; pDest = v15; *(int *)(i + 52) = v16; - v17 = (size_t)&v6->pFaces[v13]; + v17 = (size_t)&pFaces[v13]; i = v17; v18 = &pDest[2 * *(char *)(v17 + 93) + 2]; - v19 = (int)&v18[(unsigned int)v6->ptr_2AC]; + v19 = (int)&v18[(unsigned int)ptr_2AC]; pDest = v18; *(int *)(i + 56) = v19; - i = (size_t)&v6->pFaces[v13]; - v20 = v6->ptr_2AC; + i = (size_t)&pFaces[v13]; + v20 = ptr_2AC; pDest += 2 * *(char *)(i + 93) + 2; *(int *)(i + 60) = (int)(char *)v20 + (int)pDest; - i = (size_t)&v6->pFaces[v13]; - v21 = v6->ptr_2AC; + i = (size_t)&pFaces[v13]; + v21 = ptr_2AC; pDest += 2 * *(char *)(i + 93) + 2; *(int *)(i + 64) = (int)(char *)v21 + (int)pDest; - i = (size_t)&v6->pFaces[v13]; + i = (size_t)&pFaces[v13]; ++v13; - v22 = v6->ptr_2AC; + v22 = ptr_2AC; pDest += 2 * *(char *)(i + 93) + 2; ++Argsa; *(int *)(i + 68) = (int)(char *)v22 + (int)pDest; - pDest += 2 * *((char *)&v6->pFaces[v13] - 3) + 2; + pDest += 2 * *((char *)&pFaces[v13] - 3) + 2; } - while ( Argsa < (signed int)v6->uNumFaces ); + while ( Argsa < (signed int)uNumFaces ); } Argsb = 0; - if ( (signed int)v6->uNumFaces > 0 ) + if ( (signed int)uNumFaces > 0 ) { pDest = 0; do { fread(Dst, 1u, 0xAu, v7); - if ( pDest[(unsigned int)v6->pFaces + 45] & 0x40 ) + if ( pDest[(unsigned int)pFaces + 45] & 0x40 ) { v23 = pTextureFrameTable->FindTextureByName(Dst); v24 = pDest; - *(short *)&pDest[(unsigned int)v6->pFaces + 74] = v23; - v25 = *(short *)&v24[(unsigned int)v6->pFaces + 74]; + *(short *)&pDest[(unsigned int)pFaces + 74] = v23; + v25 = *(short *)&v24[(unsigned int)pFaces + 74]; if ( v25 ) { pTextureFrameTable->LoadAnimationSequenceAndPalettes(v25); @@ -2228,68 +2169,68 @@ { v26 = pBitmaps_LOD->LoadTexture(Dst); v27 = pDest; - *(short *)&pDest[(unsigned int)v6->pFaces + 74] = v26; - v27[(unsigned int)v6->pFaces + 45] &= 0xBFu; + *(short *)&pDest[(unsigned int)pFaces + 74] = v26; + v27[(unsigned int)pFaces + 45] &= 0xBFu; } } else { - *(short *)&pDest[(unsigned int)v6->pFaces + 74] = pBitmaps_LOD->LoadTexture(Dst); + *(short *)&pDest[(unsigned int)pFaces + 74] = pBitmaps_LOD->LoadTexture(Dst); } ++Argsb; pDest += 96; } - while ( Argsb < (signed int)v6->uNumFaces ); + while ( Argsb < (signed int)uNumFaces ); } fseek(v7, v211, 0); - fread(&v6->uNumFaceExtras, 4u, 1u, v7); + fread(&uNumFaceExtras, 4u, 1u, v7); fseek(v7, v212, 0); - fread(v6->pFaceExtras, 0x24u, v6->uNumFaceExtras, v7); + fread(pFaceExtras, 0x24u, uNumFaceExtras, v7); Argsc = 0; - if ( (signed int)v6->uNumFaceExtras > 0 ) + if ( (signed int)uNumFaceExtras > 0 ) { pDest = 0; do { fread(Dst, 1u, 0xAu, v7); v28 = pBitmaps_LOD->LoadTexture(Dst); - v29 = v6->pFaceExtras; + v29 = pFaceExtras; v30 = pDest; ++Argsc; pDest += 36; *(unsigned __int16 *)((char *)&v29->uAdditionalBitmapID + (int)v30) = v28; } - while ( Argsc < (signed int)v6->uNumFaceExtras ); + while ( Argsc < (signed int)uNumFaceExtras ); } Argsd = 0; - if ( (signed int)v6->uNumFaces > 0 ) + if ( (signed int)uNumFaces > 0 ) { pDest = 0; do { - v31 = (int)&v6->pFaceExtras[*(short *)&pDest[(unsigned int)v6->pFaces + 72]]; + v31 = (int)&pFaceExtras[*(short *)&pDest[(unsigned int)pFaces + 72]]; if ( *(short *)(v31 + 26) ) { if ( ((BLVFaceExtra *)v31)->HasEventint() ) - pDest[(unsigned int)v6->pFaces + 46] |= 0x10u; + pDest[(unsigned int)pFaces + 46] |= 0x10u; else - pDest[(unsigned int)v6->pFaces + 46] &= 0xEFu; + pDest[(unsigned int)pFaces + 46] &= 0xEFu; } ++Argsd; pDest += 96; } - while ( Argsd < (signed int)v6->uNumFaces ); + while ( Argsd < (signed int)uNumFaces ); } fseek(v7, v213, 0); - fread(&v6->uNumSectors, 4u, 1u, v7); + fread(&uNumSectors, 4u, 1u, v7); fseek(v7, v214, 0); - fread(v6->pSectors, 0x74u, v6->uNumSectors, v7); - v32 = pAllocator->AllocNamedChunk(v6->ptr_0002B0_sector_rdata, v6->blv.uSector_rdata_Size, "L.RData"); + fread(pSectors, 0x74u, uNumSectors, v7); + v32 = pAllocator->AllocNamedChunk(ptr_0002B0_sector_rdata, blv.uSector_rdata_Size, "L.RData"); v202 = (int)v7; - v6->ptr_0002B0_sector_rdata = (unsigned __int16 *)v32; - fread(v32, 1u, v6->blv.uSector_rdata_Size, (FILE *)v202); - v11 = v6->uNumSectors == 0; - v12 = v6->uNumSectors < 0; + ptr_0002B0_sector_rdata = (unsigned __int16 *)v32; + fread(v32, 1u, blv.uSector_rdata_Size, (FILE *)v202); + v11 = uNumSectors == 0; + v12 = uNumSectors < 0; pDest = 0; Argse = 0; if ( !(v12 | v11) ) @@ -2297,87 +2238,87 @@ v33 = 0; do { - v6->pSectors[v33].pFloors = (unsigned __int16 *)&pDest[(unsigned int)v6->ptr_0002B0_sector_rdata]; - i = (size_t)&v6->pSectors[v33]; - v34 = v6->ptr_0002B0_sector_rdata; + pSectors[v33].pFloors = (unsigned __int16 *)&pDest[(unsigned int)ptr_0002B0_sector_rdata]; + i = (size_t)&pSectors[v33]; + v34 = ptr_0002B0_sector_rdata; pDest += 2 * *(short *)(i + 4); *(int *)(i + 16) = (int)(char *)v34 + (int)pDest; - v35 = (size_t)&v6->pSectors[v33]; + v35 = (size_t)&pSectors[v33]; i = v35; v36 = &pDest[2 * *(short *)(v35 + 12)]; - v37 = (int)&v36[(unsigned int)v6->ptr_0002B0_sector_rdata]; + v37 = (int)&v36[(unsigned int)ptr_0002B0_sector_rdata]; pDest = v36; *(int *)(i + 24) = v37; - v38 = (size_t)&v6->pSectors[v33]; + v38 = (size_t)&pSectors[v33]; i = v38; v39 = &pDest[2 * *(short *)(v38 + 20)]; - v40 = (int)&v39[(unsigned int)v6->ptr_0002B0_sector_rdata]; + v40 = (int)&v39[(unsigned int)ptr_0002B0_sector_rdata]; pDest = v39; *(int *)(i + 32) = v40; - i = (size_t)&v6->pSectors[v33]; - v41 = v6->ptr_0002B0_sector_rdata; + i = (size_t)&pSectors[v33]; + v41 = ptr_0002B0_sector_rdata; pDest += 2 * *(short *)(i + 28); *(int *)(i + 40) = (int)(char *)v41 + (int)pDest; - i = (size_t)&v6->pSectors[v33]; - v42 = v6->ptr_0002B0_sector_rdata; + i = (size_t)&pSectors[v33]; + v42 = ptr_0002B0_sector_rdata; pDest += 2 * *(short *)(i + 36); *(int *)(i + 48) = (int)(char *)v42 + (int)pDest; - i = (size_t)&v6->pSectors[v33]; - v43 = v6->ptr_0002B0_sector_rdata; + i = (size_t)&pSectors[v33]; + v43 = ptr_0002B0_sector_rdata; pDest += 2 * *(short *)(i + 44); *(int *)(i + 64) = (int)(char *)v43 + (int)pDest; - i = (size_t)&v6->pSectors[v33]; - v44 = v6->ptr_0002B0_sector_rdata; + i = (size_t)&pSectors[v33]; + v44 = ptr_0002B0_sector_rdata; pDest += 2 * *(short *)(i + 60); *(int *)(i + 72) = (int)(char *)v44 + (int)pDest; - v45 = (size_t)&v6->pSectors[v33]; + v45 = (size_t)&pSectors[v33]; ++v33; i = v45; - v46 = v6->ptr_0002B0_sector_rdata; + v46 = ptr_0002B0_sector_rdata; pDest += 2 * *(short *)(v45 + 68); ++Argse; *(int *)(v45 + 80) = (int)(char *)v46 + (int)pDest; - pDest += 2 * *((short *)&v6->pSectors[v33] - 20); + pDest += 2 * *((short *)&pSectors[v33] - 20); } - while ( Argse < v6->uNumSectors ); + while ( Argse < uNumSectors ); } v47 = pAllocator->AllocNamedChunk( - v6->ptr_0002B8_sector_lrdata, - v6->blv.uSector_lrdata_Size, + ptr_0002B8_sector_lrdata, + blv.uSector_lrdata_Size, "L.RLData"); v202 = (int)v7; - v6->ptr_0002B8_sector_lrdata = (unsigned __int16 *)v47; - fread(v47, 1u, v6->blv.uSector_lrdata_Size, (FILE *)v202); - v11 = v6->uNumSectors == 0; - v12 = v6->uNumSectors < 0; + ptr_0002B8_sector_lrdata = (unsigned __int16 *)v47; + fread(v47, 1u, blv.uSector_lrdata_Size, (FILE *)v202); + v11 = uNumSectors == 0; + v12 = uNumSectors < 0; pDest = 0; Argsf = 0; if ( !(v12 | v11) ) { - v48 = v6->pSectors; + v48 = pSectors; v49 = 0; for ( i = 0; ; v49 = i ) { - v50 = v6->ptr_0002B8_sector_lrdata; + v50 = ptr_0002B8_sector_lrdata; i += 116; ++Argsf; *(BLVLightMM7 **)((char *)&v48->pLights + v49) = (BLVLightMM7 *)((char *)v50 + (int)pDest); - v48 = v6->pSectors; + v48 = pSectors; pDest += 2 * *(__int16 *)((char *)&v48->uNumLights + v49); - if ( Argsf >= v6->uNumSectors ) + if ( Argsf >= uNumSectors ) break; } } fseek(v7, v215, 0); - fread(&v6->uNumDoors, 4u, 1u, v7); + fread(&uNumDoors, 4u, 1u, v7); fseek(v7, v216, 0); - fread(v6->pDoors, 0x50u, 0xC8u, v7); - v51 = pAllocator->AllocNamedChunk(v6->ptr_0002B4_doors_ddata, v6->blv.uDoors_ddata_Size, "L.DData"); + fread(pDoors, 0x50u, 0xC8u, v7); + v51 = pAllocator->AllocNamedChunk(ptr_0002B4_doors_ddata, blv.uDoors_ddata_Size, "L.DData"); v202 = (int)v7; - v6->ptr_0002B4_doors_ddata = (unsigned __int16 *)v51; - fread(v51, 1u, v6->blv.uDoors_ddata_Size, (FILE *)v202); - v11 = v6->uNumDoors == 0; - v12 = v6->uNumDoors < 0; + ptr_0002B4_doors_ddata = (unsigned __int16 *)v51; + fread(v51, 1u, blv.uDoors_ddata_Size, (FILE *)v202); + v11 = uNumDoors == 0; + v12 = uNumDoors < 0; pDest = 0; Argsg = 0; if ( !(v12 | v11) ) @@ -2385,50 +2326,50 @@ v52 = 0; do { - v6->pDoors[v52].pVertexIDs = (unsigned __int16 *)&pDest[(unsigned int)v6->ptr_0002B4_doors_ddata]; - i = (size_t)&v6->pDoors[v52]; - v53 = v6->ptr_0002B4_doors_ddata; + pDoors[v52].pVertexIDs = (unsigned __int16 *)&pDest[(unsigned int)ptr_0002B4_doors_ddata]; + i = (size_t)&pDoors[v52]; + v53 = ptr_0002B4_doors_ddata; pDest += 2 * *(short *)(i + 68); *(int *)(i + 40) = (int)(char *)v53 + (int)pDest; - v54 = (size_t)&v6->pDoors[v52]; + v54 = (size_t)&pDoors[v52]; i = v54; v55 = &pDest[2 * *(short *)(v54 + 70)]; - v56 = (int)&v55[(unsigned int)v6->ptr_0002B4_doors_ddata]; + v56 = (int)&v55[(unsigned int)ptr_0002B4_doors_ddata]; pDest = v55; *(int *)(i + 44) = v56; - v57 = (size_t)&v6->pDoors[v52]; + v57 = (size_t)&pDoors[v52]; i = v57; v58 = &pDest[2 * *(short *)(v57 + 72)]; - v59 = (int)&v58[(unsigned int)v6->ptr_0002B4_doors_ddata]; + v59 = (int)&v58[(unsigned int)ptr_0002B4_doors_ddata]; pDest = v58; *(int *)(i + 48) = v59; - i = (size_t)&v6->pDoors[v52]; - v60 = v6->ptr_0002B4_doors_ddata; + i = (size_t)&pDoors[v52]; + v60 = ptr_0002B4_doors_ddata; pDest += 2 * *(short *)(i + 70); *(int *)(i + 52) = (int)(char *)v60 + (int)pDest; - i = (size_t)&v6->pDoors[v52]; - v61 = v6->ptr_0002B4_doors_ddata; + i = (size_t)&pDoors[v52]; + v61 = ptr_0002B4_doors_ddata; pDest += 2 * *(short *)(i + 70); *(int *)(i + 56) = (int)(char *)v61 + (int)pDest; - i = (size_t)&v6->pDoors[v52]; - v62 = v6->ptr_0002B4_doors_ddata; + i = (size_t)&pDoors[v52]; + v62 = ptr_0002B4_doors_ddata; pDest += 2 * *(short *)(i + 74); *(int *)(i + 60) = (int)(char *)v62 + (int)pDest; - i = (size_t)&v6->pDoors[v52]; - v63 = v6->ptr_0002B4_doors_ddata; + i = (size_t)&pDoors[v52]; + v63 = ptr_0002B4_doors_ddata; pDest += 2 * *(short *)(i + 74); *(int *)(i + 64) = (int)(char *)v63 + (int)pDest; ++Argsg; - v64 = v6->pDoors[v52].uNumOffsets; + v64 = pDoors[v52].uNumOffsets; ++v52; pDest += 2 * v64; } - while ( Argsg < v6->uNumDoors ); + while ( Argsg < uNumDoors ); } Argsh = 0; - if ( v6->uNumDoors > 0 ) + if ( uNumDoors > 0 ) { - v65 = v6->pDoors; + v65 = pDoors; pDest = 0; do { @@ -2441,15 +2382,15 @@ v67 = *((int *)v66 + 10); a3 = 2 * i; v68 = *(short *)(v67 + 2 * i); - v69 = v6->pFaces; + v69 = pFaces; ++i; - v70 = (int)&v6->pFaceExtras[v69[v68].uFaceExtraID]; + v70 = (int)&pFaceExtras[v69[v68].uFaceExtraID]; v71 = *((int *)v66 + 12); v72 = a3; v238 = (char *)v70; *(short *)(a3 + v71) = *(short *)(v70 + 20); - *(__int16 *)(*(char **)((char *)&v6->pDoors->pDeltaVs + (unsigned int)pDest) + v72) = *((short *)v238 + 11); - v65 = v6->pDoors; + *(__int16 *)(*(char **)((char *)&pDoors->pDeltaVs + (unsigned int)pDest) + v72) = *((short *)v238 + 11); + v65 = pDoors; v66 = &pDest[(int)v65]; } while ( (signed int)i < *(short *)&pDest[(int)v65 + 70] ); @@ -2457,7 +2398,7 @@ ++Argsh; pDest += 80; } - while ( Argsh < v6->uNumDoors ); + while ( Argsh < uNumDoors ); } fseek(v7, v217, 0); fread(&uNumLevelDecorations, 4u, 1u, v7); @@ -2527,741 +2468,734 @@ fseek(v7, v229, 0); fread(pChests, 0x14CCu, uNumChests, v7); fseek(v7, v224, 0); - fread(&v6->uNumLights, 4u, 1u, v7); + fread(&uNumLights, 4u, 1u, v7); fseek(v7, v225, 0); - fread(v6->pLights, 0x10u, v6->uNumLights, v7); + fread(pLights, 0x10u, uNumLights, v7); fseek(v7, v226, 0); - fread(&v6->uNumNodes, 4u, 1u, v7); + fread(&uNumNodes, 4u, 1u, v7); fseek(v7, v227, 0); - fread(v6->pNodes, 8u, v6->uNumNodes, v7); + fread(pNodes, 8u, uNumNodes, v7); fseek(v7, v230, 0); - fread(&v6->uNumSpawnPoints, 4u, 1u, v7); - v79 = pAllocator->AllocNamedChunk(v6->pSpawnPoints, 24 * v6->uNumSpawnPoints, "Spawn"); + fread(&uNumSpawnPoints, 4u, 1u, v7); + v79 = pAllocator->AllocNamedChunk(pSpawnPoints, 24 * uNumSpawnPoints, "Spawn"); v202 = 0; - v6->pSpawnPoints = (SpawnPointMM7 *)v79; + pSpawnPoints = (SpawnPointMM7 *)v79; fseek(v7, v231, v202); - fread(v6->pSpawnPoints, 0x18u, v6->uNumSpawnPoints, v7); + fread(pSpawnPoints, 0x18u, uNumSpawnPoints, v7); fseek(v7, v232, 0); - fread(&v6->dlv, 0x28u, 1u, v7); + fread(&dlv, 0x28u, 1u, v7); fseek(v7, v233, 0); fread(&stru_5E4C90, 1u, 0xC8u, v7); fseek(v7, v234, 0); - fread(&v6->uLastVisitDay, 1u, 0x38u, v7); + fread(&uLastVisitDay, 1u, 0x38u, v7); fseek(v7, v223, 0); - v80 = (void **)&v6->pMapVertices; + v80 = (void **)&pMapVertices; fread(*v80, 4u, 1u, v7); fread((char *)*v80 + 4, 0xCu, *(int *)*v80, v7); fclose(v7); goto LABEL_179; } return 4; + }*/ + #pragma endregion + + if (bLoaded) + { + Log::Warning(L"BLV is already loaded"); + return 3; } + if ( !pGames_LOD->DoesContainerExist(pFilename) ) Abortf("Unable to find %s in Games.LOD", pFilename); - v238 = pFilename - 4; - v81 = strlen(pFilename); - strcpy(&v238[v81], ".blv"); - v82 = pGames_LOD->FindContainer(pFilename, 1); - v11 = v6->bLoaded == 0; - File = v82; - if ( !v11 ) - return 3; + + //v238 = pFilename - 4; + //v81 = strlen(pFilename); + strcpy(this->pFilename, pFilename); + strcpy(&pFilename[strlen(pFilename) - 4], ".blv"); + File = pGames_LOD->FindContainer(pFilename, 1); + //File = v82; Release(); if ( !Alloc() ) return 4; - + + header.uVersion = 91969; header.pMagic[0] = 'm'; - header.uVersion = 91969; header.pMagic[1] = 'v'; header.pMagic[2] = 'i'; header.pMagic[3] = 'i'; header.uCompressedSize = 0; header.uDecompressedSize = 0; - fread(&header, 0x10u, 1u, File); - if ( header.uVersion != 91969 - || header.pMagic[0] != 'm' - || header.pMagic[1] != 'v' - || header.pMagic[2] != 'i' - || header.pMagic[3] != 'i' ) + fread(&header, sizeof(ODMHeader), 1u, File); + if (header.uVersion != 91969 || + header.pMagic[0] != 'm' || + header.pMagic[1] != 'v' || + header.pMagic[2] != 'i' || + header.pMagic[3] != 'i' ) { MessageBoxW(nullptr, L"Can't load file!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Polydata.cpp:792", 0); } - v83 = header.uCompressedSize; - pSource = header.uDecompressedSize; - v84 = malloc(header.uDecompressedSize); - v85 = v84; - ptr = v84; - if ( v83 <= pSource ) + //v83 = header.uCompressedSize; + //pSource = header.uDecompressedSize; + //v84 = malloc(header.uDecompressedSize); + //v85 = v84; + //ptr = v84; + auto pRawBLV = malloc(header.uDecompressedSize); + memset(pRawBLV, 0, header.uDecompressedSize); + + if (header.uCompressedSize == header.uDecompressedSize) + fread(pRawBLV, header.uDecompressedSize, 1, File); + else if (header.uCompressedSize < header.uDecompressedSize) { - if ( v83 == pSource ) + auto pTmpMem = malloc(header.uCompressedSize); { - fread(v84, pSource, 1u, File); + fread(pTmpMem, header.uCompressedSize, 1, File); + + uint uDecompressedSize = header.uDecompressedSize; + zlib::MemUnzip(pRawBLV, &uDecompressedSize, pTmpMem, header.uCompressedSize); + + if (uDecompressedSize != header.uDecompressedSize) + Log::Warning(L"uDecompressedSize != header.uDecompressedSize in BLV"); } - else - { - *(int *)((char *)&uSourceLen + 1) = (int)malloc(v83); - fread(*(void **)((char *)&uSourceLen + 1), v83, 1u, File); - zlib::MemUnzip(v85, &pSource, *(const void **)((char *)&uSourceLen + 1), v83); - free(*(void **)((char *)&uSourceLen + 1)); - } + free(pTmpMem); } else { MessageBoxW(nullptr, L"Can't load file!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Polydata.cpp:803", 0); + return 0; } - strcpy(v6->pFilename, pFilename); - v200 = 136; - v199 = (size_t)v85; - v198 = &v6->blv; - v6->bLoaded = 1; - memcpy(v198, (const void *)v199, v200); - v86 = (char *)v85 + 136; + + assert(sizeof(Vec3_short_) == 6); + assert(sizeof(BLVFace) == 96); + assert(sizeof(BLVFaceExtra) == 36); + assert(sizeof(BLVSector) == 116); + assert(sizeof(LevelDecoration) == 32); + assert(sizeof(BLVLightMM7) == 16); + assert(sizeof(BSPNode) == 8); + assert(sizeof(SpawnPointMM7) == 24); + assert(sizeof(DDM_DLV_Header) == 40); + assert(sizeof(Actor) == 836); + assert(sizeof(LayingItem) == 112); + assert(sizeof(Chest) == 5324); + assert(sizeof(stru123) == 0xC8); + + bLoaded = true; + + auto pData = (char *)pRawBLV; + pGameLoadingUI_ProgressBar->Progress(); - memcpy(&v6->uNumVertices, v86, 4u); - v86 = (char *)v86 + 4; - pGameLoadingUI_ProgressBar->Progress(); - v202 = 6 * v6->uNumVertices; - v201 = (const char *)v86; - v200 = (size_t)v6->pVertices; - v245 = v202; - memcpy((void *)v200, v86, v202); - v87 = (char *)v86 + v245; - pGameLoadingUI_ProgressBar->Progress(); - memcpy(&v6->uNumFaces, v87, 4u); - v87 = (char *)v87 + 4; + + memcpy(&blv, pData, 136); + memcpy(&uNumVertices, pData += 136, 4); + memcpy(pVertices, pData += 4, uNumVertices * sizeof(Vec3_short_)); + pGameLoadingUI_ProgressBar->Progress(); - v202 = 96 * v6->uNumFaces; - v201 = (const char *)v87; - v200 = (size_t)v6->pFaces; - v245 = v202; - memcpy((void *)v200, v87, v202); - v88 = (char *)v87 + v245; - v202 = (int)"L.FData"; - v201 = (const char *)v6->blv.uFaces_fdata_Size; - v200 = (size_t)v6->ptr_2AC; - v89 = pAllocator->AllocNamedChunk((const void *)v200, (unsigned int)v201, "L.FData"); - v90 = v6->blv.uFaces_fdata_Size; - v6->ptr_2AC = (unsigned __int16 *)v89; - v245 = v90; - memcpy(v89, v88, v90); - v91 = (char *)v88 + v245; - v92 = 0; - v11 = v6->uNumFaces == 0; - v12 = (v6->uNumFaces & 0x80000000u) != 0; - v244 = 0; - v245 = 0; - if ( !(v12 | v11) ) + + memcpy(&uNumFaces, pData += uNumVertices * sizeof(Vec3_short_), 4); + + pGameLoadingUI_ProgressBar->Progress(); + + memcpy(pFaces, pData += 4, uNumFaces * sizeof (BLVFace)); + ptr_2AC = (unsigned __int16 *)pAllocator->AllocNamedChunk(ptr_2AC, blv.uFaces_fdata_Size, "L.FData"); + + memcpy(ptr_2AC, pData += uNumFaces * sizeof (BLVFace), blv.uFaces_fdata_Size); + + for (uint i = 0, j = 0; i < uNumFaces; ++i) { - do - { - v6->pFaces[v92].pVertexIDs = (unsigned __int16 *)((char *)v244 + (unsigned int)v6->ptr_2AC); - v93 = &v6->pFaces[v92]; + auto pFace = pFaces + i; + + pFace->pVertexIDs = ptr_2AC + j; + + j += pFace->uNumVertices + 1; + pFace->pXInterceptDisplacements = ptr_2AC + j; + + j += pFace->uNumVertices + 1; + pFace->pYInterceptDisplacements = ptr_2AC + j; + + j += pFace->uNumVertices + 1; + pFace->pZInterceptDisplacements = ptr_2AC + j; + + j += pFace->uNumVertices + 1; + pFace->pVertexUIDs = ptr_2AC + j; + + j += pFace->uNumVertices + 1; + pFace->pVertexVIDs = ptr_2AC + j; + + j += pFace->uNumVertices + 1; + /*v93 = &pFaces[v92]; Src = v93; v94 = (BLVSector *)((char *)v244 + 2 * v93->uNumVertices + 2); - v95 = (unsigned __int16 *)((char *)v94 + (unsigned int)v6->ptr_2AC); + v95 = (unsigned __int16 *)((char *)v94 + (unsigned int)ptr_2AC); v244 = v94; Src->pXInterceptDisplacements = v95; - v96 = (int)&v6->pFaces[v92]; + v96 = (int)&pFaces[v92]; Src = (BLVFace *)v96; v97 = (BLVSector *)((char *)v244 + 2 * *(char *)(v96 + 93) + 2); - v98 = (unsigned __int16 *)((char *)v97 + (unsigned int)v6->ptr_2AC); + v98 = (unsigned __int16 *)((char *)v97 + (unsigned int)ptr_2AC); v244 = v97; Src->pYInterceptDisplacements = v98; - Src = &v6->pFaces[v92]; - v99 = v6->ptr_2AC; + Src = &pFaces[v92]; + v99 = ptr_2AC; v244 = (BLVSector *)((char *)v244 + 2 * Src->uNumVertices + 2); Src->pZInterceptDisplacements = (unsigned __int16 *)((char *)v99 + (int)v244); - Src = &v6->pFaces[v92]; - v100 = v6->ptr_2AC; + Src = &pFaces[v92]; + v100 = ptr_2AC; v244 = (BLVSector *)((char *)v244 + 2 * Src->uNumVertices + 2); Src->pVertexUIDs = (unsigned __int16 *)((char *)v100 + (int)v244); - Src = &v6->pFaces[v92]; + Src = &pFaces[v92]; ++v92; - v101 = v6->ptr_2AC; + v101 = ptr_2AC; v244 = (BLVSector *)((char *)v244 + 2 * Src->uNumVertices + 2); ++v245; Src->pVertexVIDs = (unsigned __int16 *)((char *)v101 + (int)v244); - v244 = (BLVSector *)((char *)v244 + 2 * *((char *)&v6->pFaces[v92] - 3) + 2); - } - while ( v245 < (signed int)v6->uNumFaces ); + v244 = (BLVSector *)((char *)v244 + 2 * *((char *)&pFaces[v92] - 3) + 2);*/ } - v11 = v6->uNumFaces == 0; - v12 = (v6->uNumFaces & 0x80000000u) != 0; - v245 = 0; - if ( !(v12 | v11) ) + + pGameLoadingUI_ProgressBar->Progress(); + + pData += blv.uFaces_fdata_Size; + + for (uint i = 0; i < uNumFaces; ++i) { - v244 = 0; - do + auto pFace = pFaces + i; + + char pTexName[16]; + strncpy(pTexName, pData, 10); + pData += 10; + + if (pFace->uAttributes & 0x4000) { - memcpy(Dst, v91, 0xAu); - v91 = (char *)v91 + 10; - if ( *((char *)&v244->field_2C + (unsigned int)v6->pFaces + 1) & 0x40 ) - { - v102 = pTextureFrameTable->FindTextureByName(Dst); - v103 = v244; - *(short *)((char *)&v244->pDecorationIDs + (unsigned int)v6->pFaces + 2) = v102; - v104 = *(short *)((char *)&v103->pDecorationIDs + (unsigned int)v6->pFaces + 2); - if ( v104 ) - { - pTextureFrameTable->LoadAnimationSequenceAndPalettes(v104); - } - else - { - v105 = pBitmaps_LOD->LoadTexture(Dst); - v106 = v244; - *(short *)((char *)&v244->pDecorationIDs + (unsigned int)v6->pFaces + 2) = v105; - *((char *)&v106->field_2C + (unsigned int)v6->pFaces + 1) &= 0xBFu; - } - } + pFace->uBitmapID = pTextureFrameTable->FindTextureByName(pTexName); + if (pFace->uBitmapID) + pTextureFrameTable->LoadAnimationSequenceAndPalettes(pFace->uBitmapID); else { - *(short *)((char *)&v244->pDecorationIDs + (unsigned int)v6->pFaces + 2) = pBitmaps_LOD->LoadTexture(Dst); + pFace->uBitmapID = pBitmaps_LOD->LoadTexture(pTexName); + pFace->uAttributes &= ~0x4000; } - ++v245; - v244 = (BLVSector *)((char *)v244 + 96); } - while ( v245 < (signed int)v6->uNumFaces ); + else + pFace->uBitmapID = pBitmaps_LOD->LoadTexture(pTexName); } + pGameLoadingUI_ProgressBar->Progress(); - memcpy(&v6->uNumFaceExtras, v91, 4u); - v107 = (char *)v91 + 4; + + memcpy(&uNumFaceExtras, pData, 4u); + memcpy(pFaceExtras, pData += 4, uNumFaceExtras * sizeof(BLVFaceExtra)); + pData += uNumFaceExtras * sizeof(BLVFaceExtra); + pGameLoadingUI_ProgressBar->Progress(); - v202 = 36 * v6->uNumFaceExtras; - v201 = (const char *)v107; - v200 = (size_t)v6->pFaceExtras; - v245 = v202; - memcpy((void *)v200, v107, v202); - v108 = (char *)v107 + v245; - v245 = 0; - if ( (signed int)v6->uNumFaceExtras > 0 ) + + //v108 = (char *)v107 + 36 * uNumFaceExtras; + //v245 = 0; + //*(int *)((char *)&uSourceLen + 1) = 0; + for (uint i = 0; i < uNumFaceExtras; ++i) { - *(int *)((char *)&uSourceLen + 1) = 0; - do - { - memcpy(Dst, v108, 0xAu); - v108 = (char *)v108 + 10; - if ( !_strcmpi(Dst, nullstring) ) - *(unsigned __int16 *)((char *)&v6->pFaceExtras->uAdditionalBitmapID + *(int *)((char *)&uSourceLen + 1)) = -1; - v109 = pBitmaps_LOD->LoadTexture(Dst); - v110 = v6->pFaceExtras; - v111 = *(int *)((char *)&uSourceLen + 1); - ++v245; - *(int *)((char *)&uSourceLen + 1) += 36; - *(unsigned __int16 *)((char *)&v110->uAdditionalBitmapID + v111) = v109; - } - while ( v245 < (signed int)v6->uNumFaceExtras ); + char pTexName[32]; + strncpy(pTexName, pData, 10); + pData += 10; + + if (!strcmp(pTexName, "")) + pFaceExtras[i].uAdditionalBitmapID = -1; + else + pFaceExtras[i].uAdditionalBitmapID = pBitmaps_LOD->LoadTexture(pTexName); } - v11 = v6->uNumFaces == 0; - v12 = (v6->uNumFaces & 0x80000000u) != 0; - v245 = 0; - if ( !(v12 | v11) ) + + + for (uint i = 0; i < uNumFaces; ++i) { - v244 = 0; - do + auto pFace = pFaces + i; + auto pFaceExtra = pFaceExtras + pFace->uFaceExtraID; + + if (pFaceExtra->uEventID) { - v112 = &v6->pFaceExtras[*(short *)((char *)&v244->pDecorationIDs + (unsigned int)v6->pFaces)]; - if ( v112->uEventID ) - { - if ( v112->HasEventint() ) - *((char *)&v244->uNumNonBSPFaces + (unsigned int)v6->pFaces) |= 0x10u; - else - *((char *)&v244->uNumNonBSPFaces + (unsigned int)v6->pFaces) &= 0xEFu; - } - ++v245; - v244 = (BLVSector *)((char *)v244 + 96); + if (pFaceExtra->HasEventint()) + pFace->uAttributes |= 0x100000; + else + pFace->uAttributes &= ~0x100000; } - while ( v245 < (signed int)v6->uNumFaces ); } + pGameLoadingUI_ProgressBar->Progress(); - memcpy(&v6->uNumSectors, v108, 4u); - v113 = (char *)v108 + 4; + + memcpy(&uNumSectors, pData, 4); + memcpy(pSectors, pData + 4, uNumSectors * sizeof(BLVSector)); + pData += 4 + uNumSectors * sizeof(BLVSector); + pGameLoadingUI_ProgressBar->Progress(); - v202 = 116 * v6->uNumSectors; - v201 = (const char *)v113; - v200 = (size_t)v6->pSectors; - v245 = v202; - memcpy((void *)v200, v113, v202); - v114 = (char *)v113 + v245; - v202 = (int)"L.RData"; - v201 = (const char *)v6->blv.uSector_rdata_Size; - v200 = (size_t)v6->ptr_0002B0_sector_rdata; - v115 = pAllocator->AllocNamedChunk((const void *)v200, (unsigned int)v201, "L.RData"); - v116 = v6->blv.uSector_rdata_Size; - v6->ptr_0002B0_sector_rdata = (unsigned __int16 *)v115; - v245 = v116; - memcpy(v115, v114, v116); - v117 = (char *)v114 + v245; - v118 = 0; - v11 = v6->uNumSectors == 0; - v12 = v6->uNumSectors < 0; - Src = 0; - v245 = 0; - if ( !(v12 | v11) ) + + ptr_0002B0_sector_rdata = (unsigned short *)pAllocator->AllocNamedChunk(ptr_0002B0_sector_rdata, blv.uSector_rdata_Size, "L.RData"); + memcpy(ptr_0002B0_sector_rdata, pData, blv.uSector_rdata_Size); + pData += blv.uSector_rdata_Size; + + for (uint i = 0, j = 0; i < uNumSectors; ++i) { - do - { - v6->pSectors[v118].pFloors = (unsigned __int16 *)((char *)Src + (unsigned int)v6->ptr_0002B0_sector_rdata); - v244 = &v6->pSectors[v118]; - v119 = v6->ptr_0002B0_sector_rdata; + auto pSector = pSectors + i; + + pSector->pFloors = ptr_0002B0_sector_rdata + j; + j += pSector->field_4; + + pSector->pWalls = ptr_0002B0_sector_rdata + j; + j += pSector->field_C; + + pSector->pCeilings = ptr_0002B0_sector_rdata + j; + j += pSector->field_14; + + pSector->pFluids = ptr_0002B0_sector_rdata + j; + j += pSector->field_1C; + + pSector->pPortals = ptr_0002B0_sector_rdata + j; + j += pSector->uNumPortals; + + pSector->pFaceIDs = ptr_0002B0_sector_rdata + j; + j += pSector->field_2C; + + pSector->pCogs = ptr_0002B0_sector_rdata + j; + j += pSector->field_3C; + + pSector->pDecorationIDs = ptr_0002B0_sector_rdata + j; + j += pSector->uNumDecorations; + + pSector->pMarkers = ptr_0002B0_sector_rdata + j; + j += pSector->field_4C; + + + //do + //{ + /*pSectors[v118].pFloors = (unsigned __int16 *)((char *)Src + (unsigned int)ptr_0002B0_sector_rdata); + v244 = &pSectors[v118]; + v119 = ptr_0002B0_sector_rdata; Src = (BLVFace *)((char *)Src + 2 * v244->field_4); v244->pWalls = (unsigned __int16 *)((char *)v119 + (int)Src); - v120 = (int)&v6->pSectors[v118]; + v120 = (int)&pSectors[v118]; v244 = (BLVSector *)v120; v121 = (BLVFace *)((char *)Src + 2 * *(short *)(v120 + 12)); - v122 = (unsigned __int16 *)((char *)v121 + (unsigned int)v6->ptr_0002B0_sector_rdata); + v122 = (unsigned __int16 *)((char *)v121 + (unsigned int)ptr_0002B0_sector_rdata); Src = v121; v244->pCeilings = v122; - v123 = (int)&v6->pSectors[v118]; + v123 = (int)&pSectors[v118]; v244 = (BLVSector *)v123; v124 = (BLVFace *)((char *)Src + 2 * *(short *)(v123 + 20)); - v125 = (unsigned __int16 *)((char *)v124 + (unsigned int)v6->ptr_0002B0_sector_rdata); + v125 = (unsigned __int16 *)((char *)v124 + (unsigned int)ptr_0002B0_sector_rdata); Src = v124; v244->pFluids = v125; - v244 = &v6->pSectors[v118]; - v126 = v6->ptr_0002B0_sector_rdata; + v244 = &pSectors[v118]; + v126 = ptr_0002B0_sector_rdata; Src = (BLVFace *)((char *)Src + 2 * v244->field_1C); v244->pPortals = (unsigned __int16 *)((char *)v126 + (int)Src); - v244 = &v6->pSectors[v118]; - v127 = v6->ptr_0002B0_sector_rdata; + v244 = &pSectors[v118]; + v127 = ptr_0002B0_sector_rdata; Src = (BLVFace *)((char *)Src + 2 * v244->uNumPortals); v244->pFaceIDs = (unsigned __int16 *)((char *)v127 + (int)Src); - v244 = &v6->pSectors[v118]; - v128 = v6->ptr_0002B0_sector_rdata; + v244 = &pSectors[v118]; + v128 = ptr_0002B0_sector_rdata; Src = (BLVFace *)((char *)Src + 2 * v244->field_2C); v244->pCogs = (unsigned __int16 *)((char *)v128 + (int)Src); - v244 = &v6->pSectors[v118]; - v129 = v6->ptr_0002B0_sector_rdata; + v244 = &pSectors[v118]; + v129 = ptr_0002B0_sector_rdata; Src = (BLVFace *)((char *)Src + 2 * v244->field_3C); v244->pDecorationIDs = (unsigned __int16 *)((char *)v129 + (int)Src); - v130 = (int)&v6->pSectors[v118]; + v130 = (int)&pSectors[v118]; ++v118; v244 = (BLVSector *)v130; - v131 = v6->ptr_0002B0_sector_rdata; + v131 = ptr_0002B0_sector_rdata; Src = (BLVFace *)((char *)Src + 2 * *(short *)(v130 + 68)); ++v245; *(int *)(v130 + 80) = (int)(char *)v131 + (int)Src; - Src = (BLVFace *)((char *)Src + 2 * *((short *)&v6->pSectors[v118] - 20)); - } - while ( v245 < v6->uNumSectors ); + Src = (BLVFace *)((char *)Src + 2 * *((short *)&pSectors[v118] - 20));*/ + //} + //while ( v245 < uNumSectors ); + } + + ptr_0002B8_sector_lrdata = (unsigned __int16 *)pAllocator->AllocNamedChunk(ptr_0002B8_sector_lrdata, blv.uSector_lrdata_Size, "L.RLData"); + memcpy(ptr_0002B8_sector_lrdata, pData, blv.uSector_lrdata_Size); + pData += blv.uSector_lrdata_Size; + + pGameLoadingUI_ProgressBar->Progress(); + + for (uint i = 0, j = 0; i < uNumSectors; ++i) + { + pSectors->pLights = (BLVLightMM7 *)(ptr_0002B8_sector_lrdata + j); + j += pSectors->uNumLights; } - v202 = (int)"L.RLData"; - v201 = (const char *)v6->blv.uSector_lrdata_Size; - v200 = (size_t)v6->ptr_0002B8_sector_lrdata; - v132 = pAllocator->AllocNamedChunk((const void *)v200, (unsigned int)v201, "L.RLData"); - v133 = v6->blv.uSector_lrdata_Size; - v6->ptr_0002B8_sector_lrdata = (unsigned __int16 *)v132; - v245 = v133; - memcpy(v132, v117, v133); - v134 = (char *)v117 + v245; + + pGameLoadingUI_ProgressBar->Progress(); + + memcpy(&uNumDoors, pData, 4); + pData += 4; + + pGameLoadingUI_ProgressBar->Progress(); + pGameLoadingUI_ProgressBar->Progress(); + + memcpy(&uNumLevelDecorations, pData, 4); + memcpy(pLevelDecorations, pData + 4, uNumLevelDecorations * sizeof(LevelDecoration)); + pData += 4 + uNumLevelDecorations * sizeof(LevelDecoration); + + for (uint i = 0; i < uNumLevelDecorations; ++i) + { + pLevelDecorations[i].uDecorationDescID = pDecorationList->GetDecorIdByName(pData); + + pData += 32; + } + + pGameLoadingUI_ProgressBar->Progress(); + + memcpy(&uNumLights, pData, 4); + memcpy(pLights, pData + 4, uNumLights * sizeof(BLVLightMM7)); + pData += 4 + uNumLights * sizeof(BLVLightMM7); + + pGameLoadingUI_ProgressBar->Progress(); + pGameLoadingUI_ProgressBar->Progress(); + + memcpy(&uNumNodes, pData, 4); + memcpy(pNodes, pData + 4, uNumNodes * sizeof(BSPNode)); + pData += 4 + uNumNodes * sizeof(BSPNode); + + pGameLoadingUI_ProgressBar->Progress(); + pGameLoadingUI_ProgressBar->Progress(); + + memcpy(&uNumSpawnPoints, pData, 4); + pSpawnPoints = (SpawnPointMM7 *)pAllocator->AllocNamedChunk(pSpawnPoints, uNumSpawnPoints * sizeof(SpawnPointMM7), "Spawn"); + memcpy(pSpawnPoints, pData + 4, uNumSpawnPoints * sizeof(SpawnPointMM7)); + pData += 4 + uNumSpawnPoints * sizeof(SpawnPointMM7); + + pGameLoadingUI_ProgressBar->Progress(); pGameLoadingUI_ProgressBar->Progress(); - v11 = v6->uNumSectors == 0; - v12 = v6->uNumSectors < 0; - Src = 0; - v245 = 0; - if ( !(v12 | v11) ) + + //v201 = (const char *)v148; + //v200 = (size_t)pMapVertices; + memcpy(&pMapVertices->uNumVertices, pData, 4); + memcpy(pMapVertices->pVertices, pData + 4, pMapVertices->uNumVertices * sizeof(Vec3_int_)); + //v149 = pMapVertices; + //v199 = 12 * *v149; + //memcpy(v149 + 1, (const void *)(v148 + 4), v199); + free(pRawBLV); + pRawBLV = nullptr; + + void *pRawDLV = nullptr; + strcpy(&pFilename[strlen(pFilename) - 4], ".dlv"); + File = pNew_LOD->FindContainer(pFilename, 1); + fread(&header, 0x10u, 1u, File);//(FILE *)v245); + bool _v244 = false; + if (header.uVersion != 91969 || + header.pMagic[0] != 'm' || + header.pMagic[1] != 'v' || + header.pMagic[2] != 'i' || + header.pMagic[3] != 'i' ) + { + MessageBoxW(nullptr, L"Can't load file!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Polydata.cpp:1090", 0); + _v244 = true; + } + else { - v135 = v6->pSectors; - v136 = 0; - for ( File = 0; ; v136 = File ) + pRawDLV = malloc(header.uDecompressedSize); + if (header.uCompressedSize == header.uDecompressedSize) + fread(pRawDLV, 1, header.uCompressedSize, File); + else if (header.uCompressedSize < header.uDecompressedSize) { - v137 = v6->ptr_0002B8_sector_lrdata; - File = (FILE *)((char *)File + 116); - ++v245; - *(int *)((char *)&v136[2]._bufsiz + (int)v135) = (int)((char *)v137 + (int)Src); - v135 = v6->pSectors; - Src = (BLVFace *)((char *)Src + 2 * *(short *)((char *)&v136[2]._charbuf + (int)v135)); - if ( v245 >= v6->uNumSectors ) - break; + auto pTmpMem = malloc(header.uCompressedSize); + { + fread(pTmpMem, header.uCompressedSize, 1, File); + + uint uDecompressedSize = header.uDecompressedSize; + zlib::MemUnzip(pRawDLV, &uDecompressedSize, pTmpMem, header.uCompressedSize); + + if (uDecompressedSize != header.uDecompressedSize) + Log::Warning(L"uDecompressedSize != header.uDecompressedSize in DLV"); + } + free(pTmpMem); + } + else + MessageBoxW(nullptr, L"Can't load file!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Polydata.cpp:1108", 0); + + pData = (char *)pRawDLV; + } + + memcpy(&dlv, pData, 40); + pData += 40; + + //v152 = dlv.uNumFacesInBModels; + if (dlv.uNumFacesInBModels) + { + //v153 = dlv.uNumDecorations; + if (dlv.uNumDecorations) + { + if (dlv.uNumFacesInBModels != uNumFaces || + dlv.uNumDecorations != uNumLevelDecorations) + _v244 = true; } } - pGameLoadingUI_ProgressBar->Progress(); - memcpy(&v6->uNumDoors, v134, 4u); - v138 = (char *)v134 + 4; - pGameLoadingUI_ProgressBar->Progress(); - memcpy(&uNumLevelDecorations, v138, 4u); - v138 = (char *)v138 + 4; - pGameLoadingUI_ProgressBar->Progress(); - v245 = 32 * uNumLevelDecorations; - memcpy(pLevelDecorations, v138, 32 * uNumLevelDecorations); - v139 = (char *)v138 + v245; - v245 = 0; - if ( (signed int)uNumLevelDecorations > 0 ) + + if (dword_6BE364_game_settings_1 & 0x2000 ) + _i = 29030400; + bool _a = false; + if ( a3 - dlv.uLastRepawnDay >= _i && strcmpi(pCurrentMapName, "d29.dlv") ) + _a = true; + + //v154 = 875; + if (_v244) { - File = (FILE *)pLevelDecorations; - do - { - memcpy(pName, v139, 0x20u); - v139 = (char *)v139 + 32; - v140 = pDecorationList->GetDecorIdByName(pName); - v141 = File; - ++v245; - ++File; - LOWORD(v141->_ptr) = v140; - } - while ( v245 < (signed int)uNumLevelDecorations ); - } - pGameLoadingUI_ProgressBar->Progress(); - memcpy(&v6->uNumLights, v139, 4u); - v142 = (char *)v139 + 4; - pGameLoadingUI_ProgressBar->Progress(); - v202 = 16 * v6->uNumLights; - v201 = (const char *)v142; - v200 = (size_t)v6->pLights; - v245 = v202; - memcpy((void *)v200, v142, v202); - v143 = (char *)v142 + v245; - pGameLoadingUI_ProgressBar->Progress(); - memcpy(&v6->uNumNodes, v143, 4u); - v143 = (char *)v143 + 4; - pGameLoadingUI_ProgressBar->Progress(); - v202 = 8 * v6->uNumNodes; - v201 = (const char *)v143; - v200 = (size_t)v6->pNodes; - v245 = v202; - memcpy((void *)v200, v143, v202); - v144 = (char *)v143 + v245; - pGameLoadingUI_ProgressBar->Progress(); - memcpy(&v6->uNumSpawnPoints, v144, 4u); - v144 = (char *)v144 + 4; - pGameLoadingUI_ProgressBar->Progress(); - v145 = v6->uNumSpawnPoints; - v202 = (int)"Spawn"; - v201 = (const char *)(24 * v145); - v200 = (size_t)v6->pSpawnPoints; - v146 = pAllocator->AllocNamedChunk((const void *)v200, 24 * v145, "Spawn"); - v147 = v6->uNumSpawnPoints; - v6->pSpawnPoints = (SpawnPointMM7 *)v146; - v245 = 24 * v147; - memcpy(v146, v144, 24 * v147); - v148 = (int)((char *)v144 + v245); - pGameLoadingUI_ProgressBar->Progress(); - v202 = 4; - v201 = (const char *)v148; - v200 = (size_t)v6->pMapVertices; - memcpy((void *)v200, (const void *)v148, 4u); - v149 = v6->pMapVertices; - v199 = 12 * *v149; - memcpy(v149 + 1, (const void *)(v148 + 4), v199); - free(ptr); - v202 = (int)".dlv"; - v150 = strlen(pFilename); - strcpy(&v238[v150], (const char *)v202); - v245 = (int)pNew_LOD->FindContainer(pFilename, 1); - fread(&header, 0x10u, 1u, (FILE *)v245); - v244 = 0; - if ( header.uVersion != 91969 - || header.pMagic[0] != 'm' - || header.pMagic[1] != 'v' - || header.pMagic[2] != 'i' - || header.pMagic[3] != 'i' ) - { - MessageBoxW(nullptr, L"Can't load file!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Polydata.cpp:1090", 0); - v244 = (BLVSector *)1; - } - v151 = header.uCompressedSize; - Count = header.uDecompressedSize; - Src = 0; - File = 0; - if ( !v244 ) - { - Src = (BLVFace *)malloc(header.uDecompressedSize); - File = (FILE *)Src; - if ( v151 <= Count ) - { - if ( v151 == Count ) - { - fread(Src, 1u, Count, (FILE *)v245); - } - else - { - *(int *)((char *)&uSourceLen + 1) = (int)malloc(v151); - fread(*(void **)((char *)&uSourceLen + 1), v151, 1u, (FILE *)v245); - zlib::MemUnzip(Src, &Count, *(const void **)((char *)&uSourceLen + 1), v151); - free(*(void **)((char *)&uSourceLen + 1)); - } - } - else - { - MessageBoxW(nullptr, L"Can't load file!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Polydata.cpp:1108", 0); - } - memcpy(&v6->dlv, Src, 0x28u); - Src = (BLVFace *)((char *)Src + 40); - } - v152 = v6->dlv.uNumFacesInBModels; - if ( v152 ) - { - v153 = v6->dlv.uNumDecorations; - if ( v153 ) - { - if ( v152 != pIndoor->uNumFaces || v153 != uNumLevelDecorations ) - v244 = (BLVSector *)1; - } - } - if ( BYTE1(dword_6BE364_game_settings_1) & 0x20 ) - i = 29030400; - *(int *)((char *)&uSourceLen + 1) = 0; - if ( a3 - v6->dlv.uLastRepawnDay >= i && _strcmpi(pCurrentMapName, "d29.dlv") ) - *(int *)((char *)&uSourceLen + 1) = 1; - v154 = 875; - if ( v244 ) - { - memset(v203, 0, 0x36Bu); + memset(v203, 0, 0x36B); goto LABEL_132; } - if ( *(int *)((char *)&uSourceLen + 1) || !v6->dlv.uLastRepawnDay ) + if (_a || !dlv.uLastRepawnDay ) { - memcpy(v203, Src, 0x36Bu); + memcpy(v203, pData, 0x36B); LABEL_132: free(File); - v11 = v244 == (BLVSector *)1; - v6->dlv.uLastRepawnDay = a3; - if ( v11 ) - ++v6->dlv.uNumRespawns; - v202 = 0; - v201 = pFilename; + dlv.uLastRepawnDay = a3; + if (_v244) + ++dlv.uNumRespawns; + //v201 = pFilename; *(int *)pDest = 1; - v245 = (int)pGames_LOD->FindContainer(v201, v202); - fread(&header, 0x10u, 1u, (FILE *)v245); - v155 = header.uCompressedSize; - Count = header.uDecompressedSize; - Src = (BLVFace *)malloc(header.uDecompressedSize); + File = pGames_LOD->FindContainer(pFilename, 0); + fread(&header, 0x10u, 1u, File); + auto v155 = header.uCompressedSize; + auto Count = header.uDecompressedSize; + auto Src = (BLVFace *)malloc(header.uDecompressedSize); File = (FILE *)Src; if ( v155 <= Count ) { if ( v155 == Count ) { - fread(Src, 1u, Count, (FILE *)v245); + fread(Src, 1u, Count, File); } else { - *(int *)((char *)&uSourceLen + 1) = (int)malloc(v155); - fread(*(void **)((char *)&uSourceLen + 1), v155, 1u, (FILE *)v245); - zlib::MemUnzip(Src, &Count, *(const void **)((char *)&uSourceLen + 1), v155); - free(*(void **)((char *)&uSourceLen + 1)); + auto _uSourceLen = malloc(v155); + fread(_uSourceLen, v155, 1u, File); + zlib::MemUnzip(Src, &Count, _uSourceLen, v155); + free(_uSourceLen); } } else { MessageBoxW(nullptr, L"Can't load file!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Polydata.cpp:1195", 0); } - Src = (BLVFace *)((char *)Src + 40); - v154 = 875; + pData = ((char *)Src + 40); + //v154 = 875; goto LABEL_140; } *(int *)pDest = 0; LABEL_140: - v202 = (int)".blv"; - v156 = strlen(pFilename); - strcpy(&v238[v156], (const char *)v202); - memcpy(v6->_visible_outlines, Src, v154); - Src = (BLVFace *)((char *)Src + v154); + //v202 = (int)".blv"; + //v156 = strlen(pFilename); + strcpy(&pFilename[strlen(pFilename) - 4], ".blv"); + memcpy(_visible_outlines, pData, 875); + pData += 875; + if ( *(int *)pDest ) - memcpy(v6->_visible_outlines, v203, v154); - v157 = 0; - if ( (signed int)*pIndoor->pMapVertices > 0 ) + memcpy(_visible_outlines, v203, 875); + + for (uint i = 0; i < pMapVertices->uNumVertices; ++i) { - Argsk = 0; - do - { - if ( (unsigned __int8)(1 << (7 - v157 % 8)) & v6->_visible_outlines[v157 / 8] ) - BYTE2(v6->pMapVertices[Argsk + 3]) |= 1u; - Argsk += 3; - ++v157; - } - while ( v157 < (signed int)*pIndoor->pMapVertices ); + auto pVertex = pMapVertices->pVertices + i; + if ((unsigned __int8)(1 << (7 - i % 8)) & _visible_outlines[i / 8]) + pVertex->uFlags |= 1; } - v245 = 0; - if ( (signed int)v6->uNumFaces > 0 ) + + + for (uint i = 0; i < uNumFaces; ++i) { - v158 = 0; - do + auto pFace = pFaces + i; + auto pFaceExtra = pFaceExtras + pFace->uFaceExtraID; + + memcpy(&pFace->uAttributes, pData, 4); + pData += 4; + + if (pFaceExtra->uEventID) { - v200 = (size_t)&v6->pFaces[v158].uAttributes; - memcpy((void *)v200, Src, 4u); - v159 = v6->pFaces; - v160 = v6->pFaceExtras; - Src = (BLVFace *)((char *)Src + 4); - v161 = &v160[v159[v158].uFaceExtraID]; - if ( v161->uEventID ) - { - if ( v161->HasEventint() ) - BYTE2(v6->pFaces[v158].uAttributes) |= 0x10u; - else - BYTE2(v6->pFaces[v158].uAttributes) &= 0xEFu; - } - ++v245; - ++v158; + if (pFaceExtra->HasEventint()) + pFace->uAttributes |= 0x100000; + else + pFace->uAttributes &= ~0x100000; } - while ( v245 < (signed int)v6->uNumFaces ); } + pGameLoadingUI_ProgressBar->Progress(); - v162 = 0; - if ( (signed int)uNumLevelDecorations > 0 ) + + for (uint i = 0; i < uNumLevelDecorations; ++i) { - Argsl = &pLevelDecorations[0].field_2; - do - { - memcpy(Argsl, Src, 2u); - Src = (BLVFace *)((char *)Src + 2); - Argsl = (char *)Argsl + 32; - ++v162; - } - while ( v162 < (signed int)uNumLevelDecorations ); + memcpy(&pLevelDecorations[i].field_2, pData, 2); + pData += 2; } - pGameLoadingUI_ProgressBar->Progress(); - memcpy(&uNumActors, Src, 4u); - Src = (BLVFace *)((char *)Src + 4); + pGameLoadingUI_ProgressBar->Progress(); - v163 = 836 * uNumActors; - memcpy(pActors, Src, 836 * uNumActors); - Src = (BLVFace *)((char *)Src + v163); + + memcpy(&uNumActors, pData, 4); + memcpy(pActors, pData + 4, uNumActors * sizeof(Actor)); + pData += 4 + uNumActors * sizeof(Actor); + + pGameLoadingUI_ProgressBar->Progress(); + pGameLoadingUI_ProgressBar->Progress(); + + memcpy(&uNumLayingItems, pData, 4); + memcpy(pLayingItems, pData + 4, uNumLayingItems * sizeof(LayingItem)); + pData += 4 + uNumLayingItems * sizeof(LayingItem); + pGameLoadingUI_ProgressBar->Progress(); - memcpy(&uNumLayingItems, Src, 4u); - Src = (BLVFace *)((char *)Src + 4); - pGameLoadingUI_ProgressBar->Progress(); - v164 = 112 * uNumLayingItems; - memcpy(pLayingItems, Src, 112 * uNumLayingItems); - Src = (BLVFace *)((char *)Src + v164); - if ( (signed int)uNumLayingItems > 0 ) + + for (uint i = 0; i < uNumLayingItems; ++i) { - v165 = pObjectList->uNumObjects; - v166 = (char *)&pLayingItems[0].stru_24; - i = uNumLayingItems; - do + auto pItem = pLayingItems + i; + + if (pItem->stru_24.uItemID && !(pItem->uAttributes & 0x0100)) { - if ( *(int *)v166 && !(*(v166 - 9) & 1) ) - { - Argsm = 0; - v167 = pItemsTable->pItems[*(int *)v166].uSpriteID; - *((short *)v166 - 18) = v167; - if ( (signed int)v165 <= 0 ) + pItem->uItemType = pItemsTable->pItems[pItem->stru_24.uItemID - 1].uSpriteID; + + uint uObjectID = 0; + for (uint j = 0; j < pObjectList->uNumObjects; ++j) + if (pItem->uItemType == pObjectList->pObjects[j].uObjectID) { -LABEL_165: - v168 = 0; - } - else - { - pDest = (char *)&pObjectList->pObjects->uObjectID; - while ( v167 != *(short *)pDest ) - { - ++Argsm; - pDest += 56; - if ( Argsm >= (signed int)v165 ) - goto LABEL_165; - } - v168 = Argsm; + pItem->uObjectDescID = j; + break; } - *((short *)v166 - 17) = v168; - } - v166 += 112; - --i; } - while ( i ); } - pGameLoadingUI_ProgressBar->Progress(); - memcpy(&uNumChests, Src, 4u); - Src = (BLVFace *)((char *)Src + 4); + pGameLoadingUI_ProgressBar->Progress(); - v169 = 5324 * uNumChests; - memcpy(pChests, Src, 5324 * uNumChests); - Src = (BLVFace *)((char *)Src + v169); + + memcpy(&uNumChests, pData, 4); + memcpy(pChests, pData + 4, uNumChests * sizeof(Chest)); + pData += 4 + uNumChests * sizeof(Chest); + + pGameLoadingUI_ProgressBar->Progress(); pGameLoadingUI_ProgressBar->Progress(); - v202 = 16000; - v201 = (const char *)Src; - v200 = (size_t)v6->pDoors; - memcpy((void *)v200, Src, 0x3E80u); - Src = (BLVFace *)((char *)Src + 16000); - v202 = (int)"L.DData"; - v201 = (const char *)v6->blv.uDoors_ddata_Size; - v200 = (size_t)v6->ptr_0002B4_doors_ddata; - v170 = pAllocator->AllocNamedChunk((const void *)v200, (unsigned int)v201, "L.DData"); - v171 = v6->blv.uDoors_ddata_Size; - v6->ptr_0002B4_doors_ddata = (unsigned __int16 *)v170; - memcpy(v170, Src, v171); - Src = (BLVFace *)((char *)Src + v171); - v172 = 0; - v11 = v6->uNumDoors == 0; - v12 = v6->uNumDoors < 0; - v245 = 0; - if ( !(v12 | v11) ) + + memcpy(pDoors, pData, 0x3E80); + pData += 0x3E80; + + //v201 = (const char *)blv.uDoors_ddata_Size; + //v200 = (size_t)ptr_0002B4_doors_ddata; + //v170 = pAllocator->AllocNamedChunk(ptr_0002B4_doors_ddata, blv.uDoors_ddata_Size, "L.DData"); + //v171 = blv.uDoors_ddata_Size; + ptr_0002B4_doors_ddata = (unsigned __int16 *)pAllocator->AllocNamedChunk(ptr_0002B4_doors_ddata, blv.uDoors_ddata_Size, "L.DData"); + memcpy(ptr_0002B4_doors_ddata, pData, blv.uDoors_ddata_Size); + pData += blv.uDoors_ddata_Size; + + //Src = (BLVFace *)((char *)Src + v171); + //v172 = 0; + //v245 = 0; + //if (uNumDoors > 0) + for (uint i = 0, j = 0; i < uNumDoors; ++i) { - v173 = v6->pDoors; + auto pDoor = pDoors + i; + + pDoor->pVertexIDs = ptr_0002B4_doors_ddata + j; + j += pDoor->uNumVertices; + + pDoor->pFaceIDs = ptr_0002B4_doors_ddata + j; + j += pDoor->uNumFaces; + + pDoor->pSectorIDs = ptr_0002B4_doors_ddata + j; + j += pDoor->field_48; + + pDoor->pDeltaUs = (short *)(ptr_0002B4_doors_ddata + j); + j += pDoor->uNumFaces; + + pDoor->pDeltaVs = (short *)(ptr_0002B4_doors_ddata + j); + j += pDoor->uNumFaces; + + pDoor->pXOffsets = ptr_0002B4_doors_ddata + j; + j += pDoor->uNumOffsets; + + pDoor->pYOffsets = ptr_0002B4_doors_ddata + j; + j += pDoor->uNumOffsets; + + pDoor->pZOffsets = ptr_0002B4_doors_ddata + j; + j += pDoor->uNumOffsets; + /*v173 = pDoors; for ( k = 0; ; v172 = v188 + 2 * *((short *)&v173[k] - 3) ) { - v173[k].pVertexIDs = (unsigned __int16 *)((char *)v6->ptr_0002B4_doors_ddata + v172); - v175 = &v6->pDoors[k]; + v173[k].pVertexIDs = (unsigned __int16 *)((char *)ptr_0002B4_doors_ddata + v172); + v175 = &pDoors[k]; v176 = v172 + 2 * v175->uNumVertices; - v175->pFaceIDs = (unsigned __int16 *)((char *)v6->ptr_0002B4_doors_ddata + v176); - v177 = &v6->pDoors[k]; + v175->pFaceIDs = (unsigned __int16 *)((char *)ptr_0002B4_doors_ddata + v176); + v177 = &pDoors[k]; v178 = v176 + 2 * v177->uNumFaces; - v177->pSectorIDs = (unsigned __int16 *)((char *)v6->ptr_0002B4_doors_ddata + v178); - v179 = &v6->pDoors[k]; + v177->pSectorIDs = (unsigned __int16 *)((char *)ptr_0002B4_doors_ddata + v178); + v179 = &pDoors[k]; v180 = v178 + 2 * v179->field_48; - v179->pDeltaUs = (__int16 *)((char *)v6->ptr_0002B4_doors_ddata + v180); - v181 = &v6->pDoors[k]; + v179->pDeltaUs = (__int16 *)((char *)ptr_0002B4_doors_ddata + v180); + v181 = &pDoors[k]; v182 = v180 + 2 * v181->uNumFaces; - v181->pDeltaVs = (__int16 *)((char *)v6->ptr_0002B4_doors_ddata + v182); - v183 = &v6->pDoors[k]; + v181->pDeltaVs = (__int16 *)((char *)ptr_0002B4_doors_ddata + v182); + v183 = &pDoors[k]; v184 = v182 + 2 * v183->uNumFaces; - v183->pXOffsets = (unsigned __int16 *)((char *)v6->ptr_0002B4_doors_ddata + v184); - v185 = &v6->pDoors[k]; + v183->pXOffsets = (unsigned __int16 *)((char *)ptr_0002B4_doors_ddata + v184); + v185 = &pDoors[k]; v186 = v184 + 2 * v185->uNumOffsets; - v185->pYOffsets = (unsigned __int16 *)((char *)v6->ptr_0002B4_doors_ddata + v186); - v187 = &v6->pDoors[k]; + v185->pYOffsets = (unsigned __int16 *)((char *)ptr_0002B4_doors_ddata + v186); + v187 = &pDoors[k]; ++k; v188 = v186 + 2 * v187->uNumOffsets; - v189 = (unsigned __int16 *)((char *)v6->ptr_0002B4_doors_ddata + v188); + v189 = (unsigned __int16 *)((char *)ptr_0002B4_doors_ddata + v188); ++v245; v187->pZOffsets = v189; - v173 = v6->pDoors; - if ( v245 >= v6->uNumDoors ) + v173 = pDoors; + if ( v245 >= uNumDoors ) break; - } + }*/ } - v190 = 0; - v11 = v6->uNumDoors == 0; - v12 = v6->uNumDoors < 0; - v245 = 0; - if ( !(v12 | v11) ) + //v190 = 0; + //v245 = 0; + for (uint i = 0; i < uNumDoors; ++i) { - v191 = v6->pDoors; - pDest = 0; - do + auto pDoor = pDoors + i; + + for (uint j = 0; j < pDoor->uNumFaces; ++j) { - Argsn = 0; + auto pFace = pFaces + pDoor->pFaceIDs[j]; + auto pFaceExtra = pFaceExtras + pFace->uFaceExtraID; + + pDoor->pDeltaUs[j] = pFaceExtra->sTextureDeltaU; + pDoor->pDeltaVs[j] = pFaceExtra->sTextureDeltaV; + } + //v191 = pDoors; + //pDest = 0; + //do + // { + /*Argsn = 0; for ( l = (BLVDoor *)&v190[(int)v191]; Argsn < *(short *)&v190[(int)v191 + 70]; l = (BLVDoor *)&v190[(int)v191] ) { v193 = Argsn; v194 = l->pFaceIDs[Argsn++]; - v195 = &v6->pFaceExtras[v6->pFaces[v194].uFaceExtraID]; + v195 = &pFaceExtras[pFaces[v194].uFaceExtraID]; l->pDeltaUs[v193] = v195->sTextureDeltaU; v190 = pDest; - *(short *)(v193 * 2 + *(int *)&pDest[(unsigned int)v6->pDoors + 52]) = v195->sTextureDeltaV; - v191 = v6->pDoors; + *(short *)(v193 * 2 + *(int *)&pDest[(unsigned int)pDoors + 52]) = v195->sTextureDeltaV; + v191 = pDoors; } ++v245; v190 += 80; - pDest = v190; - } - while ( v245 < v6->uNumDoors ); + pDest = v190;*/ + //} + //while ( v245 < uNumDoors ); } + + pGameLoadingUI_ProgressBar->Progress(); - v196 = Src; - memcpy(&stru_5E4C90, Src, 0xC8u); + + memcpy(&stru_5E4C90, pData, 0xC8); + pData += 0xC8; + pGameLoadingUI_ProgressBar->Progress(); - memcpy(&v6->uLastVisitDay, &v196[2].pFacePlane.vNormal.z, 0x38u); - free(File); - v5 = 0; -LABEL_179: - pSoundList->_4A9A67(64, v5); - pSoundList->_4A9A67(103, v5); - pSoundList->_4A9A67(63, v5); - pSoundList->_4A9A67(102, v5); - pSoundList->_4A9A67(50, v5); - pSoundList->_4A9A67(89, v5); + + memcpy(&stru1, pData, 0x38u); + pData += 0x38; + + free(pRawDLV); + //v5 = 0; + + pSoundList->_4A9A67(64, 0); + pSoundList->_4A9A67(103, 0); + pSoundList->_4A9A67(63, 0); + pSoundList->_4A9A67(102, 0); + pSoundList->_4A9A67(50, 0); + pSoundList->_4A9A67(89, 0); + return 0; }
--- a/Indoor.h Tue Oct 16 01:31:05 2012 +0200 +++ b/Indoor.h Tue Oct 16 19:31:34 2012 +0200 @@ -362,9 +362,24 @@ #pragma pack(pop) +#pragma pack(push, 1) +struct BLVMapVertices +{ + uint uNumVertices; + BLVMapVertex pVertices[1]; +}; +#pragma pack(pop) +#pragma pack(push, 1) +struct IndoorLocation_stru1 +{ + unsigned __int64 uLastVisitDay; + char field_2F4[48]; +}; +#pragma pack(pop) + /* 89 */ @@ -422,7 +437,7 @@ struct BLVDoor *pDoors; unsigned int uNumNodes; struct BSPNode *pNodes; - unsigned int *pMapVertices; + BLVMapVertices *pMapVertices; unsigned __int16 *ptr_2AC; unsigned __int16 *ptr_0002B0_sector_rdata; unsigned __int16 *ptr_0002B4_doors_ddata; @@ -430,8 +445,7 @@ unsigned int uNumSpawnPoints; struct SpawnPointMM7 *pSpawnPoints; struct DDM_DLV_Header dlv; - unsigned __int64 uLastVisitDay; - char field_2F4[48]; + IndoorLocation_stru1 stru1; char _visible_outlines[876]; }; #pragma pack(pop)
--- a/Outdoor.cpp Tue Oct 16 01:31:05 2012 +0200 +++ b/Outdoor.cpp Tue Oct 16 19:31:34 2012 +0200 @@ -29,7 +29,7 @@ -OutdoorLocation *pOutdoor; +OutdoorLocation *pOutdoor = new OutdoorLocation; OutdoorCamera *pOutdoorCamera;
--- a/SaveLoad.cpp Tue Oct 16 01:31:05 2012 +0200 +++ b/SaveLoad.cpp Tue Oct 16 19:31:34 2012 +0200 @@ -351,7 +351,7 @@ pParty->sRotationY = pParty->sPrevRotationY; pParty->sRotationX = pParty->sPrevRotationX; if ( uCurrentlyLoadedLevelType == LEVEL_Indoor ) - pIndoor->uLastVisitDay = pParty->uTimePlayed; + pIndoor->stru1.uLastVisitDay = pParty->uTimePlayed; else pOutdoor->uLastVisitDay = pParty->uTimePlayed; v3 = MakeScreenshot(150, 112); @@ -543,7 +543,7 @@ v16 = (char *)v15 + pIndoor->blv.uDoors_ddata_Size; memcpy(v16, &stru_5E4C90, 0xC8u); v17 = (int)((char *)v16 + 200); - memcpy((void *)v17, &pIndoor->uLastVisitDay, 0x38u); + memcpy((void *)v17, &pIndoor->stru1, 0x38u); } else {
--- a/mm7_2.cpp Tue Oct 16 01:31:05 2012 +0200 +++ b/mm7_2.cpp Tue Oct 16 19:31:34 2012 +0200 @@ -11685,21 +11685,21 @@ } //----- (00460706) -------------------------------------------------------- -void __cdecl TryLoadLevelFromLOD() +void TryLoadLevelFromLOD() { FILE *v0; // eax@1 FILE *v1; // esi@1 __int32 v2; // edi@2 char Ext[256]; // [sp+4h] [bp-40Ch]@1 - char Dir; // [sp+104h] [bp-30Ch]@1 + char Dir[256]; // [sp+104h] [bp-30Ch]@1 char Filename[256]; // [sp+204h] [bp-20Ch]@1 char a1[260]; // [sp+304h] [bp-10Ch]@1 - char Drive; // [sp+408h] [bp-8h]@1 + char Drive[4]; // [sp+408h] [bp-8h]@1 int DstBuf; // [sp+40Ch] [bp-4h]@2 strcpy(a1, pCurrentMapName); - _splitpath(a1, &Drive, &Dir, Filename, Ext); - sprintfex(a1, "levels\\%s%s", Filename, ".lod"); + _splitpath(a1, Drive, Dir, Filename, Ext); + sprintf(a1, "levels\\%s%s", Filename, ".lod"); v0 = fopen(a1, "rb"); v1 = v0; if ( v0 ) @@ -11875,7 +11875,7 @@ bNoNPCHiring = 0; v38 = 0; pDest = 1; - uCurrentlyLoadedLevelType = (LEVEL_TYPE)1; + uCurrentlyLoadedLevelType = LEVEL_Indoor; pGame->uFlags2 &= 0xFFFFFFF7u; if ( Is_out15odm_underwater() ) { @@ -11910,19 +11910,19 @@ uNumStationaryLightsApplied = 0; v4 = pIndoor->Load( pCurrentMapName, - (unsigned int)(signed __int64)((double)(signed __int64)pParty->uTimePlayed * 0.234375) / 0x3C / 0x3C / 0x18 + 1, + (unsigned int)(signed __int64)((double)pParty->uTimePlayed * 0.234375) / 60 / 60 / 24 + 1, v1, (char *)&pDest) - 1; if ( !v4 ) { - sprintfex(&Args, "Unable to open %s", pCurrentMapName); + sprintf(&Args, "Unable to open %s", pCurrentMapName); Abortf(&Args); } v5 = v4 - 1; if ( !v5 ) { - sprintfex(&Args, "File %s is not a BLV File", pCurrentMapName); + sprintf(&Args, "File %s is not a BLV File", pCurrentMapName); Abortf(&Args); } v6 = v5 - 1; @@ -11930,7 +11930,7 @@ Abortf("Attempt to open new level before clearing old"); if ( v6 == 1 ) Abortf("Out of memory loading indoor level"); - if ( !(BYTE1(dword_6BE364_game_settings_1) & 0x20) ) + if ( !(dword_6BE364_game_settings_1 & 0x2000) ) { UpdateActors(); UpdateLayingItems(); @@ -13445,7 +13445,7 @@ { int v2; // esi@1 char *v3; // eax@1 - char *v4; // eax@1 + //char *v4; // eax@1 unsigned int v5; // eax@3 size_t v6; // ecx@10 char *v7; // eax@11 @@ -13466,13 +13466,10 @@ _strrev(Str1); strtok(Str1, "."); _strrev(Str1); - v4 = (char *)&pLayingItems[0].uObjectDescID; - do - { - *(short *)v4 = 0; - v4 += 112; - } - while ( (signed int)v4 < (signed int)((char *)&pObjectList->uNumObjects + 2) ); + + for (uint i = 0; i < 1000; ++i) + pLayingItems[i].uObjectDescID = 0; + v5 = pMapStats->GetMapInfo(pCurrentMapName); bUnderwater = 0; uLevelMapStatsID = v5;
--- a/mm7_3.cpp Tue Oct 16 01:31:05 2012 +0200 +++ b/mm7_3.cpp Tue Oct 16 19:31:34 2012 +0200 @@ -39,6 +39,7 @@ #include "stru176.h" #include "stru159.h" #include "stru298.h" +#include "Log.h" #include "mm7_data.h" @@ -14800,13 +14801,13 @@ pRenderer->FillRect2(v6, a2, a3, uZ - a2, v6, 0xFu); uNumBlueFacesInBLVMinimap = 0; uZa = 0; - if ( (signed int)*pIndoor->pMapVertices > 0 ) + if ( (signed int)pIndoor->pMapVertices->uNumVertices > 0 ) { a2a = 0; v7 = pIndoor->pFaces; while ( 1 ) { - v8 = &pIndoor->pMapVertices[a2a + 1]; + v8 = (uint *)&pIndoor->pMapVertices->pVertices[a2a]; v9 = v7[LOWORD(pIndoor->pMapVertices[a2a + 2])].uAttributes; if ( !(BYTE1(v9) & 0x20) ) { @@ -14823,7 +14824,7 @@ LABEL_26: ++uZa; a2a += 3; - if ( uZa >= (signed int)*pIndoor->pMapVertices ) + if ( uZa >= (signed int)pIndoor->pMapVertices->uNumVertices ) goto LABEL_27; } HIWORD(pIndoor->pMapVertices[a2a + 3]) = v11 | 1; @@ -14870,7 +14871,7 @@ LABEL_27: for ( uZb = 0; uZb < (signed int)uNumBlueFacesInBLVMinimap; ++uZb ) { - v16 = &pIndoor->pMapVertices[3 * pBlueFacesInBLVMinimapIDs[uZb] + 1]; + v16 = (uint *)&pIndoor->pMapVertices->pVertices[3 * pBlueFacesInBLVMinimapIDs[uZb]]; pRenderer->FillRect( uWidth + ((signed int)(((unsigned int)((unsigned __int64)((signed int)uZoom @@ -15341,10 +15342,10 @@ LABEL_8: black = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0, 0, 0); teal = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0, 0xFFu, 0xFFu); - v7 = pIndoor->pMapVertices; + v7 = (uint *)pIndoor->pMapVertices; uNumBlueFacesInBLVMinimap = 0; - v8 = *pIndoor->pMapVertices == 0; - v9 = (*pIndoor->pMapVertices & 0x80000000u) != 0; + v8 = pIndoor->pMapVertices->uNumVertices == 0; + v9 = (pIndoor->pMapVertices->uNumVertices & 0x80000000u) != 0; v94 = 0; if ( !(v9 | v8) ) { @@ -15387,7 +15388,7 @@ v85 + ((unsigned __int64)((v19 - v6) * (signed __int64)v5) >> 16), v90 - v92, black); - v7 = pIndoor->pMapVertices; + v7 = (uint *)pIndoor->pMapVertices; LABEL_17: ++v94; i += 12; @@ -15424,7 +15425,7 @@ ++v21; if ( v21 >= (signed int)uNumBlueFacesInBLVMinimap ) break; - v7 = pIndoor->pMapVertices; + v7 = (uint *)pIndoor->pMapVertices; } v6 = v86; } @@ -15797,11 +15798,11 @@ v14 = 0x40000000u; v17 = 0xC0000000u; v15 = 0xC0000000u; - if ( (signed int)*pIndoor->pMapVertices > 0 ) - { - v2 = (__int16 *)(pIndoor->pMapVertices + 1); - v11 = *pIndoor->pMapVertices; - v12 = pIndoor->pMapVertices + 1; + if ( (signed int)pIndoor->pMapVertices->uNumVertices > 0 ) + { + v2 = (__int16 *)(pIndoor->pMapVertices->pVertices); + v11 = pIndoor->pMapVertices->uNumVertices; + v12 = (uint *)pIndoor->pMapVertices->pVertices; do { v3 = &pIndoor->pVertices[*v2]; @@ -16204,10 +16205,10 @@ void __cdecl LoadLevel_InitializeLevelStr() { signed __int16 v0; // si@1 - unsigned int v1; // ecx@1 + //unsigned int v1; // ecx@1 signed int v2; // edi@1 int v3; // edx@1 - int v4; // eax@2 + //int v4; // eax@2 int v5; // ebx@4 int v6; // ebx@11 int v7; // eax@12 @@ -16215,30 +16216,28 @@ char Args[100]; // [sp+Ch] [bp-68h]@9 int v10; // [sp+70h] [bp-4h]@1 - v0 = 0; + if (sizeof(pLevelStrOffsets) != 0x7D0) + Log::Warning(L"pLevelStrOffsets: deserialization warning"); memset(pLevelStrOffsets, 0, 0x7D0u); - v1 = uLevelStrFileSize; + + v0 = 0; + //v1 = uLevelStrFileSize; v2 = 1; v3 = 0; v10 = 0; - if ( (signed int)uLevelStrFileSize > 0 ) - { - v4 = 0; - do - { - if ( !pLevelStr[v4] ) + //v4 = 0; + for (uint i = 0; i < uLevelStrFileSize; ++i) + { + if ( !pLevelStr[i] ) { v5 = (signed __int16)v2++; - pLevelStrOffsets[v5] = v4 + 1; - if ( (signed __int16)(v3 - (short)v10) > v0 ) - v0 = v3 - v10; - v10 = v3; - } - ++v3; - v4 = (signed __int16)v3; - } - while ( (signed __int16)v3 < (signed int)v1 ); - } + pLevelStrOffsets[v5] = i + 1; + if ( (signed __int16)(i - (short)v10) > v0 ) + v0 = i - v10; + v10 = i; + } + } + uLevelStrNumStrings = (signed __int16)v2 - 1; if ( v0 > 800 ) { @@ -16264,37 +16263,25 @@ //----- (00443EF8) -------------------------------------------------------- void __cdecl LoadLevel_InitializeLevelEvt() { - int v0; // esi@1 - unsigned int v1; // edx@2 - int v2; // eax@2 - unsigned int v3; // ecx@2 - - v0 = 0; - if ( uLevelEVT_Size ) - { - memset(array_5B5928, 0, 0xC80u); - uLevelEVT_NumEvents = 0; - dword_5B65C8 = 0; - memset(pLevelEVT_Events, 128, 0xCE40u); - v1 = uLevelEVT_NumEvents; - v2 = 0; - v3 = 12 * uLevelEVT_NumEvents + 5989852; - do - { - ++v1; - *(int *)(v3 - 4) = (unsigned __int8)pLevelEVT[v2 + 1] + ((unsigned __int8)pLevelEVT[v2 + 2] << 8); - *(int *)v3 = (unsigned __int8)pLevelEVT[v2 + 3]; - *(int *)(v3 + 4) = v2; - LOWORD(v2) = (unsigned __int8)pLevelEVT[v2]; - v3 += 12; - v0 += v2 + 1; - v2 = (signed __int16)v0; - } - while ( (signed __int16)v0 < (signed int)uLevelEVT_Size ); - uLevelEVT_NumEvents = v1; - } -} -// 5B65C8: using guessed type int dword_5B65C8; + if (!uLevelEVT_Size) + return; + + memset(array_5B5928, 0, 0xC80u); + memset(pLevelEVT_Events, 128, 0xCE40u); + + uLevelEVT_NumEvents = 0; + dword_5B65C8 = 0; + + for (uint i = 0, j = 0; j < uLevelEVT_Size; ++i) + { + pLevelEVT_Events[i].uEventID = pLevelEVT[j + 1] + ((unsigned short)pLevelEVT[j + 2] << 8); + pLevelEVT_Events[i].field_4 = pLevelEVT[j + 3]; + pLevelEVT_Events[i].uEventOffsetInEVT = j; + j += pLevelEVT[j] + 1; + + uLevelEVT_NumEvents++; + } +} //----- (00443F95) -------------------------------------------------------- void __cdecl OnMapLeave() @@ -16404,7 +16391,7 @@ v20 = pOutdoor->uLastVisitDay; v3 = &array_5B5928[dword_5B65C8]; if ( uCurrentlyLoadedLevelType == LEVEL_Indoor ) - v20 = pIndoor->uLastVisitDay; + v20 = pIndoor->stru1.uLastVisitDay; v4 = (unsigned __int8)pLevelEVT[(int)v0 + 4]; WORD2(v0) = LOWORD(v2->uEventID); *(short *)&v3->field_18[4] = v4; @@ -16524,15 +16511,14 @@ //----- (00444360) -------------------------------------------------------- void __thiscall Level_LoadEvtAndStr(const char *pLevelName) { - const char *v1; // edi@1 char pContainerName[120]; // [sp+8h] [bp-98h]@1 - v1 = pLevelName; - sprintfex(pContainerName, "%s.evt", pLevelName); + sprintf(pContainerName, "%s.evt", pLevelName); uLevelEVT_Size = LoadEventsToBuffer(pContainerName, pLevelEVT, 0x2400u); - sprintfex(pContainerName, "%s.str", v1); + + sprintf(pContainerName, "%s.str", pLevelName); uLevelStrFileSize = LoadEventsToBuffer(pContainerName, pLevelStr, 0x2400u); - if ( uLevelStrFileSize ) + if (uLevelStrFileSize) LoadLevel_InitializeLevelStr(); }