Mercurial > might-and-magic-trilogy
changeset 53:fd2fd234a66c
BLV minimap: 2/3
author | Nomad |
---|---|
date | Wed, 24 Oct 2012 17:33:46 +0200 |
parents | 0f4ed4f0f472 |
children | 1f161a887c69 41cbaabde2cb |
files | Indoor.cpp Indoor.h mm7_2.cpp mm7_3.cpp |
diffstat | 4 files changed, 79 insertions(+), 90 deletions(-) [+] |
line wrap: on
line diff
--- a/Indoor.cpp Wed Oct 24 17:02:44 2012 +0200 +++ b/Indoor.cpp Wed Oct 24 17:33:46 2012 +0200 @@ -1733,7 +1733,7 @@ pAllocator->FreeChunk(v1->pLights); pAllocator->FreeChunk(v1->pDoors); pAllocator->FreeChunk(v1->pNodes); - pAllocator->FreeChunk(v1->pMapVertices); + pAllocator->FreeChunk(v1->pMapOutlines); v1->pVertices = 0; v1->pFaces = 0; v1->pFaceExtras = 0; @@ -1741,7 +1741,7 @@ v1->pLights = 0; v1->pDoors = 0; v1->pNodes = 0; - v1->pMapVertices = 0; + v1->pMapOutlines = 0; v1->bLoaded = 0; } @@ -1787,11 +1787,11 @@ v13 = v1->pNodes; v1->pDoors = (BLVDoor *)v12; v14 = pAllocator->AllocNamedChunk(v13, 0x9C40u, "L.BSP"); - v15 = v1->pMapVertices; + v15 = v1->pMapOutlines; v1->pNodes = (BSPNode *)v14; v16 = pAllocator->AllocNamedChunk(v15, 0x14824u, "L.Map"); v17 = v1->pVertices; - v1->pMapVertices = (BLVMapVertices *)v16; + v1->pMapOutlines = (BLVMapOutlines *)v16; if ( v17 && v1->pFaces && v1->pFaceExtras && v1->pSectors && v1->pLights && v1->pDoors && v1->pNodes && v16 ) { memset(v17, 90000, 0); @@ -1801,7 +1801,7 @@ memset(v1->pLights, 6400, 0); memset(v1->pDoors, 16000, 0); memset(v1->pNodes, 40000, 0); - memset(v1->pMapVertices, 84004, 0); + memset(v1->pMapOutlines, 84004, 0); result = 1; } else @@ -2461,7 +2461,7 @@ fseek(v7, v234, 0); fread(&uLastVisitDay, 1u, 0x38u, v7); fseek(v7, v223, 0); - v80 = (void **)&pMapVertices; + v80 = (void **)&pMapOutlines; fread(*v80, 4u, 1u, v7); fread((char *)*v80 + 4, 0xCu, *(int *)*v80, v7); fclose(v7); @@ -2550,6 +2550,7 @@ assert(sizeof(LayingItem) == 112); assert(sizeof(Chest) == 5324); assert(sizeof(stru123) == 0xC8); + assert(sizeof(BLVMapOutline) == 12); bLoaded = true; @@ -2835,10 +2836,10 @@ pGameLoadingUI_ProgressBar->Progress(); //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; + //v200 = (size_t)pMapOutlines; + memcpy(&pMapOutlines->uNumOutlines, pData, 4); + memcpy(pMapOutlines->pOutlines, pData + 4, pMapOutlines->uNumOutlines * sizeof(BLVMapOutline)); + //v149 = pMapOutlines; //v199 = 12 * *v149; //memcpy(v149 + 1, (const void *)(v148 + 4), v199); free(pRawBLV); @@ -2959,9 +2960,9 @@ if ( *(int *)pDest ) memcpy(_visible_outlines, v203, 875); - for (uint i = 0; i < pMapVertices->uNumVertices; ++i) + for (uint i = 0; i < pMapOutlines->uNumOutlines; ++i) { - auto pVertex = pMapVertices->pVertices + i; + auto pVertex = pMapOutlines->pOutlines + i; if ((unsigned __int8)(1 << (7 - i % 8)) & _visible_outlines[i / 8]) pVertex->uFlags |= 1; }
--- a/Indoor.h Wed Oct 24 17:02:44 2012 +0200 +++ b/Indoor.h Wed Oct 24 17:33:46 2012 +0200 @@ -238,7 +238,7 @@ /* 101 */ #pragma pack(push, 1) -struct BLVMapVertex +struct BLVMapOutline { unsigned __int16 uVertex1ID; unsigned __int16 uVertex2ID; @@ -373,10 +373,10 @@ #pragma pack(push, 1) -struct BLVMapVertices +struct BLVMapOutlines { - uint uNumVertices; - BLVMapVertex pVertices[1]; + uint uNumOutlines; + BLVMapOutline pOutlines[1]; }; #pragma pack(pop) @@ -411,7 +411,7 @@ pLights = 0; pDoors = 0; pNodes = 0; - pMapVertices = 0; + pMapOutlines = 0; uNumSpawnPoints = 0; pSpawnPoints = 0; } @@ -447,7 +447,7 @@ struct BLVDoor *pDoors; unsigned int uNumNodes; struct BSPNode *pNodes; - BLVMapVertices *pMapVertices; + BLVMapOutlines *pMapOutlines; unsigned __int16 *ptr_2AC; unsigned __int16 *ptr_0002B0_sector_rdata; unsigned __int16 *ptr_0002B4_doors_ddata;
--- a/mm7_2.cpp Wed Oct 24 17:02:44 2012 +0200 +++ b/mm7_2.cpp Wed Oct 24 17:33:46 2012 +0200 @@ -13086,8 +13086,8 @@ char *v3; // eax@1 //char *v4; // eax@1 unsigned int v5; // eax@3 - size_t v6; // ecx@10 - char *v7; // eax@11 + //size_t v6; // ecx@10 + //char *v7; // eax@11 char Str1[20]; // [sp+Ch] [bp-18h]@1 unsigned int v9; // [sp+20h] [bp-4h]@1 @@ -13127,20 +13127,13 @@ sub_461103(); if ( !_strcmpi(pCurrentMapName, "d11.blv") || !_strcmpi(pCurrentMapName, "d10.blv") ) { - __debugbreak(); - v6 = uNumActors; - if ( (signed int)uNumActors > 0 ) - { - v7 = (char *)&pActors[0].pMonsterInfo.uTreasureType; - do - { - *v7 = 0; - *(v7 - 3) = 0; - *(int *)(v7 + 59) = 0; - v7 += 836; - --v6; - } - while ( v6 ); + //spawning grounds & good analogue - no loot & exp from monsters + + for (uint i = 0; i < uNumActors; ++i) + { + pActors[i].pMonsterInfo.uTreasureType = 0; + pActors[i].pMonsterInfo.uTreasureDiceRolls = 0; + pActors[i].pMonsterInfo.uExp = 0; } } bDialogueUI_InitializeActor_NPC_ID = 0;
--- a/mm7_3.cpp Wed Oct 24 17:02:44 2012 +0200 +++ b/mm7_3.cpp Wed Oct 24 17:33:46 2012 +0200 @@ -13694,14 +13694,14 @@ void GameUI_DrawMinimap(unsigned int uX, unsigned int uY, unsigned int uZ, unsigned int uW, unsigned int uZoom, unsigned int flags) { int uHeight; // ebx@6 - unsigned int v9; // edx@9 - unsigned int v10; // ebx@10 + //unsigned int v9; // edx@9 + //unsigned int v10; // ebx@10 __int16 v11; // cx@11 - BLVFace *v12; // ecx@17 - unsigned int v13; // ecx@21 + //BLVFace *v12; // ecx@17 + //unsigned int v13; // ecx@21 unsigned int v14; // ebx@23 int v15; // eax@23 - unsigned int *v16; // ecx@28 + //unsigned int *v16; // ecx@28 __int16 v17; // di@30 double v18; // st7@30 float v19; // ST38_4@30 @@ -13906,57 +13906,51 @@ pRenderer->FillRectFast(uX, uY, uZ - uX, uHeight, 0xF); uNumBlueFacesInBLVMinimap = 0; - for (uint i = 0; i < pIndoor->pMapVertices->uNumVertices; ++i) - { - auto pMapVertex = &pIndoor->pMapVertices->pVertices[i]; - v9 = pIndoor->pFaces[pMapVertex->uFace1ID].uAttributes; - if ( !(BYTE1(v9) & 0x20) ) - { - v10 = pIndoor->pFaces[pMapVertex->uFace2ID].uAttributes; - if ( !(BYTE1(v10) & 0x20) ) - { - v11 = pMapVertex->uFlags; + for (uint i = 0; i < pIndoor->pMapOutlines->uNumOutlines; ++i) + { + auto pOutline = &pIndoor->pMapOutlines->pOutlines[i]; + + auto pFace1 = pIndoor->pFaces + pOutline->uFace1ID; + auto pFace2 = pIndoor->pFaces + pOutline->uFace2ID; + //v9 = pIndoor->pFaces[pMapVertex->uFace1ID].uAttributes; + if (~pFace1->uAttributes & 0x2000) + { + //v10 = pIndoor->pFaces[pMapVertex->uFace2ID].uAttributes; + if (~pFace2->uAttributes & 0x2000) + { + v11 = pOutline->uFlags; if ( v11 & 1 ) goto LABEL_15; - if ( (v9 & 0x80u) != 0 || (v10 & 0x80u) != 0 ) + if (pFace1->uAttributes & 0x80 || pFace2->uAttributes & 0x80u != 0 ) goto LABEL_ABC; } } continue; LABEL_ABC: - pIndoor->pMapVertices->pVertices[i].uFlags = v11 | 1; + pOutline->uFlags = v11 | 1; pIndoor->_visible_outlines[i >> 3] |= 1 << (7 - i % 8); LABEL_15: - if ( bWizardEyeActive - && uWizardEyeSkillLevel >= 3 - && ((v12 = &pIndoor->pFaces[pMapVertex->uFace1ID], v12->uAttributes & 0x2000000) || pIndoor->pFaces[pMapVertex->uFace2ID].uAttributes & 0x2000000) - && (pIndoor->pFaceExtras[v12->uFaceExtraID].uEventID || pIndoor->pFaceExtras[pIndoor->pFaces[pMapVertex->uFace2ID].uFaceExtraID].uEventID) - && (v13 = uNumBlueFacesInBLVMinimap, (signed int)uNumBlueFacesInBLVMinimap < 49) ) - { - pBlueFacesInBLVMinimapIDs[uNumBlueFacesInBLVMinimap] = i; - uNumBlueFacesInBLVMinimap = v13 + 1; - } - else - { - v69 = uCenterX - + ((signed int)(((unsigned int)((unsigned __int64)((signed int)uZoom - * (signed __int64)pIndoor->pVertices[pMapVertex->uVertex1ID].x) >> 16) << 16) + //v12 = &pIndoor->pFaces[pOutline->uFace1ID]; + if (bWizardEyeActive && uWizardEyeSkillLevel >= 3 && + (pFace1->uAttributes & 0x2000000 || pFace2->uAttributes & 0x2000000) && + (pIndoor->pFaceExtras[pFace1->uFaceExtraID].uEventID || pIndoor->pFaceExtras[pFace2->uFaceExtraID].uEventID)) + { + if (uNumBlueFacesInBLVMinimap < 49) + pBlueFacesInBLVMinimapIDs[uNumBlueFacesInBLVMinimap++] = i; + } + else + { + v69 = uCenterX + ((signed int)(((unsigned int)((unsigned __int64)(uZoom * (signed __int64)pIndoor->pVertices[pOutline->uVertex1ID].x) >> 16) << 16) - uZoom * pParty->vPosition.x) >> 16); - lPitcha = uCenterY - - ((signed int)(((unsigned int)((unsigned __int64)((signed int)uZoom - * (signed __int64)pIndoor->pVertices[pMapVertex->uVertex1ID].y) >> 16) << 16) + lPitcha = uCenterY - ((signed int)(((unsigned int)((unsigned __int64)(uZoom * (signed __int64)pIndoor->pVertices[pOutline->uVertex1ID].y) >> 16) << 16) - uZoom * pParty->vPosition.z) >> 16); - uWa = uCenterX - + ((signed int)(((unsigned int)((unsigned __int64)((signed int)uZoom - * (signed __int64)pIndoor->pVertices[pMapVertex->uVertex2ID].x) >> 16) << 16) + uWa = uCenterX + ((signed int)(((unsigned int)((unsigned __int64)(uZoom * (signed __int64)pIndoor->pVertices[pOutline->uVertex2ID].x) >> 16) << 16) - uZoom * pParty->vPosition.x) >> 16); - v14 = uCenterY - - ((signed int)(((unsigned int)((unsigned __int64)((signed int)uZoom - * (signed __int64)pIndoor->pVertices[pMapVertex->uVertex2ID].y) >> 16) << 16) + v14 = uCenterY - ((signed int)(((unsigned int)((unsigned __int64)(uZoom * (signed __int64)pIndoor->pVertices[pOutline->uVertex2ID].y) >> 16) << 16) - uZoom * pParty->vPosition.z) >> 16); - v15 = abs(pMapVertex->sZ - pParty->vPosition.y) / 8; + v15 = abs(pOutline->sZ - pParty->vPosition.y) / 8; if ( v15 > 100 ) v15 = 100; pRenderer->Line2D(v69, lPitcha, uWa, v14, viewparams->pPalette[-v15 + 200]); @@ -13966,23 +13960,24 @@ for ( uZb = 0; uZb < (signed int)uNumBlueFacesInBLVMinimap; ++uZb ) { - v16 = (uint *)&pIndoor->pMapVertices->pVertices[3 * pBlueFacesInBLVMinimapIDs[uZb]]; + //v16 = (uint *)&pIndoor->pMapOutlines->pOutlines[pBlueFacesInBLVMinimapIDs[uZb]]; + auto pOutline = &pIndoor->pMapOutlines->pOutlines[pBlueFacesInBLVMinimapIDs[uZb]]; pRenderer->Line2D( uCenterX + ((signed int)(((unsigned int)((unsigned __int64)((signed int)uZoom - * (signed __int64)pIndoor->pVertices[*(short *)v16].x) >> 16) << 16) + * (signed __int64)pIndoor->pVertices[pOutline->uVertex1ID].x) >> 16) << 16) - uZoom * pParty->vPosition.x) >> 16), uCenterY - ((signed int)(((unsigned int)((unsigned __int64)((signed int)uZoom - * (signed __int64)pIndoor->pVertices[*(short *)v16].y) >> 16) << 16) + * (signed __int64)pIndoor->pVertices[pOutline->uVertex1ID].y) >> 16) << 16) - uZoom * pParty->vPosition.z) >> 16), uCenterX + ((signed int)(((unsigned int)((unsigned __int64)((signed int)uZoom - * (signed __int64)pIndoor->pVertices[HIWORD(pIndoor->pMapVertices[3 * pBlueFacesInBLVMinimapIDs[uZb] + 1])].x) >> 16) << 16) + * (signed __int64)pIndoor->pVertices[pOutline->uVertex2ID].x) >> 16) << 16) - uZoom * pParty->vPosition.x) >> 16), uCenterY - ((signed int)(((unsigned int)((unsigned __int64)((signed int)uZoom - * (signed __int64)pIndoor->pVertices[HIWORD(pIndoor->pMapVertices[3 * pBlueFacesInBLVMinimapIDs[uZb] + 1])].y) >> 16) << 16) + * (signed __int64)pIndoor->pVertices[pOutline->uVertex2ID].y) >> 16) << 16) - uZoom * pParty->vPosition.z) >> 16), uBlue); } @@ -14440,10 +14435,10 @@ LABEL_8: black = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0, 0, 0); teal = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0, 0xFFu, 0xFFu); - v7 = (uint *)pIndoor->pMapVertices; + v7 = (uint *)pIndoor->pMapOutlines; uNumBlueFacesInBLVMinimap = 0; - v8 = pIndoor->pMapVertices->uNumVertices == 0; - v9 = (pIndoor->pMapVertices->uNumVertices & 0x80000000u) != 0; + v8 = pIndoor->pMapOutlines->uNumOutlines == 0; + v9 = (pIndoor->pMapOutlines->uNumOutlines & 0x80000000u) != 0; v94 = 0; if ( !(v9 | v8) ) { @@ -14486,7 +14481,7 @@ v85 + ((unsigned __int64)((v19 - v6) * (signed __int64)v5) >> 16), v90 - v92, black); - v7 = (uint *)pIndoor->pMapVertices; + v7 = (uint *)pIndoor->pMapOutlines; LABEL_17: ++v94; i += 12; @@ -14523,7 +14518,7 @@ ++v21; if ( v21 >= (signed int)uNumBlueFacesInBLVMinimap ) break; - v7 = (uint *)pIndoor->pMapVertices; + v7 = (uint *)pIndoor->pMapOutlines; } v6 = v86; } @@ -14896,11 +14891,11 @@ v14 = 0x40000000u; v17 = 0xC0000000u; v15 = 0xC0000000u; - if ( (signed int)pIndoor->pMapVertices->uNumVertices > 0 ) - { - v2 = (__int16 *)(pIndoor->pMapVertices->pVertices); - v11 = pIndoor->pMapVertices->uNumVertices; - v12 = (uint *)pIndoor->pMapVertices->pVertices; + if ( (signed int)pIndoor->pMapOutlines->uNumOutlines > 0 ) + { + v2 = (__int16 *)(pIndoor->pMapOutlines->pOutlines); + v11 = pIndoor->pMapOutlines->uNumOutlines; + v12 = (uint *)pIndoor->pMapOutlines->pOutlines; do { v3 = &pIndoor->pVertices[*v2];