Mercurial > might-and-magic-trilogy
diff mm7_4.cpp @ 0:8b8875f5b359
Initial commit
author | Nomad |
---|---|
date | Fri, 05 Oct 2012 16:07:14 +0200 |
parents | |
children | ac0fb48cd27a |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mm7_4.cpp Fri Oct 05 16:07:14 2012 +0200 @@ -0,0 +1,16005 @@ +#include <io.h> +#include <direct.h> + +#include "MapInfo.h" +#include "Game.h" +#include "GUIWindow.h" +#include "GUIButton.h" +#include "GUIFont.h" +#include "Party.h" +#include "AudioPlayer.h" +#include "Outdoor.h" +#include "IndoorCamera.h" +#include "Overlays.h" +#include "Monsters.h" +#include "Arcomage.h" +#include "LOD.h" +#include "Actor.h" +#include "Allocator.h" +#include "Events.h" +#include "Viewport.h" +#include "FrameTableInc.h" +#include "Math.h" +#include "LayingItem.h" +#include "ObjectList.h" +#include "Chest.h" +#include "PaletteManager.h" +#include "DecorationList.h" +#include "SaveLoad.h" +#include "stru123.h" +#include "stru287.h" +#include "Time.h" +#include "IconFrameTable.h" +#include "GUIProgressBar.h" +#include "stru157.h" +#include "Bink_Smacker.h" +#include "TileFrameTable.h" +#include "PlayerFrameTable.h" +#include "Awards.h" +#include "Autonotes.h" +#include "stru160.h" +#include "stru279.h" +#include "TurnEngine.h" +#include "FactionTable.h" +#include "StorylineTextTable.h" +#include "Random.h" +#include "stru277.h" +#include "stru298.h" +#include "stru12.h" +#include "stru351.h" +#include "Events2D.h" +#include "stru159.h" +#include "Log.h" + +#include "mm7_data.h" + + + + + + + + + + + + + + + +//----- (0046CC4B) -------------------------------------------------------- +void __cdecl _46CC4B_check_event_triggers() +{ + int v0; // eax@1 + LevelDecoration *v1; // esi@2 + signed int v2; // edi@2 + int v3; // ebx@2 + int v4; // eax@3 + int v5; // ebx@3 + unsigned int v6; // ecx@3 + unsigned int v7; // edx@6 + unsigned int v8; // edx@8 + char *v9; // edi@13 + int v10; // ebx@14 + int v11; // eax@14 + int v12; // ebx@14 + unsigned int v13; // ecx@14 + int v14; // edx@15 + unsigned int v15; // edx@17 + unsigned int v16; // edx@19 + char *v17; // edi@25 + int v18; // ebx@26 + int v19; // eax@26 + int v20; // ebx@26 + unsigned int v21; // ecx@26 + int v22; // edx@27 + unsigned int v23; // edx@29 + unsigned int v24; // edx@31 + int v25; // [sp+0h] [bp-24h]@3 + int v26; // [sp+0h] [bp-24h]@14 + int v27; // [sp+0h] [bp-24h]@26 + int v28; // [sp+4h] [bp-20h]@3 + int v29; // [sp+4h] [bp-20h]@14 + int v30; // [sp+4h] [bp-20h]@26 + signed int v31; // [sp+8h] [bp-1Ch]@2 + int v32; // [sp+Ch] [bp-18h]@2 + int v33; // [sp+10h] [bp-14h]@2 + int i; // [sp+14h] [bp-10h]@1 + int v35; // [sp+18h] [bp-Ch]@2 + int v36; // [sp+1Ch] [bp-8h]@3 + signed int v37; // [sp+1Ch] [bp-8h]@12 + signed int v38; // [sp+20h] [bp-4h]@24 + + v0 = 0; + for ( i = 0; i < _6836C8_num_decorations_6807E8; ++i ) + { + v1 = &pLevelDecorations[_6807E8_level_decorations_ids[v0]]; + v2 = v1->field_18; + v3 = v1->vPosition.y; + v33 = v1->vPosition.x; + v32 = v1->vPosition.y; + v35 = v1->vPosition.z; + v31 = v1->field_18; + if ( v1->field_2 & 1 ) + { + v36 = abs(v1->vPosition.x - pParty->vPosition.x); + v25 = abs(v3 - pParty->vPosition.z); + v28 = abs(v35 - pParty->vPosition.y); + v4 = v36; + v5 = v25; + v6 = v28; + if ( v36 < v25 ) + { + v4 = v25; + v5 = v36; + } + if ( v4 < v28 ) + { + v7 = v4; + v4 = v28; + v6 = v7; + } + if ( v5 < (signed int)v6 ) + { + v8 = v6; + v6 = v5; + v5 = v8; + } + if ( (signed int)(((unsigned int)(11 * v5) >> 5) + (v6 >> 2) + v4) < v2 ) + EventProcessor(v1->field_16_event_id, 8 * i | 5, 1); + } + if ( v1->field_2 & 2 ) + { + v37 = 0; + if ( (signed int)uNumActors > 0 ) + { + v9 = (char *)&pActors[0].vPosition.y; + do + { + v10 = abs(v33 - *((short *)v9 - 1)); + v29 = abs(v32 - *(short *)v9); + v26 = abs(v35 - *((short *)v9 + 1)); + v11 = v10; + v12 = v29; + v13 = v26; + if ( v11 < v29 ) + { + v14 = v11; + v11 = v29; + v12 = v14; + } + if ( v11 < v26 ) + { + v15 = v11; + v11 = v26; + v13 = v15; + } + if ( v12 < (signed int)v13 ) + { + v16 = v13; + v13 = v12; + v12 = v16; + } + if ( (signed int)(((unsigned int)(11 * v12) >> 5) + (v13 >> 2) + v11) < v31 ) + EventProcessor(v1->field_16_event_id, 0, 1); + ++v37; + v9 += 836; + } + while ( v37 < (signed int)uNumActors ); + } + } + if ( v1->field_2 & 4 ) + { + v38 = 0; + if ( (signed int)uNumLayingItems > 0 ) + { + v17 = (char *)&pLayingItems[0].vPosition.y; + do + { + v18 = abs(v33 - *((int *)v17 - 1)); + v30 = abs(v32 - *(int *)v17); + v27 = abs(v35 - *((int *)v17 + 1)); + v19 = v18; + v20 = v30; + v21 = v27; + if ( v19 < v30 ) + { + v22 = v19; + v19 = v30; + v20 = v22; + } + if ( v19 < v27 ) + { + v23 = v19; + v19 = v27; + v21 = v23; + } + if ( v20 < (signed int)v21 ) + { + v24 = v21; + v21 = v20; + v20 = v24; + } + if ( (signed int)(((unsigned int)(11 * v20) >> 5) + (v21 >> 2) + v19) < v31 ) + EventProcessor(v1->field_16_event_id, 0, 1); + ++v38; + v17 += 112; + } + while ( v38 < (signed int)uNumLayingItems ); + } + } + v0 = i + 1; + } +} +// 6836C8: using guessed type int 6836C8_num_decorations_6807E8; + +//----- (0046CEC3) -------------------------------------------------------- +int __fastcall _46CEC3_get_floor_level(signed int a1, signed int a2, int a3, unsigned int uSectorID, int *a5) +{ + BLVSector *v5; // edi@1 + int v6; // ecx@1 + Vec3_short_ *v7; // edx@1 + BLVFace *v8; // esi@2 + int v9; // eax@8 + int v10; // edi@8 + int v11; // eax@10 + int v12; // ecx@10 + int v13; // ecx@13 + signed int v14; // ebx@14 + int v15; // eax@16 + int v16; // edx@19 + int v17; // ST18_4@19 + signed int v18; // edx@19 + signed __int64 v19; // qtt@19 + PolygonType v20; // al@25 + int v21; // eax@27 + int v22; // ecx@29 + BLVFace *v23; // eax@33 + int v24; // esi@39 + int v25; // edi@39 + int v26; // esi@41 + int v27; // ecx@43 + signed int v28; // eax@45 + int v29; // ebx@47 + int v30; // edx@49 + int v31; // ST10_4@49 + signed int v32; // edx@49 + signed __int64 v33; // qtt@49 + signed int v34; // eax@54 + signed int v35; // esi@56 + int result; // eax@57 + int v37; // edi@61 + int v38; // edx@62 + int v39; // [sp+Ch] [bp-34h]@1 + int v40; // [sp+10h] [bp-30h]@2 + int v41; // [sp+14h] [bp-2Ch]@12 + unsigned __int16 *v42; // [sp+18h] [bp-28h]@1 + BLVSector *v43; // [sp+1Ch] [bp-24h]@1 + int v44; // [sp+20h] [bp-20h]@10 + int v45; // [sp+24h] [bp-1Ch]@10 + signed int v46; // [sp+24h] [bp-1Ch]@38 + bool v47; // [sp+24h] [bp-1Ch]@43 + bool v48; // [sp+28h] [bp-18h]@10 + bool v49; // [sp+28h] [bp-18h]@41 + bool v50; // [sp+2Ch] [bp-14h]@12 + int v51; // [sp+2Ch] [bp-14h]@41 + signed int v52; // [sp+30h] [bp-10h]@7 + signed int v53; // [sp+30h] [bp-10h]@10 + signed int v54; // [sp+30h] [bp-10h]@41 + signed int v55; // [sp+34h] [bp-Ch]@1 + signed int v56; // [sp+38h] [bp-8h]@1 + signed int v57; // [sp+3Ch] [bp-4h]@1 + int uSectorIDa; // [sp+4Ch] [bp+Ch]@1 + signed int uSectorIDb; // [sp+4Ch] [bp+Ch]@32 + + v5 = &pIndoor->pSectors[uSectorID]; + v57 = a2; + v56 = a1; + v6 = 0; + v55 = 0; + v43 = v5; + v42 = v5->pFloors; + v7 = pIndoor->pVertices; + v39 = v5->field_4; + for ( uSectorIDa = 0; uSectorIDa < v39; ++uSectorIDa ) + { + v40 = (int)&v42[v6]; + v8 = &pIndoor->pFaces[*(short *)v40]; + if ( !(BYTE3(v8->uAttributes) & 0x20) + && v56 <= v8->pBounding.x2 + && v56 >= v8->pBounding.x1 + && v57 <= v8->pBounding.y2 + && v57 >= v8->pBounding.y1 ) + { + v52 = 0; + if ( v8->uNumVertices ) + { + do + { + v9 = v52; + v10 = 2 * v52; + word_721460[2 * v52] = v8->pXInterceptDisplacements[v52] + v7[v8->pVertexIDs[v52]].x; + word_721390[2 * v52] = v8->pYInterceptDisplacements[v9] + v7[v8->pVertexIDs[v9]].y; + word_721460[2 * v52++ + 1] = v8->pXInterceptDisplacements[v9] + v7[v8->pVertexIDs[v9 + 1]].x; + word_721390[v10 + 1] = v8->pYInterceptDisplacements[v9] + v7[v8->pVertexIDs[v9 + 1]].y; + } + while ( v52 < v8->uNumVertices ); + v5 = v43; + } + v44 = 2 * v8->uNumVertices; + v11 = 2 * v8->uNumVertices; + word_721460[v11] = word_721460[0]; + word_721390[v11] = word_721390[0]; + v48 = word_721390[0] >= v57; + v12 = 0; + v53 = 0; + v45 = 0; + if ( v44 > 0 ) + { + do + { + if ( v53 >= 2 ) + break; + v41 = word_721390[v12 + 1]; + v50 = word_721390[v12 + 1] >= v57; + if ( v48 == v50 ) + { + v13 = v45; + } + else + { + v13 = v45; + if ( word_721460[v45 + 1] >= v56 ) + v14 = 0; + else + v14 = 2; + v15 = v14 | word_721460[v45] < v56; + if ( v15 != 3 ) + { + if ( !v15 + || (v16 = word_721390[v45], + v17 = v41 - v16, + v18 = v57 - v16, + LODWORD(v19) = v18 << 16, + HIDWORD(v19) = v18 >> 16, + v7 = pIndoor->pVertices, + (signed int)(((unsigned __int64)(((signed int)word_721460[v45 + 1] - (signed int)word_721460[v45]) + * v19 + / v17) >> 16) + + word_721460[v45]) >= v56) ) + ++v53; + } + } + v12 = v13 + 1; + v48 = v50; + v45 = v12; + } + while ( v12 < v44 ); + if ( v53 == 1 ) + { + if ( v55 >= 50 ) + break; + v20 = v8->uPolygonType; + if ( v20 == 3 || v20 == 5 ) + { + v21 = v7[*v8->pVertexIDs].z; + } + else + { + v7 = pIndoor->pVertices; + v21 = ((unsigned __int64)(v8->zCalc1 * (signed __int64)v56) >> 16) + + ((unsigned __int64)(v8->zCalc2 * (signed __int64)v57) >> 16) + + HIWORD(v8->zCalc3); + } + v22 = v55++; + dword_7212C8[v22] = v21; + dword_721200[v22] = *(short *)v40; + } + } + } + v6 = uSectorIDa + 1; + } + if ( v5->field_0 & 8 ) + { + for ( uSectorIDb = 0; uSectorIDb < v5->uNumPortals; ++uSectorIDb ) + { + v23 = &pIndoor->pFaces[v5->pPortals[uSectorIDb]]; + if ( v23->uPolygonType == 3 + && v56 <= v23->pBounding.x2 + && v56 >= v23->pBounding.x1 + && v57 <= v23->pBounding.y2 + && v57 >= v23->pBounding.y1 ) + { + v46 = 0; + if ( v23->uNumVertices ) + { + do + { + v24 = v46; + v25 = 2 * v46; + word_721460[2 * v46] = v23->pXInterceptDisplacements[v46] + v7[v23->pVertexIDs[v46]].x; + word_721390[2 * v46] = v23->pYInterceptDisplacements[v24] + v7[v23->pVertexIDs[v24]].y; + word_721460[2 * v46++ + 1] = v23->pXInterceptDisplacements[v24 + 1] + v7[v23->pVertexIDs[v24 + 1]].x; + word_721390[v25 + 1] = v23->pYInterceptDisplacements[v24 + 1] + v7[v23->pVertexIDs[v24 + 1]].y; + } + while ( v46 < v23->uNumVertices ); + v5 = v43; + } + v26 = 2 * v23->uNumVertices; + word_721460[2 * v23->uNumVertices] = word_721460[0]; + word_721390[v26] = word_721390[0]; + v54 = 0; + v51 = 0; + v49 = word_721390[0] >= v57; + if ( v26 > 0 ) + { + do + { + if ( v54 >= 2 ) + break; + v27 = v51; + v47 = word_721390[v51 + 1] >= v57; + if ( v49 != v47 ) + { + if ( word_721460[v27 + 1] >= v56 ) + v28 = 0; + else + v28 = 2; + v29 = v28 | word_721460[v27] < v56; + if ( v29 != 3 ) + { + if ( !v29 + || (v30 = word_721390[v27], + v31 = word_721390[v51 + 1] - v30, + v32 = v57 - v30, + LODWORD(v33) = v32 << 16, + HIDWORD(v33) = v32 >> 16, + v7 = pIndoor->pVertices, + (signed int)(((unsigned __int64)(((signed int)word_721460[v27 + 1] - (signed int)word_721460[v27]) + * v33 + / v31) >> 16) + + word_721460[v27]) >= v56) ) + ++v54; + } + } + ++v51; + v49 = v47; + } + while ( v51 < v26 ); + if ( v54 == 1 ) + { + if ( v55 >= 50 ) + break; + v34 = v55++; + dword_7212C8[v34] = -29000; + dword_721200[v34] = v5->pPortals[uSectorIDb]; + } + } + } + } + } + v35 = 1; + if ( v55 == 1 ) + { + *a5 = dword_721200[0]; + return dword_7212C8[0]; + } + if ( !v55 ) + return -30000; + *a5 = dword_721200[0]; + result = dword_7212C8[0]; + if ( v55 > 1 ) + { + v37 = a3 + 5; + while ( 1 ) + { + v38 = dword_7212C8[v35]; + if ( result <= v37 ) + break; + if ( v38 < result ) + goto LABEL_67; +LABEL_68: + ++v35; + if ( v35 >= v55 ) + return result; + } + if ( v38 <= result || v38 > v37 ) + goto LABEL_68; +LABEL_67: + result = dword_7212C8[v35]; + *a5 = dword_721200[v35]; + goto LABEL_68; + } + return result; +} + +//----- (0046D49E) -------------------------------------------------------- +int __fastcall sub_46D49E_prolly_get_world_y_under_party(int a1, signed int a2, int a3, int a4, int *a5, int *a6, int a7) +{ + signed int v7; // edi@1 + int v8; // ebx@1 + int v9; // eax@1 + BSPModel *v10; // esi@4 + ODMFace *v11; // ecx@11 + unsigned __int8 v12; // al@11 + char *v13; // eax@19 + int v14; // edx@20 + int v15; // eax@22 + int v16; // edx@22 + int v17; // edi@24 + signed int v18; // edx@26 + int v19; // eax@28 + int v20; // edx@30 + int v21; // ST1C_4@30 + signed int v22; // edx@30 + signed __int64 v23; // qtt@30 + int v24; // eax@36 + signed int v25; // ecx@38 + int result; // eax@42 + signed int v27; // ecx@43 + int v28; // edi@44 + signed int v29; // edx@44 + int v30; // esi@45 + int v31; // eax@45 + ODMFace *v32; // eax@57 + int v33; // ecx@59 + int v34; // [sp+Ch] [bp-34h]@8 + int v35; // [sp+10h] [bp-30h]@22 + int v36; // [sp+14h] [bp-2Ch]@24 + int v37; // [sp+18h] [bp-28h]@22 + int v38; // [sp+1Ch] [bp-24h]@2 + int v39; // [sp+20h] [bp-20h]@9 + int v40; // [sp+24h] [bp-1Ch]@1 + signed int v41; // [sp+28h] [bp-18h]@1 + int v42; // [sp+2Ch] [bp-14h]@8 + bool v43; // [sp+30h] [bp-10h]@22 + bool v44; // [sp+34h] [bp-Ch]@24 + signed int v45; // [sp+38h] [bp-8h]@1 + signed int v46; // [sp+3Ch] [bp-4h]@1 + signed int v47; // [sp+58h] [bp+18h]@18 + signed int v48; // [sp+58h] [bp+18h]@22 + signed int v49; // [sp+58h] [bp+18h]@43 + + v7 = a2; + v8 = a1; + v45 = a2; + v40 = a1; + v46 = 1; + v9 = GetTerrainHeightsAroundParty2(a1, a2, a5, a7); + dword_721160[0] = -1; + dword_721110[0] = -1; + dword_7211B0[0] = v9; + v41 = 0; + if ( (signed int)pOutdoor->uNumBModels <= 0 ) + goto LABEL_63; + v38 = 0; + while ( 1 ) + { + v10 = &pOutdoor->pBModels[v38]; + if ( v8 <= pOutdoor->pBModels[v38].sMaxX ) + { + if ( v8 >= v10->sMinX ) + { + if ( v7 <= v10->sMaxY ) + { + if ( v7 >= v10->sMinY ) + { + v42 = 0; + v34 = v10->uNumFaces; + if ( (signed int)v10->uNumFaces > 0 ) + { + v39 = 0; + while ( 1 ) + { + v11 = &v10->pFaces[v39]; + v12 = v11->uPolygonType; + if ( (v12 == 3 || v12 == 4) + && !(BYTE3(v11->uFaceAttributes) & 0x20) + && v8 <= v11->pBoundingBox.x2 + && v8 >= v11->pBoundingBox.x1 + && v7 <= v11->pBoundingBox.y2 + && v7 >= v11->pBoundingBox.y1 ) + { + v47 = 0; + if ( v11->uNumVertices ) + { + v13 = (char *)v11->pXInterceptDisplacements; + do + { + v14 = 2 * v47; + word_721040[2 * v47] = *(short *)v13 + LOWORD(v10->pVertices.pVertices[*((short *)v13 - 60)].x); + word_720F70[2 * v47] = *((short *)v13 + 20) + + LOWORD(v10->pVertices.pVertices[*((short *)v13 - 60)].y); + word_721040[2 * v47++ + 1] = *(short *)v13 + + LOWORD(v10->pVertices.pVertices[*((short *)v13 - 59)].x); + word_720F70[v14 + 1] = *((short *)v13 + 20) + + LOWORD(v10->pVertices.pVertices[*((short *)v13 - 59)].y); + v13 += 2; + } + while ( v47 < v11->uNumVertices ); + v8 = v40; + } + v15 = 2 * v11->uNumVertices; + word_721040[2 * v11->uNumVertices] = word_721040[0]; + word_720F70[v15] = word_720F70[0]; + v35 = v15; + v16 = 0; + v43 = word_720F70[0] >= v45; + v48 = 0; + v37 = 0; + if ( v15 > 0 ) + { + do + { + if ( v48 >= 2 ) + break; + v17 = v16; + v8 = v40; + v36 = word_720F70[v16 + 1]; + v44 = word_720F70[v16 + 1] >= v45; + if ( v43 != v44 ) + { + v18 = word_721040[v17 + 1] >= v40 ? 0 : 2; + v19 = v18 | word_721040[v17] < v40; + if ( v19 != 3 ) + { + if ( !v19 + || (v20 = word_720F70[v17], + v21 = v36 - v20, + v22 = v45 - v20, + LODWORD(v23) = v22 << 16, + HIDWORD(v23) = v22 >> 16, + (signed int)(((unsigned __int64)(((signed int)word_721040[v17 + 1] + - (signed int)word_721040[v17]) + * v23 + / v21) >> 16) + + word_721040[v17]) >= v40) ) + ++v48; + } + } + v16 = v37 + 1; + v43 = v44; + ++v37; + } + while ( v37 < v35 ); + if ( v48 == 1 ) + { + if ( v46 >= 20 ) + break; + if ( v11->uPolygonType == 3 ) + v24 = v10->pVertices.pVertices[v11->pVertexIDs[0]].z; + else + v24 = ((unsigned __int64)(v11->zCalc1 * (signed __int64)v8) >> 16) + + ((unsigned __int64)(v11->zCalc2 * (signed __int64)v45) >> 16) + + HIWORD(v11->zCalc3); + v25 = v46++; + dword_7211B0[v25] = v24; + dword_721160[v25] = v41; + dword_721110[v25] = v42; + } + } + } + ++v42; + ++v39; + if ( v42 >= v34 ) + break; + v7 = v45; + } + } + } + } + } + } + ++v41; + ++v38; + if ( v41 >= (signed int)pOutdoor->uNumBModels ) + break; + v7 = v45; + } + if ( v46 == 1 ) + { +LABEL_63: + *a6 = 0; + return dword_7211B0[0]; + } + v27 = 0; + v49 = 1; + if ( v46 <= 1 ) + { +LABEL_55: + *a6 = 0; + goto LABEL_56; + } + v28 = 0; + v29 = 1; + do + { + v30 = dword_7211B0[v29]; + v31 = *(int *)((char *)dword_7211B0 + v28); + if ( v30 == v31 ) + goto LABEL_51; + if ( v31 > a3 + 5 ) + { + if ( v30 >= v31 ) + goto LABEL_52; +LABEL_51: + v27 = v49; + v28 = v29 * 4; + goto LABEL_52; + } + if ( v30 > v31 && v30 <= a3 + 5 ) + goto LABEL_51; +LABEL_52: + ++v49; + ++v29; + } + while ( v49 < v46 ); + if ( !v27 ) + goto LABEL_55; + *a6 = dword_721110[v27] | (dword_721160[v27] << 6); +LABEL_56: + if ( v27 ) + { + v32 = &pOutdoor->pBModels[dword_721160[v27]].pFaces[dword_721110[v27]]; + *a5 = 0; + if ( v32->uFaceAttributes & 0x10 ) + *a5 = 1; + } + v33 = dword_7211B0[v27]; + result = dword_7211B0[0]; + if ( v33 >= dword_7211B0[0] ) + result = v33; + return result; +} + +//----- (0046D8E3) -------------------------------------------------------- +int __fastcall sub_46D8E3(int a1, signed int a2, int a3, int a4) +{ + int v4; // ebx@1 + unsigned int v5; // ecx@1 + BSPModel *v6; // edi@3 + ODMFace *v7; // esi@10 + unsigned __int8 v8; // al@10 + unsigned __int16 *v9; // eax@18 + int v10; // edx@19 + int v11; // ecx@21 + int v12; // ecx@23 + signed int v13; // eax@25 + int v14; // edx@27 + int v15; // edx@29 + int v16; // ST18_4@29 + signed int v17; // edx@29 + signed __int64 v18; // qtt@29 + int v19; // eax@35 + signed int v20; // ecx@37 + signed int v22; // ebx@42 + unsigned int v23; // esi@43 + int v24; // edx@44 + int v25; // eax@44 + int v26; // [sp+Ch] [bp-38h]@7 + int v27; // [sp+10h] [bp-34h]@21 + int v28; // [sp+18h] [bp-2Ch]@21 + int v29; // [sp+1Ch] [bp-28h]@2 + unsigned int v30; // [sp+20h] [bp-24h]@8 + signed int v31; // [sp+24h] [bp-20h]@1 + signed int v32; // [sp+28h] [bp-1Ch]@1 + int v33; // [sp+2Ch] [bp-18h]@7 + bool v34; // [sp+30h] [bp-14h]@21 + bool v35; // [sp+34h] [bp-10h]@23 + signed int v36; // [sp+38h] [bp-Ch]@17 + signed int v37; // [sp+38h] [bp-Ch]@21 + signed int v38; // [sp+38h] [bp-Ch]@42 + signed int v39; // [sp+3Ch] [bp-8h]@1 + signed int v40; // [sp+40h] [bp-4h]@1 + + dword_720ED0[0] = -1; + dword_720E80[0] = -1; + v4 = a1; + v5 = 0; + v40 = a2; + v31 = v4; + v39 = 1; + dword_720F20[0] = 10000; + v32 = 0; + if ( (signed int)pOutdoor->uNumBModels > 0 ) + { + v29 = 0; + do + { + v6 = &pOutdoor->pBModels[v29]; + if ( v4 <= pOutdoor->pBModels[v29].sMaxX ) + { + if ( v4 >= v6->sMinX ) + { + if ( v40 <= v6->sMaxY ) + { + if ( v40 >= v6->sMinY ) + { + v33 = v5; + v26 = v6->uNumFaces; + if ( (signed int)v6->uNumFaces > (signed int)v5 ) + { + v30 = v5; + while ( 1 ) + { + v7 = (ODMFace *)((char *)v6->pFaces + v30); + v8 = v7->uPolygonType; + if ( (v8 == 5 || v8 == 6) + && !(BYTE3(v7->uFaceAttributes) & 0x20) + && v4 <= v7->pBoundingBox.x2 + && v4 >= v7->pBoundingBox.x1 + && v40 <= v7->pBoundingBox.y2 + && v40 >= v7->pBoundingBox.y1 ) + { + v36 = v5; + if ( v7->uNumVertices ) + { + v9 = v7->pXInterceptDisplacements; + do + { + v10 = 2 * v36; + word_720DB0_xs[2 * v36] = *v9 + LOWORD(v6->pVertices.pVertices[*(v9 - 60)].x); + word_720CE0_ys[2 * v36] = v9[20] + LOWORD(v6->pVertices.pVertices[*(v9 - 60)].y); + word_720DB0_xs[2 * v36++ + 1] = *v9 + LOWORD(v6->pVertices.pVertices[*(v9 - 59)].x); + word_720CE0_ys[v10 + 1] = v9[20] + LOWORD(v6->pVertices.pVertices[*(v9 - 59)].y); + ++v9; + } + while ( v36 < v7->uNumVertices ); + v4 = v31; + } + v27 = 2 * v7->uNumVertices; + word_720DB0_xs[2 * v7->uNumVertices] = word_720DB0_xs[0]; + word_720CE0_ys[v27] = word_720CE0_ys[0]; + v11 = 0; + v34 = word_720CE0_ys[0] >= v40; + v37 = 0; + v28 = 0; + if ( v27 > 0 ) + { + do + { + if ( v37 >= 2 ) + break; + v12 = v11; + v4 = v31; + v35 = word_720CE0_ys[v12 + 1] >= v40; + if ( v34 != v35 ) + { + v13 = word_720DB0_xs[v12 + 1] >= v31 ? 0 : 2; + v14 = v13 | word_720DB0_xs[v12] < v31; + if ( v14 != 3 ) + { + if ( !v14 + || (v15 = word_720CE0_ys[v12], + v16 = word_720CE0_ys[v12 + 1] - v15, + v17 = v40 - v15, + LODWORD(v18) = v17 << 16, + HIDWORD(v18) = v17 >> 16, + (signed int)(((unsigned __int64)(((signed int)word_720DB0_xs[v12 + 1] + - (signed int)word_720DB0_xs[v12]) + * v18 + / v16) >> 16) + + word_720DB0_xs[v12]) >= v31) ) + ++v37; + } + } + v11 = v28 + 1; + v34 = v35; + ++v28; + } + while ( v28 < v27 ); + if ( v37 == 1 ) + { + if ( v39 >= 20 ) + break; + if ( v7->uPolygonType == 5 ) + v19 = v6->pVertices.pVertices[v7->pVertexIDs[0]].z; + else + v19 = ((unsigned __int64)(v7->zCalc1 * (signed __int64)v4) >> 16) + + ((unsigned __int64)(v7->zCalc2 * (signed __int64)v40) >> 16) + + HIWORD(v7->zCalc3); + v20 = v39++; + dword_720F20[v20] = v19; + dword_720ED0[v20] = v32; + dword_720E80[v20] = v33; + } + } + } + ++v33; + v30 += 308; + if ( v33 >= v26 ) + break; + v5 = 0; + } + } + } + } + } + } + ++v32; + ++v29; + v5 = 0; + } + while ( v32 < (signed int)pOutdoor->uNumBModels ); + if ( !v39 ) + { + *(int *)a4 = 0; + return dword_720F20[0]; + } + } + v22 = 0; + v38 = v5; + if ( v39 <= (signed int)v5 ) + goto LABEL_54; + v23 = 0; + do + { + v24 = dword_720F20[v5 / 4]; + v25 = *(int *)((char *)dword_720F20 + v23); + if ( v24 == v25 ) + goto LABEL_50; + if ( v25 > a3 + 15 ) + { + if ( v24 >= v25 ) + goto LABEL_51; +LABEL_50: + v22 = v38; + v23 = v5; + goto LABEL_51; + } + if ( v24 > v25 && v24 <= a3 + 15 ) + goto LABEL_50; +LABEL_51: + ++v38; + v5 += 4; + } + while ( v38 < v39 ); + if ( v22 ) + { + *(int *)a4 = dword_720E80[v22] | (dword_720ED0[v22] << 6); + return dword_720F20[v22]; + } +LABEL_54: + *(int *)a4 = 0; + return dword_720F20[v22]; +} + +//----- (0046DCC8) -------------------------------------------------------- +signed __int64 __fastcall _46DCC8_get_gravity_direction_outdoor(int a1, int a2, Vec3_int_ *a3) +{ + int v3; // ebx@1 + int v4; // ST4C_4@1 + unsigned int v5; // ST54_4@1 + unsigned int v6; // edi@1 + unsigned int v7; // ST50_4@1 + int v8; // edi@1 + int v9; // esi@1 + int v10; // ebx@1 + int v11; // ecx@2 + int v12; // eax@2 + int v13; // edx@2 + int v14; // ebx@2 + double v15; // st7@4 + double v16; // st6@4 + double v17; // st5@4 + float v18; // ST44_4@4 + float v19; // ST54_4@4 + double v20; // st4@4 + double v21; // st5@4 + float v22; // ST44_4@6 + double v23; // st7@4 + double v24; // st7@6 + signed __int64 result; // qax@6 + int v26; // [sp+14h] [bp-44h]@1 + int v27; // [sp+18h] [bp-40h]@1 + int v28; // [sp+20h] [bp-38h]@1 + int v29; // [sp+24h] [bp-34h]@1 + int v30; // [sp+28h] [bp-30h]@1 + int v31; // [sp+2Ch] [bp-2Ch]@1 + int v32; // [sp+30h] [bp-28h]@1 + int v33; // [sp+34h] [bp-24h]@1 + int v34; // [sp+38h] [bp-20h]@1 + int v35; // [sp+3Ch] [bp-1Ch]@1 + int v36; // [sp+40h] [bp-18h]@1 + int v37; // [sp+4Ch] [bp-Ch]@2 + float v38; // [sp+4Ch] [bp-Ch]@4 + int v39; // [sp+50h] [bp-8h]@2 + float v40; // [sp+50h] [bp-8h]@4 + int v41; // [sp+54h] [bp-4h]@2 + + v3 = a1; + v4 = a2; + v5 = WorldPosToGridCellX(a1); + v6 = WorldPosToGridCellZ(v4) - 1; + v33 = GridCellToWorldPosX(v5); + v34 = GridCellToWorldPosX(v5 + 1); + v35 = GridCellToWorldPosX(v5 + 1); + v36 = GridCellToWorldPosX(v5); + v29 = GridCellToWorldPosZ(v6); + v30 = GridCellToWorldPosZ(v6); + v7 = v6 + 1; + v31 = GridCellToWorldPosZ(v6 + 1); + v32 = GridCellToWorldPosZ(v6 + 1); + v26 = pOutdoor->DoGetHeightOnTerrain(v5, v6); + v27 = pOutdoor->DoGetHeightOnTerrain(v5 + 1, v6); + v8 = pOutdoor->DoGetHeightOnTerrain(v5 + 1, v6 + 1); + v28 = pOutdoor->DoGetHeightOnTerrain(v5, v7); + v9 = v29; + v10 = abs(v3 - v33); + if ( abs(v29 - v4) >= v10 ) + { + v11 = v33; + v37 = v28; + v39 = v36; + v12 = v35; + v41 = v32; + v13 = v31; + v14 = v8; + v8 = v26; + } + else + { + v11 = v35; + v41 = v30; + v39 = v34; + v12 = v33; + v13 = v29; + v9 = v31; + v37 = v27; + v14 = v26; + } + v15 = (double)(v12 - v39); + v16 = (double)(v13 - v41); + v17 = (double)(v14 - v37); + v18 = (double)(v11 - v39); + v19 = (double)(v9 - v41); + v20 = (double)(v8 - v37); + v38 = v20 * v16 - v19 * v17; + v40 = v18 * v17 - v20 * v15; + v21 = v19 * v15 - v18 * v16; + v23 = sqrt(v21 * v21 + v40 * v40 + v38 * v38); + if ( v23 == 0.0 ) + { + a3->y = 0; + a3->x = 0; + a3->z = 65536; + } + v24 = 1.0 / v23; + a3->x = (signed __int64)(v24 * v38 * 65536.0); + a3->y = (signed __int64)(v24 * v40 * 65536.0); + v22 = v21; + result = (signed __int64)(v24 * v22 * 65536.0); + a3->z = result; + return result; +} +// 47F44B: using guessed type int __stdcall WorldPosToGridCellX(int); +// 47F458: using guessed type int __stdcall WorldPosToGridCellZ(int); +// 47F469: using guessed type int __stdcall GridCellToWorldPosX(int); +// 47F476: using guessed type int __stdcall GridCellToWorldPosZ(int); + +//----- (0046DEF2) -------------------------------------------------------- +unsigned int __fastcall sub_46DEF2(signed int a2, unsigned int uLayingItemID) +{ + unsigned int result; // eax@1 + + result = uLayingItemID; + if ( pObjectList->pObjects[pLayingItems[uLayingItemID].uObjectDescID].uFlags & 0x10 ) + result = _46BFFA_check_object_intercept(uLayingItemID, a2); + return result; +} + +//----- (0046DF1A) -------------------------------------------------------- +signed int __fastcall _46DF1A_collide_against_actor(int a1, int a2) +{ + Actor *v2; // edi@1 + unsigned __int16 v3; // ax@1 + int v4; // esi@6 + int v5; // ecx@8 + int v6; // eax@10 + int v7; // edx@12 + int v8; // ecx@14 + int v9; // eax@14 + int v10; // ebx@14 + int v11; // esi@14 + int v12; // ebx@15 + int v13; // ebx@17 + unsigned int v14; // eax@20 + signed int result; // eax@21 + int v16; // [sp+Ch] [bp-10h]@1 + int v17; // [sp+10h] [bp-Ch]@14 + int v18; // [sp+14h] [bp-8h]@14 + int v19; // [sp+18h] [bp-4h]@14 + + v16 = a1; + v2 = &pActors[a1]; + v3 = v2->uAIState; + if ( v3 == 11 || v3 == 4 || v3 == 19 || v3 == 5 || v3 == 17 ) + goto LABEL_25; + v4 = v2->uActorRadius; + if ( a2 ) + v4 = a2; + v5 = v2->vPosition.x; + if ( stru_721530.sMaxX > v5 + v4 + || stru_721530.sMinX < v5 - v4 + || (v6 = v2->vPosition.y, stru_721530.sMaxY > v6 + v4) + || stru_721530.sMinY < v6 - v4 + || (v7 = v2->vPosition.z, stru_721530.sMaxZ > v7 + v2->uActorHeight) + || stru_721530.sMinZ < v7 + || (v8 = v5 - stru_721530.normal.x, + v9 = v6 - stru_721530.normal.y, + v10 = stru_721530.prolly_normal_d + v4, + v17 = stru_721530.prolly_normal_d + v4, + v11 = (v8 * stru_721530.field_58.y - v9 * stru_721530.field_58.x) >> 16, + v18 = v8, + v19 = v9, + abs((v8 * stru_721530.field_58.y - v9 * stru_721530.field_58.x) >> 16) > v10) + || (v12 = (v18 * stru_721530.field_58.x + v19 * stru_721530.field_58.y) >> 16, v12 <= 0) + || (signed int)(((unsigned __int64)(stru_721530.field_58.z * (signed __int64)v12) >> 16) + stru_721530.normal.z) < v2->vPosition.z ) + { +LABEL_25: + result = 0; + } + else + { + v13 = v12 - sub_452A9E(v17 * v17 - v11 * v11); + if ( v13 < 0 ) + v13 = 0; + if ( v13 < stru_721530.field_7C ) + { + stru_721530.field_7C = v13; + v14 = 8 * v16; + LOBYTE(v14) = 8 * v16 | 3; + stru_721530.uFaceID = v14; + } + result = 1; + } + return result; +} +// 46DF1A: using guessed type int __fastcall 46DF1A_collide_against_actor(int, int); + +//----- (0046E0B2) -------------------------------------------------------- +void __cdecl _46E0B2_collide_against_decorations() +{ + BLVSector *v0; // ebp@1 + LevelDecoration *v1; // edi@2 + DecorationDesc *v2; // esi@3 + int v3; // edx@4 + int v4; // eax@4 + int v5; // ecx@6 + int v6; // ebx@8 + int v7; // esi@8 + int v8; // ebx@10 + int v9; // esi@11 + int v10; // edi@12 + int v11; // eax@12 + int v12; // esi@14 + unsigned int v13; // eax@17 + signed int i; // [sp+4h] [bp-14h]@1 + int v15; // [sp+8h] [bp-10h]@10 + int v16; // [sp+Ch] [bp-Ch]@10 + int v17; // [sp+10h] [bp-8h]@10 + int v18; // [sp+14h] [bp-4h]@8 + + v0 = &pIndoor->pSectors[stru_721530.uSectorID]; + for ( i = 0; i < v0->uNumDecorations; ++i ) + { + v1 = &pLevelDecorations[v0->pDecorationIDs[i]]; + if ( !(v1->field_2 & 0x20) ) + { + v2 = &pDecorationList->pDecorations[v1->uDecorationDescID]; + if ( !(v2->uFlags & 1) ) + { + v3 = v2->uRadius; + v4 = v1->vPosition.x; + if ( stru_721530.sMaxX <= v4 + v3 ) + { + if ( stru_721530.sMinX >= v4 - v3 ) + { + v5 = v1->vPosition.y; + if ( stru_721530.sMaxY <= v5 + v3 ) + { + if ( stru_721530.sMinY >= v5 - v3 ) + { + v6 = v2->uDecorationHeight; + v7 = v1->vPosition.z; + v18 = v6; + if ( stru_721530.sMaxZ <= v7 + v6 ) + { + if ( stru_721530.sMinZ >= v7 ) + { + v16 = v4 - stru_721530.normal.x; + v15 = v5 - stru_721530.normal.y; + v8 = stru_721530.prolly_normal_d + v3; + v17 = ((v4 - stru_721530.normal.x) * stru_721530.field_58.y + - (v5 - stru_721530.normal.y) * stru_721530.field_58.x) >> 16; + if ( abs(v17) <= stru_721530.prolly_normal_d + v3 ) + { + v9 = (v16 * stru_721530.field_58.x + v15 * stru_721530.field_58.y) >> 16; + if ( v9 > 0 ) + { + v10 = v1->vPosition.z; + v11 = stru_721530.normal.z + + ((unsigned __int64)(stru_721530.field_58.z * (signed __int64)v9) >> 16); + if ( v11 >= v10 ) + { + if ( v11 <= v18 + v10 ) + { + v12 = v9 - sub_452A9E(v8 * v8 - v17 * v17); + if ( v12 < 0 ) + v12 = 0; + if ( v12 < stru_721530.field_7C ) + { + stru_721530.field_7C = v12; + v13 = 8 * v0->pDecorationIDs[i]; + LOBYTE(v13) = v13 | 5; + stru_721530.uFaceID = v13; + } + } + } + } + } + } + } + } + } + } + } + } + } + } +} + +//----- (0046E26D) -------------------------------------------------------- +void __fastcall _46E26D_collide_against_sprites(signed int a1, signed int a2) +{ + int v2; // edx@5 + unsigned __int16 *v3; // eax@5 + unsigned __int16 v4; // ax@6 + LevelDecoration *v5; // edi@7 + DecorationDesc *v6; // esi@8 + int v7; // edx@9 + int v8; // eax@9 + int v9; // ecx@11 + int v10; // ebx@13 + int v11; // esi@13 + int v12; // ebp@15 + int v13; // ebx@15 + int v14; // esi@16 + int v15; // edi@17 + int v16; // eax@17 + int v17; // esi@19 + char v18; // zf@23 + int v19; // [sp+0h] [bp-10h]@15 + unsigned __int16 *v20; // [sp+4h] [bp-Ch]@5 + int v21; // [sp+8h] [bp-8h]@15 + int v22; // [sp+Ch] [bp-4h]@13 + + if ( a1 >= 0 ) + { + if ( a1 <= 127 ) + { + if ( a2 >= 0 ) + { + if ( a2 <= 127 ) + { + v2 = a1 + (a2 << 7); + v3 = &pOutdoor->pFaceIDLIST[pOutdoor->pOMAP[v2]]; + v20 = &pOutdoor->pFaceIDLIST[pOutdoor->pOMAP[v2]]; + if ( v3 ) + { + do + { + v4 = *v3; + if ( (v4 & 7) == 5 ) + { + v5 = &pLevelDecorations[(signed __int16)v4 >> 3]; + if ( !(v5->field_2 & 0x20) ) + { + v6 = &pDecorationList->pDecorations[v5->uDecorationDescID]; + if ( !(v6->uFlags & 1) ) + { + v7 = v6->uRadius; + v8 = v5->vPosition.x; + if ( stru_721530.sMaxX <= v8 + v7 ) + { + if ( stru_721530.sMinX >= v8 - v7 ) + { + v9 = v5->vPosition.y; + if ( stru_721530.sMaxY <= v9 + v7 ) + { + if ( stru_721530.sMinY >= v9 - v7 ) + { + v10 = v6->uDecorationHeight; + v11 = v5->vPosition.z; + v22 = v10; + if ( stru_721530.sMaxZ <= v11 + v10 ) + { + if ( stru_721530.sMinZ >= v11 ) + { + v12 = v8 - stru_721530.normal.x; + v19 = v9 - stru_721530.normal.y; + v13 = stru_721530.prolly_normal_d + v7; + v21 = ((v8 - stru_721530.normal.x) * stru_721530.field_58.y + - (v9 - stru_721530.normal.y) * stru_721530.field_58.x) >> 16; + if ( abs(v21) <= stru_721530.prolly_normal_d + v7 ) + { + v14 = (v12 * stru_721530.field_58.x + v19 * stru_721530.field_58.y) >> 16; + if ( v14 > 0 ) + { + v15 = v5->vPosition.z; + v16 = stru_721530.normal.z + + ((unsigned __int64)(stru_721530.field_58.z * (signed __int64)v14) >> 16); + if ( v16 >= v15 ) + { + if ( v16 <= v22 + v15 ) + { + v17 = v14 - sub_452A9E(v13 * v13 - v21 * v21); + if ( v17 < 0 ) + v17 = 0; + if ( v17 < stru_721530.field_7C ) + { + stru_721530.field_7C = v17; + stru_721530.uFaceID = (signed __int16)*v20; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + v3 = v20 + 1; + v18 = *v20 == 0; + ++v20; + } + while ( !v18 ); + } + } + } + } + } +} + +//----- (00486F92) -------------------------------------------------------- +void __cdecl sr_sub_486F92_MessWithEdgesAndSpans() +{ + Span *v0; // ebx@1 + int v1; // eax@2 + Edge *v2; // ecx@3 + Edge *v3; // edx@3 + Edge *v4; // esi@6 + Edge *v5; // eax@7 + Edge *v6; // ecx@8 + Surf *v7; // esi@11 + double v8; // st7@13 + Surf *v9; // edi@13 + double v10; // st6@13 + double v11; // st7@14 + signed __int64 v12; // qax@14 + stru148 *v13; // eax@15 + Span *v14; // ecx@17 + double v15; // st7@28 + signed __int64 v16; // qax@28 + stru148 *v17; // eax@29 + Span *v18; // ecx@31 + Edge *i; // eax@40 + Edge *v20; // ecx@43 + Edge *v21; // esi@44 + double v22; // st7@45 + Edge *v23; // edx@48 + unsigned int v24; // [sp+10h] [bp-10h]@2 + float v25; // [sp+14h] [bp-Ch]@3 + Edge *v26; // [sp+18h] [bp-8h]@8 + unsigned int v27; // [sp+1Ch] [bp-4h]@1 + + v0 = pSpans; + stru_80C9D8.pSurf = &stru_80C980; + stru_80C9D8.field_0 = (double)(signed int)pViewport->uViewportX; + stru_80C9A4.pSurf = &stru_80C980; + stru_80C980.pPrev = &stru_80C980; + stru_80C980.pNext = &stru_80C980; + stru_80C9A4.field_0 = (double)(signed int)pViewport->uViewportZ; + stru_80C980.field_8 = 0.0; + stru_80C980.field_4 = 0.0; + stru_80C9D8.pNext = &stru_80C9A4; + stru_80C9D8.pPrev = 0; + stru_80C9D8.field_8 = 1; + stru_80C9A4.pNext = 0; + stru_80C9A4.pPrev = &stru_80C9D8; + stru_80C9A4.field_8 = 0; + LODWORD(stru_80C980.field_0) = 0xC97423F0u; + v27 = pViewport->uViewportY; + if ( (signed int)pViewport->uViewportY > (signed int)pViewport->uViewportW ) + { +LABEL_51: + v0->field_8 = -1; + } + else + { + v1 = 52 * pViewport->uViewportY; + v24 = 52 * pViewport->uViewportY; + while ( 1 ) + { + v2 = *(Edge **)((char *)&pNewEdges->pNext + v1); + v3 = &stru_80C9D8; + v25 = (double)(signed int)v27; + if ( v2 != &defaultEdge ) + { + do + { + while ( 1 ) + { + v4 = v3->pNext; + if ( v2->field_0 <= (double)v4->field_0 ) + break; + v3 = v3->pNext; + } + v5 = v2->pNext; + v2->pNext = v4; + v2->pPrev = v3; + v3->pNext->pPrev = v2; + v3->pNext = v2; + v3 = v2; + v2 = v5; + } + while ( v5 != &defaultEdge ); + } + v6 = stru_80C9D8.pNext; + stru_80C980.field_20 = 0; + stru_80C980.field_22 = 1; + v26 = stru_80C9D8.pNext; + if ( stru_80C9D8.pNext ) + { + while ( 1 ) + { + v7 = v6->pSurf; + if ( v6->field_8 ) + { + ++v7->field_22; + if ( v7->field_22 == 1 ) + { + v8 = v6->field_0 + 2.0; + v9 = stru_80C980.pNext; + v10 = (v8 - v7->field_C) * v7->field_4 + (v25 - v7->field_10) * v7->field_8 + v7->field_0; + if ( v10 <= (v8 - stru_80C980.pNext->field_C) * stru_80C980.pNext->field_4 + + (v25 - stru_80C980.pNext->field_10) * stru_80C980.pNext->field_8 + + stru_80C980.pNext->field_0 ) + { + do + v9 = v9->pNext; + while ( v10 <= (v8 - v9->field_C) * v9->field_4 + (v25 - v9->field_10) * v9->field_8 + v9->field_0 ); + v7->pNext = v9; + v7->pPrev = v9->pPrev; + v9->pPrev->pNext = v7; + v9->pPrev = v7; + } + else + { + v11 = v6->field_0 + 0.5; + v12 = (signed __int64)(v11 - (double)stru_80C980.pNext->field_20); + v0->field_C = v12; + if ( (signed __int16)v12 > 0 ) + { + v0->field_A = v27; + v0->field_8 = v9->field_20; + v13 = v9->pParent; + v0->pParent = v13; + if ( v13 ) + { + if ( v13->prolly_head ) + { + v14 = v13->prolly_tail; + if ( !v14 ) + return; + v14->pNext = v0; + } + else + { + v13->prolly_head = v0; + } + v13->prolly_tail = v0; + } + if ( (signed int)pOutdoorCamera->uNumSpans >= 12499 ) + return; + ++v0; + ++pOutdoorCamera->uNumSpans; + } + v6 = v26; + v7->field_20 = (signed __int64)v11; + v7->pNext = v9; + v9->pPrev = v7; + stru_80C980.pNext = v7; + v7->pPrev = &stru_80C980; + } + } + } + else + { + --v7->field_22; + if ( !v7->field_22 ) + { + if ( stru_80C980.pNext == v7 ) + { + v15 = v6->field_0 + 0.5; + v16 = (signed __int64)(v15 - (double)v7->field_20); + v0->field_C = v16; + if ( (signed __int16)v16 > 0 ) + { + v0->field_A = v27; + v0->field_8 = v7->field_20; + v17 = v7->pParent; + v0->pParent = v17; + if ( v17 ) + { + if ( v17->prolly_head ) + { + v18 = v17->prolly_tail; + if ( !v18 ) + return; + v18->pNext = v0; + } + else + { + v17->prolly_head = v0; + } + v17->prolly_tail = v0; + } + if ( (signed int)pOutdoorCamera->uNumSpans >= 12499 ) + return; + ++v0; + ++pOutdoorCamera->uNumSpans; + } + v7->pNext->field_20 = (signed __int64)v15; + v6 = v26; + } + v7->pNext->pPrev = v7->pPrev; + v7->pPrev->pNext = v7->pNext; + } + } + v26 = v6->pNext; + if ( !v26 ) + break; + v6 = v6->pNext; + } + } + for ( i = ptr_80CA10[v27]; i; i = i->ptr_18 ) + { + i->pPrev->pNext = i->pNext; + i->pNext->pPrev = i->pPrev; + } + v20 = stru_80C9D8.pNext; + if ( stru_80C9D8.pNext != &stru_80C9A4 ) + break; +LABEL_50: + ++v27; + v1 = v24 + 52; + v24 += 52; + if ( (signed int)v27 > (signed int)pViewport->uViewportW ) + goto LABEL_51; + } + while ( 1 ) + { + v21 = v20->pNext; + if ( !v21 ) + break; + v22 = v20->field_4 + v20->field_0; + v20->field_0 = v22; + if ( v22 < stru_80C9D8.field_0 ) + v20->field_0 = stru_80C9D8.field_0 + 0.0000001; + while ( 1 ) + { + v23 = v20->pPrev; + if ( v20->field_0 >= (double)v23->field_0 ) + break; + v23->pNext = v20->pNext; + v20->pNext->pPrev = v23; + v23->pPrev->pNext = v20; + v20->pPrev = v23->pPrev; + v20->pNext = v23; + v23->pPrev = v20; + } + v20 = v21; + if ( v21 == &stru_80C9A4 ) + goto LABEL_50; + } + } +} +// 4EC3EC: using guessed type Edge defaultEdge; + + + +//----- (00487355) -------------------------------------------------------- +bool OutdoorCamera::_487355() +{ + int v0; // esi@1 + stru148 *v1; // edi@2 + bool result; // eax@3 + + v0 = 0; + if ( pOutdoorCamera->numStru148s > 0 ) + { + v1 = array_77EC08; + do + { + result = pGame->pLightmapBuilder->_45D3C7(v1); + ++v0; + ++v1; + } + while ( v0 < pOutdoorCamera->numStru148s ); + } + return result; +} + + + +//----- (00487DA9) -------------------------------------------------------- +void __cdecl sub_487DA9() +{ + char *v0; // eax@1 + + v0 = &array_77EC08[0].field_108; + do + { + *v0 = 0; + v0 += 268; + } + while ( (signed int)v0 < (signed int)&pVerticesSR_801A10[4] ); +} + +//----- (00487DBE) -------------------------------------------------------- +void Software_ResetNewEdges() +{ + int v0; // ecx@1 + Edge **v1; // eax@1 + signed int v2; // eax@3 + + v0 = 0; + v1 = ptr_80CA10; + do + { + ++v0; + *((int *)&pNewEdges[v0] - 9) = (int)&defaultEdge; + *v1 = 0; + ++v1; + } + while ( (signed int)v1 < (signed int)&unk_80D190 ); + v2 = 2000; + do + { + pSurfs->field_22 = 0; + --v2; + } + while ( v2 ); +} +// 4EC3EC: using guessed type Edge defaultEdge; + + + + +//----- (00487E1D) -------------------------------------------------------- +TileTable::~TileTable() +{ + if ( this->pTiles ) + { + pAllocator->FreeChunk(this->pTiles); + pTiles = nullptr; + } + uNumTiles = 0; +} + +//----- (00487E3B) -------------------------------------------------------- +TileDesc *TileTable::GetTileById(unsigned int uTileID) +{ + TileDesc *result; // eax@3 + + if ( (uTileID & 0x80000000u) != 0 || (signed int)uTileID > (signed int)(this->uNumTiles - 1) ) + result = this->pTiles; + else + result = &this->pTiles[uTileID]; + return result; +} + +//----- (00487E58) -------------------------------------------------------- +void TileTable::InitializeTileset(int uTerrainType) +{ + TileTable *v2; // edi@1 + int v3; // ebx@1 + TileDesc *v4; // eax@2 + signed int i; // [sp+8h] [bp-4h]@1 + + v2 = this; + v3 = 0; + for ( i = 0; i < (signed int)v2->uNumTiles; ++v3 ) + { + v4 = &v2->pTiles[v3]; + if ( uTerrainType == v4->uTerrainType && v4->pTileName[0] ) + { + v2->pTiles[v3].uBitmapID = pBitmaps_LOD->LoadTexture(v4->pTileName); + if ( v2->pTiles[v3].uBitmapID != -1 ) + HIWORD(pBitmaps_LOD->pTextures[v2->pTiles[v3].uBitmapID].palette) = pPaletteManager->LoadPalette(pBitmaps_LOD->pTextures[v2->pTiles[v3].uBitmapID].palette); + } + ++i; + } +} + +//----- (00487ED6) -------------------------------------------------------- +int TileTable::method_487ED6(signed int a1, int a2) +{ + int v3; // esi@1 + TileTable *v4; // edi@1 + int v5; // edx@3 + int v6; // edx@11 + unsigned int v8; // [sp-4h] [bp-10h]@4 + + v3 = 0; + v4 = this; + if ( a1 > 8 ) + { + v8 = 0; + return v4->GetTileId(a1, v8); + } + if ( a2 || (v5 = rand() % 50, v5 < 20) ) + { + v8 = 0; + return v4->GetTileId(a1, v8); + } + if ( v5 < 30 ) + { + v8 = 1; + return v4->GetTileId(a1, v8); + } + if ( v5 < 40 ) + { + v8 = 2; + return v4->GetTileId(a1, v8); + } + if ( v5 < 48 ) + { + v8 = 3; + return v4->GetTileId(a1, v8); + } + v6 = rand() % 8; + if ( !v6 ) + { + v8 = 4; + return v4->GetTileId(a1, v8); + } + if ( v6 == 1 ) + { + v8 = 5; + return v4->GetTileId(a1, v8); + } + if ( v6 == 2 ) + { + v8 = 6; + return v4->GetTileId(a1, v8); + } + if ( v6 == 3 ) + { + v8 = 7; + return v4->GetTileId(a1, v8); + } + if ( v6 == 4 ) + { + v8 = 8; + return v4->GetTileId(a1, v8); + } + if ( v6 == 5 ) + { + v8 = 9; + return v4->GetTileId(a1, v8); + } + if ( v6 == 6 ) + { + v8 = 10; + return v4->GetTileId(a1, v8); + } + if ( v6 == 7 ) + { + v8 = 11; + return v4->GetTileId(a1, v8); + } + return v3; +} + +//----- (00487F84) -------------------------------------------------------- +unsigned int TileTable::GetTileId(unsigned int uTerrainType, unsigned int uSection) +{ + unsigned int v3; // edx@1 + unsigned int result; // eax@1 + unsigned __int16 *v5; // ecx@2 + + v3 = this->uNumTiles; + result = 0; + if ( (signed int)this->uNumTiles <= 0 ) + { +LABEL_6: + result = 0; + } + else + { + v5 = &this->pTiles->uSection; + while ( (signed __int16)*(v5 - 1) != uTerrainType || (signed __int16)*v5 != uSection ) + { + ++result; + v5 += 13; + if ( (signed int)result >= (signed int)v3 ) + goto LABEL_6; + } + } + return result; +} + +//----- (00487FB4) -------------------------------------------------------- +void TileTable::ToFile() +{ + TileTable *v1; // esi@1 + FILE *v2; // eax@1 + FILE *v3; // edi@1 + + auto Str = this; + + v1 = Str; + v2 = fopen("data\\dtile.bin", "wb"); + v3 = v2; + if ( !v2 ) + Abortf("Unable to save dtile.bin!"); + fwrite(v1, 4u, 1u, v2); + fwrite(v1->pTiles, 0x1Au, v1->uNumTiles, v3); + fclose(v3); +} + +//----- (00488000) -------------------------------------------------------- +void TileTable::FromFile(void *pSerialized) +{ + uNumTiles = *(int *)pSerialized; + pTiles = (TileDesc *)pAllocator->AllocNamedChunk(pTiles, 26 * uNumTiles, "Tile Descrip"); + memcpy(pTiles, (char *)pSerialized + 4, 26 * uNumTiles); +} + +//----- (00488047) -------------------------------------------------------- +int TileTable::FromFileTxt(const char *pFilename) +{ + TileTable *v2; // ebp@1 + FILE *v3; // eax@1 + unsigned int v4; // ebx@3 + void *v5; // eax@9 + unsigned __int16 v6; // ax@14 + const char *v7; // ST14_4@14 + unsigned __int16 v8; // ax@14 + const char *v9; // esi@14 + int v10; // eax@17 + int v11; // eax@20 + int v12; // eax@22 + int v13; // eax@24 + int v14; // eax@26 + int v15; // eax@28 + int v16; // eax@30 + int v17; // eax@32 + int v18; // eax@34 + int v19; // eax@36 + int v20; // eax@38 + int v21; // eax@40 + int v22; // eax@42 + int v23; // eax@44 + int v24; // eax@46 + int v25; // eax@48 + int v26; // eax@50 + int v27; // eax@52 + int v28; // eax@54 + int v29; // eax@56 + int v30; // eax@58 + int v31; // eax@60 + int v32; // eax@62 + int v33; // eax@64 + int v34; // eax@66 + const char *v35; // esi@67 + int v36; // eax@70 + int v37; // eax@73 + int v38; // eax@75 + int v39; // eax@77 + int v40; // eax@79 + int v41; // eax@81 + int v42; // eax@83 + int v43; // eax@85 + int v44; // eax@87 + int v45; // eax@89 + int v46; // eax@91 + int v47; // eax@93 + int v48; // eax@108 + int v49; // eax@110 + int v50; // eax@112 + int v51; // eax@114 + int v52; // eax@116 + int v53; // eax@118 + int v54; // eax@120 + int v55; // eax@122 + int v56; // eax@124 + int v57; // eax@126 + int v58; // eax@128 + int v59; // eax@130 + int v60; // eax@132 + int v61; // eax@134 + int v62; // eax@136 + int v63; // eax@138 + int v64; // eax@140 + int v65; // eax@142 + int v66; // eax@144 + int v67; // eax@146 + int v68; // eax@148 + int v69; // eax@150 + int v70; // eax@151 + int j; // edi@152 + const char *v72; // esi@153 + int v73; // eax@154 + int v74; // eax@156 + int v75; // eax@160 + int v76; // eax@162 + int v77; // eax@164 + int v78; // eax@166 + int v79; // eax@168 + int v80; // eax@170 + FILE *i; // [sp-10h] [bp-304h]@3 + FILE *File; // [sp+4h] [bp-2F0h]@1 + FrameTableTxtLine v84; // [sp+8h] [bp-2ECh]@4 + FrameTableTxtLine v85; // [sp+84h] [bp-270h]@4 + char Buf; // [sp+100h] [bp-1F4h]@4 + + v2 = this; + v3 = fopen(pFilename, "r"); + File = v3; + if ( !v3 ) + Abortf("TileTable::load - Unable to open file: %s."); + v4 = 0; + for ( i = v3; fgets(&Buf, 490, i); i = File ) + { + *strchr(&Buf, 10) = 0; + memcpy(&v84, texture_frame_table_txt_parser(&Buf, &v85), sizeof(v84)); + if ( v84.field_0 && *v84.pProperties[0] != 47 ) + ++v4; + } + v2->uNumTiles = v4; + v5 = pAllocator->AllocNamedChunk(v2->pTiles, 26 * v4, "Tile Descrip"); + v2->pTiles = (TileDesc *)v5; + if ( !v5 ) + Abortf("TileTable::Load - Out of Memory!"); + memset(v5, 0, 26 * v2->uNumTiles); + v2->uNumTiles = 0; + fseek(File, 0, 0); + if ( fgets(&Buf, 490, File) ) + { + while ( 1 ) + { + *strchr(&Buf, 10) = 0; + memcpy(&v84, texture_frame_table_txt_parser(&Buf, &v85), sizeof(v84)); + if ( v84.field_0 ) + { + if ( *v84.pProperties[0] != 47 ) + break; + } +LABEL_173: + if ( !fgets(&Buf, 490, File) ) + goto LABEL_174; + } + strcpy(v2->pTiles[v2->uNumTiles].pTileName, v84.pProperties[0]); + v6 = atoi(v84.pProperties[1]); + v7 = v84.pProperties[2]; + v2->pTiles[v2->uNumTiles].uTileID = v6; + v8 = atoi(v7); + v9 = v84.pProperties[3]; + v2->pTiles[v2->uNumTiles].uBitmapID = v8; + v2->pTiles[v2->uNumTiles].uTerrainType = 0; + if ( _strcmpi(v9, "TTtype_NULL") ) + { + if ( _strcmpi(v9, "TTtype_Start") ) + { + if ( _strcmpi(v9, "TTtype_Grass") ) + { + if ( _strcmpi(v9, "TTtype_Cracked") ) + { + if ( _strcmpi(v9, "TTtype_Snow") ) + { + if ( _strcmpi(v9, "TTtype_Sand") ) + { + if ( _strcmpi(v9, "TTtype_Volcano") ) + { + if ( _strcmpi(v9, "TTtype_Dirt") ) + { + if ( _strcmpi(v9, "TTtype_Water") ) + { + if ( _strcmpi(v9, "TTtype_Tropical") ) + { + if ( _strcmpi(v9, "TTtype_Swamp") ) + { + if ( _strcmpi(v9, "TTtype_City") ) + { + if ( _strcmpi(v9, "TTtype_RoadGrassCobble") ) + { + if ( _strcmpi(v9, "TTtype_RoadGrassDirt") ) + { + if ( _strcmpi(v9, "TTtype_RoadCrackedCobble") ) + { + if ( _strcmpi(v9, "TTtype_RoadCrackedDirt") ) + { + if ( _strcmpi(v9, "TTtype_RoadSandCobble") ) + { + if ( _strcmpi(v9, "TTtype_RoadSandDirt") ) + { + if ( _strcmpi(v9, "TTtype_RoadVolcanoCobble") ) + { + if ( _strcmpi(v9, "TTtype_RoadVolcanoDirt") ) + { + if ( _strcmpi(v9, "TTtype_RoadSwampCobble") ) + { + if ( _strcmpi(v9, "TTtype_RoadSwampDirt") ) + { + if ( _strcmpi(v9, "TTtype_RoadTropicalCobble") ) + { + if ( _strcmpi(v9, "TTtype_RoadTropicalDirt") ) + { + if ( _strcmpi(v9, "TTtype_RoadSnowCobble") ) + { + if ( _strcmpi(v9, "TTtype_RoadSnowDirt") ) + { + if ( !_strcmpi(v9, "TTtype_RoadCityStone") ) + { + v34 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v34 |= 0x1Cu; + } + } + else + { + v33 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v33 |= 0xDu; + } + } + else + { + v32 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v32 |= 0xCu; + } + } + else + { + v31 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v31 |= 0x1Bu; + } + } + else + { + v30 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v30 |= 0x1Au; + } + } + else + { + v29 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v29 |= 0x19u; + } + } + else + { + v28 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v28 |= 0x18u; + } + } + else + { + v27 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v27 |= 0x11u; + } + } + else + { + v26 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v26 |= 0x10u; + } + } + else + { + v25 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v25 |= 0xFu; + } + } + else + { + v24 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v24 |= 0xEu; + } + } + else + { + v23 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v23 |= 0x17u; + } + } + else + { + v22 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v22 |= 0x16u; + } + } + else + { + v21 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v21 |= 0xBu; + } + } + else + { + v20 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v20 |= 0xAu; + } + } + else + { + v19 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v19 |= 9u; + } + } + else + { + v18 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v18 |= 7u; + } + } + else + { + v17 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v17 |= 8u; + } + } + else + { + v16 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v16 |= 5u; + } + } + else + { + v15 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v15 |= 4u; + } + } + else + { + v14 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v14 |= 3u; + } + } + else + { + v13 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v13 |= 2u; + } + } + else + { + v12 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v12 |= 1u; + } + } + else + { + v11 = (int)&v2->pTiles[v2->uNumTiles].uTerrainType; + *(char *)v11 |= 6u; + } + } + } + else + { + v10 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v10 |= 0xFEu; + } + } + else + { + LOBYTE(v2->pTiles[v2->uNumTiles].uTerrainType) = -1; + } + v35 = v84.pProperties[4]; + v2->pTiles[v2->uNumTiles].uSection = 0; + v2->pTiles[v2->uNumTiles].uAttributes = 0; + if ( !_strcmpi(v35, "TTsect_NULL") ) + { + LOBYTE(v2->pTiles[v2->uNumTiles].uSection) = -1; +LABEL_152: + for ( j = 5; j < v84.field_0; ++j ) + { + v72 = v84.pProperties[j]; + if ( _strcmpi(v84.pProperties[j], "TTattr_Burn") ) + { + if ( _strcmpi(v72, "TTattr_Water") ) + { + if ( _strcmpi(v72, "TTattr_Water2") ) + { + if ( _strcmpi(v72, "TTattr_Block") ) + { + if ( _strcmpi(v72, "TTattr_Repulse") ) + { + if ( _strcmpi(v72, "TTattr_Flat") ) + { + if ( _strcmpi(v72, "TTattr_Wave") ) + { + if ( _strcmpi(v72, "TTattr_NoDraw") ) + { + if ( !_strcmpi(v72, "TTattr_Transition") ) + { + v80 = (int)&v2->pTiles[v2->uNumTiles].uAttributes; + *(short *)v80 |= 0x200u; + } + } + else + { + v79 = (int)&v2->pTiles[v2->uNumTiles].uAttributes; + *(char *)v79 |= 0x40u; + } + } + else + { + v78 = (int)&v2->pTiles[v2->uNumTiles].uAttributes; + *(char *)v78 |= 0x20u; + } + } + else + { + v77 = (int)&v2->pTiles[v2->uNumTiles].uAttributes; + *(char *)v77 |= 0x10u; + } + } + else + { + v76 = (int)&v2->pTiles[v2->uNumTiles].uAttributes; + *(char *)v76 |= 8u; + } + } + else + { + v75 = (int)&v2->pTiles[v2->uNumTiles].uAttributes; + *(char *)v75 |= 4u; + } + } + else + { + HIBYTE(v2->pTiles[v2->uNumTiles].uAttributes) |= 1u; + } + } + else + { + v74 = (int)&v2->pTiles[v2->uNumTiles].uAttributes; + *(char *)v74 |= 2u; + } + } + else + { + v73 = (int)&v2->pTiles[v2->uNumTiles].uAttributes; + *(char *)v73 |= 1u; + } + } + ++v2->uNumTiles; + goto LABEL_173; + } + if ( !_strcmpi(v35, "TTsect_Start") ) + { + v36 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v36 |= 0xFEu; + goto LABEL_152; + } + if ( !_strcmpi(v35, "TTsect_Base1") ) + goto LABEL_152; + if ( !_strcmpi(v35, "TTsect_Base2") ) + { + v37 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v37 |= 1u; + goto LABEL_152; + } + if ( !_strcmpi(v35, "TTsect_Base3") ) + { + v38 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v38 |= 2u; + goto LABEL_152; + } + if ( !_strcmpi(v35, "TTsect_Base4") ) + { + v39 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v39 |= 3u; + goto LABEL_152; + } + if ( !_strcmpi(v35, "TTsect_Special1") ) + { + v40 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v40 |= 4u; + goto LABEL_152; + } + if ( !_strcmpi(v35, "TTsect_Special2") ) + { + v41 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v41 |= 5u; + goto LABEL_152; + } + if ( !_strcmpi(v35, "TTsect_Special3") ) + { + v42 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v42 |= 6u; + goto LABEL_152; + } + if ( !_strcmpi(v35, "TTsect_Special4") ) + { + v43 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v43 |= 7u; + goto LABEL_152; + } + if ( !_strcmpi(v35, "TTsect_Special5") ) + { + v44 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v44 |= 8u; + goto LABEL_152; + } + if ( !_strcmpi(v35, "TTsect_Special6") ) + { + v45 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v45 |= 9u; + goto LABEL_152; + } + if ( !_strcmpi(v35, "TTsect_Special7") ) + { + v46 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v46 |= 0xAu; + goto LABEL_152; + } + if ( !_strcmpi(v35, "TTsect_Special8") ) + { + v47 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v47 |= 0xBu; + goto LABEL_152; + } + if ( !_strcmpi(v35, "TTsect_NE1") ) + goto LABEL_130; + if ( !_strcmpi(v35, "TTsect_NW1") ) + goto LABEL_134; + if ( !_strcmpi(v35, "TTsect_SE1") ) + goto LABEL_130; + if ( !_strcmpi(v35, "TTsect_SW1") ) + goto LABEL_134; + if ( !_strcmpi(v35, "TTsect_E1") ) + goto LABEL_138; + if ( !_strcmpi(v35, "TTsect_W1") ) + goto LABEL_140; + if ( !_strcmpi(v35, "TTsect_N1") ) + goto LABEL_142; + if ( !_strcmpi(v35, "TTsect_S1") ) + goto LABEL_144; + if ( !_strcmpi(v35, "TTsect_XNE1") ) + goto LABEL_146; + if ( _strcmpi(v35, "TTsect_XNW1") ) + { + if ( !_strcmpi(v35, "TTsect_XSE1") ) + goto LABEL_146; + if ( _strcmpi(v35, "TTsect_XSW1") ) + { + if ( !_strcmpi(v35, "TTsect_CROS") ) + { +LABEL_151: + v70 = (int)&v2->pTiles[v2->uNumTiles].uAttributes; + *(short *)v70 |= 0x200u; + goto LABEL_152; + } + if ( !_strcmpi(v35, "TTsect_NS") ) + { + v48 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v48 |= 1u; + goto LABEL_151; + } + if ( !_strcmpi(v35, "TTsect_EW") ) + { + v49 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v49 |= 2u; + goto LABEL_151; + } + if ( !_strcmpi(v35, "TTsect_N_E") ) + { + v50 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v50 |= 3u; + goto LABEL_151; + } + if ( !_strcmpi(v35, "TTsect_N_W") ) + { + v51 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v51 |= 4u; + goto LABEL_151; + } + if ( !_strcmpi(v35, "TTsect_S_E") ) + { + v52 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v52 |= 5u; + goto LABEL_151; + } + if ( !_strcmpi(v35, "TTsect_S_W") ) + { + v53 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v53 |= 6u; + goto LABEL_151; + } + if ( !_strcmpi(v35, "TTsect_NS_E") ) + { + v54 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v54 |= 7u; + goto LABEL_151; + } + if ( !_strcmpi(v35, "TTsect_NS_W") ) + { + v55 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v55 |= 8u; + goto LABEL_151; + } + if ( !_strcmpi(v35, "TTsect_EW_N") ) + { + v56 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v56 |= 9u; + goto LABEL_151; + } + if ( !_strcmpi(v35, "TTsect_EW_S") ) + { + v57 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v57 |= 0xAu; + goto LABEL_151; + } + if ( !_strcmpi(v35, "TTsect_NCAP") ) + { + v58 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v58 |= 0xBu; + goto LABEL_151; + } + if ( !_strcmpi(v35, "TTsect_ECAP") ) + { +LABEL_130: + v59 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v59 |= 0xCu; + goto LABEL_151; + } + if ( !_strcmpi(v35, "TTsect_SCAP") ) + { + v60 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v60 |= 0xDu; + goto LABEL_151; + } + if ( !_strcmpi(v35, "TTsect_WCAP") ) + { +LABEL_134: + v61 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v61 |= 0xEu; + goto LABEL_151; + } + if ( !_strcmpi(v35, "TTsect_DN") ) + { + v62 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v62 |= 0xFu; + goto LABEL_151; + } + if ( !_strcmpi(v35, "TTsect_DS") ) + { +LABEL_138: + v63 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v63 |= 0x10u; + goto LABEL_151; + } + if ( !_strcmpi(v35, "TTsect_DW") ) + { +LABEL_140: + v64 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v64 |= 0x11u; + goto LABEL_151; + } + if ( !_strcmpi(v35, "TTsect_DE") ) + { +LABEL_142: + v65 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v65 |= 0x12u; + goto LABEL_151; + } + if ( !_strcmpi(v35, "TTsect_DSW") ) + { +LABEL_144: + v66 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v66 |= 0x13u; + goto LABEL_151; + } + if ( !_strcmpi(v35, "TTsect_DNE") ) + { +LABEL_146: + v67 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v67 |= 0x14u; + goto LABEL_151; + } + if ( !_strcmpi(v35, "TTsect_DSE") ) + { + v68 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v68 |= 0x15u; + goto LABEL_151; + } + if ( _strcmpi(v35, "TTsect_DNW") ) + goto LABEL_152; + } + } + v69 = (int)&v2->pTiles[v2->uNumTiles].uSection; + *(char *)v69 |= 0x16u; + goto LABEL_151; + } +LABEL_174: + fclose(File); + return 1; +} + + + +//----- (0048958E) -------------------------------------------------------- +stru12_MemoryBlock::stru12_MemoryBlock(int a2) +{ + stru12_MemoryBlock *v2; // esi@1 + void *v3; // eax@1 + void *v4; // ecx@1 + stru12_MemoryBlock *result; // eax@1 + + v2 = this; + v3 = operator new(8 * a2 + 16); + v2->pBlockBase = v3; + v4 = (char *)v3 + (-(signed int)v3 & 7); + result = v2; + v2->pAlignedBlock = v4; +} + +//----- (004895B7) -------------------------------------------------------- +stru12::stru12(stru11 *pStru11) +{ + stru12 *v2; // esi@1 + + v2 = this; + this->field_44 = 0x41000000u; + this->field_4C = 0x46000000u; + //this->vdestructor_ptr = stru12::_4898E6; + this->field_48 = 0; + this->field_50 = 0; + this->field_54 = 0x33D6BF95u; + this->field_58 = 0; + + for (int i = 0; i < 12; ++i) + v2->pMemBlocks[i] = new stru12_MemoryBlock(640); + /* + v3 = (stru12_MemoryBlock *)operator new(8u); + if ( v3 ) + v4 = AllocAlignedMem(v3, 640); + else + v4 = 0; + v2->pMemBlocks[0] = v4; + /*v5 = (stru12_MemoryBlock *)operator new(8u); + if ( v5 ) + v6 = AllocAlignedMem(v5, 640); + else + v6 = 0; + v2->pMemBlocks[1] = v6; + v7 = (stru12_MemoryBlock *)operator new(8u); + if ( v7 ) + v8 = AllocAlignedMem(v7, 640); + else + v8 = 0; + v2->pMemBlocks[2] = v8; + v9 = (stru12_MemoryBlock *)operator new(8u); + if ( v9 ) + v10 = AllocAlignedMem(v9, 640); + else + v10 = 0; + v2->pMemBlocks[3] = v10; + v11 = (stru12_MemoryBlock *)operator new(8u); + if ( v11 ) + v12 = AllocAlignedMem(v11, 640); + else + v12 = 0; + v2->pMemBlocks[4] = v12; + v13 = (stru12_MemoryBlock *)operator new(8u); + if ( v13 ) + v14 = AllocAlignedMem(v13, 640); + else + v14 = 0; + v2->pMemBlocks[5] = v14; + v15 = (stru12_MemoryBlock *)operator new(8u); + if ( v15 ) + v16 = AllocAlignedMem(v15, 640); + else + v16 = 0; + v2->pMemBlocks[6] = v16; + v17 = (stru12_MemoryBlock *)operator new(8u); + if ( v17 ) + v18 = AllocAlignedMem(v17, 640); + else + v18 = 0; + v2->pMemBlocks[7] = v18; + v19 = (stru12_MemoryBlock *)operator new(8u); + if ( v19 ) + v20 = AllocAlignedMem(v19, 640); + else + v20 = 0; + v2->pMemBlocks[8] = v20; + v21 = (stru12_MemoryBlock *)operator new(8u); + if ( v21 ) + v22 = AllocAlignedMem(v21, 640); + else + v22 = 0; + v2->pMemBlocks[9] = v22; + v23 = (stru12_MemoryBlock *)operator new(8u); + if ( v23 ) + v24 = AllocAlignedMem(v23, 640); + else + v24 = 0; + v2->pMemBlocks[10] = v24; + v25 = (stru12_MemoryBlock *)operator new(8u); + if ( v25 ) + v26 = AllocAlignedMem(v25, 640); + else + v26 = 0; + v2->field_8C = 0; + v2->pMemBlocks[11] = v26;*/ +} + +//----- (00489810) -------------------------------------------------------- +stru12::~stru12() +{ + for (int i = 0; i < 12; ++i) + delete pMemBlocks[i]; + /*if ( v2 ) + stru12_MemoryBlock::dtor(v2, 1); + v3 = v1->pMemBlocks[1]; + if ( v3 ) + stru12_MemoryBlock::dtor(v3, 1); + v4 = v1->pMemBlocks[2]; + if ( v4 ) + stru12_MemoryBlock::dtor(v4, 1); + v5 = v1->pMemBlocks[3]; + if ( v5 ) + stru12_MemoryBlock::dtor(v5, 1); + v6 = v1->pMemBlocks[4]; + if ( v6 ) + stru12_MemoryBlock::dtor(v6, 1); + v7 = v1->pMemBlocks[5]; + if ( v7 ) + stru12_MemoryBlock::dtor(v7, 1); + v8 = v1->pMemBlocks[6]; + if ( v8 ) + stru12_MemoryBlock::dtor(v8, 1); + v9 = v1->pMemBlocks[7]; + if ( v9 ) + stru12_MemoryBlock::dtor(v9, 1); + v10 = v1->pMemBlocks[8]; + if ( v10 ) + stru12_MemoryBlock::dtor(v10, 1); + v11 = v1->pMemBlocks[9]; + if ( v11 ) + stru12_MemoryBlock::dtor(v11, 1); + v12 = v1->pMemBlocks[10]; + if ( v12 ) + stru12_MemoryBlock::dtor(v12, 1); + v13 = v1->pMemBlocks[11]; + if ( v13 ) + stru12_MemoryBlock::dtor(v13, 1);*/ +} + +//----- (004898BF) -------------------------------------------------------- +stru12_MemoryBlock::~stru12_MemoryBlock() +{ + stru12_MemoryBlock *v2; // esi@1 + void *v3; // ST00_4@1 + + v2 = this; + v3 = this->pBlockBase; + this->pAlignedBlock = 0; + free(v3); + v2->pBlockBase = 0; + /*if ( a2 & 1 ) + free(v2);*/ +} + +//----- (004898E6) -------------------------------------------------------- +void stru12::_4898E6() +{ + void *v1; // eax@1 + void *v2; // edx@1 + char *v3; // edi@2 + double v4; // st7@2 + char *v5; // ebx@2 + double v6; // st6@3 + double v7; // st5@3 + double v8; // st4@3 + int v9; // esi@3 + double v10; // st3@3 + float v11; // ST34_4@5 + double v12; // st6@10 + double v13; // ST0C_8@10 + char *v14; // [sp+14h] [bp-44h]@2 + char *v15; // [sp+18h] [bp-40h]@2 + char *v16; // [sp+1Ch] [bp-3Ch]@2 + char *v17; // [sp+20h] [bp-38h]@2 + char *v18; // [sp+24h] [bp-34h]@2 + float v19; // [sp+30h] [bp-28h]@3 + float v20; // [sp+38h] [bp-20h]@3 + char *v21; // [sp+3Ch] [bp-1Ch]@2 + int v22; // [sp+40h] [bp-18h]@1 + char *v23; // [sp+44h] [bp-14h]@2 + char *v24; // [sp+48h] [bp-10h]@2 + int v25; // [sp+4Ch] [bp-Ch]@2 + float v26; // [sp+50h] [bp-8h]@3 + float v27; // [sp+54h] [bp-4h]@3 + + v22 = 0; + v1 = this->pMemBlocks[1]->pAlignedBlock; + v2 = this->pMemBlocks[6]->pAlignedBlock; + if ( this->field_8C > 0 ) + { + v24 = (char *)((char *)pMemBlocks[0]->pAlignedBlock - v1); + v23 = (char *)((char *)pMemBlocks[2]->pAlignedBlock - v1); + v18 = (char *)((char *)pMemBlocks[7]->pAlignedBlock - v2); + v17 = (char *)((char *)pMemBlocks[8]->pAlignedBlock - v2); + v25 = (int)v1 - (int)v2; + v16 = (char *)((char *)pMemBlocks[9]->pAlignedBlock - v2); + v3 = (char *)((char *)pMemBlocks[4]->pAlignedBlock - v2); + v15 = (char *)((char *)pMemBlocks[10]->pAlignedBlock - v2); + v4 = 1.0; + v5 = (char *)((char *)pMemBlocks[5]->pAlignedBlock - v2); + v21 = (char *)((char *)pMemBlocks[3]->pAlignedBlock - v2); + v14 = (char *)((char *)pMemBlocks[11]->pAlignedBlock - v2); + do + { + v26 = *(float *)&v24[(int)((char *)v2 + v25)] - (double)pIndoorCamera->pos.x; + v27 = *(float *)((char *)v2 + v25) - (double)pIndoorCamera->pos.y; + v6 = *(float *)&v23[(int)((char *)v2 + v25)] - (double)pIndoorCamera->pos.z; + v7 = pIndoorCamera->fRotationYCosine; + v8 = pIndoorCamera->fRotationYSine; + v20 = pIndoorCamera->fRotationXCosine; + v19 = pIndoorCamera->fRotationXSine; + v9 = (int)((char *)v2 + (int)v21); + v10 = v27 * pIndoorCamera->fRotationYSine + pIndoorCamera->fRotationYCosine * v26; + if ( pIndoorCamera->sRotationX ) + { + v11 = v10; + *(float *)v9 = v11 * pIndoorCamera->fRotationXCosine + pIndoorCamera->fRotationXSine * v6; + *(float *)((char *)v2 + (int)v3) = v7 * v27 - v8 * v26; + *(float *)((char *)v2 + (int)v5) = v20 * v6 - v11 * v19; + } + else + { + *(float *)v9 = v10; + *(float *)((char *)v2 + (int)v3) = v7 * v27 - v8 * v26; + *(float *)((char *)v2 + (int)v5) = v6; + } + if ( *(float *)v9 >= 8.0 ) + { + if ( (double)pOutdoorCamera->shading_dist_mist >= *(float *)v9 ) + { + *(int *)v2 = 0; + v12 = v4 / (*(float *)v9 + 0.0000001) * (double)pOutdoorCamera->int_fov_rad; + *(float *)((char *)v2 + (int)v18) = (double)pViewport->uScreenCenterX + - v12 * *(float *)((char *)v2 + (int)v3); + *(float *)((char *)v2 + (int)v17) = (double)pViewport->uScreenCenterY + - v12 * *(float *)((char *)v2 + (int)v5); + *(float *)((char *)v2 + (int)v16) = v4 + - v4 / (*(float *)v9 * 1000.0 / (double)pOutdoorCamera->shading_dist_mist); + *(float *)((char *)v2 + (int)v15) = v4 / (*(float *)v9 + 0.0000001); + v13 = *(float *)v9 + 6.7553994e15; + v4 = 1.0; + *(int *)((char *)v2 + (int)v14) = LODWORD(v13); + } + else + { + *(int *)v2 = 2; + } + } + else + { + *(int *)v2 = 1; + } + ++v22; + v2 = (char *)v2 + 4; + } + while ( v22 < this->field_8C ); + } + this->field_8C = 0; +} + + + + + +//----- (0048A959) -------------------------------------------------------- +unsigned int sub_48A959(int _this, float a2, float a3, float a4) +{ + int v4; // esi@1 + double v5; // st6@1 + double v6; // st6@1 + __int64 v8; // [sp+14h] [bp-20h]@1 + double v9; // [sp+1Ch] [bp-18h]@1 + int a6; // [sp+24h] [bp-10h]@1 + float v11; // [sp+28h] [bp-Ch]@1 + float v12; // [sp+2Ch] [bp-8h]@1 + float a1; // [sp+30h] [bp-4h]@1 + float a2a; // [sp+3Ch] [bp+8h]@7 + float a2b; // [sp+3Ch] [bp+8h]@7 + float a2c; // [sp+3Ch] [bp+8h]@7 + int a3a; // [sp+40h] [bp+Ch]@7 + + v4 = _this; + v8 = ((unsigned int)_this >> 16) & 0xFFi64; + v5 = (double)v8 * 0.0039215689; + v8 = (unsigned __int16)_this >> 8; + a1 = v5; + v6 = (double)v8; + v8 = _this & 0xFFi64; + v12 = v6 * 0.0039215689; + v11 = (double)v8 * 0.0039215689; + RGB2HSV((float *)&v8 + 1, (float *)&v9 + 1, a1, v12, v11, (float *)&a6); + if ( a2 != -1.0 ) + HIDWORD(v8) = LODWORD(a2); + if ( a3 != -1.0 ) + HIDWORD(v9) = LODWORD(a3); + if ( a4 != -1.0 ) + a6 = LODWORD(a4); + HSV2RGB(&a1, &v12, &v11, *((float *)&v8 + 1), *((float *)&v9 + 1), *(float *)&a6); + a2a = a1 * 255.0; + *(double *)&v8 = a2a + 6.7553994e15; + a3a = v8; + a2b = v12 * 255.0; + *(double *)&v8 = a2b + 6.7553994e15; + a2c = v11 * 255.0; + v9 = a2c + 6.7553994e15; + return LODWORD(v9) | v4 & 0xFF000000 | (((unsigned int)v8 | (a3a << 8)) << 8); +} + + +//----- (0048B561) -------------------------------------------------------- +int _48B561_mess_with_scaling_along_z(/*int a1, */float a2) +{ + float v2; // ST08_4@1 + double v3; // ST00_8@1 + int v4; // ST0C_4@1 + double v5; // ST00_8@1 + float v7; // [sp+18h] [bp+8h]@1 + + __debugbreak(); // check parameters carefully + + v2 = a2 - 0.5; + v3 = v2 + 6.7553994e15; + v4 = LODWORD(v3); + v7 = (a2 - (double)SLODWORD(v3)) * 65536.0; + v5 = v7 + 6.7553994e15; + return LODWORD(v5) | (v4 << 16); +} + + + + +//----- (004908DE) -------------------------------------------------------- +signed int __cdecl sub_4908DE() +{ + char *v0; // esi@1 + signed int v1; // edx@2 + char *v2; // eax@2 + signed int v3; // ecx@2 + + v0 = (char *)pParty->pPlayers[0].pActiveSkills; + while ( 1 ) + { + v1 = 0; + v2 = v0; + v3 = 37; + do + { + if ( *(short *)v2 ) + ++v1; + v2 += 2; + --v3; + } + while ( v3 ); + if ( v1 < 4 ) + break; + v0 += 6972; + if ( (signed int)v0 >= (signed int)&pParty->field_777C[18] ) + return 1; + } + return 0; +} + + + + +//----- (00491CB5) -------------------------------------------------------- +void __cdecl LoadPlayerPortraintsAndVoices() +{ + Texture **v0; // ebx@1 + int v1; // eax@2 + int v2; // edi@3 + char *v3; // esi@5 + char *v4; // [sp+10h] [bp-4h]@1 + + pIcons_LOD->dword_011BA0 = pIcons_LOD->uNumLoadedFiles; + v0 = (Texture **)pTextures_PlayerFaces; + v4 = (char *)&pParty->pPlayers[0].uFace; + do + { + v1 = 0; + do + { + v2 = v1 + 1; + sprintfex(pTmpBuf, "%s%02d", pPlayerPortraitsNames[*v4], v1 + 1); + *v0 = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(pTmpBuf, TEXTURE_16BIT_PALETTE)]; + v1 = v2; + ++v0; + } + while ( v2 < 56 ); + v4 += 6972; + } + while ( (signed int)v4 < (signed int)((char *)&pParty->pPickedItem.uExpireTime + 6) ); + pTexture_PlayerFaceEradicated = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture("ERADCATE", TEXTURE_16BIT_PALETTE)]; + pTexture_PlayerFaceDead = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture("DEAD", TEXTURE_16BIT_PALETTE)]; + v3 = (char *)&pParty->pPlayers[0].uVoiceID; + pTexture_PlayerFaceMask = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture("FACEMASK", TEXTURE_16BIT_PALETTE)]; + do + { + if ( byte_4ED498 ) + { + pSoundList->_4A9A67(2 * ((unsigned __int8)byte_4ED498 + 50 * *(int *)v3) + 4998, 0); + pSoundList->_4A9A67(2 * ((unsigned __int8)byte_4ED498 + 50 * *(int *)v3) + 4999, 0); + } + v3 += 6972; + } + while ( (signed int)v3 < (signed int)&pParty->field_871C[560] ); +} +// 4ED498: using guessed type char byte_4ED498; + +//----- (00491DE7) -------------------------------------------------------- +int __fastcall ReloadPlayerPortraits(int a1, int a2) +{ + int result; // eax@1 + char **v3; // ebp@1 + Texture **v4; // ebx@1 + int v5; // esi@2 + + result = 0; + v3 = &pPlayerPortraitsNames[a2]; + v4 = pTextures_PlayerFaces[a1]; + do + { + v5 = result + 1; + sprintfex(pTmpBuf, "%s%02d", *v3, result + 1); + pIcons_LOD->ReloadTexture(*v4, pTmpBuf, 2); + result = v5; + ++v4; + } + while ( v5 < 56 ); + return result; +} +// 491DE7: using guessed type int __fastcall ReloadPlayerPortraits(int, int); + +//----- (00491E3A) -------------------------------------------------------- +void __cdecl sub_491E3A() +{ + Player *v0; // ebx@1 + signed int v1; // esi@3 + char *v2; // eax@4 + unsigned int v3; // eax@7 + unsigned int v4; // edx@8 + char *v5; // ecx@9 + int v6; // edi@17 + Texture *v7; // ebx@18 + struct IDirect3DTexture2 **v8; // eax@19 + struct IDirect3DTexture2 *v9; // eax@20 + struct IDirectDrawSurface **v10; // eax@22 + struct IDirectDrawSurface *v11; // eax@23 + int v12; // eax@26 + + v0 = pParty->pPlayers; + do + { + if ( byte_4ED498 ) + { + v1 = 0; + if ( (signed int)pSoundList->uNumSounds <= 0 ) + { +LABEL_7: + v3 = 0; + } + else + { + v2 = (char *)&pSoundList->pSounds->uSoundID; + while ( *(int *)v2 != 2 * ((unsigned __int8)byte_4ED498 + 50 * v0->uVoiceID) + 4998 ) + { + ++v1; + v2 += 120; + if ( v1 >= (signed int)pSoundList->uNumSounds ) + goto LABEL_7; + } + v3 = v1; + } + pSoundList->_4A9DCD(v3, 1); + v4 = 0; + if ( (signed int)pSoundList->uNumSounds <= 0 ) + { +LABEL_12: + v4 = 0; + } + else + { + v5 = (char *)&pSoundList->pSounds->uSoundID; + while ( *(int *)v5 != 2 * ((unsigned __int8)byte_4ED498 + 50 * v0->uVoiceID) + 4999 ) + { + ++v4; + v5 += 120; + if ( (signed int)v4 >= (signed int)pSoundList->uNumSounds ) + goto LABEL_12; + } + } + pSoundList->_4A9DCD(v4, 1); + } + ++v0; + } + while ( (signed int)v0 < (signed int)pParty->pHirelings ); + v6 = pIcons_LOD->uNumLoadedFiles - 1; + if ( v6 >= pIcons_LOD->dword_011BA0 ) + { + v7 = &pIcons_LOD->pTextures[v6]; + do + { + v7->Release(); + v8 = pIcons_LOD->pHardwareTextures; + if ( v8 ) + { + v9 = v8[v6]; + if ( v9 ) + { + v9->Release(); + pIcons_LOD->pHardwareTextures[v6] = 0; + } + } + v10 = pIcons_LOD->pHardwareSurfaces; + if ( v10 ) + { + v11 = v10[v6]; + if ( v11 ) + { + v11->Release(); + pIcons_LOD->pHardwareSurfaces[v6] = 0; + } + } + --v6; + --v7; + } + while ( v6 >= pIcons_LOD->dword_011BA0 ); + } + v12 = pIcons_LOD->dword_011BA0; + pIcons_LOD->dword_011BA0 = 0; + pIcons_LOD->uNumLoadedFiles = v12; +} +// 4ED498: using guessed type char byte_4ED498; + +//----- (00491F87) -------------------------------------------------------- +void __cdecl DrawHiredNPCs() +{ + int v0; // ecx@2 + char *v1; // eax@2 + int v2; // edx@4 + signed int v3; // ebx@6 + char *v4; // esi@7 + int v5; // ecx@13 + int v6; // eax@15 + char v7; // al@17 + unsigned int v8; // eax@18 + int v9; // esi@18 + int v10; // eax@18 + unsigned int v11; // eax@19 + unsigned int v12; // esi@19 + unsigned int v13; // eax@23 + IconFrame *v14; // eax@24 + unsigned int v15; // eax@26 + char pContainer; // [sp+Ch] [bp-30h]@18 + unsigned int v17; // [sp+20h] [bp-1Ch]@19 + signed int uFrameID; // [sp+24h] [bp-18h]@19 + int i; // [sp+28h] [bp-14h]@15 + unsigned int v20; // [sp+2Ch] [bp-10h]@20 + unsigned int v21; // [sp+30h] [bp-Ch]@19 + int v22; // [sp+34h] [bp-8h]@2 + unsigned __int8 v23; // [sp+3Bh] [bp-1h]@2 + + if ( bNoNPCHiring != 1 ) + { + v23 = 0; + v22 = 0; + v0 = 0; + v1 = (char *)pParty->pHirelings; + do + { + if ( *(int *)v1 ) + { + v2 = v22++; + pTmpBuf[v2] = v0; + } + v1 += 76; + ++v0; + } + while ( (signed int)v1 < (signed int)&pParty->pPickedItem ); + v3 = 0; + if ( (signed int)pNPCStats->uNumNewNPCs > 0 ) + { + v4 = (char *)pNPCStats->pNewNPCData; + do + { + if ( v4[8] & 0x80 && (!pParty->pHirelings[0].pName || strcmp(*(const char **)v4, pParty->pHirelings[0].pName)) ) + { + if ( !pParty->pHirelings[1].pName || strcmp(*(const char **)v4, pParty->pHirelings[1].pName) ) + { + v5 = v22++; + pTmpBuf[v5] = v3 + 2; + } + } + ++v3; + v4 += 76; + } + while ( v3 < (signed int)pNPCStats->uNumNewNPCs ); + } + v6 = (unsigned __int8)pParty->field_709; + for ( i = (unsigned __int8)pParty->field_709; i < v22; v6 = i++ + 1 ) + { + if ( v23 >= 2u ) + break; + v7 = pTmpBuf[v6]; + if ( (unsigned __int8)v7 >= 2u ) + { + sprintfex(&pContainer, "NPC%03d", pNPCStats->pNPCData[(unsigned __int8)v7 + 499].uPortraitID); + v15 = pIcons_LOD->LoadTexture(&pContainer, TEXTURE_16BIT_PALETTE); + pRenderer->DrawTextureIndexed( + pHiredNPCsIconsOffsetsX[v23], + pHiredNPCsIconsOffsetsY[v23], + (Texture *)(v15 != -1 ? 72 * v15 + 7145548 : 0)); + } + else + { + sprintfex(&pContainer, "NPC%03d", pParty->pHirelings[(unsigned __int8)v7].uPortraitID); + v8 = pIcons_LOD->LoadTexture(&pContainer, TEXTURE_16BIT_PALETTE); + v9 = v23; + pRenderer->DrawTextureIndexed( + pHiredNPCsIconsOffsetsX[v9], + pHiredNPCsIconsOffsetsY[v9], + (Texture *)(v8 != -1 ? (int)&pIcons_LOD->pTextures[v8] : 0)); + v10 = (unsigned __int8)pTmpBuf[i]; + if ( pParty->pHirelings[v10].bDrawSomeAnim == 1 ) + { + uFrameID = pParty->pHirelings[v10].evtb; + v11 = pHiredNPCsIconsOffsetsX[v9]; + v12 = pHiredNPCsIconsOffsetsY[v9]; + v17 = v11; + v21 = 0; + if ( (signed int)pIconsFrameTable->uNumIcons <= 0 ) + { +LABEL_23: + v13 = 0; + } + else + { + v20 = 0; + while ( _strcmpi("spell96", pIconsFrameTable->pIcons[v20 / 0x20].pAnimationName) ) + { + ++v21; + v20 += 32; + if ( (signed int)v21 >= (signed int)pIconsFrameTable->uNumIcons ) + goto LABEL_23; + } + v13 = v21; + } + v14 = pIconsFrameTable->GetFrame(v13, uFrameID); + pRenderer->DrawTextureTransparent(v17, v12, &pIcons_LOD->pTextures[v14->uTextureID]); + } + } + ++v23; + } + } +} +// 6BE3C5: using guessed type char bNoNPCHiring; + + + +//----- (004921C1) -------------------------------------------------------- +void GameUI_DrawPortraits(unsigned int _this) +{ + signed int v1; // ebx@2 + int v2; // ebp@7 + char *v3; // esi@7 + Texture *v4; // eax@10 + signed int v5; // edx@13 + PlayerFrame *v6; // eax@14 + unsigned int v7; // eax@17 + PlayerFrame *v8; // eax@21 + unsigned int v9; // eax@27 + bool v10; // eax@33 + bool v11; // edi@40 + bool v12; // edx@43 + bool v13; // ecx@46 + int v14; // esi@54 + char *v15; // edi@55 + int v16; // eax@57 + __int16 *v17; // esi@59 + char *v18; // edi@59 + int v19; // eax@62 + Texture *v20; // [sp-4h] [bp-1Ch]@27 + signed int v21; // [sp+10h] [bp-8h]@7 + unsigned int v22; // [sp+14h] [bp-4h]@1 + + v22 = _this; + if ( qword_A750D8 ) + { + qword_A750D8 -= (signed int)pMiscTimer->uTimeElapsed; + v1 = 0; + if ( qword_A750D8 <= 0 ) + { + if ( pPlayers[word_A750E2]->CanAct() ) + pPlayers[word_A750E2]->PlaySound(word_A750E0, 0); + qword_A750D8 = 0i64; + } + } + else + { + v1 = 0; + } + v2 = 0; + v21 = v1; + v3 = (char *)&pParty->pPlayers[0].pConditions[14]; + while ( 1 ) + { + if ( *((_QWORD *)v3 + 2) ) + { + v4 = pTexture_PlayerFaceEradicated; +LABEL_27: + v20 = v4; + v9 = pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[v2]; + if ( pParty->pPartyBuffs[11].uExpireTime ) + pRenderer->_4A6E7E(v9, 0x183u, v20); + else + pRenderer->DrawTextureTransparent(v9 + 1, 0x184u, v20); + v10 = *((int *)v3 + 1541) >= v1 && (*((int *)v3 + 1541) > v1 || *((int *)v3 + 1540) > (unsigned int)v1); + if ( *((int *)v3 + 1489) >= v1 && (*((int *)v3 + 1489) > v1 || *((int *)v3 + 1488) > (unsigned int)v1) ) + v1 = 1; + v11 = *((_QWORD *)v3 + 758) > 0i64; + v12 = *((_QWORD *)v3 + 756) > 0i64; + v13 = *((_QWORD *)v3 + 768) > 0i64; + if ( v13 | v12 | v11 | v1 | v10 ) + sub_441A4E(v2); + goto LABEL_50; + } + if ( *(_QWORD *)v3 ) + { + v4 = pTexture_PlayerFaceDead; + goto LABEL_27; + } + v5 = 0; + if ( (signed int)pPlayerFrameTable->uNumFrames <= v1 ) + { +LABEL_17: + v7 = 0; + } + else + { + v6 = pPlayerFrameTable->pFrames; + while ( v6->uSequenceID != *((short *)v3 + 3350) ) + { + ++v5; + ++v6; + if ( v5 >= (signed int)pPlayerFrameTable->uNumFrames ) + goto LABEL_17; + } + v7 = v5; + } + if ( v7 == v1 ) + v7 = 1; + if ( *((short *)v3 + 3350) == 21 ) + v8 = pPlayerFrameTable->GetFrameBy_y( + (int *)v3 + 1678, + (int *)v3 + 1677, + pMiscTimer->uTimeElapsed); + else + v8 = pPlayerFrameTable->GetFrameBy_x(v7, *((short *)v3 + 3351)); + if ( *((short *)v3 + 3353) != v8->uTextureID - 1 || v22 ) + { + *((short *)v3 + 3353) = v8->uTextureID - 1; + v1 = 0; + v4 = (Texture *)A74CEC_player_faces_minus1_indexing[v21 + v8->uTextureID]; + goto LABEL_27; + } +LABEL_50: + v21 += 56; + v3 += 6972; + ++v2; + if ( (signed int)v3 >= (signed int)&pParty->pHirelings[1].field_24 ) + break; + v1 = 0; + } + if ( pParty->bTurnBasedModeOn == 1 ) + { + if ( pTurnEngine->field_4 != 1 ) + { + if ( (pTurnEngine->pQueue[0].uPackedID & 7) == 4 ) + { + v14 = 0; + if ( pTurnEngine->uActorQueueSize > 0 ) + { + v15 = (char *)pTurnEngine->pQueue; + do + { + if ( (*v15 & 7) != 4 ) + break; + v16 = dword_5079D0; + if ( pParty->uFlags & 0x10 ) + { + v16 = dword_5079CC; + } + else + { + if ( pParty->uFlags & 0x20 ) + v16 = dword_5079C8; + } + pRenderer->DrawTextureTransparent( + pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing[*(int *)v15 >> 3] - 4, + 0x181u, + (Texture *)(v16 != -1 ? (int)&pIcons_LOD->pTextures[v16] : 0)); + ++v14; + v15 += 16; + } + while ( v14 < pTurnEngine->uActorQueueSize ); + } + } + } + } + else + { + v17 = pPlayerPortraitsXCoords_For_PlayerBuffAnimsDrawing; + v18 = (char *)pParty->pPlayers; + do + { + if ( ((Player *)v18)->CanAct() && !*((short *)v18 + 3226) ) + { + v19 = dword_5079D0; + if ( pParty->uFlags & 0x10 ) + { + v19 = dword_5079CC; + } + else + { + if ( pParty->uFlags & 0x20 ) + v19 = dword_5079C8; + } + pRenderer->DrawTextureTransparent( + *v17 - 4, + 0x181u, + (Texture *)(v19 != -1 ? (int)&pIcons_LOD->pTextures[v19] : 0)); + } + v18 += 6972; + ++v17; + } + while ( (signed int)v18 < (signed int)pParty->pHirelings ); + } +} + + +//----- (0049387A) -------------------------------------------------------- +int CycleCharacter(unsigned int _this) +{ + signed int result; // eax@1 + signed int v2; // ecx@2 + signed int v3; // ecx@8 + + result = uActiveCharacter; + if ( _this ) + { + v2 = 0; + while ( 1 ) + { + --result; + if ( result < 1 ) + result = 4; + if ( !pPlayers[result]->uTimeToRecovery ) + break; + ++v2; + if ( v2 >= 4 ) + return uActiveCharacter; + } + } + else + { + v3 = 0; + while ( 1 ) + { + ++result; + if ( result > 4 ) + result = 1; + if ( !pPlayers[result]->uTimeToRecovery ) + break; + ++v3; + if ( v3 >= 4 ) + return uActiveCharacter; + } + } + return result; +} + +//----- (004938D1) -------------------------------------------------------- +void __fastcall Rest(unsigned int uHoursToSleep) +{ + unsigned int v1; // esi@1 + double v2; // st7@3 + Player **v3; // esi@3 + + v1 = uHoursToSleep; + if ( uHoursToSleep > 240 ) + UpdateActors(); + v2 = (double)(7680 * v1) * 0.033333335; + pParty->uTimePlayed += (signed __int64)v2; + v3 = &pPlayers[1]; + do + { + (*v3)->Recover((signed __int64)v2); + ++v3; + } + while ( (signed int)v3 <= (signed int)&pPlayers[4] ); + _494035_timed_effects__water_walking_damage__etc(); +} + +//----- (00493938) -------------------------------------------------------- +int __cdecl _493938_regenerate() +{ + int v0; // edi@1 + signed __int64 v1; // qax@1 + int v2; // ecx@1 + int result; // eax@1 + int v4; // eax@2 + int v5; // edi@5 + char *v6; // ecx@5 + char v7; // sf@5 + char *v8; // ecx@10 + int v9; // edi@15 + signed int v10; // eax@15 + __int16 *v11; // edx@16 + int v12; // eax@20 + int v13; // ebx@20 + unsigned int *v14; // esi@21 + unsigned int v15; // ecx@21 + unsigned int v16; // eax@21 + int v17; // edx@21 + int v18; // eax@21 + signed int v19; // eax@21 + signed int v20; // ebx@25 + Player *v21; // esi@25 + ITEM_EQUIP_TYPE v22; // edi@30 + int v23; // edx@31 + signed int v24; // ecx@32 + signed int v25; // eax@33 + int v26; // eax@35 + int v27; // eax@36 + int v28; // eax@37 + int v29; // eax@40 + int v30; // eax@41 + signed int v31; // ecx@53 + char *v32; // eax@53 + char *v33; // edi@82 + int v34; // ecx@88 + int v35; // eax@88 + char *v36; // edi@99 + int v37; // edi@104 + int v38; // edi@106 + int v39; // edi@111 + int v40; // ecx@113 + char v41[400]; // [sp+4h] [bp-22Ch]@20 + LayingItem a1; // [sp+194h] [bp-9Ch]@15 + Vec3_int_ a3; // [sp+204h] [bp-2Ch]@15 + int v44; // [sp+210h] [bp-20h]@22 + int v45; // [sp+214h] [bp-1Ch]@25 + int v46; // [sp+218h] [bp-18h]@25 + int v47; // [sp+21Ch] [bp-14h]@25 + int v48; // [sp+220h] [bp-10h]@25 + int v49; // [sp+224h] [bp-Ch]@24 + int v50; // [sp+228h] [bp-8h]@25 + int v51; // [sp+22Ch] [bp-4h]@2 + + v0 = (signed int)(signed __int64)((double)(signed __int64)pParty->uTimePlayed * 0.234375) / 60; + v1 = (signed __int64)((double)pParty->uLastRegenerationTime * 0.234375); + v2 = (signed int)v1 / 60; + result = (signed int)v1 / 60 + 5; + if ( v0 >= result ) + { + v51 = 0; + v4 = (v0 - v2) / 5; + if ( (signed __int64)pParty->pPartyBuffs[7].uExpireTime > 0 ) + { + if ( pParty->bFlying ) + { + if ( !(pParty->pPartyBuffs[7].uFlags & 1) ) + { + v5 = v4 * pParty->pPartyBuffs[7].uPower; + v6 = &stru_AA1058[4].pSounds[6972 * pParty->pPartyBuffs[7].uCaster + 2000]; + v7 = *(int *)v6 - v5 < 0; + *(int *)v6 -= v5; + if ( v7 ) + { + *(int *)v6 = 0; + pParty->uFlags &= 0xFFFFFFBFu; + pParty->bFlying = 0; + v51 = 1; + } + } + } + } + if ( (signed __int64)pParty->pPartyBuffs[18].uExpireTime > 0 ) + { + if ( pParty->uFlags & 0x80 ) + { + if ( !(pParty->pPartyBuffs[18].uFlags & 1) ) + { + v8 = &stru_AA1058[4].pSounds[6972 * pParty->pPartyBuffs[18].uCaster + 2000]; + v7 = *(int *)v8 - v4 < 0; + *(int *)v8 -= v4; + if ( v7 ) + { + *(int *)v8 = 0; + LOBYTE(pParty->uFlags) &= 0x7Fu; + v51 = 1; + } + } + } + } + if ( SHIDWORD(pParty->pPartyBuffs[10].uExpireTime) >= 0 + && (SHIDWORD(pParty->pPartyBuffs[10].uExpireTime) > 0 || LODWORD(pParty->pPartyBuffs[10].uExpireTime)) ) + { + //LayingItem::LayingItem(&a1); + v9 = 0; + a3.z = 0; + a3.y = 0; + a3.x = 0; + a1.stru_24.Reset(); + a1.field_4C = pParty->pPartyBuffs[10].uPower; + a1.field_50 = pParty->pPartyBuffs[10].uSkill; + v10 = 0; + a1.uItemType = 1070; + a1.field_48 = 8; + if ( (signed int)pObjectList->uNumObjects <= 0 ) + { +LABEL_19: + LOWORD(v10) = 0; + } + else + { + v11 = &pObjectList->pObjects->uObjectID; + while ( stru_4E3ACC[8].uItemType != *v11 ) + { + ++v10; + v11 += 28; + if ( v10 >= (signed int)pObjectList->uNumObjects ) + goto LABEL_19; + } + } + a1.uObjectDescID = v10; + a1.field_60_distance_related_prolly_lod = 0; + v12 = 8 * pParty->pPartyBuffs[10].uCaster; + LOBYTE(v12) = v12 | 4; + a1.uAttributes = 0; + a1.uSectorID = 0; + a1.uSpriteFrameID = 0; + a1.field_58 = v12; + a1.uFacing = 0; + a1.uSoundID = 0; + v13 = sub_46A89E((int)v41, 100, 307); + if ( v13 > 0 ) + { + do + { + v14 = (unsigned int *)&v41[4 * v9]; + v15 = *v14; + v16 = *v14; + a1.vPosition.x = pActors[v16].vPosition.x; + v17 = pActors[v16].vPosition.y; + a1.vPosition.z = pActors[v16].vPosition.z; + v18 = 8 * v15; + LOBYTE(v18) = 8 * v15 | 3; + a1.vPosition.y = v17; + a1.field_5C = v18; + v19 = a1.Create(0, 0, 0, 0); + DamageMonsterFromParty(8 * v19 | 2, *v14, &a3); + ++v9; + } + while ( v9 < v13 ); + } + } + v44 = 0; + if ( sub_476387() == 1 ) + v44 = 1; + v49 = 0; +LABEL_25: + v20 = 0; + v21 = &pParty->pPlayers[v49]; + v50 = 0; + v47 = 0; + v45 = 0; + v48 = 0; + v46 = 0; + if ( v44 && v21->uClass == 31 ) + v50 = 1; + if ( v21->uClass == 35 ) + v48 = 1; + v22 = (ITEM_EQUIP_TYPE)0; + while ( 1 ) + { + if ( v21->HasItemEquipped(v22) ) + { + v24 = *(int *)&v21->pDarkSpellbook.bIsSpellAvailable[36 * *(int *)v23 + 5]; + if ( v24 > 134 ) + { + if ( v24 == 529 ) + goto LABEL_43; + if ( v24 == 535 ) + goto LABEL_44; + if ( v24 == 515 ) + { + v47 = 1; + } + else + { + if ( v24 == 532 ) + goto LABEL_50; + } + } + else + { + v25 = *(int *)&v21->field_1F5[36 * *(int *)v23 + 7]; + if ( v25 <= 50 ) + { + if ( v25 != 50 ) + { + v26 = v25 - 37; + if ( v26 ) + { + v27 = v26 - 1; + if ( !v27 ) + goto LABEL_50; + v28 = v27 - 6; + if ( v28 ) + { + if ( v28 != 3 ) + goto LABEL_51; +LABEL_50: + v50 = 1; + goto LABEL_51; + } + } + } +LABEL_44: + v20 = 1; + goto LABEL_51; + } + v29 = v25 - 54; + if ( !v29 ) + goto LABEL_44; + v30 = v29 - 1; + if ( !v30 ) + goto LABEL_50; + if ( v30 == 11 ) + { +LABEL_43: + v20 = 1; + v50 = 1; + goto LABEL_51; + } + } + } +LABEL_51: + v22 = (ITEM_EQUIP_TYPE)((int)v22 + 1); + if ( (signed int)v22 >= 16 ) + { + if ( v48 ) + { + v31 = 0; + v32 = (char *)v21->pInventoryItems; + while ( *(int *)v32 != 601 || (unsigned __int8)v32[26] != v49 + 1 ) + { + ++v31; + v32 += 36; + if ( v31 >= 138 ) + goto LABEL_59; + } + v48 = 0; + v45 = 1; + } +LABEL_59: + if ( v21->pConditions[17] ) + v46 = 1; + if ( v20 && !v21->pConditions[14] && !v21->pConditions[16] ) + { + ++v21->sHealth; + if ( v21->sHealth > v21->GetMaxHealth() ) + v21->sHealth = v21->GetMaxHealth(); + if ( v21->pConditions[13] && v21->sHealth > 0 ) + { + LODWORD(v21->pConditions[13]) = 0; + HIDWORD(v21->pConditions[13]) = 0; + } + v51 = 1; + } + if ( SHIDWORD(v21->pPlayerBuffs[12].uExpireTime) >= 0 + && (SHIDWORD(v21->pPlayerBuffs[12].uExpireTime) > 0 || LODWORD(v21->pPlayerBuffs[12].uExpireTime)) + && !v21->pConditions[14] + && !v21->pConditions[16] ) + { + v21->sHealth += 5 * v21->pPlayerBuffs[12].uPower; + if ( v21->sHealth > v21->GetMaxHealth() ) + v21->sHealth = v21->GetMaxHealth(); + if ( v21->pConditions[13] && v21->sHealth > 0 ) + { + LODWORD(v21->pConditions[13]) = 0; + HIDWORD(v21->pConditions[13]) = 0; + } + v51 = 1; + } + if ( v50 ) + { + v33 = (char *)&v21->sMana; + ++*(int *)v33; + if ( v21->sMana > v21->GetMaxMana() ) + *(int *)v33 = v21->GetMaxMana(); + v51 = 1; + } + if ( v47 && !v21->pConditions[14] && !v21->pConditions[16] ) + { + v34 = LODWORD(v21->pConditions[13]); + --v21->sHealth; + v35 = v21->sHealth; + if ( !(HIDWORD(v21->pConditions[13]) | v34) && v35 < 0 ) + v21->pConditions[13] = pParty->uTimePlayed; + if ( v35 < 1 ) + { + if ( v21->sHealth + v21->uEndurance + v21->GetItemsBonus(CHARACTER_ATTRIBUTE_ENDURANCE, 0) >= 1 + || (signed __int64)v21->pPlayerBuffs[11].uExpireTime > 0 ) + { + v21->pConditions[13] = pParty->uTimePlayed; + } + else + { + if ( !v21->pConditions[14] ) + v21->pConditions[14] = pParty->uTimePlayed; + } + } + v51 = 1; + } + if ( v45 ) + { + v36 = (char *)&v21->sMana; + ++*(int *)v36; + if ( v21->sMana > v21->GetMaxMana() ) + *(int *)v36 = v21->GetMaxMana(); + } + if ( v48 && !v21->pConditions[14] && !v21->pConditions[16] ) + { + v37 = v21->sHealth; + if ( v37 > v21->GetMaxHealth() / 2 ) + v21->sHealth = v37 - 2; + v38 = v21->sMana; + if ( v38 > v21->GetMaxMana() / 2 ) + v21->sMana = v38 - 2; + } + if ( v46 && !v21->pConditions[14] && !v21->pConditions[16] ) + { + v39 = v21->sHealth; + if ( v39 > v21->GetMaxHealth() / 2 ) + v21->sHealth = v39 - 1; + v40 = v21->sMana; + if ( v40 > 0 ) + v21->sMana = v40 - 1; + } + ++v49; + if ( v49 >= 4 ) + { + result = HIDWORD(pParty->uTimePlayed); + pParty->uLastRegenerationTime = pParty->uTimePlayed; + if ( !viewparams->bRedrawGameUI ) + { + result = v51; + viewparams->bRedrawGameUI = v51; + } + return result; + } + goto LABEL_25; + } + } + } + return result; +} +// 493938: using guessed type char var_22C[400]; + + + +//----- (00493F79) -------------------------------------------------------- +int sub_493F79(stru351 *_this, __int64 a2) +{ + signed __int64 v2; // ST2C_8@1 + signed __int64 v3; // qax@1 + signed __int64 v4; // ST1C_8@1 + unsigned __int64 v5; // qax@1 + unsigned int v6; // ebx@1 + int result; // eax@1 + + v2 = (signed __int64)((double)a2 * 0.234375); + v3 = v2 / 60 / 60; + v4 = v3; + v5 = (unsigned int)v3 / 0x18; + v6 = (unsigned int)(v5 / 7) >> 2; + _this->field_0 = v2 % 60; + _this->field_4 = v2 / 60 % 60; + _this->field_8 = v4 % 24; + _this->field_10 = v5 / 7 & 3; + _this->field_C = (unsigned int)v5 % 0x1C; + result = v6 / 0xC + 1168; + _this->field_14 = v6 % 0xC; + _this->field_18 = result; + return result; +} + + + + + +//----- (00494035) -------------------------------------------------------- +void __cdecl _494035_timed_effects__water_walking_damage__etc() +{ + signed __int64 v0; // qax@1 + signed __int64 v1; // ST30_8@1 + signed __int64 v2; // ST38_8@1 + unsigned __int64 v3; // qax@1 + unsigned int v4; // edi@1 + signed int v5; // eax@4 + char *v6; // ecx@5 + Player *v7; // esi@8 + char *v8; // ecx@12 + Player *pPlayer; // esi@15 + void *v10; // esi@25 + unsigned int v11; // ecx@27 + signed int v12; // edi@29 + Player *v13; // ecx@30 + Player *v14; // esi@35 + double v15; // st7@35 + Player **v16; // esi@43 + Player *v17; // edi@44 + double v18; // st7@44 + float v19; // ST28_4@48 + double v20; // ST38_8@48 + Player *v21; // esi@51 + signed int v22; // edi@53 + int v23; // eax@59 + int v24; // ecx@60 + int v25; // eax@63 + int v26; // ecx@64 + int v27; // eax@67 + int v28; // ecx@68 + int v29; // eax@71 + int v30; // ecx@72 + int v31; // eax@75 + int v32; // ecx@76 + int v33; // eax@79 + int v34; // ecx@80 + int v35; // eax@83 + int v36; // ecx@84 + int v37; // eax@87 + int v38; // ecx@88 + int v39; // eax@91 + int v40; // ecx@92 + int v41; // eax@95 + int v42; // ecx@96 + bool v43; // ebx@102 + SpellBuff *v44; // edi@104 + signed int v45; // ebp@104 + bool v46; // edi@111 + SpellBuff *v47; // esi@113 + Player **v48; // esi@119 + signed int v49; // edi@121 + char *v50; // esi@122 + signed int v51; // edx@128 + signed int v52; // ecx@130 + int v53; // eax@131 + Player *v54; // eax@141 + unsigned int v55; // [sp-8h] [bp-38h]@18 + unsigned int v56; // [sp-8h] [bp-38h]@55 + int v57; // [sp-4h] [bp-34h]@18 + int v58; // [sp-4h] [bp-34h]@33 + int v59; // [sp-4h] [bp-34h]@55 + unsigned int v60; // [sp+10h] [bp-20h]@1 + unsigned int v61; // [sp+14h] [bp-1Ch]@1 + Player **v62; // [sp+14h] [bp-1Ch]@50 + unsigned int a2; // [sp+18h] [bp-18h]@1 + signed int a2a; // [sp+18h] [bp-18h]@47 + signed int v65; // [sp+1Ch] [bp-14h]@47 + + a2 = pParty->uCurrentHour; + v61 = pParty->uDaysPlayed; + v60 = pEventTimer->uTimeElapsed; + pParty->uTimePlayed += (signed int)pEventTimer->uTimeElapsed; + v0 = (signed __int64)((double)(signed __int64)pParty->uTimePlayed * 0.234375) / 60; + v1 = v0; + v0 /= 60i64; + v2 = v0; + v3 = (unsigned int)v0 / 0x18; + v4 = (unsigned int)(v3 / 7) >> 2; + pParty->uCurrentTimeSecond = (signed __int64)((double)(signed __int64)pParty->uTimePlayed * 0.234375) % 60; + pParty->uCurrentMinute = v1 % 60; + pParty->uCurrentMonthWeek = v3 / 7 & 3; + pParty->uCurrentHour = v2 % 24; + pParty->uDaysPlayed = (unsigned int)v3 % 0x1C; + pParty->uCurrentMonth = v4 % 0xC; + pParty->uCurrentYear = v4 / 0xC + 1168; + if ( pParty->uCurrentHour >= 3 && ((signed int)a2 < 3 || (unsigned int)v3 % 0x1C > v61) ) + { + v5 = 0; + pParty->pHirelings[0].bHasUsedTheAbility = 0; + pParty->pHirelings[1].bHasUsedTheAbility = 0; + if ( (signed int)pNPCStats->uNumNewNPCs > 0 ) + { + v6 = (char *)&pNPCStats->pNewNPCData[0].bHasUsedTheAbility; + do + { + *(int *)v6 = 0; + ++v5; + v6 += 76; + } + while ( v5 < (signed int)pNPCStats->uNumNewNPCs ); + } + ++pParty->field_764; + if ( pParty->field_764 > 1u ) + { + v7 = pParty->pPlayers; + do + { + v7->SetCondition(1u, 0); + ++v7; + } + while ( (signed int)v7 < (signed int)pParty->pHirelings ); + if ( pParty->uNumFoodRations ) + { + Party::TakeFood(1u); + } + else + { + v8 = (char *)&pParty->pPlayers[0].sHealth; + do + { + *(int *)v8 = *(int *)v8 / ((unsigned __int8)pParty->field_764 + 1) + 1; + v8 += 6972; + } + while ( (signed int)v8 < (signed int)&pParty->field_871C[567] ); + } + if ( pParty->field_764 > 3u ) + { + pPlayer = pParty->pPlayers; + do + { + pPlayer->Zero(); + if ( !(pPlayer->pConditions[15] | pPlayer->pConditions[16] | pPlayer->pConditions[14]) ) + { + if ( rand() % 100 < 5 * (unsigned __int8)pParty->field_764 ) + { + v57 = 0; + v55 = 14; +LABEL_21: + pPlayer->SetCondition(v55, v57); + goto LABEL_22; + } + if ( rand() % 100 < 10 * (unsigned __int8)pParty->field_764 ) + { + v57 = 0; + v55 = 5; + goto LABEL_21; + } + } +LABEL_22: + ++pPlayer; + } + while ( (signed int)pPlayer < (signed int)pParty->pHirelings ); + } + } + if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor ) + pOutdoor->SetFog(); + v10 = &pParty->pPlayers[0].uNumDivineInterventionCastsThisDay; + do + { + memset(v10, 0, 4u); + v10 = (char *)v10 + 6972; + } + while ( (signed int)v10 < (signed int)&pParty->field_871C[694] ); + } + v11 = LODWORD(pParty->uTimePlayed); + if ( pParty->uFlags & 4 && pParty->field_6FC < (signed __int64)pParty->uTimePlayed ) + { + v12 = 1; + pParty->field_6FC = LODWORD(pParty->uTimePlayed) + 128; + viewparams->bRedrawGameUI = 1; + while ( 1 ) + { + if ( pPlayers[v12]->WearsItem(516, 3) + || v13->HasEnchantedItemEquipped(71) + || (signed __int64)v13->pPlayerBuffs[23].uExpireTime > 0 ) + { + v58 = 0; + } + else + { + v58 = 0; + if ( !sub_43EE77_ProbablyIfUnderwaterSuitIsEquipped(v12) ) + { + v14 = pPlayers[v12]; + v15 = (double)pPlayers[v12]->GetMaxHealth() * 0.1; + v14->ReceiveDamage((signed __int64)v15, 0); + if ( pParty->uFlags & 4 ) + { + strcpy(GameUI_StatusBar_TimedString, pGlobalTXT_LocalizationStrings[660]); + GameUI_StatusBar_TimedStringTimeLeft = 128; + } + goto LABEL_39; + } + v13 = pPlayers[v12]; + } + v13->PlayEmotion(37, v58); +LABEL_39: + ++v12; + if ( v12 > 4 ) + { + v11 = LODWORD(pParty->uTimePlayed); + break; + } + } + } + if ( pParty->uFlags & 0x200 && pParty->field_6FC < (signed __int64)__PAIR__(HIDWORD(pParty->uTimePlayed), v11) ) + { + viewparams->bRedrawGameUI = 1; + pParty->field_6FC = v11 + 128; + v16 = &pPlayers[1]; + do + { + v17 = *v16; + v18 = (double)(*v16)->GetMaxHealth() * 0.1; + v17->ReceiveDamage((signed __int64)v18, 0); + if ( pParty->uFlags & 0x200 ) + { + strcpy(GameUI_StatusBar_TimedString, pGlobalTXT_LocalizationStrings[661]); + GameUI_StatusBar_TimedStringTimeLeft = 128; + } + ++v16; + } + while ( (signed int)v16 <= (signed int)&pPlayers[4] ); + } + _493938_regenerate(); + v65 = 4; + a2a = v60; + if ( pParty->uFlags2 & 2 ) + { + v19 = (double)(signed int)v60 * 0.5; + v20 = v19 + 6.7553994e15; + a2a = LODWORD(v20); + if ( SLODWORD(v20) <= 0 ) + a2a = 1; + } + v62 = &pPlayers[1]; + do + { + v21 = *v62; + if ( (*v62)->uTimeToRecovery ) + v21->Recover(a2a); + v22 = v21->sHealth; + if ( v21->GetItemsBonus(CHARACTER_ATTRIBUTE_ENDURANCE, 0) + v22 + v21->uEndurance >= 1 + || (signed __int64)v21->pPlayerBuffs[11].uExpireTime > 0 ) + { + if ( v22 >= 1 ) + goto LABEL_59; + v59 = 0; + v56 = 13; + } + else + { + v59 = 0; + v56 = 14; + } + v21->SetCondition(v56, v59); +LABEL_59: + v23 = (int)&v21->field_E0; + if ( v21->field_E0 ) + { + v24 = *(int *)v23 - v60; + if ( v24 > 0 ) + { + *(int *)v23 = v24; + } + else + { + *(int *)v23 = 0; + viewparams->bRedrawGameUI = 1; + } + } + v25 = (int)&v21->field_E4; + if ( v21->field_E4 ) + { + v26 = *(int *)v25 - v60; + if ( v26 > 0 ) + { + *(int *)v25 = v26; + } + else + { + *(int *)v25 = 0; + viewparams->bRedrawGameUI = 1; + } + } + v27 = (int)&v21->field_E8; + if ( v21->field_E8 ) + { + v28 = *(int *)v27 - v60; + if ( v28 > 0 ) + { + *(int *)v27 = v28; + } + else + { + *(int *)v27 = 0; + viewparams->bRedrawGameUI = 1; + } + } + v29 = (int)&v21->field_EC; + if ( v21->field_EC ) + { + v30 = *(int *)v29 - v60; + if ( v30 > 0 ) + { + *(int *)v29 = v30; + } + else + { + *(int *)v29 = 0; + viewparams->bRedrawGameUI = 1; + } + } + v31 = (int)&v21->field_F0; + if ( v21->field_F0 ) + { + v32 = *(int *)v31 - v60; + if ( v32 > 0 ) + { + *(int *)v31 = v32; + } + else + { + *(int *)v31 = 0; + viewparams->bRedrawGameUI = 1; + } + } + v33 = (int)&v21->field_F4; + if ( v21->field_F4 ) + { + v34 = *(int *)v33 - v60; + if ( v34 > 0 ) + { + *(int *)v33 = v34; + } + else + { + *(int *)v33 = 0; + viewparams->bRedrawGameUI = 1; + } + } + v35 = (int)&v21->field_F8; + if ( v21->field_F8 ) + { + v36 = *(int *)v35 - v60; + if ( v36 > 0 ) + { + *(int *)v35 = v36; + } + else + { + *(int *)v35 = 0; + viewparams->bRedrawGameUI = 1; + } + } + v37 = (int)&v21->field_FC; + if ( v21->field_FC ) + { + v38 = *(int *)v37 - v60; + if ( v38 > 0 ) + { + *(int *)v37 = v38; + } + else + { + *(int *)v37 = 0; + viewparams->bRedrawGameUI = 1; + } + } + v39 = (int)&v21->field_100; + if ( v21->field_100 ) + { + v40 = *(int *)v39 - v60; + if ( v40 > 0 ) + { + *(int *)v39 = v40; + } + else + { + *(int *)v39 = 0; + viewparams->bRedrawGameUI = 1; + } + } + v41 = (int)&v21->field_104; + if ( v21->field_104 ) + { + v42 = *(int *)v41 - v60; + if ( v42 > 0 ) + { + *(int *)v41 = v42; + } + else + { + *(int *)v41 = 0; + viewparams->bRedrawGameUI = 1; + } + } + if ( v21->pConditions[2] | v21->pConditions[12] | v21->pConditions[13] | v21->pConditions[14] | v21->pConditions[15] | v21->pConditions[16] ) + --v65; + v43 = (signed __int64)v21->pPlayerBuffs[7].uExpireTime > 0; + v44 = v21->pPlayerBuffs; + v45 = 24; + do + { + v44->_4585CA(pParty->uTimePlayed); + ++v44; + --v45; + } + while ( v45 ); + if ( v43 && (signed __int64)v21->pPlayerBuffs[7].uExpireTime <= 0 ) + v21->SetCondition(1u, 0); + ++v62; + } + while ( (signed int)v62 <= (signed int)&pPlayers[4] ); + v46 = (signed __int64)pParty->pPartyBuffs[8].uExpireTime > 0; + v47 = pParty->pPartyBuffs; + do + { + if ( v47->_4585CA(pParty->uTimePlayed) == 1 ) + viewparams->bRedrawGameUI = 1; + ++v47; + } + while ( (signed int)v47 < (signed int)pParty->pPlayers ); + if ( v46 && (signed __int64)pParty->pPartyBuffs[8].uExpireTime <= 0 ) + { + v48 = &pPlayers[1]; + do + { + (*v48)->SetCondition(1u, 0); + ++v48; + } + while ( (signed int)v48 <= (signed int)&pPlayers[4] ); + } + v49 = (signed int)dword_4EE07C; + do + { + v50 = (char *)&pParty->pPartyBuffs[*(int *)v49]; + if ( *(_QWORD *)v50 > 0i64 ) + { + if ( !(v50[15] & 1) ) + { + if ( !pPlayers[(unsigned __int8)v50[14]]->CanAct() ) + { + ((SpellBuff *)v50)->Reset(); + if ( *(int *)v49 == 7 ) + pParty->bFlying = 0; + } + } + } + v49 += 4; + } + while ( v49 < (signed int)&unk_4EE084 ); + v51 = v65; + if ( v65 ) + goto LABEL_135; + if ( uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions != 5 ) + { + v52 = (signed int)&pPlayers[1]; + while ( 1 ) + { + v53 = *(int *)v52; + if ( *(_QWORD *)(*(int *)v52 + 16) ) + break; + v52 += 4; + if ( v52 > (signed int)&pPlayers[4] ) + goto LABEL_135; + } + *(int *)(v53 + 16) = 0; + *(int *)(v53 + 20) = 0; + v51 = 1; +LABEL_135: + if ( uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions != 5 + && (!v51 || dword_5C35C0) ) + uGameState = 8; + } + if ( uActiveCharacter ) + { + if ( uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions != 5 ) + { + v54 = pPlayers[uActiveCharacter]; + if ( v54->pConditions[2] + || v54->pConditions[12] + || v54->pConditions[13] + || v54->pConditions[14] + || v54->pConditions[15] + || v54->pConditions[16] ) + { + viewparams->bRedrawGameUI = 1; + uActiveCharacter = pParty->GetNextActiveCharacter(); + } + } + } +} + +//----- (00494820) -------------------------------------------------------- +unsigned int __fastcall sub_494820(unsigned int a1) +{ + signed int v1; // eax@1 + + v1 = 5; + if ( a1 % 0x18 >= 5 ) + v1 = 29; + return v1 - a1 % 0x18; +} + +//----- (00494836) -------------------------------------------------------- +int stru339_spell_sound::_494836(int uSoundID, int a6) +{ + int v3; // esi@1 + int result; // eax@1 + stru339_spell_sound *v5; // ebx@1 + int *v6; // edi@2 + unsigned int v7; // eax@3 + int v8; // [sp+Ch] [bp-8h]@3 + int v9; // [sp+10h] [bp-4h]@2 + int a2a; // [sp+1Ch] [bp+8h]@1 + + v3 = 0; + result = word_4EE088_sound_ids[uSoundID]; + v5 = this; + a2a = word_4EE088_sound_ids[uSoundID]; + if ( result ) + { + v9 = 0; + v6 = this->pSoundsOffsets; + do + { + v7 = a2a++; + result = pSoundList->LoadSound(v7, (char *)v5 + v3, 44744 - v3, &v8, a6); + if ( !result ) + break; + a6 += 4; + result = v8 + 256; + *v6 = v3; + v3 += result; + ++v9; + *(v6 - 2) = result; + ++v6; + } + while ( v9 < 2 ); + } + return result; +} +// 4EE088: using guessed type __int16 word_4EE088_sound_ids[]; + + + +//----- (00494AED) -------------------------------------------------------- +unsigned int PlayerFrameTable::GetFrameIdBy_field0(int uField0) +{ + unsigned int _uNumFrames; // edx@1 + unsigned int result; // eax@1 + PlayerFrame *v4; // ecx@2 + + _uNumFrames = this->uNumFrames; + result = 0; + if ( (signed int)this->uNumFrames <= 0 ) + { +LABEL_5: + result = 0; + } + else + { + v4 = this->pFrames; + while ( v4->uSequenceID != uField0 ) + { + ++result; + ++v4; + if ( (signed int)result >= (signed int)_uNumFrames ) + goto LABEL_5; + } + } + return result; +} + +//----- (00494B10) -------------------------------------------------------- +PlayerFrame *PlayerFrameTable::GetFrameBy_x(unsigned int uFramesetID, unsigned int uFrameID) +{ + unsigned int v3; // esi@1 + PlayerFrame *v4; // edi@1 + PlayerFrame *v5; // ecx@1 + __int16 v6; // dx@2 + int v7; // edx@3 + char *i; // eax@3 + int v9; // ecx@5 + PlayerFrame *result; // eax@6 + + v3 = uFramesetID; + v4 = this->pFrames; + v5 = &v4[uFramesetID]; + if ( v5->uFlags & 1 && (v6 = v5->uAnimLength) != 0 ) + { + v7 = ((signed int)uFrameID >> 3) % (unsigned __int16)v6; + for ( i = (char *)&v5->uAnimTime; ; i += 10 ) + { + v9 = *(short *)i; + if ( v7 <= v9 ) + break; + v7 -= v9; + ++v3; + } + result = &v4[v3]; + } + else + { + result = &v4[uFramesetID]; + } + return result; +} + +//----- (00494B5E) -------------------------------------------------------- +PlayerFrame *PlayerFrameTable::GetFrameBy_y(int *a2, int *a3, int a4) +{ + PlayerFrameTable *v4; // edi@1 + int v5; // esi@1 + int v6; // eax@2 + + v4 = this; + v5 = a4 + *a3; + if ( v5 < 8 * this->pFrames[*a2].uAnimTime ) + { + *a3 = v5; + } + else + { + v6 = rand() % 4 + 21; + *a2 = v6; + *a3 = 8 * v5 % v4->pFrames[v6].uAnimTime; + } + return &v4->pFrames[*a2]; +} + +//----- (00494BC3) -------------------------------------------------------- +void PlayerFrameTable::ToFile() +{ + PlayerFrameTable *v1; // esi@1 + FILE *v2; // eax@1 + FILE *v3; // edi@1 + + auto Str = this; + + v1 = Str; + v2 = fopen("data\\dpft.bin", "wb"); + v3 = v2; + if ( !v2 ) + Abortf("Unable to save dpft.bin!"); + fwrite(v1, 4u, 1u, v2); + fwrite(v1->pFrames, 0xAu, v1->uNumFrames, v3); + fclose(v3); +} + +//----- (00494C0F) -------------------------------------------------------- +void PlayerFrameTable::FromFile(void *pSerialized) +{ + uNumFrames = *(int *)pSerialized; + pFrames = (PlayerFrame *)pAllocator->AllocNamedChunk(pFrames, 10 * uNumFrames, "P Frames"); + memcpy(pFrames, (char *)pSerialized + 4, 10 * uNumFrames); +} + +//----- (00494C5A) -------------------------------------------------------- +int PlayerFrameTable::FromFileTxt(const char *Args) +{ + PlayerFrameTable *v2; // ebx@1 + FILE *v3; // eax@1 + int v4; // esi@3 + void *v5; // eax@10 + FILE *v6; // ST0C_4@12 + char *i; // eax@12 + __int16 v8; // ax@15 + const char *v9; // ST10_4@15 + unsigned __int16 v10; // ax@15 + const char *v11; // ST0C_4@15 + int j; // esi@15 + int v13; // eax@17 + int v14; // edx@22 + int v15; // ecx@23 + int v16; // eax@24 + signed int k; // eax@27 + PlayerFrame *v18; // edx@28 + int v19; // esi@28 + int l; // ecx@29 + char Buf; // [sp+Ch] [bp-2F8h]@3 + FrameTableTxtLine v23; // [sp+200h] [bp-104h]@4 + FrameTableTxtLine v24; // [sp+27Ch] [bp-88h]@4 + int v25; // [sp+2F8h] [bp-Ch]@3 + int v26; // [sp+2FCh] [bp-8h]@3 + FILE *File; // [sp+300h] [bp-4h]@1 + int Argsa; // [sp+30Ch] [bp+8h]@28 + + v2 = this; + //TileTable::dtor((TileTable *)this); + v3 = fopen(Args, "r"); + File = v3; + if ( !v3 ) + Abortf("PlayerFrameTable::load - Unable to open file: %s.", Args); + v4 = 0; + v25 = 0; + v26 = 1; + if ( fgets(&Buf, 490, v3) ) + { + do + { + *strchr(&Buf, 10) = 0; + memcpy(&v24, texture_frame_table_txt_parser(&Buf, &v23), sizeof(v24)); + if ( v24.field_0 && *v24.pProperties[0] != 47 ) + { + if ( v24.field_0 < 3 ) + Abortf("PlayerFrameTable::load, too few arguments, %s line %i.", Args, v26); + ++v25; + } + ++v26; + } + while ( fgets(&Buf, 490, File) ); + v4 = v25; + } + v2->uNumFrames = v4; + v5 = pAllocator->AllocNamedChunk(v2->pFrames, 10 * v4, "P Frames"); + v2->pFrames = (PlayerFrame *)v5; + if ( !v5 ) + Abortf("PlayerFrameTable::load - Out of Memory!"); + v6 = File; + v2->uNumFrames = 0; + fseek(v6, 0, 0); + for ( i = fgets(&Buf, 490, File); i; i = fgets(&Buf, 490, File) ) + { + *strchr(&Buf, 10) = 0; + memcpy(&v24, texture_frame_table_txt_parser(&Buf, &v23), sizeof(v24)); + if ( v24.field_0 && *v24.pProperties[0] != 47 ) + { + v8 = atoi(v24.pProperties[0]); + v9 = v24.pProperties[1]; + v2->pFrames[v2->uNumFrames].uSequenceID = v8; + v10 = atoi(v9); + v11 = v24.pProperties[2]; + v2->pFrames[v2->uNumFrames].uTextureID = v10; + v2->pFrames[v2->uNumFrames].uAnimTime = atoi(v11); + v2->pFrames[v2->uNumFrames].uAnimLength = 0; + v2->pFrames[v2->uNumFrames].uFlags = 0; + for ( j = 3; j < v24.field_0; ++j ) + { + if ( !_strcmpi(v24.pProperties[j], "New") ) + { + v13 = (int)&v2->pFrames[v2->uNumFrames].uFlags; + *(char *)v13 |= 4u; + } + } + ++v2->uNumFrames; + } + } + fclose(File); + v14 = 0; + if ( (signed int)(v2->uNumFrames - 1) > 0 ) + { + v15 = 0; + do + { + v16 = (int)&v2->pFrames[v15]; + if ( !(*(char *)(v16 + 18) & 4) ) + *(char *)(v16 + 8) |= 1u; + ++v14; + ++v15; + } + while ( v14 < (signed int)(v2->uNumFrames - 1) ); + } + for ( k = 0; k < (signed int)v2->uNumFrames; *(short *)(Argsa + 6) = v19 ) + { + v18 = v2->pFrames; + Argsa = (int)&v18[k]; + v19 = *(short *)(Argsa + 4); + if ( *(char *)(Argsa + 8) & 1 ) + { + ++k; + for ( l = (int)&v18[k]; *(char *)(l + 8) & 1; l += 10 ) + { + v19 += *(short *)(l + 4); + ++k; + } + LOWORD(v19) = v18[k].uAnimTime + v19; + } + ++k; + } + return 1; +} + +//----- (00494F3A) -------------------------------------------------------- +unsigned int IconFrameTable::FindIcon(const char *pIconName) +{ + IconFrameTable *v2; // esi@1 + int v3; // ebx@1 + unsigned int uID; // edi@1 + unsigned int result; // eax@4 + + v2 = this; + v3 = 0; + uID = 0; + if ( (signed int)this->uNumIcons <= 0 ) + { +LABEL_4: + result = 0; + } + else + { + while ( _strcmpi(pIconName, v2->pIcons[v3].pAnimationName) ) + { + ++uID; + ++v3; + if ( (signed int)uID >= (signed int)v2->uNumIcons ) + goto LABEL_4; + } + result = uID; + } + return result; +} + +//----- (00494F70) -------------------------------------------------------- +IconFrame *IconFrameTable::GetFrame(unsigned int uIconID, unsigned int uFrameID) +{ + IconFrame *v3; // edi@1 + IconFrame *v4; // ecx@1 + __int16 v5; // dx@2 + int v6; // edx@3 + unsigned int v7; // eax@3 + char *i; // ecx@3 + int v9; // esi@5 + IconFrame *result; // eax@6 + + v3 = this->pIcons; + v4 = &v3[uIconID]; + if ( v4->uFlags & 1 && (v5 = v4->uAnimLength) != 0 ) + { + v6 = ((signed int)uFrameID >> 3) % (unsigned __int16)v5; + v7 = uIconID; + for ( i = (char *)&v4->uAnimTime; ; i += 32 ) + { + v9 = *(short *)i; + if ( v6 <= v9 ) + break; + v6 -= v9; + ++v7; + } + result = &v3[v7]; + } + else + { + result = &v3[uIconID]; + } + return result; +} + +//----- (00494FBF) -------------------------------------------------------- +void IconFrameTable::InitializeAnimation(unsigned int uIconID) +{ + IconFrameTable *v2; // esi@1 + unsigned int v3; // edi@3 + const char *i; // eax@3 + IconFrame *v5; // eax@5 + + v2 = this; + if ( (signed int)uIconID <= (signed int)this->uNumIcons && (uIconID & 0x80000000u) == 0 ) + { + v3 = uIconID; + for ( i = this->pIcons[uIconID].pTextureName; ; i = v5[v3].pTextureName ) + { + v2->pIcons[v3].uTextureID = pIcons_LOD->LoadTexture(i, TEXTURE_16BIT_PALETTE); + v5 = v2->pIcons; + if ( !(v5[v3].uFlags & 1) ) + break; + ++v3; + } + } +} + +//----- (0049500A) -------------------------------------------------------- +void IconFrameTable::ToFile() +{ + IconFrameTable *v1; // esi@1 + FILE *v2; // eax@1 + FILE *v3; // edi@1 + + auto Str = this; + + v1 = Str; + v2 = fopen("data\\dift.bin", "wb"); + v3 = v2; + if ( !v2 ) + Abortf("Unable to save dift.bin!"); + fwrite(v1, 4u, 1u, v2); + fwrite(v1->pIcons, 0x20u, v1->uNumIcons, v3); + fclose(v3); +} + +//----- (00495056) -------------------------------------------------------- +void IconFrameTable::FromFile(void *pSerialized) +{ + uNumIcons = *(int *)pSerialized; + pIcons = (IconFrame *)pAllocator->AllocNamedChunk(pIcons, 32 * uNumIcons, "I Frames"); + memcpy(pIcons, (char *)pSerialized + 4, 32 * uNumIcons); +} + +//----- (0049509D) -------------------------------------------------------- +int IconFrameTable::FromFileTxt(const char *Args) +{ + IconFrameTable *v2; // ebx@1 + FILE *v3; // eax@1 + int v4; // esi@3 + void *v5; // eax@10 + FILE *v6; // ST0C_4@12 + char *i; // eax@12 + const char *v8; // ST00_4@15 + int v9; // eax@16 + int v10; // edx@20 + int v11; // ecx@21 + int v12; // eax@22 + signed int j; // edx@25 + IconFrame *v14; // ecx@26 + int v15; // esi@26 + int k; // eax@27 + signed int result; // eax@11 + char Buf; // [sp+Ch] [bp-2F8h]@3 + FrameTableTxtLine v19; // [sp+200h] [bp-104h]@4 + FrameTableTxtLine v20; // [sp+27Ch] [bp-88h]@4 + int v21; // [sp+2F8h] [bp-Ch]@3 + int v22; // [sp+2FCh] [bp-8h]@3 + FILE *File; // [sp+300h] [bp-4h]@1 + int Argsa; // [sp+30Ch] [bp+8h]@26 + + v2 = this; + //TileTable::dtor((TileTable *)this); + v3 = fopen(Args, "r"); + File = v3; + if ( !v3 ) + Abortf("IconFrameTable::load - Unable to open file: %s.", Args); + v4 = 0; + v21 = 0; + v22 = 1; + if ( fgets(&Buf, 490, v3) ) + { + do + { + *strchr(&Buf, 10) = 0; + memcpy(&v20, frame_table_txt_parser(&Buf, &v19), sizeof(v20)); + if ( v20.field_0 && *v20.pProperties[0] != 47 ) + { + if ( v20.field_0 < 3 ) + Abortf("IconFrameTable::loadText, too few arguments, %s line %i.", Args, v22); + ++v21; + } + ++v22; + } + while ( fgets(&Buf, 490, File) ); + v4 = v21; + } + v2->uNumIcons = v4; + v5 = pAllocator->AllocNamedChunk(v2->pIcons, 32 * v4, "I Frames"); + v2->pIcons = (IconFrame *)v5; + if ( v5 ) + { + v6 = File; + v2->uNumIcons = 0; + fseek(v6, 0, 0); + for ( i = fgets(&Buf, 490, File); i; i = fgets(&Buf, 490, File) ) + { + *strchr(&Buf, 10) = 0; + memcpy(&v20, frame_table_txt_parser(&Buf, &v19), sizeof(v20)); + if ( v20.field_0 && *v20.pProperties[0] != 47 ) + { + strcpy(v2->pIcons[v2->uNumIcons].pAnimationName, v20.pProperties[0]); + strcpy(v2->pIcons[v2->uNumIcons].pTextureName, v20.pProperties[1]); + v8 = v20.pProperties[2]; + v2->pIcons[v2->uNumIcons].uFlags = 0; + if ( !_strcmpi(v8, "new") ) + { + v9 = (int)&v2->pIcons[v2->uNumIcons].uFlags; + *(char *)v9 |= 4u; + } + v2->pIcons[v2->uNumIcons].uAnimTime = atoi(v20.pProperties[3]); + v2->pIcons[v2->uNumIcons].uAnimLength = 0; + v2->pIcons[v2->uNumIcons++].uTextureID = 0; + } + } + fclose(File); + v10 = 0; + if ( (signed int)(v2->uNumIcons - 1) > 0 ) + { + v11 = 0; + do + { + v12 = (int)&v2->pIcons[v11]; + if ( !(*(char *)(v12 + 60) & 4) ) + *(char *)(v12 + 28) |= 1u; + ++v10; + ++v11; + } + while ( v10 < (signed int)(v2->uNumIcons - 1) ); + } + for ( j = 0; j < (signed int)v2->uNumIcons; *(short *)(Argsa + 26) = v15 ) + { + v14 = v2->pIcons; + Argsa = (int)&v14[j]; + v15 = *(short *)(Argsa + 24); + if ( *(char *)(Argsa + 28) & 1 ) + { + ++j; + for ( k = (int)&v14[j]; *(char *)(k + 28) & 1; k += 32 ) + { + v15 += *(short *)(k + 24); + ++j; + } + LOWORD(v15) = v14[j].uAnimTime + v15; + } + ++j; + } + result = 1; + } + else + { + fclose(File); + result = 0; + } + return result; +} + + + +//----- (00495366) -------------------------------------------------------- +char *__fastcall sub_495366(unsigned __int8 a1, unsigned __int8 a2) +{ + int v2; // edi@1 + int v3; // edx@2 + int v4; // esi@3 + int v5; // ebx@5 + signed int v7; // [sp+Ch] [bp-14h]@1 + signed int v8; // [sp+10h] [bp-10h]@1 + int **v9; // [sp+14h] [bp-Ch]@4 + signed int v10; // [sp+18h] [bp-8h]@3 + unsigned __int8 v11; // [sp+1Ch] [bp-4h]@1 + + v2 = a1; + v11 = a2; + v8 = 0; + v7 = 0; + if ( dword_AE336C == a1 ) + { + v3 = dword_AE3370; + } + else + { + v4 = a2; + dword_AE336C = a1; + v10 = 0; + if ( (signed int)pNPCStats->uNumNPCNames[v4] <= 0 ) + goto LABEL_17; + v9 = (int **)((char *)pNPCStats->pNPCNames + v4 * 4); + do + { + v5 = tolower(*(char *)*v9); + if ( v5 == tolower(v2) ) + { + if ( v8 ) + v7 = v10; + else + v8 = v10; + } + ++v10; + v9 += 2; + } + while ( v10 < (signed int)pNPCStats->uNumNPCNames[v4] ); + if ( v8 && v8 != v7 ) + v3 = v8 + rand() % (v7 - v8); + else +LABEL_17: + v3 = rand() % (signed int)pNPCStats->uNumNPCNames[v4]; + } + dword_AE3370 = v3; + return pNPCStats->pNPCNames[0][v11 + 2 * v3]; +} +// AE336C: using guessed type int dword_AE336C; +// AE3370: using guessed type int dword_AE3370; + +//----- (00495430) -------------------------------------------------------- +char *__fastcall GetReputationString(signed int a1) +{ + char *result; // eax@2 + + if ( a1 < 25 ) + { + if ( a1 < 6 ) + { + if ( a1 < -5 ) + { + result = pGlobalTXT_LocalizationStrings[402]; + if ( a1 < -24 ) + result = pGlobalTXT_LocalizationStrings[434]; + } + else + { + result = pGlobalTXT_LocalizationStrings[399]; + } + } + else + { + result = pGlobalTXT_LocalizationStrings[392]; + } + } + else + { + result = pGlobalTXT_LocalizationStrings[379]; + } + return result; +} + +//----- (00495461) -------------------------------------------------------- +char *__fastcall sub_495461(char *lpsz, unsigned __int8 uPlayerID, ItemGen *a3, char *a4, int a5, __int64 *a6) +{ + unsigned __int8 v6; // bl@1 + Player *pPlayer; // ebx@3 + NPCData *v9; // eax@4 + size_t v10; // eax@6 + char *v11; // esi@7 + int v12; // edx@7 + ItemGen *v13; // edi@7 + char v14; // cl@8 + char *v15; // ecx@10 + int v16; // edx@10 + int v17; // eax@10 + signed __int64 v18; // qax@18 + unsigned int v19; // edi@32 + unsigned __int8 *v20; // ebx@32 + int v21; // ecx@34 + __int16 v22; // ax@34 + int v23; // edx@39 + int v24; // eax@39 + int v25; // eax@45 + float *v26; // esi@68 + float v27; // ST18_4@68 + signed int v28; // eax@68 + int v29; // eax@68 + float v30; // ST18_4@72 + signed int v31; // eax@72 + float v32; // ST18_4@74 + signed int v33; // eax@74 + double v34; // st7@75 + float v35; // ST18_4@76 + signed int v36; // eax@76 + float *v37; // esi@78 + float v38; // ST18_4@78 + int v39; // eax@78 + float v40; // ST18_4@82 + int v41; // eax@82 + float v42; // ST18_4@83 + int v43; // eax@83 + float v44; // ST18_4@85 + int v45; // eax@85 + const char *v46; // eax@86 + unsigned int v47; // eax@87 + float v48; // ST18_4@97 + __int64 v49; // ST14_8@107 + int v50; // eax@107 + int v51; // eax@108 + Player *v52; // eax@109 + int v53; // [sp-4h] [bp-13Ch]@107 + int v54; // [sp+0h] [bp-138h]@107 + __int16 v55[56]; // [sp+10h] [bp-128h]@34 + stru351 v56; // [sp+80h] [bp-B8h]@107 + stru351 v57; // [sp+9Ch] [bp-9Ch]@115 + char a1[100]; // [sp+B8h] [bp-80h]@3 + unsigned int v59; // [sp+11Ch] [bp-1Ch]@3 + size_t v60; // [sp+120h] [bp-18h]@3 + Player *v61; // [sp+124h] [bp-14h]@3 + char *Str; // [sp+128h] [bp-10h]@1 + int v63; // [sp+12Ch] [bp-Ch]@32 + int v64; // [sp+130h] [bp-8h]@6 + NPCData *v65; // [sp+134h] [bp-4h]@6 + + v6 = uPlayerID; + Str = lpsz; + if ( IsBadStringPtrA(lpsz, 1u) ) + return "Invalid String Passed"; + v60 = strlen(Str); + a1[0] = 0; + pPlayer = &pParty->pPlayers[v6]; + v59 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); + v61 = pPlayer; + memset(pTmpBuf2, 0, 0x7D0u); + if ( dword_5C35D4 ) + v9 = array_5913D8[(unsigned int)((char *)array_5913D8[6] + -(dword_591080 != 0) - 1)]; + else + v9 = GetNPCData(uDialogue_SpeakingActorNPC_ID); + v65 = v9; + v10 = 0; + v64 = 0; + if ( (signed int)v60 > 0 ) + { + v11 = a4; + v12 = v64; + v13 = a3; + while ( 1 ) + { + v14 = Str[v12]; + if ( v14 == 37 ) + break; + pTmpBuf2[v10++] = v14; +LABEL_119: + ++v12; + v64 = v12; + if ( v12 >= (signed int)v60 ) + return pTmpBuf2; + } + v15 = &Str[v12 + 1]; + v16 = (unsigned __int8)Str[v12 + 2]; + v17 = v16 + 10 * (unsigned __int8)*v15 - 528; + if ( v17 <= 15 ) + { + if ( v17 != 15 ) + { + switch ( v16 + 10 * (unsigned __int8)*v15 ) + { + case 0x211: + v11 = v65->pName; + goto LABEL_118; + case 0x212: + v11 = pPlayer->pName; + goto LABEL_118; + case 0x213: + case 0x219: + if ( v65->uSex ) + v11 = pGlobalTXT_LocalizationStrings[384];// "her" + else + v11 = pGlobalTXT_LocalizationStrings[383];// "his" + goto LABEL_118; + case 0x215: + v18 = (signed __int64)((double)(signed __int64)pParty->uTimePlayed * 0.234375) / 60 / 60 % 24; + v11 = pGlobalTXT_LocalizationStrings[397];// "evening" + if ( SHIDWORD(v18) <= 0 && SHIDWORD(v18) >= 0 && (unsigned int)v18 >= 5 && SHIDWORD(v18) <= 0 ) + { + if ( SHIDWORD(v18) >= 0 && (unsigned int)v18 >= 0xB ) + { + if ( v18 < 20 ) + v11 = pGlobalTXT_LocalizationStrings[396];// "day" + } + else + { + v11 = pGlobalTXT_LocalizationStrings[395];// "morning" + } + } + goto LABEL_118; + case 0x216: + if ( pPlayer->uSex ) + v11 = pGlobalTXT_LocalizationStrings[387];// "lady" + else + v11 = pGlobalTXT_LocalizationStrings[385];// "sir" + goto LABEL_118; + case 0x217: + if ( pPlayer->uSex ) + goto LABEL_43; + v11 = pGlobalTXT_LocalizationStrings[386];// "Sir" + goto LABEL_118; + case 0x218: + v19 = 0; + v63 = 0; + v20 = (unsigned __int8 *)v61->field_152; + do + { + if ( (unsigned __int16)_449B57_test_bit(v20, word_4EE150[v19]) ) + { + v21 = v63; + v22 = word_4EE150[v19]; + ++v63; + v55[v21] = v22; + } + ++v19; + } + while ( v19 < 28 ); + if ( v63 ) + { + v23 = rand() % v63; + v24 = dword_A74CDC; + if ( dword_A74CDC == -1 ) + { + v24 = v23; + dword_A74CDC = v23; + } + v11 = (char *)dword_723E80_award_related[2 * v55[v24]]; + } + else + { + v11 = (char *)dword_721824; + } + pPlayer = v61; + v13 = a3; + goto LABEL_118; + case 0x21A: + if ( pPlayer->uSex ) +LABEL_43: + v11 = pGlobalTXT_LocalizationStrings[389];// "Lady" + else + v11 = pGlobalTXT_LocalizationStrings[388];// "Lord" + goto LABEL_118; + case 0x21B: + v25 = GetPartyReputation(); + goto LABEL_46; + case 0x21C: + v25 = v65->rep; +LABEL_46: + if ( v25 >= 25 ) + { + v11 = pGlobalTXT_LocalizationStrings[379]; + } + else + { + if ( v25 < 6 ) + { + if ( v25 >= -5 ) + { + v11 = pGlobalTXT_LocalizationStrings[399]; + } + else + { + if ( v25 < -24 ) + v11 = pGlobalTXT_LocalizationStrings[434]; + else + v11 = pGlobalTXT_LocalizationStrings[402]; + } + } + else + { + v11 = pGlobalTXT_LocalizationStrings[392]; + } + } + goto LABEL_118; + case 0x21D: + v11 = sub_495366(pPlayer->pName[0], pPlayer->uSex); + goto LABEL_118; + case 0x21E: + goto LABEL_93; + case 0x214: + goto LABEL_117; + default: + goto LABEL_108; + } + goto LABEL_108; + } + v11 = pGlobalTXT_LocalizationStrings[393];// "daughter" +LABEL_118: + strcat(pTmpBuf2, v11); + v10 = strlen(pTmpBuf2); + v64 += 2; + v12 = v64; + goto LABEL_119; + } + if ( v17 <= 29 ) + { + if ( v17 == 29 ) + { + //v34 = p2DEvents_minus1__20[13 * (signed int)a4]; + v34 = p2DEvents[(signed int)a4 - 1].fPriceMultiplier; + } + else + { + if ( v16 + 10 * (unsigned __int8)*v15 == 544 ) + { +LABEL_93: + if ( v65->uSex ) + v11 = pGlobalTXT_LocalizationStrings[391];// "sister" + else + v11 = pGlobalTXT_LocalizationStrings[390];// "brother" + goto LABEL_118; + } + if ( v16 + 10 * (unsigned __int8)*v15 == 545 ) + { + v29 = *(&pNPCStats->field_13A58 + 5 * v65->uProfession) / 100; + goto LABEL_91; + } + if ( v16 + 10 * (unsigned __int8)*v15 == 551 ) + { + v47 = pMapStats->GetMapInfo(pCurrentMapName); + if ( v47 ) + v11 = pMapStats->pInfos[v47].pName; + else + v11 = pGlobalTXT_LocalizationStrings[394];// "Unknown" + goto LABEL_118; + } + if ( v16 + 10 * (unsigned __int8)*v15 == 552 ) + { + v46 = v13->GetDisplayName(); + sprintfex(a1, format_4E2D80, v59, v46); +LABEL_117: + v11 = a1; + goto LABEL_118; + } + if ( v16 + 10 * (unsigned __int8)*v15 == 553 ) + { + //v37 = &p2DEvents_minus1__20[13 * (signed int)a4]; + v37 = &p2DEvents[(signed int)a4 - 1].fPriceMultiplier; + v38 = *v37; + v39 = v13->GetValue(); + v29 = pPlayer->_4B8233(v39, v38); + switch ( a5 ) + { + case 3: + v44 = *v37; + v45 = v13->GetValue(); + v29 = pPlayer->_4B8213(v45, v44); + break; + case 4: + v29 = pPlayer->_4B824B(*v37); + break; + case 5: + v42 = *v37; + v43 = v13->GetValue(); + v29 = pPlayer->_4B8265(v43, v42); + break; + case 6: + v40 = *v37; + v41 = v13->GetValue(); + v29 = pPlayer->_4B8213(v41, v40) / 2; + break; + } + goto LABEL_98; + } + if ( v16 + 10 * (unsigned __int8)*v15 != 555 ) + { + if ( v16 + 10 * (unsigned __int8)*v15 == 556 ) + { + //v11 = (char *)p2DEvents_minus1__10[13 * (signed int)a4]; + v11 = (char *)p2DEvents[(signed int)a4 - 1].pProprieterTitle; + goto LABEL_118; + } +LABEL_108: + strncpy(a1, v15, 2u); + v51 = atoi(a1); + sprintfex(a1, "%lu", v51); + goto LABEL_117; + } + v26 = &p2DEvents[(signed int)a4 - 1].fPriceMultiplier; + v27 = *v26; + v28 = v13->GetValue(); + v29 = pPlayer->_4B8142(v28, v27); + if ( a5 == 3 ) + { + v35 = *v26; + v36 = v13->GetValue(); + v29 = pPlayer->_4B8102(v36, v35); + if ( v13->uAttributtes & 2 ) + { +LABEL_77: + v29 = 1; + goto LABEL_98; + } + goto LABEL_98; + } + if ( a5 != 4 ) + { + if ( a5 == 5 ) + { + v32 = *v26; + v33 = v13->GetValue(); + v29 = pPlayer->_4B81C3(v33, v32); + } + else + { + if ( a5 == 6 ) + { + v30 = *v26; + v31 = v13->GetValue(); + v29 = pPlayer->_4B8102(v31, v30) / 2; + if ( v13->uAttributtes & 2 ) + v29 = 1; +LABEL_91: + if ( v29 >= 1 ) + goto LABEL_98; + goto LABEL_77; + } + } +LABEL_98: + sprintfex(a1, "%lu", v29); + goto LABEL_117; + } + v34 = *v26; + } + v48 = v34; + v29 = pPlayer->_4B8179(v48); + goto LABEL_98; + } + if ( v17 != 30 ) + { + switch ( v17 ) + { + case 31: + v52 = pPlayers[1]; + break; + case 32: + v52 = pPlayers[2]; + break; + case 33: + v52 = pPlayers[3]; + break; + default: + if ( v17 != 34 ) + { + if ( v17 <= 50 || v17 > 70 ) + goto LABEL_108; + if ( v16 + 10 * (unsigned __int8)*v15 - 579 >= 20 ) + goto LABEL_118; + HIDWORD(v49) = pParty->field_3C.field_440[2 * v17 + 1]; + LODWORD(v49) = pParty->field_3C.field_440[2 * v17]; + sub_493F79(&v56, v49); + v54 = v56.field_18; + v53 = v56.field_C + 1; + v50 = v56.field_14; +LABEL_116: + sprintfex(a1, pGlobalTXT_LocalizationStrings[378], aMonthNames[v50], v53, v54); + goto LABEL_117; + } + v52 = pPlayers[4]; + break; + } + v11 = v52->pName; + goto LABEL_118; + } + if ( !a6 ) + goto LABEL_118; + sub_493F79(&v57, *a6); + v54 = v57.field_18; + v53 = v57.field_C + 1; + v50 = v57.field_14; + goto LABEL_116; + } + return pTmpBuf2; +} + +//----- (00495B39) -------------------------------------------------------- +void __cdecl PlayerCreationUI_Draw() +{ + Texture *v0; // edi@1 + const char *v1; // ST10_4@3 + int v2; // eax@3 + IconFrame *v3; // eax@3 + int v4; // ecx@7 + GUIButton *v5; // edi@12 + int v6; // esi@14 + int v7; // eax@14 + char v8; // al@17 + int v9; // ecx@17 + char v10; // sf@17 + int v11; // ecx@19 + void *v12; // eax@20 + int v13; // ecx@21 + int v14; // ecx@22 + char *v15; // ST14_4@24 + size_t v16; // eax@28 + int v17; // eax@33 + enum CHARACTER_RACE v18; // eax@35 + int v19; // eax@36 + int v20; // eax@37 + int v21; // ST0C_4@44 + int v22; // eax@44 + int v23; // eax@44 + unsigned int v24; // eax@44 + int v25; // eax@44 + unsigned int v26; // eax@44 + int v27; // eax@44 + unsigned int v28; // eax@44 + int v29; // eax@44 + unsigned int v30; // eax@44 + int v31; // eax@44 + unsigned int v32; // eax@44 + int v33; // eax@44 + unsigned int v34; // eax@44 + int v35; // eax@44 + unsigned int v36; // eax@44 + enum PLAYER_SKILL_TYPE v37; // eax@44 + int v38; // eax@44 + enum PLAYER_SKILL_TYPE v39; // eax@44 + int v40; // eax@44 + enum PLAYER_SKILL_TYPE v41; // eax@44 + const char *v42; // edx@44 + char *v43; // ST1C_4@44 + int v44; // eax@44 + int v45; // eax@44 + enum PLAYER_SKILL_TYPE v46; // eax@46 + const char *v47; // edx@46 + char *v48; // ST1C_4@46 + int v49; // eax@46 + int v50; // eax@46 + int v51; // eax@49 + char *v52; // edi@52 + char v53; // al@52 + int v54; // edi@53 + int v55; // ST0C_4@53 + int v56; // eax@53 + int v57; // eax@53 + const char *v58; // ST10_4@55 + unsigned int v59; // ST0C_4@55 + int v60; // eax@55 + int v61; // ecx@55 + const char *v62; // ST10_4@57 + unsigned int v63; // ST0C_4@57 + int v64; // ST08_4@57 + int v65; // eax@57 + int v66; // ecx@57 + const char *v67; // ST10_4@59 + unsigned int v68; // ST0C_4@59 + int v69; // ST08_4@59 + int v70; // eax@59 + int v71; // eax@59 + const char *v72; // ST10_4@61 + unsigned int v73; // ST0C_4@61 + int v74; // eax@61 + int v75; // eax@61 + const char *v76; // ST10_4@63 + unsigned int v77; // ST0C_4@63 + int v78; // ST08_4@63 + int v79; // eax@63 + int v80; // eax@63 + const char *v81; // ST10_4@65 + unsigned int v82; // ST0C_4@65 + int v83; // ST08_4@65 + int v84; // eax@65 + int v85; // eax@65 + const char *v86; // ST10_4@67 + unsigned int v87; // ST0C_4@67 + int v88; // eax@67 + int v89; // eax@67 + const char *v90; // ST10_4@69 + unsigned int v91; // ST0C_4@69 + int v92; // ST08_4@69 + int v93; // eax@69 + int v94; // eax@69 + const char *v95; // ST10_4@71 + unsigned int v96; // ST0C_4@71 + int v97; // ST08_4@71 + int v98; // eax@71 + const char *v99; // ST10_4@71 + int v100; // ST0C_4@71 + int v101; // eax@71 + enum PLAYER_SKILL_TYPE v102; // edi@72 + size_t v103; // eax@72 + signed int v104; // ecx@72 + int v105; // ecx@79 + int v106; // edi@81 + unsigned int v107; // ST0C_4@81 + int v108; // ST08_4@81 + int v109; // eax@81 + const char *v110; // ST10_4@82 + int v111; // ST0C_4@82 + int v112; // eax@82 + signed int v113; // edi@82 + int v114; // ST0C_4@82 + int v115; // eax@82 + const char *v116; // [sp+0h] [bp-170h]@39 + char Str1[200]; // [sp+10h] [bp-160h]@14 + GUIWindow v118; // [sp+D8h] [bp-98h]@83 + int v119; // [sp+12Ch] [bp-44h]@18 + size_t v120; // [sp+130h] [bp-40h]@25 + int uY; // [sp+134h] [bp-3Ch]@18 + int v122; // [sp+138h] [bp-38h]@18 + int v123; // [sp+13Ch] [bp-34h]@11 + void *v124; // [sp+140h] [bp-30h]@18 + int uColor1; // [sp+144h] [bp-2Ch]@1 + int v126; // [sp+148h] [bp-28h]@25 + int uColorGreen; // [sp+14Ch] [bp-24h]@1 + int v128; // [sp+150h] [bp-20h]@14 + int v129; // [sp+154h] [bp-1Ch]@18 + int uColorTeal; // [sp+158h] [bp-18h]@1 + int uColorWhite; // [sp+15Ch] [bp-14h]@1 + int uX; // [sp+160h] [bp-10h]@18 + unsigned int v133; // [sp+164h] [bp-Ch]@25 + int v134; // [sp+168h] [bp-8h]@14 + char *Str; // [sp+16Ch] [bp-4h]@18 + + uColor1 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xD1u, 0xBBu, 0x61u); + uColorTeal = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0, 0xF7u, 0xF7u); + uColorGreen = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0, 0xFFu, 0); + uColorWhite = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu); + pRenderer->BeginScene(); + pRenderer->DrawTextureRGB(0, 0, &stru_506F20); + v0 = pTexture_MAKESKY; + pRenderer->DrawTextureIndexed(uPlayerCreationUI_SkySliderPos, 2u, pTexture_MAKESKY); + pRenderer->DrawTextureIndexed(uPlayerCreationUI_SkySliderPos++ - 640, 2u, v0); + if ( (signed int)uPlayerCreationUI_SkySliderPos > 640 ) + uPlayerCreationUI_SkySliderPos = 0; + pRenderer->DrawTextureTransparent(0, 0, pTexture_MAKETOP); + v1 = pGlobalTXT_LocalizationStrings[51]; + uPlayerCreationUI_SelectedCharacter = (pGUIWindow_CurrentMenu->field_2C_focus_id - pGUIWindow_CurrentMenu->field_38) + / 7; + v2 = pFontCChar->AlignText_Center(0x280u, pGlobalTXT_LocalizationStrings[51]); + pGUIWindow_CurrentMenu->DrawText(pFontCChar, v2 + 1, 0, 0, v1, 0, 0, 0); + pRenderer->DrawTextureTransparent(17u, 35u, pPlayerPortraits[(char)pParty->pPlayers[0].uFace]); + pRenderer->DrawTextureTransparent(176u, 35u, pPlayerPortraits[(char)pParty->pPlayers[1].uFace]); + pRenderer->DrawTextureTransparent(335u, 35u, pPlayerPortraits[(char)pParty->pPlayers[2].uFace]); + pRenderer->DrawTextureTransparent(494u, 35u, pPlayerPortraits[(char)pParty->pPlayers[3].uFace]); + v3 = pIconsFrameTable->GetFrame(uIconID_CharacterFrame, pEventTimer->uStartTime); + if ( uPlayerCreationUI_SelectedCharacter ) + { + switch ( uPlayerCreationUI_SelectedCharacter ) + { + case 1u: + v4 = 171; + break; + case 2u: + v4 = 329; + break; + case 3u: + v4 = 488; + break; + default: + v4 = v123; + break; + } + } + else + { + v4 = 12; + } + pRenderer->DrawTextureTransparent(v4, 0x1Du, &pIcons_LOD->pTextures[v3->uTextureID]); + v5 = pGUIWindow_CurrentMenu->GetControl(pGUIWindow_CurrentMenu->field_2C_focus_id); + pRenderer->DrawTextureTransparent(v5->uZ - 4, v5->uY, pTextures_arrowl[uPlayerCreationUI_ArrowAnim + 1]); + pRenderer->DrawTextureTransparent(v5->uX - 12, v5->uY, pTextures_arrowr[uPlayerCreationUI_ArrowAnim-- + 1]); + if ( uPlayerCreationUI_ArrowAnim < 0 ) + uPlayerCreationUI_ArrowAnim = 18; + v6 = LOBYTE(pFontCreate->uFontHeight) - 2; + v128 = LOBYTE(pFontCreate->uFontHeight) - 2; + strcpy(Str1, pGlobalTXT_LocalizationStrings[205]);// "Skills" + v7 = strlen(Str1) - 1; + v134 = v7; + if ( v7 >= 0 ) + { + while ( 1 ) + { + v8 = toupper((unsigned __int8)Str1[v7]); + v9 = v134; + v10 = v134-- - 1 < 0; + Str1[v9] = v8; + if ( v10 ) + break; + v7 = v134; + } + } + v134 = 18; + v124 = 0; + uX = 32; + uY = 3 * v6 + 169; + v122 = 5 * v6 + 169; + v123 = 3 * v6 + 311; + v129 = 493; + Str = pParty->pPlayers[0].pName; + v119 = 6 * v6 + 169; + do + { + pGUIWindow_CurrentMenu->DrawText( + pFontCreate, + v134 + 73, + 100, + 0, + pClassNames[(unsigned __int8)Str[17]], + 0, + 0, + 0); + pRenderer->DrawTextureTransparent( + v134 + 77, + 50u, + *(&pTexture_IC_KNIGHT + ((unsigned int)(unsigned __int8)Str[17] >> 2))); + v11 = pGUIWindow_CurrentMenu->field_40; + if ( v11 && (v12 = pGUIWindow_CurrentMenu->ptr_1C, v12 == v124) ) + { + v13 = v11 - 1; + if ( v13 ) + { + v14 = v13 - 1; + if ( v14 ) + { + if ( v14 == 1 ) + { + v15 = Str; + pGUIWindow_CurrentMenu->field_40 = 0; + pGUIWindow_CurrentMenu->DrawTextInRect(pFontCreate, v134, 124u, 0, v15, 130, 0); + SetCurrentMenuID(7u); + } + } + else + { + pGUIWindow_CurrentMenu->field_40 = 0; + v120 = strlen((const char *)pKeyActionMap->pPressedKeysBuffer); + v126 = 0; + v133 = 0; + if ( strlen((const char *)pKeyActionMap->pPressedKeysBuffer) ) + { + do + { + if ( pKeyActionMap->pPressedKeysBuffer[v133] == ' ' ) + ++v126; + ++v133; + v16 = strlen((const char *)pKeyActionMap->pPressedKeysBuffer); + } + while ( v133 < v16 ); + } + if ( v120 && v126 != v120 ) + strcpy(Str, (const char *)pKeyActionMap->pPressedKeysBuffer); + pGUIWindow_CurrentMenu->DrawTextInRect(pFontCreate, v134, 0x7Cu, 0, Str, 130, 0); + *((short *)Str + 3323) = 1; + } + } + else + { + v17 = pGUIWindow_CurrentMenu->DrawTextInRect( + pFontCreate, + 159 * (int)v12 + 18, + 0x7Cu, + 0, + (const char *)pKeyActionMap->pPressedKeysBuffer, + 120, + 1); + pGUIWindow_CurrentMenu->DrawFlashingInputCursor( + 159 * (unsigned int)pGUIWindow_CurrentMenu->ptr_1C + v17 + 20, + 124, + pFontCreate); + } + } + else + { + pGUIWindow_CurrentMenu->DrawTextInRect(pFontCreate, v134, 0x7Cu, 0, Str, 130, 0); + } + v18 = ((Player *)(Str - 168))->GetRace(); + if ( v18 ) + { + v19 = v18 - 1; + if ( v19 ) + { + v20 = v19 - 1; + if ( v20 ) + { + if ( v20 != 1 ) + goto LABEL_44; + v116 = pGlobalTXT_LocalizationStrings[101];// "Dwarf" + } + else + { + v116 = pGlobalTXT_LocalizationStrings[106];// "Goblin" + } + } + else + { + v116 = pGlobalTXT_LocalizationStrings[103];// "Elf" + } + } + else + { + v116 = pGlobalTXT_LocalizationStrings[99];// "Human" + } + strcpy(pTmpBuf, v116); +LABEL_44: + pGUIWindow_CurrentMenu->DrawTextInRect(pFontCreate, v134 + 72, v128 + 12, 0, pTmpBuf, 130, 0); + v21 = uColor1; + v22 = pFontCreate->AlignText_Center(0x96u, Str1); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, v22 + uX - 24, 291, v21, Str1, 0, 0, 0); + v23 = ((Player *)(Str - 168))->GetActualMight(); + sprintfex(pTmpBuf, "%s\r%03d%d", pGlobalTXT_LocalizationStrings[144], v129, v23);// "Might" + LOWORD(v24) = ((Player *)(Str - 168))->GetStatColor(0); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, uX, 169, v24, pTmpBuf, 0, 0, 0); + v25 = ((Player *)(Str - 168))->GetActualIntelligence(); + sprintfex(pTmpBuf, "%s\r%03d%d", pGlobalTXT_LocalizationStrings[116], v129, v25);// "Intellect" + LOWORD(v26) = ((Player *)(Str - 168))->GetStatColor(1u); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, uX, v128 + 169, v26, pTmpBuf, 0, 0, 0); + v27 = ((Player *)(Str - 168))->GetActualWillpower(); + sprintfex(pTmpBuf, "%s\r%03d%d", pGlobalTXT_LocalizationStrings[163], v129, v27);// "Personality" + LOWORD(v28) = ((Player *)(Str - 168))->GetStatColor(2u); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, uX, 2 * v128 + 169, v28, pTmpBuf, 0, 0, 0); + v29 = ((Player *)(Str - 168))->GetActualEndurance(); + sprintfex(pTmpBuf, "%s\r%03d%d", pGlobalTXT_LocalizationStrings[75], v129, v29);// "Endurance" + LOWORD(v30) = ((Player *)(Str - 168))->GetStatColor(3u); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, uX, uY, v30, pTmpBuf, 0, 0, 0); + v31 = ((Player *)(Str - 168))->GetActualAccuracy(); + sprintfex(pTmpBuf, "%s\r%03d%d", pGlobalTXT_LocalizationStrings[1], v129, v31);// "Accuracy" + LOWORD(v32) = ((Player *)(Str - 168))->GetStatColor(4u); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, uX, 4 * v128 + 169, v32, pTmpBuf, 0, 0, 0); + v33 = ((Player *)(Str - 168))->GetActualSpeed(); + sprintfex(pTmpBuf, "%s\r%03d%d", pGlobalTXT_LocalizationStrings[211], v129, v33);// "Speed" + LOWORD(v34) = ((Player *)(Str - 168))->GetStatColor(5u); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, uX, v122, v34, pTmpBuf, 0, 0, 0); + v35 = ((Player *)(Str - 168))->GetActualLuck(); + sprintfex(pTmpBuf, "%s\r%03d%d", pGlobalTXT_LocalizationStrings[136], v129, v35);// "Luck" + LOWORD(v36) = ((Player *)(Str - 168))->GetStatColor(6u); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, uX, v119, v36, pTmpBuf, 0, 0, 0); + v37 = ((Player *)(Str - 168))->GetSkillIdxByOrder(0); + v38 = pFontCreate->AlignText_Center(0x96u, pSkillNames[v37]); + sprintfex(pTmpBuf, "\t%03u%s", v38); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, uX - 24, 311, uColorWhite, pTmpBuf, 0, 0, 0); + v39 = ((Player *)(Str - 168))->GetSkillIdxByOrder(1); + v40 = pFontCreate->AlignText_Center(0x96u, pSkillNames[v39]); + sprintfex(pTmpBuf, "\t%03u%s", v40); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, uX - 24, v128 + 311, uColorWhite, pTmpBuf, 0, 0, 0); + v41 = ((Player *)(Str - 168))->GetSkillIdxByOrder(2); + v42 = pSkillNames[v41]; + v43 = pSkillNames[v41]; + v133 = v41; + v44 = pFontCreate->AlignText_Center(150u, v42); + sprintfex(pTmpBuf, "\t%03u%s", v44, v43); + v45 = uColorGreen; + if ( (signed int)v133 >= 37 ) + v45 = uColorTeal; + pGUIWindow_CurrentMenu->DrawText(pFontCreate, uX - 24, 2 * v128 + 311, v45, pTmpBuf, 0, 0, 0); + v46 = ((Player *)(Str - 168))->GetSkillIdxByOrder(3); + v47 = pSkillNames[v46]; + v48 = pSkillNames[v46]; + v133 = v46; + v49 = pFontCreate->AlignText_Center(150u, v47); + sprintfex(pTmpBuf, "\t%03u%s", v49, v48); + v50 = uColorGreen; + if ( (signed int)v133 >= 37 ) + v50 = uColorTeal; + pGUIWindow_CurrentMenu->DrawText(pFontCreate, uX - 24, v123, v50, pTmpBuf, 0, 0, 0); + Str += 6972; + v124 = (char *)v124 + 1; + v134 += 159; + v129 -= 158; + uX += 158; + } + while ( (signed int)Str < (signed int)&pParty->pPickedItem.uNumCharges ); + strcpy(Str1, pGlobalTXT_LocalizationStrings[41]);// "Class" + v51 = strlen(Str1) - 1; + v134 = v51; + if ( v51 >= 0 ) + { + while ( 1 ) + { + v52 = &Str1[v51]; + v53 = toupper((unsigned __int8)Str1[v51]); + v10 = v134-- - 1 < 0; + *v52 = v53; + if ( v10 ) + break; + v51 = v134; + } + } + v54 = pParty->pPlayers[uPlayerCreationUI_SelectedCharacter].uClass; + v55 = uColor1; + v133 = pParty->pPlayers[uPlayerCreationUI_SelectedCharacter].uClass; + v56 = pFontCreate->AlignText_Center(193u, Str1); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, v56 + 324, 395, v55, Str1, 0, 0, 0); + v57 = uColorTeal; + if ( v54 ) + v57 = uColorWhite; + v58 = pClassNames[0]; + v59 = v57; + v60 = pFontCreate->AlignText_Center(65u, pClassNames[0]); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, v60 + 323, 417, v59, v58, 0, 0, 0); + v61 = uColorTeal; + if ( v133 != 12 ) + v61 = uColorWhite; + v62 = pClassNames[12]; + v63 = v61; + v64 = v128 + 417; + uColorGreen = v128 + 417; + v65 = pFontCreate->AlignText_Center(65u, pClassNames[12]); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, v65 + 323, v64, v63, v62, 0, 0, 0); + v66 = uColorTeal; + if ( v133 != 20 ) + v66 = uColorWhite; + v67 = pClassNames[20]; + v68 = v66; + v69 = 2 * v128 + 417; + v126 = 2 * v128 + 417; + v70 = pFontCreate->AlignText_Center(65u, pClassNames[20]); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, v70 + 323, v69, v68, v67, 0, 0, 0); + v71 = uColorTeal; + if ( v133 != PLAYER_CLASS_CLERIC ) + v71 = uColorWhite; + v72 = pClassNames[24]; + v73 = v71; + v74 = pFontCreate->AlignText_Center(65u, pClassNames[24]); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, v74 + 388, 417, v73, v72, 0, 0, 0); + v75 = uColorTeal; + if ( v133 != 28 ) + v75 = uColorWhite; + v76 = pClassNames[28]; + v77 = v75; + v78 = uColorGreen; + v79 = pFontCreate->AlignText_Center(65u, pClassNames[28]); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, v79 + 388, v78, v77, v76, 0, 0, 0); + v80 = uColorTeal; + if ( v133 != PLAYER_CLASS_SORCERER ) + v80 = uColorWhite; + v81 = pClassNames[32]; + v82 = v80; + v83 = v126; + v84 = pFontCreate->AlignText_Center(65u, pClassNames[32]); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, v84 + 388, v83, v82, v81, 0, 0, 0); + v85 = uColorTeal; + if ( v133 != 16 ) + v85 = uColorWhite; + v86 = pClassNames[16]; + v87 = v85; + v88 = pFontCreate->AlignText_Center(65u, pClassNames[16]); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, v88 + 453, 417, v87, v86, 0, 0, 0); + v89 = uColorTeal; + if ( v133 != 8 ) + v89 = uColorWhite; + v90 = pClassNames[8]; + v91 = v89; + v92 = uColorGreen; + v93 = pFontCreate->AlignText_Center(65u, pClassNames[8]); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, v93 + 453, v92, v91, v90, 0, 0, 0); + v94 = uColorTeal; + if ( v133 != 4 ) + v94 = uColorWhite; + v95 = pClassNames[4]; + v96 = v94; + v97 = v126; + v98 = pFontCreate->AlignText_Center(65u, pClassNames[4]); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, v98 + 453, v97, v96, v95, 0, 0, 0); + v99 = pGlobalTXT_LocalizationStrings[20]; // "Available Skills" + v100 = uColor1; + v101 = pFontCreate->AlignText_Center(0xECu, pGlobalTXT_LocalizationStrings[20]); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, v101 + 37, 395, v100, v99, 0, 0, 0); + v134 = 0; + do + { + v102 = pParty->pPlayers[uPlayerCreationUI_SelectedCharacter].GetSkillIdxByOrder(v134 + 4); + strcpy(Str1, pSkillNames[v102]); + v103 = strlen(Str1); + v104 = 0; + if ( (signed int)v103 > 0 ) + { + while ( Str1[v104] != 32 ) + { + ++v104; + if ( v104 >= (signed int)v103 ) + goto LABEL_77; + } + Str1[v104] = 0; + } +LABEL_77: + uColorGreen = -5; + if ( (signed int)v124 <= 3 ) + uColorGreen = 0; + v105 = uColorTeal; + if ( !pParty->pPlayers[0].pActiveSkills[v102 + 3486 * uPlayerCreationUI_SelectedCharacter] ) + v105 = uColorWhite; + v106 = v134 / 3; + v107 = v105; + v108 = v128 * v134 % 3 + 417; + v109 = pFontCreate->AlignText_Center(100u, Str1); + pGUIWindow_CurrentMenu->DrawText( + pFontCreate, + 100 * v106 + v109 + uColorGreen + 17, + v108, + v107, + Str1, + 0, + 0, + 0); + ++v134; + } + while ( v134 < 9 ); + v110 = pGlobalTXT_LocalizationStrings[30]; // "Bonus" + v111 = uColor1; + v112 = pFontCreate->AlignText_Center(0x5Cu, pGlobalTXT_LocalizationStrings[30]); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, v112 + 533, 394, v111, v110, 0, 0, 0); + v113 = PlayerCreation_ComputeAttributeBonus(); + sprintfex(pTmpBuf, "%d", v113); + v114 = uColorWhite; + v115 = pFontCreate->AlignText_Center(84u, pTmpBuf); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, v115 + 530, 410, v114, pTmpBuf, 0, 0, 0); + if ( GameUI_StatusBar_TimedStringTimeLeft > GetTickCount() ) + { + v118.str_48 = pGlobalTXT_LocalizationStrings[412];// "Create Party cannot be completed unless you have assigned all characters 2 extra skills and have spent all of your bonus points." + if ( v113 < 0 ) + v118.str_48 = pGlobalTXT_LocalizationStrings[413];// "You can't spend more than 50 points." + v118.uFrameWidth = 300; + v118.uFrameHeight = 100; + v118.uFrameX = 170; + v118.uFrameY = 140; + v118.uFrameZ = 469; + v118.uFrameW = 239; + v118._415551(0); + } + pRenderer->EndScene(); +} + +//----- (0049695A) -------------------------------------------------------- +void __cdecl PlayerCreationUI_Initialize() +{ + unsigned int v0; // ebx@5 + unsigned int v1; // eax@6 + int v2; // ecx@6 + unsigned int v3; // eax@8 + signed int v4; // ecx@8 + signed int uControlParam; // [sp+10h] [bp-Ch]@7 + unsigned int uControlParama; // [sp+10h] [bp-Ch]@9 + unsigned int uControlParamb; // [sp+10h] [bp-Ch]@11 + unsigned int uControlParamc; // [sp+10h] [bp-Ch]@13 + signed int uControlParamd; // [sp+10h] [bp-Ch]@15 + signed int uX; // [sp+14h] [bp-8h]@5 + unsigned int uXa; // [sp+14h] [bp-8h]@9 + unsigned int uXb; // [sp+14h] [bp-8h]@11 + unsigned int uXc; // [sp+14h] [bp-8h]@13 + signed int uXd; // [sp+14h] [bp-8h]@16 + + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + pAudioPlayer->SetMusicVolume((signed __int64)(pSoundVolumeLevels[(char)uMusicVolimeMultiplier] * 64.0)); + ++pIcons_LOD->uTexturePacksCount; + if ( !pIcons_LOD->uNumPrevLoadedFiles ) + pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles; + uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = 21; + uPlayerCreationUI_ArrowAnim = 0; + uPlayerCreationUI_SkySliderPos = 0; + uPlayerCreationUI_SelectedCharacter = 0; + v0 = LOBYTE(pFontCreate->uFontHeight) - 2; + pTexture_IC_KNIGHT = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture("IC_KNIGHT", TEXTURE_16BIT_PALETTE)]; + pTexture_IC_THIEF = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture("IC_THIEF", TEXTURE_16BIT_PALETTE)]; + pTexture_IC_MONK = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture("IC_MONK", TEXTURE_16BIT_PALETTE)]; + pTexture_IC_PALAD = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture("IC_PALAD", TEXTURE_16BIT_PALETTE)]; + pTexture_IC_ARCH = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture("IC_ARCH", TEXTURE_16BIT_PALETTE)]; + pTexture_IC_RANGER = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture("IC_RANGER", TEXTURE_16BIT_PALETTE)]; + pTexture_IC_CLER = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture("IC_CLER", TEXTURE_16BIT_PALETTE)]; + pTexture_IC_DRUID = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture("IC_DRUID", TEXTURE_16BIT_PALETTE)]; + pTexture_IC_SORC = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture("IC_SORC", TEXTURE_16BIT_PALETTE)]; + pTexture_MAKETOP = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture("MAKETOP", TEXTURE_16BIT_PALETTE)]; + uX = 0; + pTexture_MAKESKY = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture("MAKESKY", TEXTURE_16BIT_PALETTE)]; + do + { + sprintfex(pTmpBuf, "%s01", pPlayerPortraitsNames[uX]); + v1 = pIcons_LOD->LoadTexture(pTmpBuf, TEXTURE_16BIT_PALETTE); + v2 = uX * 4; + ++uX; + *(Texture **)((char *)pPlayerPortraits + v2) = &pIcons_LOD->pTextures[v1]; + } + while ( uX < 22 ); + pTexture_PlayerFaceMask = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture("FACEMASK", TEXTURE_16BIT_PALETTE)]; + pTexture_buttminu = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture("buttminu", TEXTURE_16BIT_PALETTE)]; + pTexture_buttplus = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture("buttplus", TEXTURE_16BIT_PALETTE)]; + pTexture_pressrigh = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture("presrigh", TEXTURE_16BIT_PALETTE)]; + pTexture_presleft = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture("presleft", TEXTURE_16BIT_PALETTE)]; + uControlParam = 1; + do + { + sprintfex(pTmpBuf, "arrowl%d", uControlParam); + pTextures_arrowl[uControlParam] = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(pTmpBuf, TEXTURE_16BIT_PALETTE)]; + sprintfex(pTmpBuf, "arrowr%d", uControlParam); + v3 = pIcons_LOD->LoadTexture(pTmpBuf, TEXTURE_16BIT_PALETTE); + v4 = uControlParam++; + pTextures_arrowr[v4] = &pIcons_LOD->pTextures[v3]; + } + while ( uControlParam < 20 ); + pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640u, 480u, WINDOW_Credits, 0, 0); + uControlParama = 0; + uXa = 8; + do + { + pGUIWindow_CurrentMenu->CreateButton(uXa, 120u, 145u, 25u, 1, 0, 0x3Cu, uControlParama, 0, nullstring, 0); + uXa += 158; + ++uControlParama; + } + while ( (signed int)uXa < 640 ); + pCreationUI_BtnPressLeft[0] = pGUIWindow_CurrentMenu->CreateButton( + 10u, + 32u, + 11u, + 13u, + 1, + 0, + 0xABu, + 0, + 0, + nullstring, + pTexture_presleft, + 0); + pCreationUI_BtnPressLeft[1] = pGUIWindow_CurrentMenu->CreateButton( + 169u, + 32u, + 11u, + 13u, + 1, + 0, + 0xABu, + 1u, + 0, + nullstring, + pTexture_presleft, + 0); + pCreationUI_BtnPressLeft[2] = pGUIWindow_CurrentMenu->CreateButton( + 327u, + 32u, + 11u, + 13u, + 1, + 0, + 0xABu, + 2u, + 0, + nullstring, + pTexture_presleft, + 0); + pCreationUI_BtnPressLeft[3] = pGUIWindow_CurrentMenu->CreateButton( + 486u, + 32u, + 11u, + 13u, + 1, + 0, + 0xABu, + 3u, + 0, + nullstring, + pTexture_presleft, + 0); + pCreationUI_BtnPressRight[0] = pGUIWindow_CurrentMenu->CreateButton( + 74u, + 32u, + 11u, + 13u, + 1, + 0, + 0xACu, + 0, + 0, + nullstring, + pTexture_pressrigh, + 0); + pCreationUI_BtnPressRight[1] = pGUIWindow_CurrentMenu->CreateButton( + 233u, + 32u, + 11u, + 13u, + 1, + 0, + 0xACu, + 1u, + 0, + nullstring, + pTexture_pressrigh, + 0); + pCreationUI_BtnPressRight[2] = pGUIWindow_CurrentMenu->CreateButton( + 391u, + 32u, + 11u, + 13u, + 1, + 0, + 0xACu, + 2u, + 0, + nullstring, + pTexture_pressrigh, + 0); + pCreationUI_BtnPressRight[3] = pGUIWindow_CurrentMenu->CreateButton( + 549u, + 32u, + 11u, + 13u, + 1, + 0, + 0xACu, + 3u, + 0, + nullstring, + pTexture_pressrigh, + 0); + pCreationUI_BtnPressLeft2[0] = pGUIWindow_CurrentMenu->CreateButton( + 10u, + 103u, + 11u, + 13u, + 1, + 0, + 0x90u, + 0, + 0, + nullstring, + pTexture_presleft, + 0); + pCreationUI_BtnPressLeft2[1] = pGUIWindow_CurrentMenu->CreateButton( + 169u, + 103u, + 11u, + 13u, + 1, + 0, + 0x90u, + 1u, + 0, + nullstring, + pTexture_presleft, + 0); + pCreationUI_BtnPressLeft2[2] = pGUIWindow_CurrentMenu->CreateButton( + 327u, + 103u, + 11u, + 13u, + 1, + 0, + 0x90u, + 2u, + 0, + nullstring, + pTexture_presleft, + 0); + pCreationUI_BtnPressLeft2[3] = pGUIWindow_CurrentMenu->CreateButton( + 486u, + 103u, + 11u, + 13u, + 1, + 0, + 0x90u, + 3u, + 0, + nullstring, + pTexture_presleft, + 0); + pCreationUI_BtnPressRight2[0] = pGUIWindow_CurrentMenu->CreateButton( + 74u, + 103u, + 11u, + 13u, + 1, + 0, + 0x91u, + 0, + 0, + nullstring, + pTexture_pressrigh, + 0); + pCreationUI_BtnPressRight2[1] = pGUIWindow_CurrentMenu->CreateButton( + 233u, + 103u, + 11u, + 13u, + 1, + 0, + 0x91u, + 1u, + 0, + nullstring, + pTexture_pressrigh, + 0); + pCreationUI_BtnPressRight2[2] = pGUIWindow_CurrentMenu->CreateButton( + 391u, + 103u, + 11u, + 13u, + 1, + 0, + 0x91u, + 2u, + 0, + nullstring, + pTexture_pressrigh, + 0); + pCreationUI_BtnPressRight2[3] = pGUIWindow_CurrentMenu->CreateButton( + 549u, + 103u, + 11u, + 13u, + 1, + 0, + 0x91u, + 3u, + 0, + nullstring, + pTexture_pressrigh, + 0); + uControlParamb = 0; + uXb = 8; + do + { + pGUIWindow_CurrentMenu->CreateButton(uXb, 308u, 150u, v0, 1, 0, 0x48u, uControlParamb, 0, nullstring, 0); + pGUIWindow_CurrentMenu->CreateButton( + uXb, + v0 + 308, + 150u, + v0, + 1, + 0, + 0x49u, + uControlParamb, + 0, + nullstring, + 0); + pGUIWindow_CurrentMenu->CreateButton( + uXb, + 2 * v0 + 308, + 150u, + v0, + 1, + 0, + 0x4Au, + uControlParamb, + 0, + nullstring, + 0); + pGUIWindow_CurrentMenu->CreateButton( + uXb, + 3 * v0 + 308, + 150u, + v0, + 1, + 0, + 0x4Bu, + uControlParamb, + 0, + nullstring, + 0); + uXb += 158; + ++uControlParamb; + } + while ( (signed int)uXb < 640 ); + pGUIWindow_CurrentMenu->CreateButton(5u, 21u, 0x99u, 0x16Du, 1, 0, 0x76u, 0, 0x31u, nullstring, 0); + pGUIWindow_CurrentMenu->CreateButton(163u, 21u, 0x99u, 0x16Du, 1, 0, 0x76u, 1u, 0x32u, nullstring, 0); + pGUIWindow_CurrentMenu->CreateButton(321u, 21u, 0x99u, 0x16Du, 1, 0, 0x76u, 2u, 0x33u, nullstring, 0); + pGUIWindow_CurrentMenu->CreateButton(479u, 21u, 0x99u, 0x16Du, 1, 0, 0x76u, 3u, 0x34u, nullstring, 0); + uXc = 23; + uControlParamc = 2; + do + { + pGUIWindow_CurrentMenu->CreateButton(uXc, 169u, 120u, 20u, 1, 0, 0, uControlParamc - 2, 0, nullstring, 0); + pGUIWindow_CurrentMenu->CreateButton( + uXc, + v0 + 169, + 120u, + 20u, + 1, + 0, + 0, + uControlParamc - 1, + 0, + nullstring, + 0); + pGUIWindow_CurrentMenu->CreateButton( + uXc, + 2 * v0 + 169, + 120u, + 20u, + 1, + 0, + 0, + uControlParamc, + 0, + nullstring, + 0); + pGUIWindow_CurrentMenu->CreateButton( + uXc, + 3 * v0 + 169, + 120u, + 20u, + 1, + 0, + 0, + uControlParamc + 1, + 0, + nullstring, + 0); + pGUIWindow_CurrentMenu->CreateButton( + uXc, + 4 * v0 + 169, + 120u, + 20u, + 1, + 0, + 0, + uControlParamc + 2, + 0, + nullstring, + 0); + pGUIWindow_CurrentMenu->CreateButton( + uXc, + 5 * v0 + 169, + 120u, + 20u, + 1, + 0, + 0, + uControlParamc + 3, + 0, + nullstring, + 0); + pGUIWindow_CurrentMenu->CreateButton( + uXc, + 6 * v0 + 169, + 120u, + 20u, + 1, + 0, + 0, + uControlParamc + 4, + 0, + nullstring, + 0); + uControlParamc += 7; + uXc += 158; + } + while ( (signed int)uControlParamc < 30 ); + pGUIWindow_CurrentMenu->_41D08F(28, 0, 7, 40); + pGUIWindow_CurrentMenu->CreateButton(323u, 417u, 65u, v0, 1, 0, 0x41u, 0, 0, nullstring, 0); + pGUIWindow_CurrentMenu->CreateButton(323u, v0 + 417, 65u, v0, 1, 0, 0x41u, 0xCu, 0, nullstring, 0); + pGUIWindow_CurrentMenu->CreateButton(323u, 2 * v0 + 417, 65u, v0, 1, 0, 0x41u, 0x14u, 0, nullstring, 0); + pGUIWindow_CurrentMenu->CreateButton(388u, 417u, 65u, v0, 1, 0, 0x41u, 0x18u, 0, nullstring, 0); + pGUIWindow_CurrentMenu->CreateButton(388u, v0 + 417, 65u, v0, 1, 0, 0x41u, 0x1Cu, 0, nullstring, 0); + pGUIWindow_CurrentMenu->CreateButton(388u, 2 * v0 + 417, 65u, v0, 1, 0, 0x41u, 0x20u, 0, nullstring, 0); + pGUIWindow_CurrentMenu->CreateButton(453u, 417u, 65u, v0, 1, 0, 0x41u, 0x10u, 0, nullstring, 0); + pGUIWindow_CurrentMenu->CreateButton(453u, v0 + 417, 65u, v0, 1, 0, 0x41u, 8u, 0, nullstring, 0); + pGUIWindow_CurrentMenu->CreateButton(453u, 2 * v0 + 417, 65u, v0, 1, 0, 0x41u, 4u, 0, nullstring, 0); + uControlParamd = 0; + do + { + uXd = -5; + if ( uControlParamd <= 3 ) + uXd = 0; + pGUIWindow_CurrentMenu->CreateButton( + 100 * uControlParamd / 3 + uXd + 17, + v0 * uControlParamd % 3 + 417, + 100u, + v0, + 1, + 0, + 0x40u, + uControlParamd, + 0, + nullstring, + 0); + ++uControlParamd; + } + while ( uControlParamd < 9 ); + pPlayerCreationUI_BtnOK = pGUIWindow_CurrentMenu->CreateButton( + 580u, + 431u, + 51u, + 39u, + 1, + 0, + 0x42u, + 0, + 0xDu, + nullstring, + (Texture *)(uTextureID_BUTTMAKE != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_BUTTMAKE] : 0), + 0); + pPlayerCreationUI_BtnReset = pGUIWindow_CurrentMenu->CreateButton( + 527u, + 431u, + 51u, + 39u, + 1, + 0, + 0x43u, + 0, + 0x43u, + nullstring, + (Texture *)(uTextureID_BUTTMAKE2 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_BUTTMAKE2] : 0), + 0); + pPlayerCreationUI_BtnMinus = pGUIWindow_CurrentMenu->CreateButton( + 523u, + 393u, + 20u, + 35u, + 1, + 0, + 0x3Fu, + 0, + 0x2Du, + nullstring, + pTexture_buttminu, + 0); + pPlayerCreationUI_BtnPlus = pGUIWindow_CurrentMenu->CreateButton( + 613u, + 393u, + 20u, + 35u, + 1, + 0, + 0x3Eu, + 1u, + 0x2Bu, + nullstring, + pTexture_buttplus, + 0); + pFontCChar = LoadFont("cchar.fnt", "FONTPAL", 0); +} +// 4E28F8: using guessed type int uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions; + +//----- (0049750E) -------------------------------------------------------- +void __cdecl DeleteCCharFont() +{ + pAllocator->FreeChunk(pFontCChar); + pFontCChar = 0; +} + +//----- (00497526) -------------------------------------------------------- +bool __cdecl PlayerCreationUI_Loop() +{ + RGBTexture *v0; // ebx@1 + UINT v1; // esi@1 + unsigned int v2; // ecx@3 + LONG uMouseX; // edi@6 + LONG uMouseY; // eax@6 + GUIButton *v5; // edx@6 + unsigned int v6; // ecx@7 + int v7; // esi@12 + signed int v8; // edi@30 + int v9; // edx@31 + char *v10; // ebx@37 + int v11; // esi@38 + signed int v12; // ecx@40 + int v13; // eax@40 + signed int v14; // eax@45 + int v15; // eax@70 + signed int v16; // ecx@70 + unsigned int v18; // [sp-4h] [bp-84h]@48 + ItemGen item; // [sp+Ch] [bp-74h]@37 + char v20; // [sp+30h] [bp-50h]@29 + char v21; // [sp+31h] [bp-4Fh]@29 + __int16 v22; // [sp+4Dh] [bp-33h]@29 + char v23; // [sp+4Fh] [bp-31h]@29 + MSG Msg; // [sp+50h] [bp-30h]@17 + POINT v25; // [sp+6Ch] [bp-14h]@6 + bool v26; // [sp+74h] [bp-Ch]@1 + POINT v24; // [sp+78h] [bp-8h]@6 + + v0 = &stru_506F20; + v1 = 0; + v26 = 0; + stru_506F20.Release(); + stru_506F20.Load("makeme.pcx", 0); + if ( pAsyncMouse ) + pAsyncMouse->Resume(); + v2 = 6; + pGUIWindow_CurrentMenu->field_40 = 0; +LABEL_27: + SetCurrentMenuID(v2); + while ( GetCurrentMenuID() == MENU_CREATEPARTY ) + { + if ( pAsyncMouse != (void *)v1 ) + pAsyncMouse->_46B736_consume_click_lists(1); + uMouseX = pMouse->GetCursorPos(&v24)->x; + uMouseY = pMouse->GetCursorPos(&v25)->y; + v5 = pGUIWindow_CurrentMenu->pControlsHead; + if ( v5 != (GUIButton *)v1 ) + { + v6 = pMessageQueue_50CBD0->uNumMessages; + do + { + if ( uMouseX >= (signed int)v5->uX + && uMouseX <= (signed int)v5->uZ + && uMouseY >= (signed int)v5->uY + && uMouseY <= (signed int)v5->uW ) + { + v7 = v5->uControlParam; + if ( (signed int)v6 < 40 ) + { + pMessageQueue_50CBD0->pMessages[v6].eType = (UIMessageType)v5->field_1C; + v0 = &stru_506F20; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v7; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; + v6 = pMessageQueue_50CBD0->uNumMessages + 1; + ++pMessageQueue_50CBD0->uNumMessages; + } + v1 = 0; + } + v5 = v5->pNext; + } + while ( v5 != (GUIButton *)v1 ); + } + while ( PeekMessageA(&Msg, (HWND)v1, v1, v1, PM_REMOVE) ) + { + if ( Msg.message == WM_QUIT ) + Game_DeinitializeAndTerminate(0); + TranslateMessage(&Msg); + DispatchMessageA(&Msg); + } + if ( BYTE1(dword_6BE364_game_settings_1) & 1 ) + { + WaitMessage(); + } + else + { + PlayerCreationUI_Draw(); + GUI_MainMenuMessageProc(); + pRenderer->BeginScene(); + GUI_UpdateWindows(); + pRenderer->EndScene(); + pRenderer->Present(); + if ( uGameState == 1 ) + { + v26 = 1; + v2 = 0; + goto LABEL_27; + } + if ( uGameState == 6 ) + { + uGameState = v1; + v2 = 1; + goto LABEL_27; + } + } + } + v0->Release(); + pGUIWindow_CurrentMenu->Release(); + pIcons_LOD->_4114F2(); + v20 = 0; + memset(&v21, 0, 0x1Cu); + v22 = 0; + v23 = 0; + do + { + v8 = 0; + do + { + v9 = rand() % 32; + if ( !*(&v20 + v9) ) + break; + ++v8; + } + while ( v8 < 10 ); + if ( v8 == 10 ) + { + v9 = 0; + if ( v20 ) + { + do + ++v9; + while ( *(&v20 + v9) ); + } + } + pParty->field_854[v1++] = v9; + *(&v20 + v9) = 1; + } + while ( (signed int)v1 < 32 ); + item.Reset(); + v10 = (char *)&pParty->pPlayers[0].sResMagicBase; + do + { + v11 = (int)(v10 - 6014); + if ( !*(v10 - 5829) ) + *(short *)v10 = 10; + *((short *)v10 + 400) = 0; + v12 = 0; + v13 = (int)(v10 - 5726); + while ( !*(short *)v13 ) + { + ++v12; + v13 += 2; + if ( v12 >= 9 ) + goto LABEL_45; + } + *(char *)(v11 + 6734) = v12; +LABEL_45: + pItemsTable->GenerateItem(2, 40, &item); + ((Player *)(v10 - 6014))->AddItem2(0xFFFFFFFFu, &item); + v14 = 0; + v24.y = 0; + do + { + if ( *(short *)(v11 + 2 * v14 + 264) ) + { + switch ( v14 ) + { + case 0: + v18 = 61; + goto LABEL_69; + case 1: + v18 = 1; + goto LABEL_69; + case 2: + v18 = 15; + goto LABEL_69; + case 3: + v18 = 23; + goto LABEL_69; + case 4: + v18 = 31; + goto LABEL_69; + case 5: + v18 = 47; + goto LABEL_69; + case 6: + v18 = 50; + goto LABEL_69; + case 8: + v18 = 84; + goto LABEL_69; + case 9: + v18 = 66; + goto LABEL_69; + case 10: + v18 = 71; + goto LABEL_69; + case 11: + v18 = 76; + goto LABEL_69; + case 12: + ((Player *)(v10 - 6014))->AddItem(0xFFFFFFFFu, 0x191u); + *(char *)(v11 + 402) = 1; + break; + case 13: + ((Player *)(v10 - 6014))->AddItem(0xFFFFFFFFu, 0x19Cu); + *(char *)(v11 + 413) = 1; + break; + case 14: + ((Player *)(v10 - 6014))->AddItem(0xFFFFFFFFu, 0x1A7u); + *(char *)(v11 + 424) = 1; + break; + case 15: + ((Player *)(v10 - 6014))->AddItem(0xFFFFFFFFu, 0x1B2u); + *(char *)(v11 + 435) = 1; + break; + case 16: + ((Player *)(v10 - 6014))->AddItem(0xFFFFFFFFu, 0x1BDu); + *(char *)(v11 + 446) = 1; + break; + case 17: + ((Player *)(v10 - 6014))->AddItem(0xFFFFFFFFu, 0x1C8u); + *(char *)(v11 + 457) = 1; + break; + case 18: + ((Player *)(v10 - 6014))->AddItem(0xFFFFFFFFu, 0x1D3u); + *(char *)(v11 + 468) = 1; + break; + case 21: + case 23: + case 25: + case 26: + case 29: + case 36: + ((Player *)(v10 - 6014))->AddItem(0xFFFFFFFFu, 0xDCu); + v18 = 5 * (rand() % 3 + 40); + goto LABEL_69; + case 30: + v18 = 115; + goto LABEL_69; + case 31: + v18 = 110; +LABEL_69: + ((Player *)(v10 - 6014))->AddItem(0xFFFFFFFFu, v18); + break; + default: + break; + } + v15 = v11 + 552; + v16 = 138; + do + { + if ( *(int *)(v15 - 20) ) + *(int *)v15 |= 1u; + v15 += 36; + --v16; + } + while ( v16 ); + *(int *)(v11 + 6460) = ((Player *)(v10 - 6014))->GetMaxHealth(); + *(int *)(v11 + 6464) = ((Player *)(v10 - 6014))->GetMaxMana(); + v14 = v24.y; + } + ++v14; + v24.y = v14; + } + while ( v14 < 37 ); + v10 += 6972; + } + while ( (signed int)v10 < (signed int)((char *)&pParty->field_871C[455] + 2) ); + pAudioPlayer->StopChannels(-1, -1); + if ( pAsyncMouse ) + pAsyncMouse->Suspend(); + return v26; +} + + + + +//----- (004979D2) -------------------------------------------------------- +MENU_STATE __cdecl CreditsMenu__Loop() +{ + char *v0; // eax@5 + char *v1; // edi@5 + FILE *v2; // eax@5 + unsigned int v3; // esi@7 + GUIFont *v4; // edx@9 + GUIFont *v5; // ecx@9 + __int16 v6; // ax@9 + void *v7; // eax@9 + unsigned int v8; // ST2C_4@9 + unsigned int v9; // eax@9 + unsigned int v10; // ST2C_4@19 + unsigned int teal; // eax@19 + //Texture v12; // [sp+Ch] [bp-130h]@5 + //RGBTexture v16; // [sp+54h] [bp-E8h]@1 + double v15; // [sp+7Ch] [bp-C0h]@9 + MSG Msg; // [sp+84h] [bp-B8h]@10 + int v17; // [sp+A0h] [bp-9Ch]@9 + int a2; // [sp+A4h] [bp-98h]@9 + unsigned int a3; // [sp+A8h] [bp-94h]@9 + int v20; // [sp+ACh] [bp-90h]@9 + int a4; // [sp+B0h] [bp-8Ch]@9 + int a8; // [sp+F8h] [bp-44h]@9 + int a7; // [sp+FCh] [bp-40h]@9 + //RGBTexture v21; // [sp+100h] [bp-3Ch]@1 + int a5; // [sp+128h] [bp-14h]@1 + char *pString; // [sp+12Ch] [bp-10h]@9 + char *ptr; // [sp+130h] [bp-Ch]@5 + GUIFont *pFontQuick; // [sp+134h] [bp-8h]@1 + GUIFont *pFontCChar; // [sp+138h] [bp-4h]@1 + + RGBTexture v16; // [sp+54h] [bp-E8h]@1 + //RGBTexture::RGBTexture(&v16); + RGBTexture v21; // [sp+100h] [bp-3Ch]@1 + //RGBTexture::RGBTexture(&v21); + + a5 = 0; + pFontQuick = LoadFont("quick.fnt", "FONTPAL", 0); + pFontCChar = LoadFont("cchar.fnt", "FONTPAL", 0); + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + ++pIcons_LOD->uTexturePacksCount; + if ( !pIcons_LOD->uNumPrevLoadedFiles ) + pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles; + dword_A74C88 = 0; + pAudioPlayer->PlayMusicTrack(0xFu); + v16.Load("mm6title.pcx", 0); + v0 = (char *)pEvents_LOD->LoadRaw("credits.txt", 0); + v1 = v0; + ptr = v0; + + Texture v12; // [sp+Ch] [bp-130h]@5 + //Texture::Texture(&v12); + + v2 = pEvents_LOD->FindContainer("credits.txt", 0); + if ( !v2 ) + Abortf(pGlobalTXT_LocalizationStrings[63]); // "Might and Magic VII is having trouble loading files. + // Please re-install to fix this problem. Note: Re-installing will not destroy your save games." + fread(&v12, 1u, 0x30u, v2); + v3 = v12.uDecompressedSize; + if ( !v12.uDecompressedSize ) + v3 = v12.uTextureSize; + memset(&v12, 0, 0x48u); + v4 = pFontCChar; + v5 = pFontQuick; + v1[v3] = 0; + v20 = 250; + a4 = 440; + a2 = 389; + a3 = 19; + v21.uWidth = 250; + v6 = v5->GetStringHeight2(v4, v1, (int)&a2, 0, 1); + v21.uHeight = v6 + 2 * a4; + v21.uNumPixels = (signed __int16)v21.uWidth * (signed __int16)v21.uHeight; + v7 = pAllocator->AllocNamedChunk(v21.pPixels, 2 * v21.uNumPixels, "scrollermap"); + v8 = v21.uNumPixels; + v21.pPixels = (unsigned __int16 *)v7; + v9 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0, 0xFFu, 0xFFu); + fill_pixels_fast(v9, v21.pPixels, v8); + *(int *)&v21.field_20 = 0; + a7 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0x70u, 0x8Fu, 0xFEu); + a8 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xECu, 0xE6u, 0x9Cu); + pString = (char *)operator new(2 * v3); + strncpy(pString, ptr, v3); + pFontQuick->_44D2FD_prolly_draw_credits_entry( + pFontCChar, + 1, + a4 + 1, + (signed __int16)v21.uWidth, + (signed __int16)v21.uHeight, + 1u, + 1u, + pString, + v21.pPixels, + (signed __int16)v21.uWidth); + strncpy(pString, ptr, v3); + pFontQuick->_44D2FD_prolly_draw_credits_entry( + pFontCChar, + 0, + a4, + (signed __int16)v21.uWidth, + (signed __int16)v21.uHeight, + a7, + a8, + pString, + v21.pPixels, + (signed __int16)v21.uWidth); + free(pString); + pWindow_Credits = GUIWindow::Create(0, 0, 640u, 480u, WINDOW_Credits, 0, (int)ptr); + pWindow_Credits->CreateButton(0, 0, 0, 0, 1, 0, 0x71u, 0, 0x1Bu, nullstring, 0); + uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = 9; + SetCurrentMenuID(8u); + pRenderer->BeginScene(); + pRenderer->DrawTextureRGB(0, 0, &v16); + pRenderer->Clip(a2, a3, a2 + v20, a3 + a4); + pRenderer->_4A5D33(a2, a3, 0, 0, &v21); + pRenderer->ResetClip(); + pRenderer->EndScene(); + pString = (char *)0x447A0000; + v15 = 1000.0 + 6.7553994e15; + v17 = LODWORD(v15); + GetTickCount(); + pRenderer->Present(); + do + { + while ( PeekMessageA(&Msg, 0, 0, 0, 1u) ) + { + if ( Msg.message == 18 ) + Game_DeinitializeAndTerminate(0); + TranslateMessage(&Msg); + DispatchMessageA(&Msg); + } + if ( BYTE1(dword_6BE364_game_settings_1) & 1 ) + { + WaitMessage(); + } + else + { + if ( pAsyncMouse ) + pAsyncMouse->_46B736_consume_click_lists(1); + if ( dword_A74C88 ) + { + v16.Load("mm6title.pcx", 1); + v10 = v21.uNumPixels; + teal = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0, 0xFFu, 0xFFu); + fill_pixels_fast(teal, v21.pPixels, v10); + strncpy(pTmpBuf, ptr, 0x7D0u); + pFontQuick->_44D2FD_prolly_draw_credits_entry( + pFontCChar, + 1, + a4 + 1, + (signed __int16)v21.uWidth, + (signed __int16)v21.uHeight, + 1u, + 1u, + pTmpBuf, + v21.pPixels, + (signed __int16)v21.uWidth); + strncpy(pTmpBuf, ptr, 0x7D0u); + pFontQuick->_44D2FD_prolly_draw_credits_entry( + pFontCChar, + 0, + a4, + (signed __int16)v21.uWidth, + (signed __int16)v21.uHeight, + a7, + a8, + pTmpBuf, + v21.pPixels, + (signed __int16)v21.uWidth); + dword_A74C88 = 0; + pRenderer->BeginScene(); + pRenderer->DrawTextureRGB(0, 0, &v16); + pRenderer->Clip(a2, a3, a2 + v20, a2 + a4); + pRenderer->_4A5D33(a2, a3, 0, a5, &v21); + pRenderer->ResetClip(); + pRenderer->EndScene(); + pRenderer->Present(); + } + timeGetTime(); + pRenderer->BeginScene(); + pRenderer->DrawTextureRGB(0, 0, &v16); + pRenderer->Clip(a2, a3, a2 + v20, a3 + a4); + pRenderer->_4A5D33(a2, a3, 0, a5, &v21); + pRenderer->ResetClip(); + pRenderer->EndScene(); + ++a5; + if ( a5 >= (signed __int16)v21.uHeight ) + SetCurrentMenuID(0); + timeGetTime(); + pRenderer->Present(); + GUI_MainMenuMessageProc(); + } + } + while ( GetCurrentMenuID() == MENU_Credits ); + GUI_MainMenuMessageProc(); + pRenderer->BeginScene(); + GUI_UpdateWindows(); + pRenderer->EndScene(); + pRenderer->Present(); + pAudioPlayer->_4AA258(1); + pAllocator->FreeChunk(ptr); + pAllocator->FreeChunk(pFontQuick); + pAllocator->FreeChunk(pFontCChar); + pWindow_Credits->Release(); + pIcons_LOD->_4114F2(); + v16.Release(); + v21.Release(); + return (MENU_STATE)(GetCurrentMenuID() - (int)MENU_Credits); // return MENU_Main +} + + + + +//----- (0049B04D) -------------------------------------------------------- +int stru154::_49B04D(ODMFace *a2, BSPVertexBuffer *a3) +{ + stru154 *v3; // edi@1 + signed int v4; // eax@1 + signed int result; // eax@9 + signed int v6; // [sp-8h] [bp-18h]@8 + Vec3_float_ v; // [sp+4h] [bp-Ch]@1 + + v.x = 0.0; + v3 = this; + v.y = 0.0; + v.z = 0.0; + _49B13D(a2, a3, &v, (float *)&a3); + v4 = 2; + if ( a2->pFacePlane.vNormal.z ) + { + if ( !a2->pFacePlane.vNormal.x && !a2->pFacePlane.vNormal.y ) + v4 = 1; + } + else + { + v4 = 0; + } + if ( v4 ) + { + if ( v4 == 1 ) + v6 = 3; + else + v6 = 4; + result = v6; + } + else + { + result = 1; + } + v3->vNormal.x = v.x; + v3->vNormal.y = v.y; + v3->vNormal.z = v.z; + v3->field_10 = *(float *)&a3; + v3->field_14 = result; + return result; +} + +//----- (0049B0C9) -------------------------------------------------------- +int stru154::_49B0C9(Vec3_float_ *pNormal, float a3) +{ + signed int v3; // esi@1 + signed int result; // eax@9 + double v5; // st7@12 + double v6; // st6@12 + double v7; // st5@12 + signed int v8; // [sp+0h] [bp-4h]@8 + + v3 = 2; + if ( pNormal->z == 0.0 ) + { + v3 = 0; + } + else + { + if ( pNormal->x == 0.0 && pNormal->y == 0.0 ) + v3 = 1; + } + if ( v3 ) + { + if ( v3 == 1 ) + v8 = 3; + else + v8 = 4; + result = v8; + } + else + { + result = 1; + } + v5 = pNormal->z; + v6 = pNormal->y; + v7 = pNormal->x; + this->field_14 = result; + this->vNormal.x = v7; + this->field_10 = a3; + this->vNormal.y = v6; + this->vNormal.z = v5; + return result; +} + +//----- (0049B13D) -------------------------------------------------------- +int stru154::_49B13D(ODMFace *pFace, BSPVertexBuffer *pVertices, Vec3_float_ *a3, float *a4) +{ + ODMFace *v5; // ebx@1 + int v6; // eax@1 + unsigned __int16 *v7; // ebx@2 + Vec3_int_ *v8; // eax@3 + Vec3_int_ *v9; // ecx@3 + double v10; // st7@3 + int v11; // ecx@3 + Vec3_int_ *v12; // ecx@3 + double v13; // st7@3 + double v14; // st6@3 + double v15; // st5@3 + int v16; // ecx@3 + Vec3_int_ *v17; // eax@3 + double v18; // st5@3 + Vec3_float_ *v19; // eax@3 + int result; // eax@8 + float v21; // ecx@10 + double v22; // st7@10 + double v23; // st6@10 + Vec3_float_ v2; // [sp+4h] [bp-64h]@3 + float v25; // [sp+18h] [bp-50h]@3 + float v26; // [sp+1Ch] [bp-4Ch]@3 + float v27; // [sp+20h] [bp-48h]@3 + float v28; // [sp+24h] [bp-44h]@3 + float v29; // [sp+2Ch] [bp-3Ch]@3 + float v30; // [sp+30h] [bp-38h]@3 + float v31; // [sp+34h] [bp-34h]@3 + float v32; // [sp+38h] [bp-30h]@3 + float v33; // [sp+3Ch] [bp-2Ch]@3 + Vec3_float_ v1; // [sp+40h] [bp-28h]@1 + float v35; // [sp+4Ch] [bp-1Ch]@3 + float v36; // [sp+50h] [bp-18h]@3 + float v37; // [sp+54h] [bp-14h]@3 + Vec3_float_ v38; // [sp+58h] [bp-10h]@3 + int v39; // [sp+64h] [bp-4h]@1 + + v39 = 0; + v1.x = 0.0; + v5 = pFace; + v6 = pFace->uNumVertices; + v1.y = 0.0; + v1.z = 0.0; + if ( v6 - 1 <= 0 ) + { +LABEL_8: + a3->x = (double)(v5->pFacePlane.vNormal.x & 0xFFFF) * 0.000015259022 + (double)(v5->pFacePlane.vNormal.x >> 16); + a3->y = (double)(v5->pFacePlane.vNormal.y & 0xFFFF) * 0.000015259022 + (double)(v5->pFacePlane.vNormal.y >> 16); + a3->z = (double)(v5->pFacePlane.vNormal.z & 0xFFFF) * 0.000015259022 + (double)(v5->pFacePlane.vNormal.z >> 16); + result = (int)a4; + *a4 = (double)(v5->pFacePlane.dist & 0xFFFF) * 0.000015259022 + (double)(v5->pFacePlane.dist >> 16); + } + else + { + v7 = &pFace->pVertexIDs[1]; + while ( 1 ) + { + v8 = pVertices->pVertices; + v9 = &v8[*(v7 - 1)]; + v35 = (double)v9->x; + v36 = (double)v9->y; + v10 = (double)v9->z; + v11 = *v7; + v37 = v10; + v12 = &v8[v11]; + v13 = (double)v12->x; + v14 = (double)v12->y; + v15 = (double)v12->z; + v16 = v7[1]; + v25 = v15; + v17 = &v8[v16]; + v18 = (double)v17->x; + v29 = (double)v17->y; + v30 = (double)v17->z; + v31 = v13 - v35; + v32 = v14 - v36; + v33 = v25 - v37; + v1.x = v31; + v26 = v18 - v13; + v1.y = v32; + v27 = v29 - v14; + v1.z = v33; + v28 = v30 - v25; + v19 = Vec3_float_::Cross(&v1, &v2, v26, v27, v28); + v38.x = v19->x; + v38.y = v19->y; + v38.z = v19->z; + if ( v38.x != 0.0 ) + break; + if ( v38.y != 0.0 || v38.z != 0.0 ) + break; + ++v39; + ++v7; + if ( v39 >= pFace->uNumVertices - 1 ) + { + v5 = pFace; + goto LABEL_8; + } + } + v38.Normalize(); + v21 = v38.y; + a3->x = v38.x; + v22 = v37 * v38.z; + v23 = v36 * v38.y; + a3->y = v21; + a3->z = v38.z; + result = (int)a4; + *a4 = -(v22 + v23 + v35 * v38.x); + } + return result; +} + + + + + +//----- (0049D700) -------------------------------------------------------- +unsigned int __fastcall GetMaxMipLevels(unsigned int uDim) +{ + unsigned int v1; // eax@1 + int v2; // ecx@1 + unsigned int v3; // eax@1 + + v1 = uDim; + v2 = 0; + v3 = v1 - 1; + while ( v3 & 1 ) + { + v3 >>= 1; + ++v2; + } + return v3 == 0 ? v2 : 0; +} + + + + + + + + + + +//----- (004A19D8) -------------------------------------------------------- +int __fastcall sub_4A19D8(unsigned int a1, unsigned int a2) +{ + signed __int64 v2; // ST10_8@1 + double v3; // st7@1 + float v4; // ST24_4@1 + double v5; // ST10_8@1 + int v6; // ST1C_4@1 + float v7; // ST24_4@1 + double v8; // ST10_8@1 + unsigned __int8 v9; // ST20_1@1 + float v10; // ST24_4@1 + double v11; // ST10_8@1 + float v12; // ST24_4@1 + double v13; // ST08_8@1 + + v2 = a1 >> 24; + v3 = (double)v2 * 0.0039215689; + LODWORD(v2) = a2 >> 24; + v4 = v3 * (double)v2 * 0.0039215689 * 255.0; + v5 = v4 + 6.7553994e15; + v6 = LODWORD(v5); + v7 = (double)((a1 >> 16) & 0xFFi64) * 0.0039215689 * (double)((a2 >> 16) & 0xFF) * 0.0039215689 * 255.0; + v8 = v7 + 6.7553994e15; + v9 = LOBYTE(v8); + v10 = (double)((unsigned __int16)a1 >> 8) * 0.0039215689 * (double)((unsigned __int16)a2 >> 8) * 0.0039215689 * 255.0; + v11 = v10 + 6.7553994e15; + v12 = (double)(a1 & 0xFFi64) * 0.0039215689 * (double)(unsigned __int8)a2 * 0.0039215689 * 255.0; + v13 = v12 + 6.7553994e15; + return LOBYTE(v13) | ((LOBYTE(v11) | (((v6 << 8) | v9) << 8)) << 8); +} + + +//----- (004A1C1E) -------------------------------------------------------- +void __cdecl DoRenderBillboards_D3D() +{ + signed int v0; // ebp@1 + signed int *v1; // esi@2 + //IDirect3DDevice3Vtbl *v2; // esi@7 + unsigned int v3; // eax@7 + unsigned int v4; // [sp+58h] [bp-4h]@2 + + v0 = -1; + ErrD3D(pRenderer->pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_ADDRESS, 3u)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, 1u)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZWRITEENABLE, 0)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, 1u)); + if ( ((pRenderer->uNumBillboardsToDraw - 1) & 0x80000000u) == 0 ) + { + v1 = (signed int *)&pRenderer->pBillboardRenderListD3D[pRenderer->uNumBillboardsToDraw - 1].bOpaque; + v4 = pRenderer->uNumBillboardsToDraw; + do + { + ErrD3D(pRenderer->pRenderD3D->pDevice->SetTexture( + 0, + (IDirect3DTexture2 *)*(v1 - 35))); + if ( *v1 != v0 ) + { + v0 = *v1; + SetBillboardBlendOptions(*v1); + } + ErrD3D(pRenderer->pRenderD3D->pDevice->DrawPrimitive( + D3DPT_TRIANGLEFAN, + 452, + v1 - 33, + *(v1 - 34), + 24)); + v1 -= 39; + --v4; + } + while ( v4 ); + } + if ( pRenderer->turnFogOn ) + { + pRenderer->turnFogOn = 0; + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE, 1u)); + //v2 = pRenderer->pRenderD3D->pDevice->lpVtbl; + v3 = GetLevelFogColor(); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_FOGCOLOR, v3 & 0xFFFFFF)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_FOGTABLEMODE, 0)); + } + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, 2u)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZWRITEENABLE, 1u)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, 0)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, 2u)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, 1u)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_DITHERENABLE, 1u)); +} + +//----- (004A1DA8) -------------------------------------------------------- +void __fastcall SetBillboardBlendOptions(signed int a1) +{ + //IDirect3DDevice3Vtbl *v1; // edi@9 + unsigned int v2; // eax@9 + int v3; // [sp+0h] [bp-4h]@0 + + if ( !a1 ) + { + if ( pRenderer->turnFogOn ) + { + pRenderer->turnFogOn = 0; + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE, 1u)); + //v1 = pRenderer->pRenderD3D->pDevice->lpVtbl; + v2 = GetLevelFogColor(); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_FOGCOLOR, v2 & 0xFFFFFF)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_FOGTABLEMODE, 0)); + } + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, 5)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, 6u)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_DITHERENABLE, 1)); + return; + } + if ( a1 > 0 && a1 <= 3 ) + { + if ( pRenderer->bUsingSpecular ) + { + if ( !pRenderer->turnFogOn ) + { + pRenderer->turnFogOn = 1; + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE, 0)); + } + } + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, 2)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, 2u)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_DITHERENABLE, 0)); + } +} + + + + + + + +//----- (004A46E6) -------------------------------------------------------- +int __fastcall sub_4A46E6(unsigned int x, signed int y, signed int a3, int a4, unsigned int a5) +{ + int v5; // eax@1 + int z; // eax@1 + unsigned int v7; // eax@9 + unsigned int v8; // ecx@9 + int v9; // eax@9 + unsigned int v10; // eax@10 + int *v11; // esi@10 + int *v12; // edi@10 + int v13; // ecx@10 + int v14; // edx@10 + unsigned int v15; // eax@22 + int *v16; // esi@22 + int *v17; // edi@22 + int v18; // ecx@22 + int v19; // edx@22 + unsigned __int16 *pTarget; // [sp+Ch] [bp-8h]@9 + int *pTargetZ; // [sp+10h] [bp-4h]@9 + unsigned int v22; // [sp+1Ch] [bp+8h]@9 + signed int v23; // [sp+20h] [bp+Ch]@1 + + v5 = a4; + v23 = a3 >> 16; + z = x + v5; + if ( z >= (signed int)pViewport->uViewportX + && (signed int)x <= (signed int)pViewport->uViewportZ + && y >= (signed int)pViewport->uViewportY + && y <= (signed int)pViewport->uViewportW ) + { + if ( (signed int)x < (signed int)pViewport->uViewportX ) + x = pViewport->uViewportX; + if ( z > (signed int)pViewport->uViewportZ ) + z = pViewport->uViewportZ; + pTarget = &pRenderer->pTargetSurface[x + y * pRenderer->uTargetSurfacePitch]; + v22 = z - x; + pTargetZ = &pRenderer->pActiveZBuffer[x + 640 * y]; + v7 = a5 >> 3; + v8 = a5 & 0xF0; + v9 = v7 & 0x1E0000; + if ( pRenderer->uTargetGBits == 5 ) + { + v10 = (v8 | (((unsigned __int16)(a5 & 0xF000) | (unsigned int)v9) >> 3)) >> 4; + v11 = (int *)pTarget; + v12 = pTargetZ; + v13 = v22; + v14 = (v10 << 16) | v10; + z = (unsigned __int8)pTarget & 2; + if ( (unsigned __int8)pTarget & 2 ) + { + z = (unsigned int)*pTargetZ >> 16; + if ( z > v23 ) + { + z = v14 + ((*pTarget & 0x7BDEu) >> 1); + *pTarget = z; + } + v13 = v22 - 1; + v11 = (int *)(pTarget + 1); + v12 = pTargetZ + 1; + } + while ( v13 != 1 ) + { + if ( v13 < 1 ) + return z; + z = (unsigned int)*v12 >> 16; + if ( z <= v23 ) + { + v13 -= 2; + ++v11; + v12 += 2; + } + else + { + v12 += 2; + z = v14 + ((*v11 & 0x7BDE7BDEu) >> 1); + v13 -= 2; + *v11 = z; + ++v11; + } + } + z = (unsigned int)*v12 >> 16; + if ( z > v23 ) + { + z = v14 + ((*(short *)v11 & 0x7BDEu) >> 1); + *(short *)v11 = z; + } + } + else + { + v15 = (v8 | (((unsigned __int16)(a5 & 0xF800) | (unsigned int)v9) >> 2)) >> 4; + v16 = (int *)pTarget; + v17 = pTargetZ; + v18 = v22; + v19 = (v15 << 16) | v15; + z = (unsigned __int8)pTarget & 2; + if ( (unsigned __int8)pTarget & 2 ) + { + z = (unsigned int)*pTargetZ >> 16; + if ( z > v23 ) + { + z = v19 + ((*pTarget & 0xF7DEu) >> 1); + *pTarget = z; + } + v18 = v22 - 1; + v16 = (int *)(pTarget + 1); + v17 = pTargetZ + 1; + } + while ( v18 != 1 ) + { + if ( v18 < 1 ) + return z; + z = (unsigned int)*v17 >> 16; + if ( z <= v23 ) + { + v18 -= 2; + ++v16; + v17 += 2; + } + else + { + v17 += 2; + z = v19 + ((*v16 & 0xF7DEF7DEu) >> 1); + v18 -= 2; + *v16 = z; + ++v16; + } + } + z = (unsigned int)*v17 >> 16; + if ( z > v23 ) + { + z = v19 + ((*(short *)v16 & 0xF7DEu) >> 1); + *(short *)v16 = z; + } + } + } + return z; +} + + +//----- (004A57E9) -------------------------------------------------------- +void __cdecl Present_ColorKey() +{ + HRESULT v0; // eax@3 + HRESULT v1; // eax@3 + HRESULT v2; // eax@3 + HRESULT v3; // eax@3 + HRESULT v4; // eax@3 + RECT a2; // [sp+4h] [bp-14h]@3 + //CheckHRESULT_stru0 this; // [sp+14h] [bp-4h]@3 + + if ( !pRenderer->uNumSceneBegins ) + { + if ( pRenderer->field_40110 ) + { + a2.bottom = pViewport->uViewportY; + a2.left = 0; + a2.top = 0; + a2.right = 640; + ErrD3D(pRenderer->pBackBuffer4->BltFast(0, 0, pRenderer->pColorKeySurface4, &a2, 16u)); + a2.right = 640; + a2.left = 0; + a2.top = pViewport->uViewportW + 1; + a2.bottom = 480; + ErrD3D(pRenderer->pBackBuffer4->BltFast( + 0, + pViewport->uViewportW + 1, + pRenderer->pColorKeySurface4, + &a2, + 16u)); + a2.right = pViewport->uViewportX; + a2.bottom = pViewport->uViewportW + 1; + a2.left = 0; + a2.top = pViewport->uViewportY; + ErrD3D(pRenderer->pBackBuffer4->BltFast( + 0, + pViewport->uViewportY, + pRenderer->pColorKeySurface4, + &a2, + 16u)); + a2.left = pViewport->uViewportZ; + a2.top = pViewport->uViewportY; + a2.right = 640; + a2.bottom = pViewport->uViewportW + 1; + ErrD3D(pRenderer->pBackBuffer4->BltFast( + pViewport->uViewportZ, + pViewport->uViewportY, + pRenderer->pColorKeySurface4, + &a2, + 16u)); + a2.right = pViewport->uViewportZ; + a2.bottom = pViewport->uViewportW + 1; + a2.left = pViewport->uViewportX; + a2.top = pViewport->uViewportY; + ErrD3D(pRenderer->pBackBuffer4->BltFast( + pViewport->uViewportX, + pViewport->uViewportY, + pRenderer->pColorKeySurface4, + &a2, + 17u)); + } + } +} + +//----- (004A597D) -------------------------------------------------------- +void __cdecl Present_NoColorKey() +{ + //unsigned __int16 *v0; // eax@4 + unsigned __int16 *v1; // esi@4 + void *v2; // edi@4 + //signed int v4; // ebx@4 + //signed int v5; // ebx@6 + //void *v6; // edi@7 + //const void *v7; // esi@7 + signed int v8; // ebx@8 + int v9; // eax@10 + unsigned int v10; // esi@10 + unsigned __int32 v11; // edi@10 + //int v12; // ecx@10 + unsigned int v13; // ebx@10 + int v14; // eax@11 + int v15; // eax@13 + int v16; // eax@14 + int v17; // eax@16 + HRESULT v18; // eax@22 + DDSURFACEDESC2 Dst; // [sp+Ch] [bp-98h]@3 + int v20; // [sp+88h] [bp-1Ch]@10 + int v21; // [sp+8Ch] [bp-18h]@10 + __int32 v22; // [sp+90h] [bp-14h]@10 + //unsigned __int32 v23; // [sp+94h] [bp-10h]@10 + unsigned int v24; // [sp+98h] [bp-Ch]@4 + //unsigned int _this; // [sp+9Ch] [bp-8h]@10 + //LPVOID v26; // [sp+A0h] [bp-4h]@4 + + if ( !pRenderer->uNumSceneBegins ) + { + if ( pRenderer->field_40110 ) + { + memset(&Dst, 0, 0x7Cu); + Dst.dwSize = 124; + if ( pRenderer->LockSurface_DDraw4(pRenderer->pBackBuffer4, &Dst, 1u) ) + { + //v26 = Dst.lpSurface; + pRenderer->pCurrentlyLockedSurfaceDataPtr = (unsigned __int16 *)Dst.lpSurface; + v24 = pRenderer->uTargetGMask | pRenderer->uTargetBMask | + ((pRenderer->uTargetGMask | pRenderer->uTargetBMask) << 16); + pRenderer->pCurrentlyLockedSoftSurface = pRenderer->pTargetSurface; + pRenderer->uCurrentlyLockedSurfacePitch = Dst.lPitch; + v1 = pRenderer->pTargetSurface; + v2 = Dst.lpSurface; + + //memset(pRenderer->pTargetSurface, 128, 640 * 2 * 320); + + auto pSrc = pRenderer->pTargetSurface; + auto pDst = (__int16 *)Dst.lpSurface; + + for (uint y = 0; y < 8; ++y) + memcpy(pDst + y * 640, + pSrc + y * 640, 640 * sizeof(__int16)); + + for (uint y = 8; y < 352; ++y) + { + memcpy(pDst + y * 640, + pSrc + y * 640, 8 * sizeof(__int16)); + memcpy(pDst + y * 640 + 8 + 460/*462*/, + pSrc + y * 640 + 8 + 460/*462*/, 174/*172*/ * sizeof(__int16)); + } + + for (uint y = 351/*352*/; y < 480; ++y) + memcpy(pDst + y * 640, + pSrc + y * 640, 640 * sizeof(__int16)); + + + auto pSrc_x1y1 = pSrc + 640 * pViewport->uViewportY + pViewport->uViewportX; + //_this = (unsigned int)&pSrc[2 * (((signed int)pViewport->uViewportX >> 1) + 320 * pViewport->uViewportY)]; + auto pDst_x1y1 = pDst + Dst.lPitch * pViewport->uViewportY + pViewport->uViewportX; + //v23 = (unsigned __int32)((char *)v26 + 4 * (((signed int)pViewport->uViewportX >> 1) + (Dst.lPitch >> 2) * pViewport->uViewportY)); + v9 = ((signed int)pViewport->uViewportX >> 1) - ((signed int)pViewport->uViewportZ >> 1); + //v20 = ((signed int)pViewport->uViewportZ >> 1) - ((signed int)pViewport->uViewportX >> 1); + v22 = 4 * ((Dst.lPitch / 4) + v9); + v21 = 4 * v9 + 1280; + + auto uNumLines = pViewport->uViewportW - pViewport->uViewportY + 1; + //v26 = (LPVOID)(pViewport->uViewportW - pViewport->uViewportY + 1); + v10 = (int)pSrc_x1y1; + v11 = (int)pDst_x1y1; + auto uHalfWidth = v20 = (pViewport->uViewportZ - pViewport->uViewportX) / 2; + v13 = v24; + + for (uint y = pViewport->uViewportY; y < pViewport->uViewportW; ++y) + memcpy(pDst + 640 * y + pViewport->uViewportX, + pSrc + 640 * y + pViewport->uViewportX, (pViewport->uViewportZ - pViewport->uViewportX) * sizeof(__int16)); + + ErrD3D(pRenderer->pBackBuffer4->Unlock(0)); + + /* while ( 1 ) + { + while ( 1 ) + { + v14 = *(int *)v10; + v10 += 4; + if ( v14 == v13 ) + break; + if ( (short)v14 == (short)v13 ) + { + *(int *)v11 = *(int *)v11 & 0xFFFF | v14 & 0xFFFF0000; + v11 += 4; + --uHalfWidth; + if ( !uHalfWidth ) + goto LABEL_21; + } + else + { + v15 = __ROL__(v14, 16); + if ( (short)v15 == (short)v13 ) + { + v17 = __ROR__(v15, 16); + *(int *)v11 = *(int *)v11 & 0xFFFF0000 | (unsigned __int16)v17; + v11 += 4; + --uHalfWidth; + if ( !uHalfWidth ) + goto LABEL_21; + } + else + { + v16 = __ROR__(v15, 16); + *(int *)v11 = v16; + v11 += 4; + --uHalfWidth; + if ( !uHalfWidth ) + goto LABEL_21; + } + } + } + v11 += 4; + --uHalfWidth; + if ( !uHalfWidth ) + { +LABEL_21: + v10 += v21; + v11 += v22; + uHalfWidth = v20; + if ( !--uNumLines ) + { + ErrD3D(pRenderer->pBackBuffer4->Unlock(0)); + return; + } + } + }*/ + } + } + } +} + + + +//----- (004A7063) -------------------------------------------------------- +int __thiscall sub_4A7063(unsigned int uDiffuse, float a2) +{ + float v2; // ST1C_4@1 + double v3; // ST14_8@1 + signed int v4; // ebx@1 + float v5; // ST1C_4@1 + double v6; // ST14_8@1 + signed int v7; // edi@1 + double v8; // ST0C_8@1 + signed int v9; // esi@1 + signed int v10; // ecx@1 + double v12; // [sp+8h] [bp-18h]@1 + unsigned __int64 v13; // [sp+18h] [bp-8h]@1 + + v2 = (double)(uDiffuse >> 24) * a2; + v3 = v2 + 6.7553994e15; + v4 = LODWORD(v3); + v5 = (double)((uDiffuse >> 16) & 0xFF) * a2; + v6 = v5 + 6.7553994e15; + v7 = LODWORD(v6); + *((float *)&v6 + 1) = (double)((unsigned __int16)uDiffuse >> 8) * a2; + v8 = *((float *)&v6 + 1) + 6.7553994e15; + v13 = __PAIR__(LODWORD(v6), LODWORD(v8)); + v9 = LODWORD(v8); + *((float *)&v6 + 1) = (double)(unsigned __int8)uDiffuse * a2; + v12 = *((float *)&v6 + 1) + 6.7553994e15; + v10 = LODWORD(v12); + if ( v4 > 255 ) + v4 = 255; + if ( v4 < 0 ) + v4 = 0; + if ( SHIDWORD(v13) > 255 ) + v7 = 255; + if ( v7 < 0 ) + v7 = 0; + if ( (signed int)v13 > 255 ) + v9 = 255; + if ( v9 < 0 ) + v9 = 0; + if ( SLODWORD(v12) > 255 ) + v10 = 255; + if ( v10 < 0 ) + v10 = 0; + return v10 | ((v9 | ((v7 | (v4 << 8)) << 8)) << 8); +} + + + + + +//----- (004AC1C9) -------------------------------------------------------- +int __thiscall sub_4AC1C9(unsigned int _this, Vec4_int_ *a2) +{ + unsigned int v2; // esi@1 + __int16 v3; // di@1 + signed int v4; // ebx@1 + int v5; // ecx@3 + Vec4_int_ *v6; // eax@10 + Vec4_int_ *v7; // esi@14 + int result; // eax@16 + char *v9; // esi@16 + Vec4_int_ a1; // [sp+Ch] [bp-34h]@10 + Vec4_int_ v11; // [sp+1Ch] [bp-24h]@14 + Vec4_int_ Dst; // [sp+2Ch] [bp-14h]@1 + int v13; // [sp+3Ch] [bp-4h]@1 + + v2 = _this; + v3 = sub_4382BC(_this); + v13 = sub_4383ED(); + v4 = 0; + memset(&Dst, 0, 0x10u); + if ( v3 < 0 ) + goto LABEL_19; + if ( (signed int)v2 > 0 ) + { + if ( (signed int)v2 > 150 ) + { + v5 = (int)a2; + } + else + { + v5 = 4000 * v2; + v4 = 1; + } + } + else + { + v5 = 4000 * dword_4F031C[(unsigned __int16)v3]; + } + if ( v13 & 0x10 && !v4 ) + { + if ( v2 ) + v6 = sub_4AC4FD_get_cpu_clocks_rdtsc(v5, &a1); + else + v6 = sub_4AC33A_get_cpu_clocks_QPC(v5, &a1); + goto LABEL_14; + } + if ( (unsigned __int16)v3 < 3u ) + { +LABEL_19: + v7 = &Dst; + goto LABEL_16; + } + v6 = sub_4AC277(v5, &a1); +LABEL_14: + v11.x = v6->x; + v11.y = v6->y; + v11.z = v6->z; + v11.w = v6->w; + v7 = &v11; +LABEL_16: + result = (int)a2; + a2->x = v7->x; + v9 = (char *)&v7->y; + a2->y = *(int *)v9; + v9 += 4; + a2->z = *(int *)v9; + a2->w = *((int *)v9 + 1); + return result; +} +// 4F031C: using guessed type int dword_4F031C[]; + +//----- (004AC277) -------------------------------------------------------- +Vec4_int_ *__thiscall sub_4AC277(unsigned int _this, Vec4_int_ *a2) +{ + __debugbreak(); + return 0; + /*signed int v2; // esi@1 + signed __int16 v4; // bx@3 + int v10; // esi@8 + int v11; // eax@10 + Vec4_int_ *result; // eax@13 + Vec4_int_ Dst; // [sp+8h] [bp-30h]@1 + LARGE_INTEGER Frequency; // [sp+18h] [bp-20h]@1 + LARGE_INTEGER PerformanceCount; // [sp+20h] [bp-18h]@3 + LARGE_INTEGER v16; // [sp+28h] [bp-10h]@5 + int v17; // [sp+30h] [bp-8h]@1 + int v18; // [sp+34h] [bp-4h]@2 + + v17 = _this; + v2 = -1; + memset(&Dst, 0, 0x10u); + if ( QueryPerformanceFrequency(&Frequency) ) + { + v18 = 10; + do + { + QueryPerformanceCounter(&PerformanceCount); + _EAX = -2147483648; + v4 = 4000; + do + { + __asm { bsf ecx, eax } + --v4; + } + while ( v4 ); + QueryPerformanceCounter(&v16); + if ( (signed int)v16.s.LowPart - (signed int)PerformanceCount.s.LowPart < (unsigned int)v2 ) + v2 = v16.s.LowPart - PerformanceCount.s.LowPart; + --v18; + } + while ( v18 ); + v10 = 100000 * v2 / (Frequency.s.LowPart / 0xA); + if ( v10 % Frequency.s.LowPart > Frequency.s.LowPart >> 1 ) + ++v10; + v11 = v17 / (unsigned int)v10; + Dst.z = v17 / (unsigned int)v10; + if ( v17 % (unsigned int)v10 > (unsigned int)v10 >> 1 ) + ++v11; + Dst.x = v17; + Dst.y = v10; + Dst.w = v11; + } + result = a2; + a2->x = Dst.x; + a2->y = Dst.y; + a2->z = Dst.z; + a2->w = Dst.w; + return result;*/ +} + +//----- (004AC33A) -------------------------------------------------------- +Vec4_int_ *__thiscall sub_4AC33A_get_cpu_clocks_QPC(int _this, Vec4_int_ *a1) +{ + __debugbreak(); + return 0; + /*int v2; // esi@1 + int v3; // ebx@1 + unsigned __int64 v4; // qax@4 + unsigned __int64 v5; // qax@7 + DWORD v6; // edi@7 + DWORD v7; // eax@7 + unsigned int v8; // ecx@10 + unsigned __int64 v9; // qax@10 + unsigned int v10; // edi@10 + int v11; // eax@14 + unsigned int v12; // ecx@19 + Vec4_int_ *result; // eax@24 + int Dst; // [sp+Ch] [bp-4Ch]@1 + int v15; // [sp+10h] [bp-48h]@23 + int v16; // [sp+14h] [bp-44h]@21 + int v17; // [sp+18h] [bp-40h]@21 + LARGE_INTEGER Frequency; // [sp+1Ch] [bp-3Ch]@1 + LARGE_INTEGER PerformanceCount; // [sp+24h] [bp-34h]@2 + LARGE_INTEGER v20; // [sp+2Ch] [bp-2Ch]@2 + int v21; // [sp+34h] [bp-24h]@2 + int v22; // [sp+38h] [bp-20h]@2 + int v23; // [sp+3Ch] [bp-1Ch]@4 + int v24; // [sp+40h] [bp-18h]@7 + int nPriority; // [sp+44h] [bp-14h]@2 + unsigned int v26; // [sp+48h] [bp-10h]@1 + unsigned int v27; // [sp+4Ch] [bp-Ch]@1 + HANDLE hThread; // [sp+50h] [bp-8h]@1 + int v29; // [sp+54h] [bp-4h]@1 + + v2 = 0; + v3 = 0; + v29 = 0; + v27 = 0; + v26 = 0; + hThread = GetCurrentThread(); + memset(&Dst, 0, 0x10u); + if ( QueryPerformanceFrequency(&Frequency) ) + { + do + { + ++v29; + v22 = v2; + v21 = v3; + QueryPerformanceCounter(&PerformanceCount); + v20 = PerformanceCount; + nPriority = GetThreadPriority(hThread); + if ( nPriority != 2147483647 ) + SetThreadPriority(hThread, 15); + while ( v20.s.LowPart - PerformanceCount.s.LowPart < 0x32 ) + { + QueryPerformanceCounter(&v20); + v4 = __rdtsc(); + v23 = v4; + } + PerformanceCount = v20; + do + { + QueryPerformanceCounter(&v20); + v5 = __rdtsc(); + v24 = v5; + v6 = v20.s.LowPart; + v7 = PerformanceCount.s.LowPart; + } + while ( v20.s.LowPart - PerformanceCount.s.LowPart < 0x3E8 ); + if ( nPriority != 2147483647 ) + { + SetThreadPriority(hThread, nPriority); + v7 = PerformanceCount.s.LowPart; + v6 = v20.s.LowPart; + } + v8 = v24 - v23; + v27 += v24 - v23; + v9 = (100000 * v6 - 100000 * v7) / (Frequency.s.LowPart / 0xA); + v10 = v9; + v26 += v9; + if ( v9 % Frequency.s.LowPart > Frequency.s.LowPart >> 1 ) + v10 = v9 + 1; + v3 = v8 / v10; + if ( v8 % v10 > v10 >> 1 ) + v3 = v8 / v10 + 1; + v2 = v21; + v11 = v3 + v22 + v21; + } + while ( v29 < 3 + || v29 < 20 + && ((unsigned int)(3 * v3 - v11) > 3 || (unsigned int)(3 * v21 - v11) > 3 || (unsigned int)(3 * v22 - v11) > 3) ); + v12 = 10 * v27 / v26; + if ( 100 * v27 / v26 - 10 * v12 >= 6 ) + ++v12; + v16 = v27 / v26; + v17 = v27 / v26; + if ( v12 - 10 * v27 / v26 >= 6 ) + v17 = v27 / v26 + 1; + v15 = v26; + Dst = v27; + } + result = a1; + a1->x = Dst; + a1->y = v15; + a1->z = v16; + a1->w = v17; + return result;*/ +} + +//----- (004AC4FD) -------------------------------------------------------- +Vec4_int_ *__thiscall sub_4AC4FD_get_cpu_clocks_rdtsc(int _this, Vec4_int_ *a1) +{ + __debugbreak(); + return 0; + /*int v2; // eax@1 + int v3; // eax@4 + bool v4; // eax@5 + unsigned __int64 v5; // kr00_8@8 + int v6; // edi@9 + int v7; // eax@9 + bool v8; // eax@10 + unsigned __int64 v9; // kr08_8@13 + unsigned int v10; // eax@15 + Vec4_int_ *result; // eax@17 + int Dst; // [sp+Ch] [bp-2Ch]@1 + int v13; // [sp+10h] [bp-28h]@17 + int v14; // [sp+14h] [bp-24h]@15 + int v15; // [sp+18h] [bp-20h]@17 + unsigned int v16; // [sp+1Ch] [bp-1Ch]@8 + unsigned int v17; // [sp+20h] [bp-18h]@8 + unsigned int v18; // [sp+24h] [bp-14h]@13 + int nPriority; // [sp+28h] [bp-10h]@1 + __int64 v20; // [sp+2Ch] [bp-Ch]@1 + int v21; // [sp+34h] [bp-4h]@3 + + HIDWORD(v20) = GetCurrentThread(); + memset(&Dst, 0, 0x10u); + v2 = GetThreadPriority(HIDWORD(v20)); + nPriority = v2; + if ( v2 != 0x7FFFFFFF ) + SetThreadPriority(HIDWORD(v20), v2 + 1); + __outbyte(0x70u, 0); + v21 = __inbyte(0x71u); + do + { + __outbyte(0x70u, 0); + LODWORD(v20) = __inbyte(0x71u); + v3 = v20 - v21; + if ( (signed int)v20 >= v21 ) + v4 = v3 > 0; + else + v4 = v3 + 10; + } + while ( !v4 ); + v5 = __rdtsc(); + v16 = HIDWORD(v5); + v17 = v5; + do + { + __outbyte(0x70u, 0); + v21 = __inbyte(0x71u); + v6 = v21; + v7 = v21 - v20; + if ( v21 >= (signed int)v20 ) + v8 = v7 > 0; + else + v8 = v7 + 10; + } + while ( !v8 ); + v9 = __rdtsc(); + v18 = HIDWORD(v9); + v21 = v9; + if ( nPriority != 0x7FFFFFFF ) + SetThreadPriority(HIDWORD(v20), nPriority); + nPriority = v21; + *(__int64 *)((char *)&v20 + 4) = __PAIR__(v18, v21) - __PAIR__(v16, v17); + Dst = HIDWORD(v20); + v10 = HIDWORD(v20) / 0xF4240; + v14 = HIDWORD(v20) / 0xF4240; + if ( HIDWORD(v20) / 0x186A0 - 10 * HIDWORD(v20) / 0xF4240 >= 6 ) + ++v10; + v15 = v10; + result = a1; + v13 = 1000000 * v6 - 1000000 * v20; + a1->x = Dst; + a1->y = v13; + a1->z = v14; + a1->w = v15; + return result;*/ +} + + + +//----- (004AD504) -------------------------------------------------------- +int __fastcall sub_4AD504(unsigned int uFaceID) +{ + int result; // eax@1 + unsigned int v2; // ebx@1 + BLVFace *v3; // esi@3 + Texture *v4; // edi@6 + int v5; // eax@7 + int v6; // edx@7 + int v7; // ecx@7 + int v8; // ebx@8 + int v9; // eax@8 + int v10; // ebx@8 + unsigned int v11; // ebx@9 + int v12; // esi@10 + int v13; // eax@13 + unsigned __int16 *v14; // eax@13 + unsigned int v15; // eax@14 + unsigned __int16 *v16; // ebx@14 + int v17; // eax@15 + int v18; // ebx@15 + int v19; // esi@15 + int v20; // ecx@15 + int v21; // eax@15 + stru193_math *v22; // ebx@15 + int v23; // eax@15 + char *v24; // esi@16 + int v25; // eax@18 + int v26; // eax@18 + int v27; // eax@20 + signed int v28; // esi@20 + signed int v29; // edx@20 + signed int v30; // esi@20 + signed int v31; // edi@20 + int v32; // esi@20 + int v33; // eax@26 + int *v34; // esi@27 + unsigned __int16 *v35; // edi@27 + unsigned int v36; // edx@27 + int v37; // ebx@27 + char v38; // cl@27 + char v39; // ch@27 + int v40; // ebx@29 + int v41; // edx@29 + unsigned int v42; // ebx@30 + int v43; // edx@30 + int v44; // eax@33 + int *v45; // esi@34 + unsigned __int16 *v46; // edi@34 + unsigned int v47; // edx@34 + int v48; // ebx@34 + char v49; // cl@34 + char v50; // ch@34 + int v51; // ebx@36 + int v52; // edx@36 + unsigned __int16 v53; // bx@37 + int v54; // edx@37 + int v55; // eax@40 + int v56; // eax@41 + int *v57; // esi@42 + unsigned __int16 *v58; // edi@42 + unsigned int v59; // edx@42 + int v60; // ebx@42 + char v61; // cl@42 + char v62; // ch@42 + unsigned int v63; // ebx@44 + int v64; // edx@44 + unsigned int v65; // ebx@44 + int v66; // edx@44 + unsigned int v67; // ebx@45 + int v68; // edx@45 + int v69; // ebx@45 + int v70; // edx@45 + int v71; // eax@48 + int *v72; // esi@49 + unsigned __int16 *v73; // edi@49 + unsigned int v74; // edx@49 + int v75; // ebx@49 + char v76; // cl@49 + char v77; // ch@49 + unsigned int v78; // ebx@51 + int v79; // edx@51 + unsigned int v80; // ebx@51 + int v81; // edx@51 + unsigned int v82; // ebx@52 + int v83; // edx@52 + int v84; // ebx@52 + int v85; // edx@52 + unsigned __int8 *v86; // [sp+Ch] [bp-98h]@9 + unsigned __int8 *v87; // [sp+10h] [bp-94h]@9 + unsigned __int8 *v88; // [sp+14h] [bp-90h]@9 + unsigned __int8 *v89; // [sp+18h] [bp-8Ch]@9 + int v90; // [sp+1Ch] [bp-88h]@20 + BLVFace *v91; // [sp+20h] [bp-84h]@3 + int v92; // [sp+24h] [bp-80h]@7 + int i; // [sp+28h] [bp-7Ch]@7 + unsigned __int16 *v94; // [sp+2Ch] [bp-78h]@9 + unsigned int v95; // [sp+30h] [bp-74h]@1 + Texture *v96; // [sp+34h] [bp-70h]@6 + int v97; // [sp+38h] [bp-6Ch]@15 + unsigned int v98; // [sp+3Ch] [bp-68h]@9 + int v99; // [sp+40h] [bp-64h]@9 + int v100; // [sp+44h] [bp-60h]@24 + int v101; // [sp+48h] [bp-5Ch]@10 + int v102; // [sp+4Ch] [bp-58h]@20 + int v103; // [sp+50h] [bp-54h]@20 + int v104; // [sp+54h] [bp-50h]@9 + unsigned __int8 *v105; // [sp+58h] [bp-4Ch]@20 + int v106; // [sp+5Ch] [bp-48h]@24 + int v107; // [sp+60h] [bp-44h]@20 + int v108; // [sp+64h] [bp-40h]@20 + int v109; // [sp+68h] [bp-3Ch]@20 + int v110; // [sp+6Ch] [bp-38h]@15 + int v111; // [sp+70h] [bp-34h]@20 + int a1; // [sp+74h] [bp-30h]@12 + int a2; // [sp+78h] [bp-2Ch]@9 + int *v114; // [sp+7Ch] [bp-28h]@16 + int v115; // [sp+80h] [bp-24h]@18 + int v116; // [sp+84h] [bp-20h]@7 + unsigned int v117; // [sp+88h] [bp-1Ch]@15 + unsigned int v118; // [sp+8Ch] [bp-18h]@24 + int *v119; // [sp+90h] [bp-14h]@13 + int v120; // [sp+94h] [bp-10h]@15 + unsigned int v121; // [sp+98h] [bp-Ch]@15 + unsigned __int16 *v122; // [sp+9Ch] [bp-8h]@15 + unsigned int v123; // [sp+A0h] [bp-4h]@13 + + result = pRenderer->uTargetSurfacePitch; + v2 = uFaceID; + v95 = pRenderer->uTargetSurfacePitch; + if ( (uFaceID & 0x80000000u) == 0 ) + { + if ( (signed int)uFaceID < (signed int)pIndoor->uNumFaces ) + { + v3 = &pIndoor->pFaces[uFaceID]; + v91 = &pIndoor->pFaces[uFaceID]; + if ( !pRenderer->pRenderD3D ) + { + result = sub_423B5D(uFaceID); + if ( result ) + { + result = sub_424829(result, &stru_F8A590, pBLVRenderParams->field_7C, v2); + if ( result ) + { + result = (int)v3->GetTexture(); + v4 = (Texture *)result; + v96 = (Texture *)result; + if ( result ) + { + v5 = *(short *)(result + 38); + LOBYTE(v3->uAttributes) |= 0x80u; + v92 = v5; + sub_4AE5F1(v2); + ++pBLVRenderParams->field_84; + v6 = stru_F8AD28.pDeltaUV[0]; + v116 = stru_F8AD28.pDeltaUV[1]; + v7 = 0; + for ( i = bUseLoResSprites; v7 < stru_F8AD28.field_AC; *(int *)v9 = v10 ) + { + v8 = v116; + stru_F8AD28._blv_lights_xs[v7] += v6; + v9 = 4 * v7 + 16297672; + v10 = v8 - stru_F8AD28._blv_lights_ys[v7++]; + } + v94 = sr_sub_47C24C_get_palette(v3, v92, 0, 1); + result = stru_F8A590._viewport_space_y; + a2 = stru_F8A590._viewport_space_y; + v11 = stru_F8A590._viewport_space_y * pRenderer->uTargetSurfacePitch; + v99 = 640 * stru_F8A590._viewport_space_y; + v86 = v4->pLevelOfDetail0; + v87 = v4->pLevelOfDetail1; + v88 = v4->pLevelOfDetail2; + v89 = v4->pLevelOfDetail3; + v98 = stru_F8A590._viewport_space_y * pRenderer->uTargetSurfacePitch; + v104 = 2 * pBLVRenderParams->field_0_timer_; + if ( stru_F8A590._viewport_space_y <= stru_F8A590.field_4 ) + { + v12 = 2 * stru_F8A590._viewport_space_y; + v101 = 2 * stru_F8A590._viewport_space_y; + while ( 1 ) + { + a1 = *(__int16 *)((char *)stru_F8A590.array_18 + v12); + sub_4AE313(a1, result, &stru_F81018.field_0); + if ( LOBYTE(viewparams->field_20) ) + { + v15 = v95 * (v12 - pBLVRenderParams->uViewportY); + v119 = &pBLVRenderParams->pTargetZBuffer[2 + * (*(__int16 *)((char *)stru_F8A590.array_18 + v12) + + 320 * (v12 - pBLVRenderParams->uViewportY)) + - pBLVRenderParams->uViewportX]; + v16 = &pBLVRenderParams->pRenderTarget[v15 + + 2 * *(__int16 *)((char *)stru_F8A590.array_18 + v12) + - pBLVRenderParams->uViewportX]; + v14 = &pBLVRenderParams->pRenderTarget[v15 + + 2 * *(__int16 *)((char *)stru_F8A590.array_3D8 + v12) + - pBLVRenderParams->uViewportX]; + v123 = (unsigned int)v16; + } + else + { + v13 = *(__int16 *)((char *)stru_F8A590.array_18 + v12); + v119 = &pBLVRenderParams->pTargetZBuffer[v13 + v99]; + v123 = (unsigned int)&pBLVRenderParams->pRenderTarget[v13 + v11]; + v14 = &pBLVRenderParams->pRenderTarget[v11 + *(__int16 *)((char *)stru_F8A590.array_3D8 + v12)]; + } + v117 = (unsigned int)v14; + HIWORD(v17) = HIWORD(stru_F81018.field_0.field_0); + v18 = stru_F81018.field_0.field_10; + LOWORD(v17) = 0; + v97 = stru_F8AD28.field_0 | v17; + v110 = sub_4AE491(SHIWORD(stru_F81018.field_0.field_4), SHIWORD(stru_F81018.field_0.field_8)); + v19 = stru_F81018.field_0.field_4 >> i; + v20 = 11 - v18; + v116 = stru_F81018.field_0.field_8 >> i; + v21 = stru_F81018.field_0.field_8 >> i >> (11 - v18); + v22 = stru_5C6E00; + v122 = (unsigned __int16 *)v20; + v121 = (stru_F81018.field_0.field_4 >> i) + 4 * stru_5C6E00->SinCos(v104 + v21); + v23 = stru_5C6E00->SinCos(v104 + (v19 >> (char)v122) - stru_5C6E00->uIntegerHalfPi); + v120 = v116 + 4 * v23; + if ( v123 < v117 ) + { + v24 = (char *)&stru_F81018.field_34.field_8; + v114 = &stru_F81018.field_34.field_8; + a1 += 16; + while ( 1 ) + { + sub_4AE313(a1, a2, (stru337_stru0 *)(v24 - 8)); + v25 = *((int *)v24 - 2); + LOWORD(v25) = 0; + v115 = v97; + v26 = stru_F8AD28.field_0 | v25; + if ( v97 <= (unsigned int)v26 ) + v115 = v26; + v97 = v26; + v27 = *((int *)v24 - 11); + v28 = *((int *)v24 - 1); + v105 = (&v86)[4 * v27]; + v111 = v27 + 16; + v29 = v4->uWidthMinus1; + v109 = v27 + v27 + 16 - v4->uWidthLn2; + v107 = v29 >> v27; + v30 = v28 >> i; + v102 = v4->uHeightMinus1 >> v27 << (v27 + 16); + v31 = *v114 >> i; + v122 = (unsigned __int16 *)(11 - v27); + v116 = v30 + 4 * stru_5C6E00->SinCos(v104 + (v31 >> (11 - v27))); + v90 = v31 + 4 * stru_5C6E00->SinCos(v104 + (v30 >> (char)v122) - stru_5C6E00->uIntegerHalfPi); + v108 = (signed int)(v116 - v121) >> 4; + v103 = (v90 - v120) >> 4; + v32 = v123 + 32; + if ( LOBYTE(viewparams->field_20) ) + v32 = v123 + 64; + if ( v32 > v117 ) + v32 = v117; + v118 = v32; + v100 = sub_4AE491(*((short *)v114 - 1), *((short *)v114 + 1)); + v106 = (signed int)(v32 - v123) >> 1; + if ( v110 >> 16 == v100 >> 16 ) + { + v122 = sr_sub_47C24C_get_palette(v91, v92, v110 >> 16, 1); + if ( LOBYTE(viewparams->field_20) ) + { + v44 = v123; + if ( v123 < v118 ) + { + v45 = v119; + v46 = v122; + v47 = v121; + v48 = v120; + v49 = v111; + v50 = v109; + if ( v106 & 2 ) + { + *v119 = v115; + v45 -= 2; + v44 = v123 + 4; + goto LABEL_37; + } + do + { + v44 += 8; + v51 = *(&v105[v107 & (v47 >> v49)] + ((v102 & (unsigned int)v48) >> v50)); + v52 = v115; + LOWORD(v51) = v46[v51]; + *v45 = v115; + v45[1] = v52; + v45[640] = v52; + v45[641] = v52; + *(short *)(v44 - 8) = v51; + *(short *)(v44 - 6) = v51; + *(short *)(v44 + 1272) = v51; + *(short *)(v44 + 1274) = v51; + v45[2] = v52; + v45[3] = v52; + v45[642] = v52; + v45[643] = v52; + v121 += v108; + v120 += v103; + v47 = v121; + v48 = v120; +LABEL_37: + v45 += 4; + v53 = v46[*(&v105[v107 & (v47 >> v49)] + ((v102 & (unsigned int)v48) >> v50))]; + v54 = v108; + *(short *)(v44 - 4) = v53; + *(short *)(v44 - 2) = v53; + *(short *)(v44 + 1276) = v53; + *(short *)(v44 + 1278) = v53; + v121 += v54; + v120 += v103; + v47 = v121; + v48 = v120; + } + while ( v44 < v118 ); + v123 = v44; + v119 = v45; + } + } + else + { + v33 = v123; + if ( v123 < v118 ) + { + v34 = v119; + v35 = v122; + v36 = v121; + v37 = v120; + v38 = v111; + v39 = v109; + if ( v106 & 1 ) + { + *v119 = v115; + --v34; + v33 = v123 + 2; + goto LABEL_30; + } + do + { + v33 += 4; + v40 = *(&v105[v107 & (v36 >> v38)] + ((v102 & (unsigned int)v37) >> v39)); + v41 = v115; + LOWORD(v40) = v35[v40]; + *v34 = v115; + *(short *)(v33 - 4) = v40; + v34[1] = v41; + v121 += v108; + v120 += v103; + v36 = v121; + v37 = v120; +LABEL_30: + v42 = (unsigned int)(&v105[v107 & (v36 >> v38)] + ((v102 & (unsigned int)v37) >> v39)); + v34 += 2; + v43 = v108; + *(short *)(v33 - 2) = v35[*(char *)v42]; + v121 += v43; + v120 += v103; + v36 = v121; + v37 = v120; + } + while ( v33 < v118 ); + v123 = v33; + v119 = v34; + } + } + } + else + { + v55 = v110 - ((v100 - v110) >> 4); + v110 = (v100 - v110) >> 4; + v122 = (unsigned __int16 *)v55; + if ( LOBYTE(viewparams->field_20) ) + { + v71 = v123; + if ( v123 < v118 ) + { + v72 = v119; + v73 = v94; + v74 = v121; + v75 = v120; + v76 = v111; + v77 = v109; + if ( v106 & 2 ) + { + *v119 = v115; + v72 += 2; + v71 = v123 + 4; + goto LABEL_52; + } + do + { + v78 = (v107 & (v74 >> v76)) + ((v102 & (unsigned int)v75) >> v77); + v79 = (int)((char *)v122 + v110); + v71 += 8; + v122 = (unsigned __int16 *)v79; + v80 = ((v79 & 0xFFFF0000u) >> 8) + v105[v78]; + v81 = v115; + LOWORD(v80) = v73[v80]; + *v72 = v115; + v72[1] = v81; + v72[640] = v81; + v72[641] = v81; + *(short *)(v71 - 8) = v80; + *(short *)(v71 - 6) = v80; + *(short *)(v71 + 1272) = v80; + *(short *)(v71 + 1274) = v80; + v72[2] = v81; + v72[3] = v81; + v72[642] = v81; + v72[643] = v81; + v121 += v108; + v120 += v103; + v74 = v121; + v75 = v120; + v72 += 4; +LABEL_52: + v82 = (v107 & (v74 >> v76)) + ((v102 & (unsigned int)v75) >> v77); + v83 = (int)((char *)v122 + v110); + v84 = v105[v82]; + v122 = (unsigned __int16 *)v83; + LOWORD(v84) = v73[((v83 & 0xFFFF0000u) >> 8) + v84]; + v85 = v108; + *(short *)(v71 - 4) = v84; + *(short *)(v71 - 2) = v84; + *(short *)(v71 + 1276) = v84; + *(short *)(v71 + 1278) = v84; + v121 += v85; + v120 += v103; + v74 = v121; + v75 = v120; + } + while ( v71 < v118 ); + v123 = v71; + v119 = v72; + } + } + else + { + v56 = v123; + if ( v123 < v118 ) + { + v57 = v119; + v58 = v94; + v59 = v121; + v60 = v120; + v61 = v111; + v62 = v109; + if ( v106 & 1 ) + { + *v119 = v115; + ++v57; + v56 = v123 + 2; + goto LABEL_45; + } + do + { + v63 = (v107 & (v59 >> v61)) + ((v102 & (unsigned int)v60) >> v62); + v64 = (int)((char *)v122 + v110); + v56 += 4; + v122 = (unsigned __int16 *)v64; + v65 = ((v64 & 0xFFFF0000u) >> 8) + v105[v63]; + v66 = v115; + LOWORD(v65) = v58[v65]; + *v57 = v115; + *(short *)(v56 - 4) = v65; + v57[1] = v66; + v121 += v108; + v120 += v103; + v59 = v121; + v60 = v120; + v57 += 2; +LABEL_45: + v67 = (v107 & (v59 >> v61)) + ((v102 & (unsigned int)v60) >> v62); + v68 = (int)((char *)v122 + v110); + v69 = v105[v67]; + v122 = (unsigned __int16 *)v68; + LOWORD(v69) = v58[((v68 & 0xFFFF0000u) >> 8) + v69]; + v70 = v108; + *(short *)(v56 - 2) = v69; + v121 += v70; + v120 += v103; + v59 = v121; + v60 = v120; + } + while ( v56 < v118 ); + v123 = v56; + v119 = v57; + } + } + } + v114 += 13; + v110 = v100; + a1 += 16; + v4 = v96; + v121 = v116; + v120 = v90; + if ( v123 >= v117 ) + break; + v24 = (char *)v114; + v22 = stru_5C6E00; + } + } + ++a2; + v98 += v95; + result = a2; + v101 += 2; + v99 += 640; + if ( a2 > stru_F8A590.field_4 ) + break; + v12 = v101; + result = a2; + v11 = v98; + } + } + } + } + } + } + } + } + return result; +} +// 4AE491: using guessed type int __fastcall sub_4AE491(int, int); + +//----- (004ADD1D) -------------------------------------------------------- +void __fastcall sub_4ADD1D(int uFaceID) +{ + int v1; // edi@1 + BLVFace *v2; // esi@3 + signed int v3; // ebx@4 + Texture *v4; // edi@9 + signed int v5; // eax@9 + char *v6; // edi@12 + signed int v7; // eax@15 + unsigned int v8; // eax@16 + __int16 v9; // cx@19 + unsigned __int8 *v10; // eax@19 + unsigned __int16 *v11; // eax@19 + int v12; // edi@19 + int v13; // ebx@20 + stru352 *v14; // esi@20 + DWORD v15; // eax@22 + signed int v16; // ecx@22 + signed int v17; // ST68_4@22 + int v18; // eax@22 + int v19; // ecx@22 + unsigned int v20; // esi@23 + int v21; // edi@23 + int v22; // eax@23 + int *v23; // ebx@24 + int v24; // edx@24 + int v25; // ebx@25 + unsigned __int16 v26; // cx@25 + int v27; // edx@26 + unsigned __int16 v28; // cx@26 + unsigned __int8 v29; // sf@27 + unsigned __int8 v30; // of@27 + unsigned int v31; // esi@29 + int v32; // edi@29 + unsigned __int16 *v33; // eax@29 + int *v34; // ebx@30 + int v35; // edx@30 + int v36; // ebx@31 + unsigned __int16 v37; // cx@31 + int v38; // edx@32 + unsigned __int16 v39; // cx@32 + Texture *v40; // [sp-10h] [bp-6Ch]@16 + int v41; // [sp-Ch] [bp-68h]@15 + unsigned int v42; // [sp+10h] [bp-4Ch]@1 + signed int v43; // [sp+14h] [bp-48h]@12 + signed int v44; // [sp+14h] [bp-48h]@22 + int v45; // [sp+1Ch] [bp-40h]@22 + int v46; // [sp+20h] [bp-3Ch]@22 + int v47; // [sp+24h] [bp-38h]@19 + char v48; // [sp+28h] [bp-34h]@19 + int v49; // [sp+2Ch] [bp-30h]@19 + unsigned __int8 *v50; // [sp+30h] [bp-2Ch]@19 + unsigned __int16 *v51; // [sp+34h] [bp-28h]@19 + int v52; // [sp+38h] [bp-24h]@22 + int v53; // [sp+3Ch] [bp-20h]@22 + signed int v54; // [sp+40h] [bp-1Ch]@12 + int v55; // [sp+40h] [bp-1Ch]@20 + int v56; // [sp+44h] [bp-18h]@20 + stru352 *i; // [sp+48h] [bp-14h]@20 + unsigned __int16 *v58; // [sp+4Ch] [bp-10h]@23 + int v59; // [sp+50h] [bp-Ch]@4 + int v60; // [sp+50h] [bp-Ch]@19 + int v61; // [sp+54h] [bp-8h]@22 + int *v62; // [sp+58h] [bp-4h]@23 + int *v63; // [sp+58h] [bp-4h]@29 + + v1 = uFaceID; + v42 = pRenderer->uTargetSurfacePitch; + if ( uFaceID >= 0 && uFaceID < (signed int)pIndoor->uNumFaces ) + { + v2 = &pIndoor->pFaces[uFaceID]; + if ( pRenderer->pRenderD3D ) + { + v3 = sub_424579(uFaceID, &stru_F8AD28); + v59 = v3; + } + else + { + v59 = sub_423B5D(uFaceID); + v3 = v59; + } + if ( v3 && (pRenderer->pRenderD3D || sub_424829(v3, &stru_F8A590, pBLVRenderParams->field_7C, v1)) ) + { + v4 = v2->GetTexture(); + v5 = 0; + if ( v4 ) + { + if ( pRenderer->pRenderD3D ) + { + if ( v3 > 0 ) + { + v54 = v3; + v43 = v3; + v6 = (char *)&array_507D30[0].v; + do + { + *((float *)v6 - 1) = (double)((GetTickCount() >> 5) - pBLVRenderParams->vPartyPos.x) + *((float *)v6 - 1); + *(float *)v6 = (double)(pBLVRenderParams->vPartyPos.y + (GetTickCount() >> 5)) + *(float *)v6; + v6 += 48; + --v54; + } + while ( v54 ); + v3 = v59; + v5 = v43; + } + v7 = v5; + v41 = stru_F8AD28.field_0; + array_507D30[v7].u = array_507D30[v7].u * 0.25; + array_507D30[v7].v = array_507D30[v7].v * 0.25; + if ( BYTE1(v2->uAttributes) & 0x40 ) + { + v40 = v2->GetTexture(); + v8 = pTextureFrameTable->GetFrameTexture(v2->uBitmapID, pBLVRenderParams->field_0_timer_); + } + else + { + v40 = v2->GetTexture(); + v8 = v2->uBitmapID; + } + pRenderer->DrawIndoorPolygon(v3, v2, pBitmaps_LOD->pHardwareTextures[v8], v40, v41, -1, 0); + } + else + { + v49 = v4->uWidthMinus1; + v47 = v4->uHeightMinus1 << 16; + v9 = 16 - v4->uWidthLn2; + v10 = v4->pLevelOfDetail0; + LOBYTE(v2->uAttributes) |= 0x80u; + v48 = v9; + v50 = v10; + sub_4AF412(); + ++pBLVRenderParams->field_80; + v11 = sr_sub_47C24C_get_palette(v2, HIWORD(v4->palette), 0, 1); + v12 = stru_F8A590._viewport_space_y; + v51 = v11; + v60 = stru_F8A590._viewport_space_y; + if ( stru_F8A590._viewport_space_y <= stru_F8A590.field_4 ) + { + v13 = 2 * stru_F8A590._viewport_space_y; + v14 = &stru_F83B80[stru_F8A590._viewport_space_y]; + v55 = 2 * stru_F8A590._viewport_space_y; + v56 = 640 * stru_F8A590._viewport_space_y; + for ( i = &stru_F83B80[stru_F8A590._viewport_space_y]; ; v14 = i ) + { + sub_4AE1E7(v12, *(__int16 *)((char *)stru_F8A590.array_18 + v13), v12); + v14->field_0 += (GetTickCount() << 11) - (pBLVRenderParams->vPartyPos.x << 16); + v15 = GetTickCount(); + v16 = v14->field_0; + v14->field_4 += (32 * pBLVRenderParams->vPartyPos.y + v15) << 11; + v45 = v14->field_4 >> 3; + v44 = v16 >> 3; + v17 = (signed int)((unsigned __int64)(SLODWORD(pBLVRenderParams->field_44) * (signed __int64)v14->field_28) >> 16) >> 3; + v52 = (unsigned __int64)(v17 * (signed __int64)-pBLVRenderParams->sSineY) >> 16; + v53 = (unsigned __int64)(v17 * (signed __int64)pBLVRenderParams->sCosineY) >> 16; + v18 = v14->field_28; + v19 = *(__int16 *)((char *)stru_F8A590.array_18 + v13); + LOWORD(v18) = 0; + v46 = stru_F8AD28.field_0 | v18; + v61 = *(__int16 *)((char *)stru_F8A590.array_3D8 + v13) - v19; + if ( LOBYTE(viewparams->field_20) ) + { + v63 = &pBLVRenderParams->pTargetZBuffer[2 * (v19 + 320 * (v13 - pBLVRenderParams->uViewportY)) + - pBLVRenderParams->uViewportX]; + v31 = v44; + v32 = v45; + v33 = &pBLVRenderParams->pRenderTarget[v42 * (v13 - pBLVRenderParams->uViewportY) + + 2 * v19 + - pBLVRenderParams->uViewportX]; + if ( v61 & 1 ) + { + --v61; + v33 = &pBLVRenderParams->pRenderTarget[v42 * (v13 - pBLVRenderParams->uViewportY) + + 2 * v19 + - pBLVRenderParams->uViewportX + - 2]; + v34 = &pBLVRenderParams->pTargetZBuffer[2 * (v19 + 320 * (v13 - pBLVRenderParams->uViewportY)) + - pBLVRenderParams->uViewportX]; + v35 = v46; + v63 += 2; + goto LABEL_32; + } + while ( 1 ) + { + v30 = __OFSUB__(v61, 2); + v29 = v61 - 2 < 0; + v61 -= 2; + if ( v29 ^ v30 ) + break; + v36 = *(&v50[v49 & (v31 >> 16)] + ((v47 & (unsigned int)v32) >> v48)); + v31 += v52; + v37 = v51[v36]; + v32 += v53; + v34 = v63; + v35 = v46; + *v33 = v37; + v33[1] = v37; + v33[640] = v37; + v33[641] = v37; + v63 += 4; + v34[2] = v46; + v34[3] = v46; + v34[642] = v46; + v34[643] = v46; +LABEL_32: + *v34 = v35; + v34[1] = v35; + v34[640] = v35; + v34[641] = v35; + v38 = v49 & (v31 >> 16); + v33 += 4; + v31 += v52; + v39 = v51[*(&v50[v38] + ((v47 & (unsigned int)v32) >> v48))]; + v32 += v53; + *(v33 - 2) = v39; + *(v33 - 1) = v39; + v33[638] = v39; + v33[639] = v39; + } + } + else + { + v58 = &pBLVRenderParams->pRenderTarget[v19 + v12 * pRenderer->uTargetSurfacePitch]; + v62 = &pBLVRenderParams->pTargetZBuffer[v56 + v19]; + v20 = v44; + v21 = v45; + v22 = (int)v58; + if ( v61 & 1 ) + { + --v61; + v22 = (int)(v58 - 1); + v23 = &pBLVRenderParams->pTargetZBuffer[v56 + v19]; + v24 = v46; + ++v62; + goto LABEL_26; + } + while ( 1 ) + { + v30 = __OFSUB__(v61, 2); + v29 = v61 - 2 < 0; + v61 -= 2; + if ( v29 ^ v30 ) + break; + v25 = *(&v50[v49 & (v20 >> 16)] + ((v47 & (unsigned int)v21) >> v48)); + v20 += v52; + v26 = v51[v25]; + v21 += v53; + v23 = v62; + v24 = v46; + *(short *)v22 = v26; + v62 += 2; + v23[1] = v46; +LABEL_26: + *v23 = v24; + v27 = v49 & (v20 >> 16); + v22 += 4; + v20 += v52; + v28 = v51[*(&v50[v27] + ((v47 & (unsigned int)v21) >> v48))]; + v21 += v53; + *(short *)(v22 - 2) = v28; + } + } + ++v60; + ++i; + v56 += 640; + v55 += 2; + if ( v60 > stru_F8A590.field_4 ) + break; + v13 = v55; + v12 = v60; + } + } + } + } + } + } +} + +//----- (004AE1E7) -------------------------------------------------------- +int __fastcall sub_4AE1E7(int a1, int a2, int a3) +{ + int v3; // ebx@1 + int v4; // edi@1 + int v5; // esi@1 + signed __int64 v6; // qtt@3 + int v7; // esi@3 + int v8; // eax@5 + int result; // eax@5 + int v10; // edx@5 + int v11; // [sp+Ch] [bp-8h]@1 + int v12; // [sp+1Ch] [bp+8h]@2 + + v3 = pBLVRenderParams->uViewportCenterY - a3; + v4 = pBLVRenderParams->uViewportCenterX - a2; + v11 = a1; + v5 = (pBLVRenderParams->uViewportCenterY - a3) * stru_F8AD28.vec_80.y + + stru_F8AD28.field_7C + + (pBLVRenderParams->uViewportCenterX - a2) * stru_F8AD28.vec_80.x; + if ( v5 && (v12 = abs(stru_F8AD28.vec_80.z) >> 14, v12 <= abs(v5)) ) + { + LODWORD(v6) = stru_F8AD28.vec_80.z << 16; + HIDWORD(v6) = stru_F8AD28.vec_80.z >> 16; + v7 = v6 / (v3 * stru_F8AD28.vec_80.y + stru_F8AD28.field_7C + v4 * stru_F8AD28.vec_80.x); + } + else + { + v7 = 1073741824; + } + v8 = stru_F8AD28.vec_9C.z; + stru_F83B80[v11].field_0 = ((unsigned __int64)((v3 * stru_F8AD28.vec_8C.z + + stru_F8AD28.vec_8C.x + + v4 * stru_F8AD28.vec_8C.y) + * (signed __int64)v7) >> 16) + + stru_F8AD28.field_98; + result = (unsigned __int64)((v3 * v8 + stru_F8AD28.vec_9C.x + v4 * stru_F8AD28.vec_9C.y) * (signed __int64)v7) >> 16; + v10 = result + stru_F8AD28.field_A8; + stru_F83B80[v11].field_28 = v7; + stru_F83B80[v11].field_4 = v10; + return result; +} + +//----- (004AE313) -------------------------------------------------------- +int __fastcall sub_4AE313(int viewport_space_x, int viewport_space_y, stru337_stru0 *p) +{ + int _dy; // ebx@1 + int _dx; // edi@1 + int v5; // ecx@1 + int v6; // esi@1 + int v7; // ST18_4@2 + signed __int64 v8; // qtt@3 + unsigned int v9; // ecx@3 + int result; // eax@8 + int v11; // [sp+Ch] [bp-8h]@1 + + _dy = pBLVRenderParams->uViewportCenterY - viewport_space_y; + _dx = pBLVRenderParams->uViewportCenterX - viewport_space_x; + ++pBLVRenderParams->field_88; + v5 = (pBLVRenderParams->uViewportCenterY - viewport_space_y) * stru_F8AD28.vec_80.y + stru_F8AD28.field_7C; + v6 = v5 + _dx * stru_F8AD28.vec_80.x; + v11 = v5 + _dx * stru_F8AD28.vec_80.x; + if ( v5 + _dx * stru_F8AD28.vec_80.x && (v7 = abs(stru_F8AD28.vec_80.z) >> 14, v7 <= abs(v6)) ) + { + LODWORD(v8) = stru_F8AD28.vec_80.z << 16; + HIDWORD(v8) = stru_F8AD28.vec_80.z >> 16; + v9 = v8 / v11; + } + else + { + v9 = 0x40000000u; + } + if ( (signed int)v9 >= stru_F8AD28.field_34 ) + p->field_0 = v9; + else + p->field_0 = stru_F8AD28.field_34; + p->field_4 = ((unsigned __int64)((_dy * stru_F8AD28.vec_8C.z + stru_F8AD28.vec_8C.x + _dx * stru_F8AD28.vec_8C.y) + * (signed __int64)(signed int)v9) >> 16) + + stru_F8AD28.field_98 + + (stru_F8AD28.pDeltaUV[0] << 16); + p->field_8 = ((unsigned __int64)((_dy * stru_F8AD28.vec_9C.z + stru_F8AD28.vec_9C.x + _dx * stru_F8AD28.vec_9C.y) + * (signed __int64)(signed int)v9) >> 16) + + stru_F8AD28.field_A8 + + (stru_F8AD28.pDeltaUV[1] << 16); + result = abs((__int64)(SLODWORD(pBLVRenderParams->field_44) * (signed __int64)(signed int)v9) >> 16); + if ( result < 369620 || bUseLoResSprites ) + { + if ( result < 184810 ) + p->field_10 = result > 92405; + else + p->field_10 = 2; + } + else + { + p->field_10 = 3; + } + return result; +} + +//----- (004AE491) -------------------------------------------------------- +int __fastcall sub_4AE491(signed int a1, signed int a2) +{ + signed int v2; // eax@1 + signed int v3; // edi@1 + int v4; // ecx@1 + int v5; // esi@2 + int v6; // eax@2 + int v7; // ebx@2 + unsigned int v8; // ecx@2 + int v9; // edx@5 + int v10; // edx@7 + unsigned int v11; // eax@8 + int v13; // [sp+4h] [bp-18h]@2 + int v14; // [sp+8h] [bp-14h]@2 + signed int v15; // [sp+Ch] [bp-10h]@1 + int v16; // [sp+14h] [bp-8h]@1 + int v17; // [sp+18h] [bp-4h]@1 + + v2 = a1 >> SLOBYTE(stru_F8AD28.field_38); + v3 = a2 >> SLOBYTE(stru_F8AD28.field_38); + v17 = stru_F8AD28.field_2C; + v4 = 0; + v15 = v2; + v16 = 0; + if ( stru_F8AD28.field_AC > 0 ) + { + do + { + v5 = v16; + v13 = abs(v2 - stru_F8AD28._blv_lights_xs[v16]); + v14 = abs(v3 - stru_F8AD28._blv_lights_ys[v16]); + v6 = stru_F8AD28._blv_lights_light_dot_faces[v16]; + v7 = v13; + v8 = v14; + if ( v6 < v13 ) + { + v6 = v13; + v7 = stru_F8AD28._blv_lights_light_dot_faces[v16]; + } + if ( v6 < v14 ) + { + v9 = v6; + v6 = v14; + v8 = v9; + } + if ( v7 < (signed int)v8 ) + { + v10 = v8; + v8 = v7; + v7 = v10; + } + v11 = ((unsigned int)(11 * v7) >> 5) + (v8 >> 2) + v6; + if ( (signed int)v11 < stru_F8AD28._blv_lights_radii[v5] ) + v17 += 30 * (v11 * stru_F8AD28._blv_lights_inv_radii[v5] - 65536); + ++v16; + v2 = v15; + } + while ( v16 < stru_F8AD28.field_AC ); + v4 = 0; + } + if ( stru_F8AD28.field_3E4 != v4 ) + v17 -= stru_F8AD28.field_3E8 * (v2 - stru_F8AD28.field_3F0) + stru_F8AD28.field_3EC * (v3 - stru_F8AD28.field_3F4); + if ( v17 >= v4 ) + { + if ( v17 > 2031616 ) + v17 = 2031616; + } + else + { + v17 = v4; + } + ++pBLVRenderParams->field_8C; + return v17; +} +// 4AE491: using guessed type int __fastcall sub_4AE491(int, int); + + + + +//----- (004AE5F1) -------------------------------------------------------- +void __fastcall sub_4AE5F1(unsigned int uFaceID) +{ + BLVFace *v1; // esi@1 + BLVFaceExtra *v2; // ebx@1 + int v3; // eax@1 + int v4; // edi@1 + Texture *v5; // edi@1 + int v6; // eax@1 + unsigned int v7; // eax@1 + unsigned int v8; // ecx@1 + unsigned int v9; // eax@1 + unsigned int v10; // ecx@5 + int v11; // edi@10 + int v12; // ecx@10 + int v13; // eax@10 + int v14; // edx@10 + int v15; // ebx@12 + double v16; // st7@16 + int v17; // eax@16 + char *v18; // ebx@17 + int v19; // ecx@19 + int v20; // eax@19 + int v21; // edx@21 + int v22; // eax@23 + int v23; // ST04_4@26 + int v24; // edi@26 + double v25; // st6@26 + int v26; // eax@26 + double v27; // st6@26 + int v28; // ecx@26 + char v29; // al@26 + int v30; // edx@28 + int v31; // ecx@28 + BLVLightMM7 *v32; // ecx@32 + int v33; // edi@33 + int v34; // edx@33 + int v35; // eax@33 + int v36; // edi@35 + int v37; // edx@37 + int v38; // ebx@39 + int v39; // edi@42 + int v40; // eax@42 + char *v41; // ebx@45 + signed int v42; // ecx@47 + int v43; // edi@47 + int v44; // eax@49 + int v45; // edx@51 + int v46; // eax@53 + int v47; // ST04_4@55 + int v48; // edi@55 + double v49; // st6@55 + int v50; // eax@55 + double v51; // st6@55 + int v52; // eax@55 + int v53; // ecx@57 + int v54; // ecx@58 + int v55; // ecx@59 + int v56; // edx@62 + int v57; // ecx@62 + int v58; // eax@63 + int v59; // edx@64 + int v60; // ecx@67 + int v61; // edx@67 + int v62; // eax@68 + int v63; // edx@69 + signed int v64; // ecx@72 + double v65; // st7@75 + Vec3_int_ v66; // [sp+Ch] [bp-34h]@9 + Vec3_int_ v67; // [sp+18h] [bp-28h]@9 + BLVFaceExtra *v68; // [sp+24h] [bp-1Ch]@1 + int v69; // [sp+28h] [bp-18h]@10 + int v70; // [sp+2Ch] [bp-14h]@10 + int X; // [sp+30h] [bp-10h]@10 + int v72; // [sp+34h] [bp-Ch]@10 + int v73; // [sp+38h] [bp-8h]@10 + int v74; // [sp+3Ch] [bp-4h]@10 + + v1 = &pIndoor->pFaces[uFaceID]; + v2 = &pIndoor->pFaceExtras[v1->uFaceExtraID]; + v3 = v1->uBitmapID; + v4 = v1->uBitmapID; + v68 = v2; + v5 = (Texture *)(v4 != -1 ? (int)&pBitmaps_LOD->pTextures[v3] : 0); + v6 = 8 * uFaceID; + LOBYTE(v6) = 8 * uFaceID | 6; + stru_F8AD28.field_0 = v6; + stru_F8AD28.plane_4.vNormal.x = v1->pFacePlane_old.vNormal.x; + stru_F8AD28.plane_4.vNormal.y = v1->pFacePlane_old.vNormal.y; + stru_F8AD28.plane_4.vNormal.z = v1->pFacePlane_old.vNormal.z; + stru_F8AD28.plane_4.dist = v1->pFacePlane_old.dist; + stru_F8AD28.pDeltaUV[0] = v2->sTextureDeltaU; + stru_F8AD28.pDeltaUV[1] = v2->sTextureDeltaV; + v7 = GetTickCount(); + v8 = v1->uAttributes; + v9 = v7 >> 3; + if ( v8 & 4 ) + { + stru_F8AD28.pDeltaUV[1] -= v9 & v5->uHeightMinus1; + } + else + { + if ( v8 & 0x20 ) + stru_F8AD28.pDeltaUV[1] += v9 & v5->uHeightMinus1; + } + v10 = v1->uAttributes; + if ( BYTE1(v10) & 8 ) + { + stru_F8AD28.pDeltaUV[0] -= v9 & v5->uWidthMinus1; + } + else + { + if ( v10 & 0x40 ) + stru_F8AD28.pDeltaUV[0] += v9 & v5->uWidthMinus1; + } + v1->_get_normals(&v67, &v66); + stru_F8AD28.vec_14.x = v67.x; + stru_F8AD28.vec_14.y = v67.y; + stru_F8AD28.vec_14.z = v67.z; + stru_F8AD28.vec_20.x = v66.x; + stru_F8AD28.vec_20.y = v66.y; + stru_F8AD28.vec_20.z = v66.z; + stru_F8AD28.field_3F8 = v2->field_22; + if ( pBLVRenderParams->sPartyRotX ) + { + v74 = (unsigned __int64)(stru_F8AD28.plane_4.vNormal.y * (signed __int64)pBLVRenderParams->sSineY) >> 16; + v74 = ((unsigned __int64)(stru_F8AD28.plane_4.vNormal.x * (signed __int64)pBLVRenderParams->sCosineY) >> 16) - v74; + X = (unsigned __int64)(stru_F8AD28.plane_4.vNormal.z * (signed __int64)pBLVRenderParams->sSineNegX) >> 16; + stru_F8AD28.rotated_normal.x = ((unsigned __int64)(v74 * (signed __int64)pBLVRenderParams->sCosineNegX) >> 16) - X; + stru_F8AD28.rotated_normal.y = ((unsigned __int64)(stru_F8AD28.plane_4.vNormal.x + * (signed __int64)pBLVRenderParams->sSineY) >> 16) + + ((unsigned __int64)(stru_F8AD28.plane_4.vNormal.y + * (signed __int64)pBLVRenderParams->sCosineY) >> 16); + stru_F8AD28.rotated_normal.z = ((unsigned __int64)(v74 * (signed __int64)pBLVRenderParams->sSineNegX) >> 16) + + ((unsigned __int64)(stru_F8AD28.plane_4.vNormal.z + * (signed __int64)pBLVRenderParams->sCosineNegX) >> 16); + v70 = (unsigned __int64)(stru_F8AD28.vec_14.y * (signed __int64)pBLVRenderParams->sSineY) >> 16; + v74 = ((unsigned __int64)(stru_F8AD28.vec_14.x * (signed __int64)pBLVRenderParams->sCosineY) >> 16) - v70; + v70 = (unsigned __int64)(stru_F8AD28.vec_14.z * (signed __int64)pBLVRenderParams->sSineNegX) >> 16; + stru_F8AD28.vec_60.y = ((unsigned __int64)(v74 * (signed __int64)pBLVRenderParams->sCosineNegX) >> 16) - v70; + stru_F8AD28.vec_60.z = ((unsigned __int64)(stru_F8AD28.vec_14.x * (signed __int64)pBLVRenderParams->sSineY) >> 16) + + ((unsigned __int64)(stru_F8AD28.vec_14.y * (signed __int64)pBLVRenderParams->sCosineY) >> 16); + stru_F8AD28.field_6C = ((unsigned __int64)(v74 * (signed __int64)pBLVRenderParams->sSineNegX) >> 16) + + ((unsigned __int64)(stru_F8AD28.vec_14.z * (signed __int64)pBLVRenderParams->sCosineNegX) >> 16); + v70 = (unsigned __int64)(stru_F8AD28.vec_20.y * (signed __int64)pBLVRenderParams->sSineY) >> 16; + v74 = ((unsigned __int64)(stru_F8AD28.vec_20.x * (signed __int64)pBLVRenderParams->sCosineY) >> 16) - v70; + X = (unsigned __int64)(stru_F8AD28.vec_20.x * (signed __int64)pBLVRenderParams->sSineY) >> 16; + v72 = (unsigned __int64)(stru_F8AD28.vec_20.y * (signed __int64)pBLVRenderParams->sCosineY) >> 16; + v70 = (unsigned __int64)(stru_F8AD28.vec_20.z * (signed __int64)pBLVRenderParams->sSineNegX) >> 16; + stru_F8AD28.vec_70.x = ((unsigned __int64)(v74 * (signed __int64)pBLVRenderParams->sCosineNegX) >> 16) - v70; + stru_F8AD28.vec_70.y = ((unsigned __int64)(stru_F8AD28.vec_20.x * (signed __int64)pBLVRenderParams->sSineY) >> 16) + + ((unsigned __int64)(stru_F8AD28.vec_20.y * (signed __int64)pBLVRenderParams->sCosineY) >> 16); + stru_F8AD28.vec_70.z = ((unsigned __int64)(v74 * (signed __int64)pBLVRenderParams->sSineNegX) >> 16) + + ((unsigned __int64)(stru_F8AD28.vec_20.z * (signed __int64)pBLVRenderParams->sCosineNegX) >> 16); + v74 = pBLVRenderParams->sSineY * pBLVRenderParams->vPartyPos.y + - pBLVRenderParams->sCosineY * pBLVRenderParams->vPartyPos.x; + v11 = -(pBLVRenderParams->sCosineY * pBLVRenderParams->vPartyPos.y + + pBLVRenderParams->sSineY * pBLVRenderParams->vPartyPos.x); + v73 = -65536 * pBLVRenderParams->vPartyPos.z; + v70 = (unsigned __int64)(-65536 * pBLVRenderParams->vPartyPos.z * (signed __int64)pBLVRenderParams->sSineNegX) >> 16; + v12 = ((unsigned __int64)(v74 * (signed __int64)pBLVRenderParams->sCosineNegX) >> 16) - v70; + v69 = (unsigned __int64)(v74 * (signed __int64)pBLVRenderParams->sSineNegX) >> 16; + v13 = pBLVRenderParams->vPartyPos.y; + v70 = ((unsigned __int64)(v74 * (signed __int64)pBLVRenderParams->sSineNegX) >> 16) + + ((unsigned __int64)(-65536 * pBLVRenderParams->vPartyPos.z * (signed __int64)pBLVRenderParams->sCosineNegX) >> 16); + v14 = pBLVRenderParams->vPartyPos.x; + } + else + { + v70 = (unsigned __int64)(stru_F8AD28.plane_4.vNormal.y * (signed __int64)pBLVRenderParams->sSineY) >> 16; + stru_F8AD28.rotated_normal.x = ((unsigned __int64)(stru_F8AD28.plane_4.vNormal.x + * (signed __int64)pBLVRenderParams->sCosineY) >> 16) + - v70; + stru_F8AD28.rotated_normal.z = stru_F8AD28.plane_4.vNormal.z; + stru_F8AD28.rotated_normal.y = ((unsigned __int64)(stru_F8AD28.plane_4.vNormal.x + * (signed __int64)pBLVRenderParams->sSineY) >> 16) + + ((unsigned __int64)(stru_F8AD28.plane_4.vNormal.y + * (signed __int64)pBLVRenderParams->sCosineY) >> 16); + v70 = (unsigned __int64)(stru_F8AD28.vec_14.y * (signed __int64)pBLVRenderParams->sSineY) >> 16; + stru_F8AD28.vec_60.y = ((unsigned __int64)(stru_F8AD28.vec_14.x * (signed __int64)pBLVRenderParams->sCosineY) >> 16) + - v70; + stru_F8AD28.field_6C = stru_F8AD28.vec_14.z; + stru_F8AD28.vec_60.z = ((unsigned __int64)(stru_F8AD28.vec_14.x * (signed __int64)pBLVRenderParams->sSineY) >> 16) + + ((unsigned __int64)(stru_F8AD28.vec_14.y * (signed __int64)pBLVRenderParams->sCosineY) >> 16); + v70 = (unsigned __int64)(stru_F8AD28.vec_20.y * (signed __int64)pBLVRenderParams->sSineY) >> 16; + stru_F8AD28.vec_70.x = ((unsigned __int64)(stru_F8AD28.vec_20.x * (signed __int64)pBLVRenderParams->sCosineY) >> 16) + - v70; + v69 = (unsigned __int64)(stru_F8AD28.vec_20.x * (signed __int64)pBLVRenderParams->sSineY) >> 16; + v14 = pBLVRenderParams->vPartyPos.x; + stru_F8AD28.vec_70.z = stru_F8AD28.vec_20.z; + v13 = pBLVRenderParams->vPartyPos.y; + stru_F8AD28.vec_70.y = ((unsigned __int64)(stru_F8AD28.vec_20.x * (signed __int64)pBLVRenderParams->sSineY) >> 16) + + ((unsigned __int64)(stru_F8AD28.vec_20.y * (signed __int64)pBLVRenderParams->sCosineY) >> 16); + v12 = pBLVRenderParams->sSineY * pBLVRenderParams->vPartyPos.y + - pBLVRenderParams->sCosineY * pBLVRenderParams->vPartyPos.x; + v11 = -(pBLVRenderParams->sCosineY * pBLVRenderParams->vPartyPos.y + + pBLVRenderParams->sSineY * pBLVRenderParams->vPartyPos.x); + v70 = -65536 * pBLVRenderParams->vPartyPos.z; + } + stru_F8AD28.field_7C = stru_F8AD28.rotated_normal.x; + stru_F8AD28.vec_60.x = stru_F8AD28.plane_4.vNormal.z * pBLVRenderParams->vPartyPos.z + + stru_F8AD28.plane_4.dist + + stru_F8AD28.plane_4.vNormal.y * v13 + + stru_F8AD28.plane_4.vNormal.x * v14; + stru_F8AD28.vec_80.x = (unsigned __int64)(SLODWORD(pBLVRenderParams->field_44) + * (signed __int64)stru_F8AD28.rotated_normal.y) >> 16; + stru_F8AD28.vec_80.y = (unsigned __int64)(SLODWORD(pBLVRenderParams->field_44) + * (signed __int64)stru_F8AD28.rotated_normal.z) >> 16; + stru_F8AD28.vec_80.z = -stru_F8AD28.vec_60.x; + stru_F8AD28.vec_8C.x = stru_F8AD28.vec_60.y; + stru_F8AD28.vec_8C.y = (unsigned __int64)(SLODWORD(pBLVRenderParams->field_44) * (signed __int64)stru_F8AD28.vec_60.z) >> 16; + stru_F8AD28.vec_8C.z = (unsigned __int64)(SLODWORD(pBLVRenderParams->field_44) * (signed __int64)stru_F8AD28.field_6C) >> 16; + X = (unsigned __int64)(stru_F8AD28.vec_60.y * (signed __int64)v12) >> 16; + v15 = v70; + v70 = (unsigned __int64)(stru_F8AD28.field_6C * (signed __int64)v70) >> 16; + stru_F8AD28.vec_9C.x = stru_F8AD28.vec_70.x; + stru_F8AD28.field_98 = -(X + ((unsigned __int64)(stru_F8AD28.vec_60.z * (signed __int64)v11) >> 16) + v70); + stru_F8AD28.vec_9C.y = (unsigned __int64)(SLODWORD(pBLVRenderParams->field_44) * (signed __int64)stru_F8AD28.vec_70.y) >> 16; + stru_F8AD28.vec_9C.z = (unsigned __int64)(SLODWORD(pBLVRenderParams->field_44) * (signed __int64)stru_F8AD28.vec_70.z) >> 16; + X = (unsigned __int64)(stru_F8AD28.vec_70.x * (signed __int64)v12) >> 16; + v69 = (unsigned __int64)(stru_F8AD28.vec_70.y * (signed __int64)v11) >> 16; + v70 = (unsigned __int64)(stru_F8AD28.vec_70.z * (signed __int64)v15) >> 16; + stru_F8AD28.field_38 = 0; + stru_F8AD28.field_A8 = -(X + + ((unsigned __int64)(stru_F8AD28.vec_70.y * (signed __int64)v11) >> 16) + + ((unsigned __int64)(stru_F8AD28.vec_70.z * (signed __int64)v15) >> 16)); + if ( *(int *)&v68->field_4 || *(int *)&v68->field_8 ) + { + stru_F8AD28.field_3E4 = 1; + stru_F8AD28.field_3E8 = *(int *)&v68->field_4; + stru_F8AD28.field_3EC = *(int *)&v68->field_8; + stru_F8AD28.field_3F0 = v68->field_1E; + stru_F8AD28.field_3F4 = v68->field_20; + } + else + { + stru_F8AD28.field_3E4 = 0; + } + v16 = 0.0039215689; + v17 = 116 * v1->uSectorID; + v69 = v17; + v74 = 0; + v73 = 0; + stru_F8AD28.field_2C = (stru_F8AD28.field_3F8 + *(__int16 *)((char *)&pIndoor->pSectors->uMinAmbientLightLevel + v17)) << 16; + v70 = uNumMobileLightsApplied; + if ( uNumMobileLightsApplied > 0 ) + { + v18 = (char *)&pMobileLights[0].vPosition.y; + do + { + if ( v74 >= 20 ) + break; + v19 = *((short *)v18 + 2); + v20 = *((short *)v18 - 1); + if ( v20 > v1->pBounding.x1 - v19 ) + { + if ( v20 < v19 + v1->pBounding.x2 ) + { + v21 = *(short *)v18; + if ( v21 > v1->pBounding.y1 - v19 ) + { + if ( v21 < v19 + v1->pBounding.y2 ) + { + v22 = *((short *)v18 + 1); + if ( v22 > v1->pBounding.z1 - v19 ) + { + if ( v22 < v19 + v1->pBounding.z2 ) + { + X = (v1->pFacePlane_old.dist + + *((short *)v18 + 1) * v1->pFacePlane_old.vNormal.z + + v21 * v1->pFacePlane_old.vNormal.y + + *((short *)v18 - 1) * v1->pFacePlane_old.vNormal.x) >> 16; + if ( X <= v19 ) + { + v23 = X; + v24 = v74; + stru_F8AD28._blv_lights_radii[v74] = v19; + stru_F8AD28._blv_lights_inv_radii[v24] = 65536 / v19; + *(int *)((char *)&stru_F8AD28.field_240 + v24 * 4) = *((short *)v18 + 5) << 16; + stru_F8AD28._blv_lights_xs[v24] = *((short *)v18 - 1); + stru_F8AD28._blv_lights_ys[v24] = *(short *)v18; + stru_F8AD28._blv_lights_zs[v24] = *((short *)v18 + 1); + v68 = (BLVFaceExtra *)(unsigned __int8)v18[6]; + v25 = (double)(signed int)v68 * v16; + v68 = (BLVFaceExtra *)(unsigned __int8)v18[7]; + v26 = (unsigned __int8)v18[8]; + *(float *)(v24 * 4 + 16297992) = v25; + v27 = (double)(signed int)v68; + v68 = (BLVFaceExtra *)v26; + *(float *)(v24 * 4 + 16298072) = v27 * v16; + *(float *)(v24 * 4 + 16298152) = (double)(signed int)v68 * v16; + v16 = 0.0039215689; + stru_F8AD28._blv_lights_light_dot_faces[v24] = abs(v23); + v28 = v74; + v29 = v18[9]; + ++v74; + stru_F8AD28._blv_lights_smthngs[v28] = v29; + } + } + } + } + } + } + } + ++v73; + v18 += 18; + v17 = v69; + } + while ( v73 < v70 ); + } + v30 = 0; + v73 = 0; + v31 = *(__int16 *)((char *)&pIndoor->pSectors->uNumLights + v17); + v70 = *(__int16 *)((char *)&pIndoor->pSectors->uNumLights + v17); + if ( v31 > 0 ) + { + while ( v74 < 20 ) + { + v32 = &pIndoor->pLights[*(&(*(BLVLightMM7 **)((char *)&pIndoor->pSectors->pLights + v17))->vPosition.x + v30)]; + if ( !(v32->uAtributes & 8) ) + { + v33 = v1->pBounding.x1; + v34 = v32->vPosition.x; + X = v32->uBrightness; + v35 = v32->uRadius; + v68 = (BLVFaceExtra *)v32->uRadius; + if ( v34 > v33 - v35 ) + { + if ( v34 < v35 + v1->pBounding.x2 ) + { + v36 = v32->vPosition.y; + if ( v36 > v1->pBounding.y1 - v35 ) + { + if ( v36 < v35 + v1->pBounding.y2 ) + { + v37 = v32->vPosition.z; + if ( v37 > v1->pBounding.z1 - v35 ) + { + if ( v37 < v35 + v1->pBounding.z2 ) + { + v38 = (v1->pFacePlane_old.dist + + v32->vPosition.x * v1->pFacePlane_old.vNormal.x + + v37 * v1->pFacePlane_old.vNormal.z + + v36 * v1->pFacePlane_old.vNormal.y) >> 16; + if ( v38 >= 0 ) + { + if ( v38 <= v35 && v35 ) + { + v39 = v74; + stru_F8AD28._blv_lights_radii[v74] = v35; + stru_F8AD28._blv_lights_inv_radii[v39] = 65536 / (signed int)v68; + *(int *)((char *)&stru_F8AD28.field_240 + v39 * 4) = X << 16; + stru_F8AD28._blv_lights_xs[v39] = v32->vPosition.x; + stru_F8AD28._blv_lights_ys[v39] = v32->vPosition.y; + stru_F8AD28._blv_lights_zs[v39] = v32->vPosition.z; + v68 = (BLVFaceExtra *)v32->uRed; + stru_F8AD28._blv_lights_rs[v39] = (double)(signed int)v68 * v16; + v68 = (BLVFaceExtra *)v32->uGreen; + stru_F8AD28._blv_lights_gs[v39] = (double)(signed int)v68 * v16; + v68 = (BLVFaceExtra *)v32->uBlue; + stru_F8AD28._blv_lights_bs[v39] = (double)(signed int)v68 * v16; + v16 = 0.0039215689; + stru_F8AD28._blv_lights_light_dot_faces[v39] = abs(v38); + v40 = v74++; + stru_F8AD28._blv_lights_smthngs[v40] = 1; + } + } + } + } + } + } + } + } + } + v30 = v73++ + 1; + if ( v73 >= v70 ) + break; + v17 = v69; + } + } + v73 = 0; + if ( uNumStationaryLightsApplied > 0 ) + { + v41 = (char *)&pStationaryLights[0].vPosition.y; + do + { + if ( v74 >= 20 ) + break; + v42 = *((short *)v41 + 2); + v43 = *((short *)v41 - 1); + if ( v43 > v1->pBounding.x1 - v42 ) + { + if ( v43 < v42 + v1->pBounding.x2 ) + { + v44 = *(short *)v41; + if ( v44 > v1->pBounding.y1 - v42 ) + { + if ( v44 < v42 + v1->pBounding.y2 ) + { + v45 = *((short *)v41 + 1); + if ( v45 > v1->pBounding.z1 - v42 ) + { + if ( v45 < v42 + v1->pBounding.z2 ) + { + v46 = (v1->pFacePlane_old.dist + + *(short *)v41 * v1->pFacePlane_old.vNormal.y + + v43 * v1->pFacePlane_old.vNormal.x + + v45 * v1->pFacePlane_old.vNormal.z) >> 16; + v69 = v46; + if ( v46 >= 0 ) + { + if ( v46 <= v42 ) + { + v47 = v69; + v48 = v74; + stru_F8AD28._blv_lights_radii[v74] = v42; + stru_F8AD28._blv_lights_inv_radii[v48] = 65536 / v42; + stru_F8AD28._blv_lights_xs[v48] = *((short *)v41 - 1); + stru_F8AD28._blv_lights_ys[v48] = *(short *)v41; + stru_F8AD28._blv_lights_zs[v48] = *((short *)v41 + 1); + v68 = (BLVFaceExtra *)(unsigned __int8)v41[6]; + v49 = (double)(signed int)v68 * v16; + v68 = (BLVFaceExtra *)(unsigned __int8)v41[7]; + v50 = (unsigned __int8)v41[8]; + stru_F8AD28._blv_lights_rs[v48] = v49; + v51 = (double)(signed int)v68; + v68 = (BLVFaceExtra *)v50; + stru_F8AD28._blv_lights_gs[v48] = v51 * v16; + stru_F8AD28._blv_lights_bs[v48] = (double)(signed int)v68 * v16; + v16 = 0.0039215689; + stru_F8AD28._blv_lights_light_dot_faces[v48] = abs(v47); + v52 = v74++; + stru_F8AD28._blv_lights_smthngs[v52] = 1; + } + } + } + } + } + } + } + } + ++v73; + v41 += 12; + } + while ( v73 < uNumStationaryLightsApplied ); + } + stru_F8AD28.field_AC = v74; + v53 = v1->pBounding.x2; + if ( pBLVRenderParams->vPartyPos.x <= v53 ) + { + v55 = v1->pBounding.x1; + if ( pBLVRenderParams->vPartyPos.x >= v55 ) + v54 = 0; + else + v54 = v55 - pBLVRenderParams->vPartyPos.x; + } + else + { + v54 = pBLVRenderParams->vPartyPos.x - v53; + } + v56 = v1->pBounding.y2; + v57 = v54 * v54; + if ( pBLVRenderParams->vPartyPos.y <= v56 ) + { + v59 = v1->pBounding.y1; + if ( pBLVRenderParams->vPartyPos.y >= v59 ) + v58 = 0; + else + v58 = v59 - pBLVRenderParams->vPartyPos.y; + } + else + { + v58 = pBLVRenderParams->vPartyPos.y - v56; + } + v60 = v58 * v58 + v57; + v61 = v1->pBounding.z2; + if ( pBLVRenderParams->vPartyPos.z <= v61 ) + { + v63 = v1->pBounding.z1; + if ( pBLVRenderParams->vPartyPos.z >= v63 ) + v62 = 0; + else + v62 = v63 - pBLVRenderParams->vPartyPos.z; + } + else + { + v62 = pBLVRenderParams->vPartyPos.z - v61; + } + v64 = v62 * v62 + v60; + if ( v64 ) + stru_F8AD28.field_34 = sub_452A9E(v64) << 16; + else + stru_F8AD28.field_34 = 0; + v68 = (BLVFaceExtra *)abs(stru_F8AD28.rotated_normal.y); + v65 = (double)(signed int)v68; + if ( v65 >= 655.36 ) + { + if ( v65 >= 26214.4 ) + { + if ( v65 >= 45875.2 ) + { + stru_F8AD28.field_44 = 8; + stru_F8AD28.field_48 = 3; + } + else + { + stru_F8AD28.field_44 = 16; + stru_F8AD28.field_48 = 4; + } + } + else + { + stru_F8AD28.field_44 = 32; + stru_F8AD28.field_48 = 5; + } + } + else + { + stru_F8AD28.field_44 = 64; + stru_F8AD28.field_48 = 6; + } +} +// 519AB4: using guessed type int uNumStationaryLightsApplied; + +//----- (004AF412) -------------------------------------------------------- +int __cdecl sub_4AF412() +{ + int v0; // ST20_4@2 + int v1; // ST20_4@2 + int v2; // ST20_4@2 + int v3; // esi@2 + int v4; // ST20_4@2 + int v5; // ecx@2 + int v6; // ebx@2 + int v7; // edi@2 + int v8; // edx@2 + int v9; // eax@2 + int result; // eax@4 + + stru_F8AD28.plane_4.vNormal.z = -65536; + stru_F8AD28.vec_20.y = -65536; + stru_F8AD28.plane_4.vNormal.x = 0; + stru_F8AD28.plane_4.vNormal.y = 0; + stru_F8AD28.plane_4.dist = (pBLVRenderParams->vPartyPos.z + 800) << 16; + stru_F8AD28.vec_14.x = 65536; + stru_F8AD28.vec_14.y = 0; + stru_F8AD28.vec_14.z = 0; + stru_F8AD28.vec_20.x = 0; + stru_F8AD28.vec_20.z = 0; + stru_F8AD28.field_3F8 = 0; + if ( pBLVRenderParams->sPartyRotX ) + { + v0 = ((unsigned __int64)(stru_F8AD28.plane_4.vNormal.x * (signed __int64)pBLVRenderParams->sCosineY) >> 16) + - ((unsigned __int64)(stru_F8AD28.plane_4.vNormal.y * (signed __int64)pBLVRenderParams->sSineY) >> 16); + stru_F8AD28.rotated_normal.x = ((unsigned __int64)(v0 * (signed __int64)pBLVRenderParams->sCosineNegX) >> 16) + - ((unsigned __int64)(stru_F8AD28.plane_4.vNormal.z + * (signed __int64)pBLVRenderParams->sSineNegX) >> 16); + stru_F8AD28.rotated_normal.y = ((unsigned __int64)(stru_F8AD28.plane_4.vNormal.x + * (signed __int64)pBLVRenderParams->sSineY) >> 16) + + ((unsigned __int64)(stru_F8AD28.plane_4.vNormal.y + * (signed __int64)pBLVRenderParams->sCosineY) >> 16); + stru_F8AD28.rotated_normal.z = ((unsigned __int64)(v0 * (signed __int64)pBLVRenderParams->sSineNegX) >> 16) + + ((unsigned __int64)(stru_F8AD28.plane_4.vNormal.z + * (signed __int64)pBLVRenderParams->sCosineNegX) >> 16); + v1 = ((unsigned __int64)(stru_F8AD28.vec_14.x * (signed __int64)pBLVRenderParams->sCosineY) >> 16) + - ((unsigned __int64)(stru_F8AD28.vec_14.y * (signed __int64)pBLVRenderParams->sSineY) >> 16); + stru_F8AD28.vec_60.y = ((unsigned __int64)(v1 * (signed __int64)pBLVRenderParams->sCosineNegX) >> 16) + - ((unsigned __int64)(stru_F8AD28.vec_14.z * (signed __int64)pBLVRenderParams->sSineNegX) >> 16); + stru_F8AD28.vec_60.z = ((unsigned __int64)(stru_F8AD28.vec_14.x * (signed __int64)pBLVRenderParams->sSineY) >> 16) + + ((unsigned __int64)(stru_F8AD28.vec_14.y * (signed __int64)pBLVRenderParams->sCosineY) >> 16); + stru_F8AD28.field_6C = ((unsigned __int64)(v1 * (signed __int64)pBLVRenderParams->sSineNegX) >> 16) + + ((unsigned __int64)(stru_F8AD28.vec_14.z * (signed __int64)pBLVRenderParams->sCosineNegX) >> 16); + v2 = ((unsigned __int64)(stru_F8AD28.vec_20.x * (signed __int64)pBLVRenderParams->sCosineY) >> 16) + - ((unsigned __int64)(stru_F8AD28.vec_20.y * (signed __int64)pBLVRenderParams->sSineY) >> 16); + stru_F8AD28.vec_70.x = ((unsigned __int64)(v2 * (signed __int64)pBLVRenderParams->sCosineNegX) >> 16) + - ((unsigned __int64)(stru_F8AD28.vec_20.z * (signed __int64)pBLVRenderParams->sSineNegX) >> 16); + stru_F8AD28.vec_70.y = ((unsigned __int64)(stru_F8AD28.vec_20.x * (signed __int64)pBLVRenderParams->sSineY) >> 16) + + ((unsigned __int64)(stru_F8AD28.vec_20.y * (signed __int64)pBLVRenderParams->sCosineY) >> 16); + stru_F8AD28.vec_70.z = ((unsigned __int64)(v2 * (signed __int64)pBLVRenderParams->sSineNegX) >> 16) + + ((unsigned __int64)(stru_F8AD28.vec_20.z * (signed __int64)pBLVRenderParams->sCosineNegX) >> 16); + v3 = -(pBLVRenderParams->sCosineY * pBLVRenderParams->vPartyPos.y + + pBLVRenderParams->sSineY * pBLVRenderParams->vPartyPos.x); + v4 = pBLVRenderParams->sSineY * pBLVRenderParams->vPartyPos.y + - pBLVRenderParams->sCosineY * pBLVRenderParams->vPartyPos.x; + v5 = ((unsigned __int64)(v4 * (signed __int64)pBLVRenderParams->sCosineNegX) >> 16) + - ((unsigned __int64)(-65536 * pBLVRenderParams->vPartyPos.z * (signed __int64)pBLVRenderParams->sSineNegX) >> 16); + v6 = pBLVRenderParams->vPartyPos.z; + v7 = ((unsigned __int64)(-65536 * pBLVRenderParams->vPartyPos.z * (signed __int64)pBLVRenderParams->sCosineNegX) >> 16) + + ((unsigned __int64)(v4 * (signed __int64)pBLVRenderParams->sSineNegX) >> 16); + v8 = pBLVRenderParams->vPartyPos.y; + v9 = pBLVRenderParams->vPartyPos.x; + } + else + { + stru_F8AD28.rotated_normal.x = ((unsigned __int64)(stru_F8AD28.plane_4.vNormal.x + * (signed __int64)pBLVRenderParams->sCosineY) >> 16) + - ((unsigned __int64)(stru_F8AD28.plane_4.vNormal.y + * (signed __int64)pBLVRenderParams->sSineY) >> 16); + stru_F8AD28.rotated_normal.z = stru_F8AD28.plane_4.vNormal.z; + stru_F8AD28.rotated_normal.y = ((unsigned __int64)(stru_F8AD28.plane_4.vNormal.x + * (signed __int64)pBLVRenderParams->sSineY) >> 16) + + ((unsigned __int64)(stru_F8AD28.plane_4.vNormal.y + * (signed __int64)pBLVRenderParams->sCosineY) >> 16); + stru_F8AD28.vec_60.y = ((unsigned __int64)(stru_F8AD28.vec_14.x * (signed __int64)pBLVRenderParams->sCosineY) >> 16) + - ((unsigned __int64)(stru_F8AD28.vec_14.y * (signed __int64)pBLVRenderParams->sSineY) >> 16); + stru_F8AD28.field_6C = stru_F8AD28.vec_14.z; + stru_F8AD28.vec_60.z = ((unsigned __int64)(stru_F8AD28.vec_14.x * (signed __int64)pBLVRenderParams->sSineY) >> 16) + + ((unsigned __int64)(stru_F8AD28.vec_14.y * (signed __int64)pBLVRenderParams->sCosineY) >> 16); + stru_F8AD28.vec_70.x = ((unsigned __int64)(stru_F8AD28.vec_20.x * (signed __int64)pBLVRenderParams->sCosineY) >> 16) + - ((unsigned __int64)(stru_F8AD28.vec_20.y * (signed __int64)pBLVRenderParams->sSineY) >> 16); + v8 = pBLVRenderParams->vPartyPos.y; + stru_F8AD28.vec_70.y = ((unsigned __int64)(stru_F8AD28.vec_20.x * (signed __int64)pBLVRenderParams->sSineY) >> 16) + + ((unsigned __int64)(stru_F8AD28.vec_20.y * (signed __int64)pBLVRenderParams->sCosineY) >> 16); + stru_F8AD28.vec_70.z = stru_F8AD28.vec_20.z; + v9 = pBLVRenderParams->vPartyPos.x; + v5 = pBLVRenderParams->sSineY * pBLVRenderParams->vPartyPos.y + - pBLVRenderParams->sCosineY * pBLVRenderParams->vPartyPos.x; + v6 = pBLVRenderParams->vPartyPos.z; + v3 = -(pBLVRenderParams->sCosineY * pBLVRenderParams->vPartyPos.y + + pBLVRenderParams->sSineY * pBLVRenderParams->vPartyPos.x); + v7 = -65536 * pBLVRenderParams->vPartyPos.z; + } + stru_F8AD28.field_7C = stru_F8AD28.rotated_normal.x; + stru_F8AD28.vec_60.x = stru_F8AD28.plane_4.vNormal.y * v8 + + stru_F8AD28.plane_4.dist + + stru_F8AD28.plane_4.vNormal.x * v9 + + stru_F8AD28.plane_4.vNormal.z * v6; + stru_F8AD28.vec_80.x = (unsigned __int64)(SLODWORD(pBLVRenderParams->field_44) + * (signed __int64)stru_F8AD28.rotated_normal.y) >> 16; + stru_F8AD28.vec_80.y = (unsigned __int64)(SLODWORD(pBLVRenderParams->field_44) + * (signed __int64)stru_F8AD28.rotated_normal.z) >> 16; + stru_F8AD28.vec_80.z = -stru_F8AD28.vec_60.x; + stru_F8AD28.vec_8C.x = stru_F8AD28.vec_60.y; + stru_F8AD28.vec_8C.y = (unsigned __int64)(SLODWORD(pBLVRenderParams->field_44) * (signed __int64)stru_F8AD28.vec_60.z) >> 16; + stru_F8AD28.vec_8C.z = (unsigned __int64)(SLODWORD(pBLVRenderParams->field_44) * (signed __int64)stru_F8AD28.field_6C) >> 16; + stru_F8AD28.vec_9C.x = stru_F8AD28.vec_70.x; + stru_F8AD28.field_98 = -(((unsigned __int64)(stru_F8AD28.vec_60.y * (signed __int64)v5) >> 16) + + ((unsigned __int64)(stru_F8AD28.vec_60.z * (signed __int64)v3) >> 16) + + ((unsigned __int64)(stru_F8AD28.field_6C * (signed __int64)v7) >> 16)); + stru_F8AD28.vec_9C.y = (unsigned __int64)(SLODWORD(pBLVRenderParams->field_44) * (signed __int64)stru_F8AD28.vec_70.y) >> 16; + stru_F8AD28.vec_9C.z = (unsigned __int64)(SLODWORD(pBLVRenderParams->field_44) * (signed __int64)stru_F8AD28.vec_70.z) >> 16; + result = 0; + stru_F8AD28.field_A8 = -(((unsigned __int64)(stru_F8AD28.vec_70.x * (signed __int64)v5) >> 16) + + ((unsigned __int64)(stru_F8AD28.vec_70.y * (signed __int64)v3) >> 16) + + ((unsigned __int64)(stru_F8AD28.vec_70.z * (signed __int64)v7) >> 16)); + stru_F8AD28.field_38 = 0; + stru_F8AD28.field_3E4 = 0; + stru_F8AD28.field_2C = 0; + stru_F8AD28.field_AC = 0; + stru_F8AD28.field_34 = 0; + return result; +} + + + + + + +//----- (004B1447) -------------------------------------------------------- +Player *__fastcall sub_4B1447_party_fine(int a1, int a2, int a3) +{ + signed int v3; // esi@1 + char v4; // sf@8 + int v5; // eax@8 + unsigned __int64 v6; // qax@12 + DDM_DLV_Header *v7; // eax@14 + Player **v8; // edi@18 + Player *result; // eax@19 + char *v10; // esi@20 + + v3 = 0; + if ( a2 ) + { + if ( a2 != 1 ) + { + if ( a2 == 2 ) + v3 = 2; + goto LABEL_13; + } + v3 = 2; + } + else + { + v3 = 1; + } + if ( pParty->uFine < 4000000 ) + { + v4 = a3 + pParty->uFine < 0; + v5 = a3 + pParty->uFine; + pParty->uFine += a3; + if ( v4 ) + { + v5 = 0; + pParty->uFine = 0; + } + if ( v5 > 4000000 ) + pParty->uFine = 4000000; + } + v6 = pParty->uTimePlayed + 368640; + pParty->field_3C._shop_ban_times[2 * a1] = LODWORD(pParty->uTimePlayed) + 368640; + pParty->field_3C._shop_ban_times[2 * a1 + 1] = HIDWORD(v6); +LABEL_13: + *(int *)&pParty->field_16154[4 * a1] = 1; + if ( v3 ) + { + v7 = &pOutdoor->ddm; + if ( uCurrentlyLoadedLevelType != LEVEL_Outdoor ) + v7 = &pIndoor->dlv; + v7->uReputation += v3; + if ( v7->uReputation > 10000 ) + v7->uReputation = 10000; + } + v8 = &pPlayers[1]; + do + { + result = *v8; + if ( pParty->uFine ) + { + v10 = result->field_152; + result = (Player *)_449B57_test_bit((unsigned __int8 *)result->field_152, 1); + if ( !(short)result ) + result = (Player *)_449B7E_toggle_bit(v10, 1, 1u); + } + ++v8; + } + while ( (signed int)v8 <= (signed int)&pPlayers[4] ); + return result; +} + +//----- (004B1523) -------------------------------------------------------- +char *__thiscall sub_4B1523(int *_this) +{ + int v1; // esi@1 + int v2; // edx@1 + unsigned int v3; // eax@2 + int v4; // eax@4 + LONG v5; // ecx@4 + int v6; // eax@10 + char *v7; // ST44_4@12 + unsigned __int16 v8; // ax@12 + GUIWindow a1; // [sp+Ch] [bp-68h]@4 + unsigned int v11; // [sp+60h] [bp-14h]@1 + POINT a2; // [sp+64h] [bp-10h]@1 + int v13; // [sp+6Ch] [bp-8h]@4 + int v14; // [sp+70h] [bp-4h]@4 + + v1 = *_this - 399; + v2 = (*_this - 400) % 11 + 1; + v11 = 4 * (*_this - 400) / 11; + sprintfex(pTmpBuf, "%s%03d", spellbook_texture_filename_suffices[v11 / 4], v2); + if ( pMouse->GetCursorPos(&a2)->y <= 320 ) + v3 = pMouse->GetCursorPos(&a2)->y + 30; + else + v3 = 30; + a1.str_48 = 0; + a1.uFrameY = v3; + a1.uFrameWidth = 328; + a1.uFrameHeight = 68; + a1.uFrameX = 90; + a1.uFrameZ = 417; + a1.uFrameW = v3 + 67; + a2.y = pFontSmallnum->GetLineWidth(pGlobalTXT_LocalizationStrings[431]); + v14 = pFontSmallnum->GetLineWidth(pGlobalTXT_LocalizationStrings[433]); + v13 = pFontSmallnum->GetLineWidth(pGlobalTXT_LocalizationStrings[432]); + v4 = pFontSmallnum->GetLineWidth(pGlobalTXT_LocalizationStrings[96]); + v5 = a2.y; + if ( v14 > a2.y ) + v5 = v14; + if ( v13 > v5 ) + v5 = v13; + if ( v4 > v5 ) + v5 = v4; + sprintfex( + pTmpBuf2, + "%s\n\n%s\t%03d:\t%03d%s\t000\n%s\t%03d:\t%03d%s\t000\n%s\t%03d:\t%03d%s\t000\n%s\t%03d:\t%03d%s", + pSpellStats->pInfos[v1].pDescription, + pGlobalTXT_LocalizationStrings[431], // "Normal" + v5 + 3, + v5 + 10, + pSpellStats->pInfos[v1].pBasicSkillDesc, + pGlobalTXT_LocalizationStrings[433], // "Expert" + v5 + 3, + v5 + 10, + pSpellStats->pInfos[v1].pExpertSkillDesc, + pGlobalTXT_LocalizationStrings[432], // "Master" + v5 + 3, + v5 + 10, + pSpellStats->pInfos[v1].pMasterSkillDesc, + pGlobalTXT_LocalizationStrings[96], // "Grand" + v5 + 3, + v5 + 10, + pSpellStats->pInfos[v1].pGrandmasterSkillDesc); + v6 = pFontSmallnum->CalcTextHeight(pTmpBuf2, &a1, 0, 0); + a1.uFrameHeight += v6; + if ( (signed int)a1.uFrameHeight < 150 ) + a1.uFrameHeight = 150; + a1.uFrameWidth = 460; + a1._415551(0); + a1.uFrameWidth -= 12; + a1.uFrameHeight -= 12; + v7 = pSpellStats->pInfos[v1].pName; + a1.uFrameZ = a1.uFrameX + a1.uFrameWidth - 1; + a1.uFrameW = a1.uFrameHeight + a1.uFrameY - 1; + v8 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); + a1.DrawText2(pFontArrus, 0x78u, 0xCu, v8, v7, 3u); + a1.DrawText(pFontSmallnum, 120, 44, 0, pTmpBuf2, 0, 0, 0); + a1.uFrameZ = a1.uFrameX + 107; + a1.uFrameWidth = 108; + a1.DrawText2(pFontComic, 0xCu, 0x4Bu, 0, pSkillNames[v11 / 4 + 12], 3u); + sprintfex(pTmpBuf, "%s\n%d", pGlobalTXT_LocalizationStrings[522], *(&pSpellDatas[0].uNormalLevelMana + 10 * v1)); + return a1.DrawText2( + pFontComic, + 0xCu, + a1.uFrameHeight - LOBYTE(pFontComic->uFontHeight) - 16, + 0, + pTmpBuf, + 3u); +} + + +//----- (004B1784) -------------------------------------------------------- +bool __cdecl sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() +{ + Player *pPlayer; // ebx@1 + bool result; // eax@2 + unsigned __int16 v2; // ST0C_2@3 + int v3; // eax@3 + GUIWindow v4; // [sp+4h] [bp-54h]@3 + + pPlayer = pPlayers[uActiveCharacter]; + if ( pPlayer->CanAct() ) + { + pDialogueWindow->field_28 = dword_F8B1E0; + result = 1; + } + else + { + pDialogueWindow->field_28 = 0; + memcpy(&v4, pGUIWindow0, sizeof(v4)); + v4.uFrameX = 483; + v4.uFrameWidth = 148; + v4.uFrameZ = 334; + sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[427], pPlayer->pName, pGlobalTXT_LocalizationStrings[562]);// + // "%s is in no condition to %s" + // "do anything" + v2 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); + v3 = pFontArrus->CalcTextHeight(pTmpBuf, &v4, 0, 0); + v4.DrawText2(pFontArrus, 0, (212 - v3) / 2 + 101, v2, pTmpBuf, 3u); + result = 0; + } + return result; +} +// F8B1E0: using guessed type int dword_F8B1E0; + + + +//----- (004B1A2D) -------------------------------------------------------- +void __cdecl sub_4B1A2D() +{ + Player *v0; // edi@1 + POINT *v1; // esi@5 + unsigned int v2; // eax@5 + int v3; // ecx@5 + POINT *v4; // esi@12 + int v5; // eax@12 + unsigned int v6; // eax@13 + ItemGen *v7; // ecx@13 + signed int v8; // esi@17 + unsigned int v9; // eax@19 + char v10; // [sp+8h] [bp-44h]@12 + char v11; // [sp+10h] [bp-3Ch]@12 + char v12; // [sp+18h] [bp-34h]@18 + char v13; // [sp+20h] [bp-2Ch]@17 + char v14; // [sp+28h] [bp-24h]@17 + char v15; // [sp+30h] [bp-1Ch]@17 + char v16; // [sp+38h] [bp-14h]@5 + POINT a2; // [sp+40h] [bp-Ch]@5 + int v18; // [sp+48h] [bp-4h]@5 + + v0 = pPlayers[uActiveCharacter]; + if ( dword_F8B198 <= 0 ) + return; + if ( dword_F8B198 <= 4 ) + { + if ( dword_F8B19C != 2 ) + { + if ( dword_F8B19C <= 2 ) + return; + if ( dword_F8B19C <= 5 || dword_F8B19C == 94 ) + { + v8 = pMouse->GetCursorPos((POINT *)&v15)->x - 14; + v18 = (v8 >> 5) + 14 * ((pMouse->GetCursorPos((POINT *)&v14)->y - 17) >> 5); + if ( pMouse->GetCursorPos((POINT *)&v13)->x <= 13 + || pMouse->GetCursorPos((POINT *)&v12)->x >= 462 + || (v9 = v0->GetItemIDAtInventoryIndex(&v18)) == 0 ) + return; + v7 = (ItemGen *)&v0->pDarkSpellbook.bIsSpellAvailable[36 * v9 + 5]; +LABEL_15: + GameUI_DrawItemInfo(v7); + return; + } + if ( dword_F8B19C != 95 ) + return; + } + v4 = pMouse->GetCursorPos((POINT *)&v11); + v5 = pRenderer->pActiveZBuffer[v4->x + pSRZBufferLineOffsets[pMouse->GetCursorPos((POINT *)&v10)->y]] & 0xFFFF; + v18 = v5; + if ( !v5 ) + return; + v6 = 9 * (v5 + 12 * (unsigned int)ptr_507BC0->ptr_1C); + v7 = (ItemGen *)((char *)&pParty->pPickedItem + 4 * v6 + 4); + if ( dword_F8B19C != 2 ) + v7 = (ItemGen *)&pParty->field_C59C[v6 + 715]; + goto LABEL_15; + } + if ( dword_F8B198 <= 16 && dword_F8B19C == 18 ) + { + v1 = pMouse->GetCursorPos(&a2); + v2 = v1->x + pSRZBufferLineOffsets[pMouse->GetCursorPos((POINT *)&v16)->y]; + v3 = pRenderer->pActiveZBuffer[v2] & 0xFFFF; + v18 = pRenderer->pActiveZBuffer[v2] & 0xFFFF; + if ( v18 ) + sub_4B1523((int *)&pParty->pPlayers[1].uExpressionTimeLength + 9 * (v3 + 12 * (unsigned int)ptr_507BC0->ptr_1C)); + } +} +// F8B198: using guessed type int dword_F8B198; +// F8B19C: using guessed type int dword_F8B19C; + +//----- (004B1BDB) -------------------------------------------------------- +void __stdcall RestAndHeal(__int64 uNumMinutes) +{ + signed __int64 v1; // ST2C_8@1 + signed __int64 v2; // qax@1 + signed __int64 v3; // ST1C_8@1 + unsigned __int64 v4; // qax@1 + unsigned int v5; // ebx@1 + void *v6; // ebx@1 + + pParty->pHirelings[0].bHasUsedTheAbility = 0; + pParty->pHirelings[1].bHasUsedTheAbility = 0; + pParty->uTimePlayed += (signed __int64)((double)(7680 * uNumMinutes) * 0.033333335); + v1 = (signed __int64)((double)(signed __int64)pParty->uTimePlayed * 0.234375); + v2 = v1 / 60 / 60; + v3 = v2; + v4 = (unsigned int)v2 / 0x18; + v5 = (unsigned int)(v4 / 7) >> 2; + pParty->uCurrentTimeSecond = v1 % 60; + pParty->uCurrentMinute = v1 / 60 % 60; + pParty->uCurrentHour = v3 % 24; + pParty->uCurrentMonthWeek = v4 / 7 & 3; + pParty->uDaysPlayed = (unsigned int)v4 % 0x1C; + pParty->uCurrentMonth = v5 % 0xC; + pParty->uCurrentYear = v5 / 0xC + 1168; + pParty->RestAndHeal(); + dword_507B94 = 1; + v6 = &pParty->pPlayers[0].uNumDivineInterventionCastsThisDay; + do + { + *((short *)v6 - 258) = 0; + memset(v6, 0, 4u); + v6 = (char *)v6 + 6972; + } + while ( (signed int)v6 < (signed int)&pParty->field_871C[694] ); + pParty->_4909F4(); +} +// 507B94: using guessed type int dword_507B94; + +//----- (004B1D27) -------------------------------------------------------- +void __cdecl sub_4B1D27() +{ + int v0; // edx@2 + unsigned int v1; // ecx@7 + signed int v2; // edi@10 + int v3; // esi@10 + __int16 v4; // ax@15 + signed int v5; // edi@20 + int v6; // esi@20 + int v7[4]; // [sp+Ch] [bp-10h]@12 + + if ( dword_F8B198 > 0 ) + { + v0 = 3; + if ( dword_F8B198 > 3 ) + { + if ( dword_F8B198 == 22 ) + { + if ( !dword_F8B1E4 ) + return; + } + else + { + if ( dword_F8B198 != 23 ) + return; + } + v1 = (unsigned int)ptr_507BC0->ptr_1C; +LABEL_28: + HousePlaySomeSound(v1, v0); + return; + } + v1 = (unsigned int)ptr_507BC0->ptr_1C; + if ( (signed __int64)__PAIR__(pParty->field_3C._shop_ban_times[2 * v1 + 1], pParty->field_3C._shop_ban_times[2 * v1]) <= (signed __int64)pParty->uTimePlayed ) + { + if ( pParty->uNumGold <= 0x2710 ) + { + if ( !dword_F8B1E4 ) + return; + v0 = 4; + goto LABEL_28; + } + HousePlaySomeSound(v1, dword_F8B1E4 + 3); + if ( !dword_F8B1E4 && !qword_A750D8 ) + { + v5 = 0; + v6 = 1; + do + { + if ( pPlayers[v6]->CanAct() ) + v7[v5++] = v6; + ++v6; + } + while ( v6 <= 4 ); + if ( v5 ) + { + qword_A750D8 = 256i64; + word_A750E0 = 80; + v4 = LOWORD(v7[rand() % v5]); + goto LABEL_16; + } + } + } + else + { + if ( !qword_A750D8 ) + { + v2 = 0; + v3 = 1; + do + { + if ( pPlayers[v3]->CanAct() ) + v7[v2++] = v3; + ++v3; + } + while ( v3 <= 4 ); + if ( v2 ) + { + qword_A750D8 = 256i64; + word_A750E0 = 80; + v4 = LOWORD(v7[rand() % v2]); +LABEL_16: + word_A750E2 = v4; + return; + } + } + } + } +} + +//----- (004B1E92) -------------------------------------------------------- +void __fastcall HousePlaySomeSound(unsigned int uHouseID, int a2) +{ + //if ( BYTE1(pAnimatedRooms[p2DEvents_minus1___02[26 * uHouseID]].field_C) ) + if ( BYTE1(pAnimatedRooms[p2DEvents[uHouseID - 1].uAnimationID].field_C) ) + pAudioPlayer->PlaySound( + //(SoundID)(a2 + 100 * (BYTE1(pAnimatedRooms[p2DEvents_minus1___02[26 * uHouseID]].field_C) + 300)), + (SoundID)(a2 + 100 * (BYTE1(pAnimatedRooms[p2DEvents[uHouseID - 1].uAnimationID].field_C) + 300)), + 806, + 0, + -1, + 0, + 0, + 0, + 0); +} + +//----- (004B1ECE) -------------------------------------------------------- +void __cdecl sub_4B1ECE() +{ + __int16 *v0; // edi@1 + int v1; // ebx@3 + Player *v2; // esi@3 + int v3; // eax@4 + signed int v4; // eax@9 + int v5; // ebx@11 + char *v6; // esi@13 + char *v7; // eax@14 + signed int v8; // edi@14 + int v9; // [sp+Ch] [bp-Ch]@11 + signed int v10; // [sp+10h] [bp-8h]@13 + int v11; // [sp+14h] [bp-4h]@1 + char *v12; // [sp+14h] [bp-4h]@11 + + dword_F8B1A8 = 0; + v11 = 0; + uDialogueType = 84; + ptr_F8B1E8 = (char *)dword_722B44; + v0 = _4F0882_evt_VAR_PlayerItemInHands_vals; + while ( 1 ) + { + if ( (unsigned __int16)_449B57_test_bit(pParty->_award_bits, *(v0 - 1)) ) + { + v1 = 0; + v2 = pParty->pPlayers; + do + { + LOBYTE(v3) = v2->CompareVariable(VAR_PlayerItemInHands, *v0); + if ( v3 ) + break; + ++v2; + ++v1; + } + while ( (signed int)v2 < (signed int)pParty->pHirelings ); + if ( v1 == 4 ) + break; + } + ++v11; + v0 += 2; + if ( (signed int)v0 >= (signed int)((char *)dword_4F08EC + 2) ) + goto LABEL_10; + } + ptr_F8B1E8 = (char *)dword_722B3C; + v4 = _4F0882_evt_VAR_PlayerItemInHands_vals[2 * v11]; + dword_F8B1A8 = _4F0882_evt_VAR_PlayerItemInHands_vals[2 * v11]; + pParty->pPlayers[0].AddVariable(VAR_PlayerItemInHands, v4); +LABEL_10: + if ( dword_F8B1A8 == 601 ) + { + v5 = 0; + v12 = (char *)&pParty->pPlayers[0].uClass; + v9 = 0; + while ( 1 ) + { + if ( *v12 == 35 ) + { + v10 = 0; + v6 = &pParty->pPlayers[0].pInventoryItems[0].field_1A; + do + { + v7 = v6; + v8 = 138; + do + { + if ( *(int *)(v7 - 26) == 601 ) + { + if ( !*v7 ) + v9 = (int)(v7 - 26); + if ( (unsigned __int8)*v7 == v5 ) + v10 = 1; + } + v7 += 36; + --v8; + } + while ( v8 ); + v6 += 6972; + } + while ( (signed int)v6 < (signed int)((char *)&pParty->field_777C[91] + 2) ); + if ( !v10 ) + break; + } + v12 += 6972; + ++v5; + if ( (signed int)v12 >= (signed int)((char *)&pParty->pPickedItem.uExpireTime + 5) ) + return; + } + if ( v9 ) + *(char *)(v9 + 26) = v5; + } +} +// 4F08EC: using guessed type int dword_4F08EC[]; +// 722B3C: using guessed type int dword_722B3C; +// 722B44: using guessed type int dword_722B44; +// F8B1A8: using guessed type int dword_F8B1A8; + +//----- (004B2001) -------------------------------------------------------- +void __fastcall sub_4B2001(signed int a1) +{ + signed int v1; // eax@1 + NPCData *v2; // ebp@1 + int v3; // ecx@8 + Player *v4; // esi@20 + int v5; // eax@28 + int v6; // eax@31 + int v7; // eax@34 + int v8; // eax@37 + int v9; // eax@40 + unsigned int v10; // eax@43 + unsigned int v11; // eax@48 + char *v12; // eax@53 + char *v13; // eax@56 + char *v14; // eax@57 + char *v15; // eax@58 + unsigned int v16; // ebp@62 + char *v17; // ecx@63 + char *v18; // eax@65 + const char *v19; // ecx@68 + unsigned int v20; // eax@69 + unsigned int v21; // ecx@70 + char *v22; // [sp-Ch] [bp-18h]@73 + int v23; // [sp-8h] [bp-14h]@49 + char *v24; // [sp-8h] [bp-14h]@73 + int v25; // [sp-4h] [bp-10h]@49 + + v1 = a1; + uDialogueType = a1 + 1; + v2 = array_5913D8[(unsigned int)((char *)array_5913D8[6] + -(dword_591080 != 0) - 1)]; + if ( a1 <= 23 ) + { + if ( a1 == 23 ) + { + v3 = v2->evte; + } + else + { + if ( a1 == 13 ) + { + ptr_F8B1E8 = (char *)*(&pNPCStats->field_13A64 + 5 * v2->uProfession); + ptr_F8B1E8 = sub_495461(ptr_F8B1E8, uActiveCharacter - 1, 0, 0, 0, 0); + sub_4B40E6(); + byte_F8B1EC = 0; + goto _return; + } + switch ( a1 ) + { + case 19: + v3 = v2->bDrawSomeAnim; + break; + case 20: + v3 = v2->evtb; + break; + case 21: + v3 = v2->evtc; + break; + default: + if ( a1 != 22 ) + goto _return; + v3 = v2->evtd; + break; + } + } + goto LABEL_84; + } + if ( a1 == 24 ) + { + v3 = v2->evtf; +LABEL_84: + if ( v3 < 200 || v3 > 310 ) + { + if ( v3 < 400 || v3 > 410 ) + { + if ( v3 == 139 ) + { + sub_4B1ECE(); + } + else + { + if ( v3 == 311 ) + { + sub_4BBA85_bounties(); + } + else + { + ptr_F8B1E8 = 0; + _5C3420_pDecoration = (LevelDecoration *)1; + EventProcessor(v3, 0, 1); + _5C3420_pDecoration = 0; + } + } + } + else + { + dword_F8B1D8 = v1; + sub_4B3EF0(v3 - 400); + } + } + else + { + sub_4B3FE5(v3); + } + goto _return; + } + if ( a1 != 76 ) + { + if ( a1 == 77 ) + { + v16 = v2->uProfession; + if ( byte_F8B1EC ) + v17 = (char *)*(&pNPCStats->field_13A64 + 5 * v16); + else + v17 = (char *)*(&pNPCStats->field_13A5C + 5 * v16); + ptr_F8B1E8 = v17; + v18 = sub_495461(v17, uActiveCharacter - 1, 0, 0, 0, 0); + byte_F8B1EC ^= 1u; + ptr_F8B1E8 = v18; + } + else + { + if ( a1 == 79 ) + { + if ( dword_F8B1A8 ) + { + Party::TakeGold(dword_F8B1B4); + if ( uActiveCharacter ) + { + v12 = (char *)&pPlayers[uActiveCharacter]->pActiveSkills[dword_F8B1AC_something_todo_with_awards]; + *(short *)v12 &= 0x3Fu; + switch ( dword_F8B1B0 ) + { + case 2: + v15 = (char *)&pPlayers[uActiveCharacter]->pActiveSkills[dword_F8B1AC_something_todo_with_awards]; + *v15 |= 0x40u; + break; + case 3: + v14 = (char *)&pPlayers[uActiveCharacter]->pActiveSkills[dword_F8B1AC_something_todo_with_awards]; + *v14 |= 0x80u; + break; + case 4: + v13 = (char *)&pPlayers[uActiveCharacter]->pActiveSkills[dword_F8B1AC_something_todo_with_awards]; + v13[1] |= 1u; + break; + } + pPlayers[uActiveCharacter]->PlaySound(85, 0); + } + if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + { + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; + ++pMessageQueue_50CBD0->uNumMessages; + } + } + } + else + { + if ( a1 == 82 && dword_F8B1A8 ) + { + Party::TakeGold(dword_F8B1B4); + v4 = pParty->pPlayers; + do + { + v4->SetVariable(VAR_Award, dword_F8B1AC_something_todo_with_awards); + ++v4; + } + while ( (signed int)v4 < (signed int)pParty->pHirelings ); + switch ( dword_F8B1D8 ) + { + case 19: + v10 = v2->bDrawSomeAnim; + if ( (signed int)v10 >= 400 && (signed int)v10 <= 416 ) + v2->bDrawSomeAnim = 0; + break; + case 20: + v9 = v2->evtb; + if ( v9 >= 400 && v9 <= 416 ) + v2->evtb = 0; + break; + case 21: + v8 = v2->evtc; + if ( v8 >= 400 && v8 <= 416 ) + v2->evtc = 0; + break; + case 22: + v7 = v2->evtd; + if ( v7 >= 400 && v7 <= 416 ) + v2->evtd = 0; + break; + case 23: + v6 = v2->evte; + if ( v6 >= 400 && v6 <= 416 ) + v2->evte = 0; + break; + case 24: + v5 = v2->evtf; + if ( v5 >= 400 ) + { + if ( v5 <= 416 ) + v2->evtf = 0; + } + break; + } + if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + { + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; + ++pMessageQueue_50CBD0->uNumMessages; + } + v11 = uActiveCharacter; + if ( uActiveCharacter ) + { + v25 = 0; + v23 = 86; +LABEL_50: + pPlayers[v11]->PlaySound(v23, v25); + goto _return; + } + } + } + } + goto _return; + } + if ( pParty->pHirelings[0].pName && pParty->pHirelings[1].pName ) + { + v19 = pGlobalTXT_LocalizationStrings[533]; // ""I cannot join you, you're party is full"" +LABEL_77: + ShowStatusBarString(v19, 2u); + goto _return; + } + v20 = v2->uProfession; + if ( v20 != 51 ) + { + v21 = *(&pNPCStats->field_13A58 + 5 * v20); + if ( pParty->uNumGold < v21 ) + { + ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2u); + byte_F8B1EC = 0; + uDialogueType = 13; + ptr_F8B1E8 = (char *)*(&pNPCStats->field_13A64 + 5 * v2->uProfession); + ptr_F8B1E8 = sub_495461(ptr_F8B1E8, uActiveCharacter - 1, 0, 0, 0, 0); + if ( uActiveCharacter ) + pPlayers[uActiveCharacter]->PlaySound(38, 0); + v19 = pGlobalTXT_LocalizationStrings[155]; + goto LABEL_77; + } + Party::TakeGold(v21); + } + LOBYTE(v2->uFlags) |= 0x80u; + pParty->field_709 = 0; + sub_44A56A(); + if ( pParty->pHirelings[0].pName ) + { + memcpy(&pParty->pHirelings[1], v2, sizeof(pParty->pHirelings[1])); + v24 = v2->pName; + v22 = pParty->pHireling2Name; + } + else + { + memcpy(pParty->pHirelings, v2, 0x4Cu); + v24 = v2->pName; + v22 = pParty->pHireling1Name; + } + strcpy(v22, v24); + pParty->field_709 = 0; + sub_44A56A(); + PrepareHouse((unsigned int)ptr_507BC0->ptr_1C); + dword_F8B19C = 1; + if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + { + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; + ++pMessageQueue_50CBD0->uNumMessages; + } + v11 = uActiveCharacter; + if ( uActiveCharacter ) + { + v25 = 0; + v23 = 61; + goto LABEL_50; + } +_return: + pVideoPlayer->_4BF5B2(); +} +// 591080: using guessed type int dword_591080; +// F8B19C: using guessed type int dword_F8B19C; +// F8B1A8: using guessed type int dword_F8B1A8; +// F8B1B0: using guessed type int dword_F8B1B0; +// F8B1B4: using guessed type int dword_F8B1B4; +// F8B1D8: using guessed type int dword_F8B1D8; +// F8B1EC: using guessed type char byte_F8B1EC; + +//----- (004B254D) -------------------------------------------------------- +char *__thiscall _4B254D_SkillMasteryTeacher(int _this) +{ + Player *v1; // esi@1 + int v2; // edx@1 + int v3; // ecx@1 + int v4; // edi@1 + int v5; // eax@7 + int v6; // eax@7 + int v7; // ebx@7 + int v8; // ebx@8 + signed int v9; // esi@8 + int v10; // eax@8 + char *v11; // ecx@8 + int v12; // edi@9 + char *v13; // edx@9 + signed int v14; // edi@10 + unsigned int v16; // eax@29 + int v17; // eax@36 + char v18; // cl@46 + __int16 v19; // dx@56 + int v20; // eax@60 + char *v21; // [sp-Ch] [bp-38h]@82 + const char *v22; // [sp-8h] [bp-34h]@21 + unsigned int v23; // [sp-8h] [bp-34h]@38 + char *v24; // [sp-8h] [bp-34h]@82 + char *v25; // [sp-4h] [bp-30h]@14 + int v26; // [sp-4h] [bp-30h]@38 + int v27; // [sp-4h] [bp-30h]@82 + char v28[4]; // [sp+Ch] [bp-20h]@9 + int v29; // [sp+10h] [bp-1Ch]@13 + int v30; // [sp+14h] [bp-18h]@15 + int v31; // [sp+18h] [bp-14h]@16 + unsigned __int16 a1[2]; // [sp+1Ch] [bp-10h]@7 + int v33; // [sp+20h] [bp-Ch]@7 + int v34; // [sp+24h] [bp-8h]@7 + char *v35; // [sp+28h] [bp-4h]@1 + + v1 = pPlayers[uActiveCharacter]; + dword_F8B1A8 = 0; + v2 = (_this - 200) % 3; + v3 = (_this - 200) / 3; + v4 = v2; + v35 = (char *)dword_721A64; + dword_F8B1AC_something_todo_with_awards = v3; + if ( v2 ) + { + if ( v2 == 1 ) + { + dword_F8B1B4 = 5000; + dword_F8B1B0 = 3; + } + else + { + if ( v2 == 2 ) + { + dword_F8B1B4 = 8000; + dword_F8B1B0 = 4; + } + } + } + else + { + dword_F8B1B4 = 2000; + dword_F8B1B0 = 2; + } + v5 = v1->uClass; + v33 = v5; + v6 = byte_4ED970_skill_learn_ability_by_class_table[v5][v3]; + *(int *)a1 = v1->pActiveSkills[v3]; + v7 = a1[0] & 0x3F; + v34 = v2 + 2; + if ( v6 < v2 + 2 ) + { + v8 = v33; + v9 = 0; + v10 = v33 - v33 % 4; + v11 = &byte_4ED970_skill_learn_ability_by_class_table[v33 - v33 % 4][v3]; + do + { + v12 = (unsigned __int8)*v11; + v13 = &v28[4 * v9]; + *(int *)v13 = 0; + if ( v12 < v34 ) + { + v14 = 1; + } + else + { + v14 = 1; + *(int *)v13 = 1; + } + ++v9; + v11 += 37; + } + while ( v9 < 4 ); + if ( v29 == v14 ) + { + v25 = pClassNames[v10 + 1]; + } + else + { + if ( v30 == v14 ) + { + if ( v31 == v14 ) + { + sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[634], pClassNames[v10 + 2], pClassNames[v10 + 3]); + return pTmpBuf; + } + v25 = pClassNames[v10 + 2]; + } + else + { + if ( v31 != v14 ) + { + v25 = pClassNames[v8]; + v22 = pGlobalTXT_LocalizationStrings[632]; + goto LABEL_23; + } + v25 = pClassNames[v10 + 3]; + } + } + v22 = pGlobalTXT_LocalizationStrings[633]; +LABEL_23: + sprintfex(pTmpBuf, v22, v25); + return pTmpBuf; + } + if ( !v1->CanAct() ) + return _721A3C_npc_text; + if ( !v7 ) + return (char *)_721A84_npc_text; + v16 = SkillToMastery(a1[0]); + if ( (signed int)v16 > v4 + 1 ) + return (char *)_721A6C_npc_text[2 * v4]; + if ( v34 != 2 ) + { + if ( v34 == 3 ) + { + if ( (signed int)v16 >= 2 && v7 >= 7 ) + { + v17 = dword_F8B1AC_something_todo_with_awards; + switch ( dword_F8B1AC_something_todo_with_awards ) + { + default: + goto LABEL_41; + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + dword_F8B1B4 = 4000; + goto LABEL_42; + case 19: + v19 = 114; + goto LABEL_57; + case 20: + v19 = 110; +LABEL_57: + if ( !(unsigned __int16)_449B57_test_bit(pParty->_award_bits, v19) ) + return v35; + goto LABEL_40; + case 22: + v20 = v1->GetBaseWillpower(); + goto LABEL_61; + case 24: + dword_F8B1B4 = 2500; + v20 = v1->GetBaseEndurance(); + goto LABEL_61; + case 36: + v20 = v1->GetBaseIntelligence(); +LABEL_61: + if ( v20 < 50 ) + return v35; + goto LABEL_40; + case 21: + case 23: + case 25: + case 26: + case 29: + case 32: + case 34: + case 35: + dword_F8B1B4 = 2500; + goto LABEL_42; + case 8: + case 9: + case 10: + case 11: + dword_F8B1B4 = 3000; + goto LABEL_42; + case 7: + goto LABEL_67; + } + goto LABEL_67; + } + } + else + { + if ( v34 != 4 ) + { +LABEL_40: + v17 = dword_F8B1AC_something_todo_with_awards; + goto LABEL_41; + } + if ( (signed int)v16 >= 3 && v7 >= 10 ) + { + v17 = dword_F8B1AC_something_todo_with_awards; + switch ( dword_F8B1AC_something_todo_with_awards ) + { + case 19: + if ( v1->_49327B(0x22u, 1) == 1 ) + goto LABEL_40; + v26 = 1; + v23 = 26; + goto LABEL_39; + default: + goto LABEL_41; + case 20: + if ( v1->_49327B(0x23u, 1) == 1 ) + goto LABEL_40; + v26 = 1; + v23 = 27; +LABEL_39: + if ( v1->_49327B(v23, v26) == 1 ) + goto LABEL_40; + return v35; + case 30: + v18 = LOBYTE(v1->pActiveSkills[31]); + goto LABEL_47; + case 31: + v18 = LOBYTE(v1->pActiveSkills[30]); +LABEL_47: + if ( (v18 & 0x3Fu) < 0xA ) + return v35; + goto LABEL_41; + case 21: + case 23: + case 24: + case 25: + case 26: + case 29: + case 32: + case 34: + case 35: + dword_F8B1B4 = 6000; + goto LABEL_42; + case 8: + case 9: + case 10: + case 11: + dword_F8B1B4 = 7000; + goto LABEL_42; + case 7: + break; + } +LABEL_67: + dword_F8B1B4 = 0; + goto LABEL_41; + } + } + return v35; + } + if ( v7 < 4 ) + return v35; + v17 = dword_F8B1AC_something_todo_with_awards; + if ( dword_F8B1AC_something_todo_with_awards > 27 ) + { + if ( dword_F8B1AC_something_todo_with_awards != 29 + && dword_F8B1AC_something_todo_with_awards != 32 + && (dword_F8B1AC_something_todo_with_awards <= 33 || dword_F8B1AC_something_todo_with_awards > 35) ) + { +LABEL_41: + if ( !dword_F8B1B4 ) + goto LABEL_79; + goto LABEL_42; + } +LABEL_87: + dword_F8B1B4 = 500; + goto LABEL_41; + } + if ( dword_F8B1AC_something_todo_with_awards >= 23 ) + goto LABEL_87; + if ( dword_F8B1AC_something_todo_with_awards == 7 ) + { + dword_F8B1B4 = 0; + goto LABEL_79; + } + if ( dword_F8B1AC_something_todo_with_awards <= 7 ) + goto LABEL_41; + if ( dword_F8B1AC_something_todo_with_awards > 18 ) + { + if ( dword_F8B1AC_something_todo_with_awards != 21 ) + goto LABEL_41; + goto LABEL_87; + } + dword_F8B1B4 = 1000; +LABEL_42: + if ( dword_F8B1B4 > pParty->uNumGold ) + return (char *)dword_721A4C; +LABEL_79: + dword_F8B1A8 = 1; + if ( v34 == 2 ) + { + v27 = dword_F8B1B4; + v24 = pSkillNames[v17]; + v21 = pGlobalTXT_LocalizationStrings[433]; + goto LABEL_90; + } + if ( v34 == 3 ) + { + v27 = dword_F8B1B4; + v24 = pSkillNames[v17]; + v21 = pGlobalTXT_LocalizationStrings[432]; + goto LABEL_90; + } + if ( v34 == 4 ) + { + v27 = dword_F8B1B4; + v24 = pSkillNames[v17]; + v21 = pGlobalTXT_LocalizationStrings[225]; +LABEL_90: + sprintfex(pTmpBuf2, pGlobalTXT_LocalizationStrings[534], v21, v24, v27); + } + return pTmpBuf2; +} + + + +//----- (004B29F2) -------------------------------------------------------- +int __fastcall sub_4B29F2(int a1) +{ + int v1; // esi@1 + Player *v2; // edi@1 + int v3; // eax@1 + Player *v4; // ecx@1 + int result; // eax@2 + + v1 = a1; + dword_F8B1A8 = 0; + v2 = pPlayers[uActiveCharacter]; + v3 = a1 + 50; + v4 = pPlayers[uActiveCharacter]; + dword_F8B1AC_something_todo_with_awards = v3; + dword_F8B1B4 = dword_4F08EC[v1]; + if ( v4->CanAct() ) + { + if ( (unsigned __int16)_449B57_test_bit((unsigned __int8 *)v2->field_152, dword_F8B1AC_something_todo_with_awards) ) + { + result = dword_721A44; + } + else + { + if ( dword_F8B1B4 <= pParty->uNumGold ) + { + result = dword_7219DC[2 * v1]; + dword_F8B1A8 = 1; + } + else + { + result = dword_721A4C; + } + } + } + else + { + result = (int)_721A3C_npc_text; + } + return result; +} + + +//----- (004B2A74) -------------------------------------------------------- +char __cdecl sub_4B2A74() +{ + char *v0; // esi@3 + char *v1; // ST1C_4@3 + char *v2; // eax@3 + const char *v3; // ST1C_4@5 + int v4; // eax@5 + unsigned int i; // eax@5 + NPCData *v6; // esi@6 + unsigned __int16 v7; // bx@6 + unsigned int v8; // eax@6 + int v9; // eax@11 + unsigned int v10; // ecx@12 + int v11; // eax@12 + int v12; // esi@12 + char *v13; // eax@12 + GUIWindow *v14; // ebx@13 + char *v15; // esi@14 + GUIButton *v16; // eax@15 + unsigned int v17; // ecx@15 + int v18; // ecx@17 + int v19; // ecx@18 + int v20; // ecx@19 + int v21; // ecx@20 + int v22; // ecx@21 + unsigned int v23; // ecx@23 + int v24; // ecx@35 + int v25; // ecx@36 + int v26; // ecx@37 + int v27; // ecx@38 + int v28; // ecx@39 + char *v29; // esi@42 + unsigned int v30; // ST20_4@42 + int v31; // ST1C_4@42 + unsigned int v32; // eax@42 + char *v33; // eax@43 + int v34; // esi@51 + int v35; // eax@51 + unsigned int v36; // edi@51 + GUIButton *v37; // eax@52 + int v38; // eax@52 + signed int v39; // ecx@54 + int v40; // edi@57 + GUIButton *v41; // eax@60 + GUIButton *v42; // esi@60 + const char *v43; // ebx@60 + int v44; // eax@60 + unsigned int v45; // ecx@60 + unsigned __int16 v46; // ax@60 + GUIFont *v47; // ebx@64 + int v48; // esi@64 + char *v49; // eax@66 + GUIWindow w; // [sp+Ch] [bp-110h]@64 + GUIWindow v52; // [sp+60h] [bp-BCh]@13 + GUIWindow a1; // [sp+B4h] [bp-68h]@1 + unsigned int v54; // [sp+108h] [bp-14h]@14 + int v55; // [sp+10Ch] [bp-10h]@6 + int v56; // [sp+110h] [bp-Ch]@13 + char *pInString; // [sp+114h] [bp-8h]@12 + NPCData *v58; // [sp+118h] [bp-4h]@6 + + memcpy(&a1, pDialogueWindow, sizeof(a1)); + if ( array_5913D8[6] == (NPCData *)uNumDialogueNPCPortraits && uHouse_ExitPic ) + { + v0 = pMapStats->pInfos[uHouse_ExitPic].pName; + v1 = pMapStats->pInfos[uHouse_ExitPic].pName; + a1.uFrameX = 493; + a1.uFrameWidth = 126; + a1.uFrameZ = 366; + a1.DrawText2(pFontCreate, 0, 2u, 0, v1, 3u); + a1.uFrameX = 483; + a1.uFrameWidth = 148; + a1.uFrameZ = 334; + v2 = (&off_4EB080)[4 * uHouse_ExitPic]; + if ( !v2 ) + { + sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[411], v0); + v2 = pTmpBuf; + } + v3 = v2; + v4 = pFontCreate->CalcTextHeight(v2, &a1, 0, 0); + LOBYTE(i) = (unsigned int)a1.DrawText2(pFontCreate, 0, (212 - v4) / 2 + 101, 0, v3, 3u); + return i; + } + a1.uFrameWidth -= 10; + a1.uFrameZ -= 10; + v58 = array_5913D8[(unsigned int)((char *)array_5913D8[6] + -(dword_591080 != 0) - 1)]; + v6 = v58; + v55 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xE1u, 0xCDu, 0x23u); + v7 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0x15u, 0x99u, 0xE9u); + v8 = v6->uProfession; + if ( v8 ) + sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[429], v6->pName, aNPCProfessionNames[v8]); + else + strcpy(pTmpBuf, v6->pName); + a1.DrawText2(pFontCreate, 0x1E3u, 0x71u, v7, pTmpBuf, 3u); + if ( !dword_591080 ) + { + if ( !uDialogueType ) + { + v9 = v6->greet; + if ( v9 ) + { + v10 = v6->uFlags; + a1.uFrameWidth = 460; + a1.uFrameZ = 452; + pInString = (char *)*(&pNPCStats->field_17884 + ((v10 & 3) == 2) + 2 * v9); + v11 = pFontArrus->CalcTextHeight(pInString, &a1, 13, 0); + v12 = v11 + 7; + pRenderer->_4A6A68( + 8u, + 352 - (v11 + 7), + (Texture *)(uTextureID_Leather != -1 ? &pIcons_LOD->pTextures[uTextureID_Leather] : 0), + (uTextureID_Leather != -1 ? pIcons_LOD->pTextures[uTextureID_Leather].uTextureHeight : 26) - (v11 + 7)); + pRenderer->DrawTextureIndexed(8u, 347 - v12, pTexture_591428); + v13 = FitTextInAWindow(pInString, pFontArrus, &a1, 0xDu, 0); + pDialogueWindow->DrawText(pFontArrus, 13, 354 - v12, 0, v13, 0, 0, 0); + } + } + } + v14 = pDialogueWindow; + memcpy(&v52, pDialogueWindow, sizeof(v52)); + v52.uFrameX = 483; + v52.uFrameWidth = 148; + v52.uFrameZ = 334; + v56 = v52.field_38; + if ( v52.field_38 < v52.field_38 + v52.field_28 ) + { + v15 = (char *)v54; + while ( 1 ) + { + v16 = v52.GetControl(v56); + v17 = v16->uControlParam; + pInString = (char *)v16; + if ( (signed int)v17 > 24 ) + { + v24 = v17 - 76; + if ( !v24 ) + { + v15 = pGlobalTXT_LocalizationStrings[406]; + goto LABEL_49; + } + v25 = v24 - 1; + if ( !v25 ) + { + v15 = pGlobalTXT_LocalizationStrings[407]; + goto LABEL_49; + } + v26 = v25 - 2; + if ( !v26 ) + { + v33 = _4B254D_SkillMasteryTeacher((int)v52.ptr_1C); +LABEL_44: + v15 = v33; +LABEL_45: + v16 = (GUIButton *)pInString; + goto LABEL_49; + } + v27 = v26 - 3; + if ( !v27 ) + { + v33 = (char *)sub_4B29F2((int)v52.ptr_1C); + goto LABEL_44; + } + v28 = v27 - 1; + if ( !v28 ) + { + v29 = (char *)&pMonsterStats + 88 * word_F8B1A0; + v30 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu); + v31 = *(int *)v29; + v32 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); + sprintfex(pTmpBuf, &byte_4F0F98, v32, v31, v30); + sprintfex(pTmpBuf2, dword_F8B1A4, pTmpBuf, 100 * (unsigned __int8)v29[8]); + ptr_F8B1E8 = pTmpBuf2; + v15 = nullstring; + goto LABEL_45; + } + if ( v28 != 10 ) + goto LABEL_41; + } + else + { + if ( v17 == 24 ) + { + v23 = v58->evtf; +LABEL_33: + v15 = (&dword_721660)[8 * v23]; + if ( !v15 ) + { + v16->uControlParam = 0; + v15 = nullstring; + } + goto LABEL_49; + } + v18 = v17 - 13; + if ( v18 ) + { + v19 = v18 - 6; + if ( !v19 ) + { + v23 = v58->bDrawSomeAnim; + goto LABEL_33; + } + v20 = v19 - 1; + if ( !v20 ) + { + v15 = (&dword_721660)[8 * v58->evtb]; + if ( !v15 ) + { + v16->uControlParam = 0; + v15 = nullstring; + } + if ( uDialogueType != 84 ) + goto LABEL_49; + sprintfex(pTmpBuf, format_4E2D80, v55, pItemsTable->pItems[dword_F8B1A8].pUnidentifiedName); + sprintfex(pTmpBuf2, ptr_F8B1E8, pTmpBuf); + ptr_F8B1E8 = pTmpBuf2; + goto LABEL_45; + } + v21 = v20 - 1; + if ( !v21 ) + { + v23 = v58->evtc; + goto LABEL_33; + } + v22 = v21 - 1; + if ( !v22 ) + { + v23 = v58->evtd; + goto LABEL_33; + } + if ( v22 == 1 ) + { + v23 = v58->evte; + goto LABEL_33; + } +LABEL_41: + v15 = nullstring; + goto LABEL_49; + } + v15 = pGlobalTXT_LocalizationStrings[122]; + } +LABEL_49: + strcpy(v16->pButtonName, v15); + ++v56; + if ( v56 >= v52.field_38 + v52.field_28 ) + { + v14 = pDialogueWindow; + break; + } + } + } + v34 = 0; + v54 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu); + v35 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xE1u, 0xCDu, 0x23u); + v36 = v14->field_38; + v55 = v35; + for ( i = v36 + v14->field_28; (signed int)v36 < (signed int)i; i = pDialogueWindow->field_28 + + pDialogueWindow->field_38 ) + { + v37 = v14->GetControl(v36); + v38 = pFontArrus->CalcTextHeight(v37->pButtonName, &v52, 0, 0); + v14 = pDialogueWindow; + v34 += v38; + ++v36; + } + v39 = v14->field_28; + if ( v39 ) + { + v58 = (NPCData *)((174 - v34) / v39); + if ( (signed int)v58 > 32 ) + v58 = (NPCData *)32; + pInString = (char *)2; + v40 = (174 - (signed int)v58 * v39 - v34) / 2 - (signed int)v58 / 2 + 138; + v56 = v14->field_38; + i = v56; + if ( (signed int)i < (signed int)(i + v39) ) + { + while ( 1 ) + { + v41 = v14->GetControl(i); + v42 = v41; + v43 = v41->pButtonName; + v41->uY = (unsigned int)((char *)v58 + v40); + v44 = pFontArrus->CalcTextHeight(v41->pButtonName, &v52, 0, 0); + v45 = v42->uY; + v42->uHeight = v44; + v40 = v45 + v44 - 1; + v42->uW = v40; + v46 = v55; + if ( (char *)pDialogueWindow->field_2C_focus_id != pInString ) + v46 = v54; + v52.DrawText2(pFontArrus, 0, v45, v46, v43, 3u); + v14 = pDialogueWindow; + ++pInString; + ++v56; + i = pDialogueWindow->field_28 + pDialogueWindow->field_38; + if ( v56 >= (signed int)i ) + break; + i = v56; + } + } + } + if ( ptr_F8B1E8 ) + { + w.uFrameWidth = 458; + w.uFrameZ = 457; + v47 = pFontArrus; + v48 = pFontArrus->CalcTextHeight(ptr_F8B1E8, &w, 13, 0) + 7; + if ( 352 - v48 < 8 ) + { + v47 = pFontCreate; + v48 = pFontCreate->CalcTextHeight(ptr_F8B1E8, &w, 13, 0) + 7; + } + pRenderer->_4A6A68( + 8u, + 352 - v48, + (Texture *)(uTextureID_Leather != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_Leather] : 0), + (uTextureID_Leather != -1 ? pIcons_LOD->pTextures[uTextureID_Leather].uTextureHeight : 26) - v48); + pRenderer->DrawTextureIndexed(8u, 347 - v48, pTexture_591428); + v49 = FitTextInAWindow(ptr_F8B1E8, v47, &w, 0xDu, 0); + LOBYTE(i) = a1.DrawText(v47, 13, 354 - v48, 0, v49, 0, 0, 0); + } + return i; +} + + + + + +//----- (004B36CC) -------------------------------------------------------- +GUIButton *__fastcall sub_4B36CC(int a1, unsigned int a2) +{ + return pDialogueWindow->CreateButton( + 0x1E0u, + 30 * a1 + 146, + 0x8Cu, + 0x1Eu, + 1, + 0, + 0x195u, + a2, + 0, + nullstring, + 0); +} + +//----- (004B3703) -------------------------------------------------------- +int __thiscall sub_4B3703(void *_this) +{ + signed int v1; // edi@1 + int v2; // eax@1 + char *v3; // ecx@1 + signed int v4; // ebx@1 + int v5; // ecx@2 + int v6; // ecx@3 + int v7; // ecx@4 + int v8; // ecx@5 + int v9; // ecx@6 + signed int v10; // ebx@13 + signed int v11; // edi@14 + signed int v12; // esi@15 + unsigned int v13; // ecx@16 + int v14; // ecx@16 + int v15; // ecx@17 + int v16; // ecx@19 + int v17; // ecx@20 + int v18; // ecx@21 + signed int v19; // esi@32 + char *v20; // ecx@33 + int v21; // ecx@34 + int v22; // ecx@36 + int v23; // ecx@37 + int v24; // ecx@38 + int v25; // ecx@39 + int v26; // ecx@40 + int v27; // ecx@41 + int *v28; // esi@54 + unsigned int v29; // edx@56 + char *v30; // ecx@65 + int v31; // ecx@106 + int result; // eax@107 + int v33; // [sp-4h] [bp-2Ch]@23 + int v34; // [sp-4h] [bp-2Ch]@43 + int v35[5]; // [sp+Ch] [bp-1Ch]@8 + int a2; // [sp+20h] [bp-8h]@1 + int v37; // [sp+24h] [bp-4h]@1 + + v1 = 0; + v2 = 0; + v3 = (char *)_this - 1; + a2 = 0; + v37 = 0; + dword_F8B1DC = 0; + v4 = 2; + if ( !v3 ) + { + while ( 1 ) + { + v19 = 1; + do + { + v20 = (char *)ptr_507BC0->ptr_1C + 4 * (unsigned int)ptr_507BC0->ptr_1C + v19; + if ( v1 ) + v21 = word_4F063E[(signed int)v20]; + else + v21 = word_4F03FE[(signed int)v20]; + v22 = v21 - 23; + if ( v22 ) + { + v23 = v22 - 1; + if ( v23 ) + { + v24 = v23 - 1; + if ( v24 ) + { + v25 = v24 - 1; + if ( v25 ) + { + v26 = v25 - 1; + if ( v26 ) + { + v27 = v26 - 1; + if ( v27 ) + { + if ( v27 != v4 ) + goto LABEL_51; + v34 = 36; + } + else + { + v34 = 42; + } + } + else + { + v34 = 41; + } + } + else + { + v34 = 40; + } + } + else + { + v34 = 39; + } + } + else + { + v34 = 38; + } + } + else + { + v34 = 37; + } + v37 = sub_4BE571(v34, v35, v37, 5); + v2 = dword_F8B1DC; + v4 = 2; +LABEL_51: + ++v19; + } + while ( v19 <= 4 ); + ++v1; + if ( v1 >= v4 ) + goto LABEL_53; + } + } + v5 = (int)(v3 - 1); + if ( !v5 ) + { + v10 = 0; + while ( 1 ) + { + v11 = 0; + do + { + v12 = 1; + do + { + v13 = v11 + 2 * (unsigned int)ptr_507BC0->ptr_1C - 30; + v14 = v12 + 4 * v13 + v13; + if ( v10 ) + v15 = word_4F06D8[v14]; + else + v15 = word_4F0498[v14]; + v16 = v15 - 31; + if ( v16 ) + { + v17 = v16 - 1; + if ( v17 ) + { + v18 = v17 - 1; + if ( v18 ) + { + if ( v18 != 1 ) + goto LABEL_28; + v33 = 44; + } + else + { + v33 = 47; + } + } + else + { + v33 = 46; + } + } + else + { + v33 = 45; + } + v37 = sub_4BE571(v33, v35, v37, 5); + v2 = dword_F8B1DC; +LABEL_28: + ++v12; + } + while ( v12 <= 4 ); + ++v11; + } + while ( v11 < 2 ); + ++v10; + if ( v10 >= 2 ) + goto LABEL_53; + } + } + v6 = v5 - 1; + if ( v6 ) + { + v7 = v6 - 1; + if ( v7 ) + { + v8 = v7 - 17; + if ( v8 ) + { + v9 = v8 - 2; + if ( v9 ) + { + if ( v9 == 7 ) + { + v37 = 2; + v35[0] = 69; + v35[1] = 60; + } + } + else + { + v37 = 3; + v35[0] = 67; + v35[1] = 66; + v35[2] = 58; + } + } + else + { + v37 = 3; + v35[0] = 70; + v35[1] = 65; + v35[2] = 62; + } + } + else + { + v37 = 2; + v35[0] = 71; + v35[1] = 68; + } + } + else + { + v37 = 2; + v35[0] = 57; + v35[1] = 59; + } +LABEL_53: + if ( v37 > 0 ) + { + v28 = v35; + while ( 1 ) + { + v29 = *v28; + if ( *v28 <= 47 ) + break; + if ( (signed int)v29 <= 66 ) + { + if ( v29 == 66 ) + { + v30 = pSkillNames[30]; + goto LABEL_106; + } + if ( v29 == 57 ) + { + v30 = pSkillNames[21]; + goto LABEL_106; + } + if ( v29 == 58 ) + { + v30 = pSkillNames[22]; + goto LABEL_106; + } + if ( v29 == 60 ) + { + v30 = pSkillNames[24]; + goto LABEL_106; + } + if ( v29 == 62 ) + { + v30 = pSkillNames[26]; + goto LABEL_106; + } + if ( v29 == 65 ) + { + v30 = pSkillNames[29]; + goto LABEL_106; + } + goto LABEL_100; + } + switch ( v29 ) + { + case 0x43u: + v30 = pSkillNames[31]; + break; + case 0x44u: + v30 = pSkillNames[32]; + break; + case 0x45u: + v30 = pSkillNames[33]; + break; + case 0x46u: + v30 = pSkillNames[34]; + break; + default: + if ( v29 != 71 ) + goto LABEL_100; + v30 = pSkillNames[35]; + break; + } +LABEL_106: + pShopOptions[v2] = v30; + v31 = a2++; + dword_F8B1DC = v2 + 1; + sub_4B36CC(v31, v29); + ++v28; + if ( a2 >= v37 ) + goto LABEL_107; + v2 = dword_F8B1DC; + } + if ( *v28 == 47 ) + { + v30 = pSkillNames[11]; + goto LABEL_106; + } + if ( (signed int)v29 > 40 ) + { + if ( v29 == 41 ) + { + v30 = pSkillNames[5]; + goto LABEL_106; + } + if ( v29 == 42 ) + { + v30 = pSkillNames[6]; + goto LABEL_106; + } + if ( v29 == 44 ) + { + v30 = pSkillNames[8]; + goto LABEL_106; + } + if ( v29 == 45 ) + { + v30 = pSkillNames[9]; + goto LABEL_106; + } + if ( v29 == 46 ) + { + v30 = pSkillNames[10]; + goto LABEL_106; + } + } + else + { + if ( v29 == 40 ) + { + v30 = pSkillNames[4]; + goto LABEL_106; + } + if ( v29 == 5 ) + { + v30 = pSkillNames[23]; + goto LABEL_106; + } + if ( v29 == 36 ) + { + v30 = pSkillNames[0]; + goto LABEL_106; + } + if ( v29 == 37 ) + { + v30 = pSkillNames[1]; + goto LABEL_106; + } + if ( v29 == 38 ) + { + v30 = pSkillNames[2]; + goto LABEL_106; + } + if ( v29 == 39 ) + { + v30 = pSkillNames[3]; + goto LABEL_106; + } + } +LABEL_100: + v30 = pGlobalTXT_LocalizationStrings[127]; + goto LABEL_106; + } +LABEL_107: + pDialogueWindow->_41D08F(a2, 1, 0, 2); + result = pDialogueWindow->field_28; + dword_F8B1E0 = pDialogueWindow->field_28; + return result; +} + + +//----- (004B3A72) -------------------------------------------------------- +int __thiscall sub_4B3A72(int a1) +{ + int v1; // esi@1 + int result; // eax@4 + + v1 = 0; + if ( a1 == 21 ) + { + sub_4B36CC(0, 0x66u); + v1 = 2; + sub_4B36CC(1, 0x67u); + if ( pParty->HasItem(0x28Bu) ) + { + v1 = 3; + sub_4B36CC(2, 0x68u); + } + } + pDialogueWindow->_41D08F(v1, 1, 0, 2); + result = pDialogueWindow->field_28; + dword_F8B1E0 = pDialogueWindow->field_28; + return result; +} +// F8B1E0: using guessed type int dword_F8B1E0; + +//----- (004B3AD4) -------------------------------------------------------- +int __fastcall sub_4B3AD4(signed int a1) +{ + int result; // eax@7 + int v2; // [sp-10h] [bp-10h]@4 + int v3; // [sp-Ch] [bp-Ch]@4 + int v4; // [sp-8h] [bp-8h]@4 + int v5; // [sp-4h] [bp-4h]@4 + + if ( a1 > 0 ) + { + if ( a1 <= 3 ) + { + sub_4B36CC(0, 3u); + sub_4B36CC(1, 4u); + sub_4B36CC(2, 5u); + v5 = 2; + v4 = 0; + v3 = 1; + v2 = 3; + goto LABEL_6; + } + if ( a1 == 4 ) + { + sub_4B36CC(0, 3u); + sub_4B36CC(1, 4u); + v5 = 2; + v4 = 0; + v3 = 1; + v2 = 2; +LABEL_6: + pDialogueWindow->_41D08F(v2, v3, v4, v5); + goto LABEL_7; + } + } +LABEL_7: + result = pDialogueWindow->field_28; + dword_F8B1E0 = pDialogueWindow->field_28; + return result; +} +// F8B1E0: using guessed type int dword_F8B1E0; + +//----- (004B3B42) -------------------------------------------------------- +int __fastcall sub_4B3B42(signed int a1) +{ + int v1; // ecx@18 + int v2; // ecx@19 + int v3; // ecx@20 + signed int v4; // esi@22 + signed int v5; // eax@22 + unsigned int v6; // edx@24 + int v7; // ecx@24 + int result; // eax@43 + int v9; // [sp-10h] [bp-14h]@28 + int v10; // [sp-Ch] [bp-10h]@28 + int v11; // [sp-8h] [bp-Ch]@28 + unsigned int v12; // [sp-4h] [bp-8h]@4 + unsigned int v13; // [sp-4h] [bp-8h]@5 + unsigned int v14; // [sp-4h] [bp-8h]@9 + unsigned int v15; // [sp-4h] [bp-8h]@10 + unsigned int v16; // [sp-4h] [bp-8h]@14 + int v17; // [sp-4h] [bp-8h]@28 + + if ( a1 > 13 ) + { + if ( a1 > 22 ) + { + if ( a1 == 23 ) + { + sub_4B36CC(0, 0xAu); + sub_4B36CC(1, 0xBu); + v14 = 96; +LABEL_41: + sub_4B36CC(2, v14); + v17 = 2; + v11 = 0; + v10 = 1; + v9 = 3; + goto LABEL_42; + } + if ( a1 <= 26 ) + goto LABEL_43; + if ( a1 > 28 ) + { + if ( a1 != 30 ) + goto LABEL_43; + sub_4B36CC(0, 0x11u); + v16 = 96; + goto LABEL_37; + } + sub_4B36CC(0, 0x69u); + sub_4B36CC(1, 0x6Au); + sub_4B36CC(2, 0x6Bu); + v12 = 108; + } + else + { + if ( a1 == 22 ) + { + sub_4B36CC(0, 7u); + v16 = 8; + goto LABEL_37; + } + v1 = a1 - 14; + if ( !v1 ) + { + sub_4B36CC(0, 0x12u); + sub_4B36CC(1, 0x30u); + sub_4B36CC(2, 0x31u); + sub_4B36CC(3, 0x32u); + sub_4B36CC(4, 0x33u); + v17 = 2; + v11 = 0; + v10 = 1; + v9 = 5; + goto LABEL_42; + } + v2 = v1 - 1; + if ( v2 ) + { + v3 = v2 - 2; + if ( v3 ) + { + if ( v3 != 4 ) + goto LABEL_43; + sub_4B36CC(0, 0xFu); + sub_4B36CC(1, 0x10u); + v4 = 3; + sub_4B36CC(2, 0x60u); + v5 = (signed int)ptr_507BC0->ptr_1C; + if ( v5 < 108 || v5 > 120 ) + goto LABEL_28; + v4 = 4; + v6 = 101; + v7 = 3; + } + else + { + v4 = 1; + sub_4B36CC(0, 0x63u); + if ( !pParty->uFine ) + { +LABEL_28: + v17 = 2; + v11 = 0; + v10 = 1; + v9 = v4; +LABEL_42: + pDialogueWindow->_41D08F(v9, v10, v11, v17); + goto LABEL_43; + } + v4 = 2; + v7 = 1; + v6 = 100; + } + sub_4B36CC(v7, v6); + goto LABEL_28; + } + sub_4B36CC(0, 0x12u); + sub_4B36CC(1, 0x34u); + sub_4B36CC(2, 0x35u); + v12 = 54; + } +LABEL_39: + sub_4B36CC(3, v12); + v17 = 2; + v11 = 0; + v10 = 1; + v9 = 4; + goto LABEL_42; + } + if ( a1 == 13 ) + { + sub_4B36CC(0, 0x12u); + v16 = 56; +LABEL_37: + sub_4B36CC(1, v16); + v17 = 2; + v11 = 0; + v10 = 1; + v9 = 2; + goto LABEL_42; + } + switch ( a1 ) + { + case 1: + case 2: + case 3: + case 4: + sub_4B36CC(0, 2u); + sub_4B36CC(1, 0x5Fu); + sub_4B36CC(2, 0x5Eu); + v12 = 96; + goto LABEL_39; + case 5: + sub_4B36CC(0, 0x12u); + v13 = 48; + goto LABEL_9; + case 6: + sub_4B36CC(0, 0x12u); + v13 = 49; + goto LABEL_9; + case 7: + sub_4B36CC(0, 0x12u); + v13 = 50; + goto LABEL_9; + case 8: + sub_4B36CC(0, 0x12u); + v13 = 51; +LABEL_9: + sub_4B36CC(1, v13); + v14 = 72; + goto LABEL_41; + case 9: + sub_4B36CC(0, 0x12u); + v15 = 52; + goto LABEL_13; + case 10: + sub_4B36CC(0, 0x12u); + v15 = 53; + goto LABEL_13; + case 11: + sub_4B36CC(0, 0x12u); + v15 = 54; +LABEL_13: + sub_4B36CC(1, v15); + v14 = 61; + goto LABEL_41; + case 12: + sub_4B36CC(0, 0x12u); + v16 = 55; + goto LABEL_37; + default: + break; + } +LABEL_43: + result = pDialogueWindow->field_28; + dword_F8B1E0 = pDialogueWindow->field_28; + return result; +} +// F8B1E0: using guessed type int dword_F8B1E0; + +//----- (004B3E1E) -------------------------------------------------------- +void __cdecl sub_4B3E1E() +{ + NPCData *v0; // ST40_4@1 + signed int v1; // edi@1 + GUIWindow *v2; // ecx@1 + + v0 = GetNPCData(uDialogue_SpeakingActorNPC_ID); + v1 = 0; + pDialogueWindow->uWindowType = 1; + pDialogueWindow->Release(); + v2 = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, (enum WindowType)10, 1, 0); + pDialogueWindow = v2; + if ( *(&pNPCStats->field_13A5C + 5 * v0->uProfession) ) + { + v2->CreateButton( + 0x1E0u, + 0xA0u, + 0x8Cu, + 0x1Eu, + 1, + 0, + 0x88u, + 0x4Du, + 0, + pGlobalTXT_LocalizationStrings[407], + 0); + v1 = 1; + } + pDialogueWindow->CreateButton( + 0x1E0u, + 30 * v1 + 160, + 0x8Cu, + 0x1Eu, + 1, + 0, + 0x88u, + 0x4Cu, + 0, + pGlobalTXT_LocalizationStrings[406], + 0); + pDialogueWindow->_41D08F(v1 + 1, 1, 0, 1); +} + +//----- (004B3EF0) -------------------------------------------------------- +void __fastcall sub_4B3EF0(int a4) +{ + int v1; // edi@1 + + v1 = a4; + uDialogueType = 81; + ptr_F8B1E8 = (char *)dword_721984[2 * a4]; + sub_4B29F2(a4); + pDialogueWindow->Release(); + pDialogueWindow = GUIWindow::Create(0, 0, 0x280u, 0x15Eu, WINDOW_Credits, v1, 0); + ptr_5076F4 = pDialogueWindow->CreateButton( + 0x1D7u, + 0x1BDu, + 0xA9u, + 0x23u, + 1, + 0, + 0x71u, + 0, + 0, + pGlobalTXT_LocalizationStrings[34], + (Texture *)(uTextureID_506438 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_506438] : 0), + 0); + pDialogueWindow->CreateButton(0, 0, 0, 0, 1, 0, 0x51u, 0, 0, nullstring, 0); + pDialogueWindow->CreateButton( + 0x1E0u, + 0xA0u, + 0x8Cu, + 0x1Eu, + 1, + 0, + 0xAFu, + 0x52u, + 0, + pGlobalTXT_LocalizationStrings[122], + 0); + pDialogueWindow->_41D08F(1, 1, 0, 2); + dword_F8B19C = -1; +} +// F8B19C: using guessed type int dword_F8B19C; + +//----- (004B3FE5) -------------------------------------------------------- +void __fastcall sub_4B3FE5(int a4) +{ + int v1; // edi@1 + char *v2; // edi@1 + + v1 = a4; + uDialogueType = 78; + ptr_F8B1E8 = (char *)dword_721BAC[2 * a4]; + _4B254D_SkillMasteryTeacher(a4); + pDialogueWindow->Release(); + pDialogueWindow = GUIWindow::Create(0, 0, 0x280u, 0x15Eu, WINDOW_Credits, v1, 0); + v2 = nullstring; + ptr_5076F4 = pDialogueWindow->CreateButton( + 0x1D7u, + 0x1BDu, + 0xA9u, + 0x23u, + 1, + 0, + 0x71u, + 0, + 0, + pGlobalTXT_LocalizationStrings[34], + (Texture *)(uTextureID_506438 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_506438] : 0), + 0); + pDialogueWindow->CreateButton(0, 0, 0, 0, 1, 0, 0x51u, 0, 0, nullstring, 0); + if ( dword_F8B1A8 ) + v2 = pGlobalTXT_LocalizationStrings[535]; + pDialogueWindow->CreateButton(0x1E0u, 0xA0u, 0x8Cu, 0x1Eu, 1, 0, 0xAFu, 0x4Fu, 0, v2, 0); + pDialogueWindow->_41D08F(1, 1, 0, 2); + dword_F8B19C = -1; +} +// F8B19C: using guessed type int dword_F8B19C; +// F8B1A8: using guessed type int dword_F8B1A8; + +//----- (004B40E6) -------------------------------------------------------- +void __cdecl sub_4B40E6() +{ + signed int v0; // ebx@1 + NPCData *v1; // edi@1 + + v0 = 0; + v1 = array_5913D8[(unsigned int)((char *)array_5913D8[6] + -(dword_591080 != 0) - 1)]; + pDialogueWindow->Release(); + pDialogueWindow = GUIWindow::Create(0, 0, 0x280u, 0x15Eu, WINDOW_Credits, 0, 0); + ptr_5076F4 = pDialogueWindow->CreateButton( + 0x1D7u, + 0x1BDu, + 0xA9u, + 0x23u, + 1, + 0, + 0x71u, + 0, + 0, + pGlobalTXT_LocalizationStrings[34], + (Texture *)(uTextureID_506438 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_506438] : 0), + 0); + pDialogueWindow->CreateButton(0, 0, 0, 0, 1, 0, 0x51u, 0, 0, nullstring, 0); + if ( *(&pNPCStats->field_13A5C + 5 * v1->uProfession) ) + { + pDialogueWindow->CreateButton( + 0x1E0u, + 0xA0u, + 0x8Cu, + 0x1Eu, + 1, + 0, + 0xAFu, + 0x4Du, + 0, + pGlobalTXT_LocalizationStrings[407], + 0); + v0 = 1; + } + pDialogueWindow->CreateButton( + 0x1E0u, + 30 * v0 + 160, + 0x8Cu, + 0x1Eu, + 1, + 0, + 0xAFu, + 0x4Cu, + 0, + pGlobalTXT_LocalizationStrings[406], + 0); + pDialogueWindow->_41D08F(v0 + 1, 1, 0, 2); + dword_F8B19C = -1; +} + + +//----- (004B4224) -------------------------------------------------------- +GUIButton *_4B4224_UpdateNPCTopics(int _this) +{ + int v1; // ebx@1 + GUIButton *result; // eax@3 + int i; // ebp@5 + signed int v4; // ebp@9 + void *v5; // ecx@14 + bool v6; // eax@16 + void *v7; // ecx@19 + bool v8; // eax@21 + void *v9; // ecx@24 + bool v10; // eax@26 + void *v11; // ecx@29 + bool v12; // eax@31 + void *v13; // ecx@34 + bool v14; // eax@36 + void *v15; // ecx@39 + bool v16; // eax@41 + NPCData *v17; // [sp+10h] [bp-4h]@4 + + v1 = 0; + array_5913D8[6] = (NPCData *)(_this + 1); + if ( _this + 1 == uNumDialogueNPCPortraits && uHouse_ExitPic ) + { + pDialogueWindow->Release(); + pDialogueWindow = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, WINDOW_Credits, 0, 0); + sprintfex(byte_591098, pGlobalTXT_LocalizationStrings[411], pMapStats->pInfos[uHouse_ExitPic].pName); + ptr_5076F4 = pDialogueWindow->CreateButton( + 0x236u, + 0x1BDu, + 0x4Bu, + 0x21u, + 1, + 0, + 0x71u, + 0, + 0x4Eu, + pGlobalTXT_LocalizationStrings[34],// "Cancel" + (Texture *)(uTextureID_BUTTDESC2 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_BUTTDESC2] : 0), + 0); + ptr_5076FC = pDialogueWindow->CreateButton( + 486u, + 445u, + 75u, + 33u, + 1, + 0, + 0xBFu, + 1u, + 0x59u, + byte_591098, + (Texture *)(uTextureID_BUTTYES2 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_BUTTYES2] : 0), + 0); + pDialogueWindow->CreateButton( + _4E5E50_transui_x, + _4E5EE0_transui_y, + 63u, + 73u, + 1, + 0, + 0xBFu, + 1u, + 0x20u, + byte_591098, + 0); + result = pDialogueWindow->CreateButton(8u, 8u, 460u, 344u, 1, 0, 0xBFu, 1u, 0x59u, byte_591098, 0); + } + else + { + v17 = array_5913D8[_this + 1 - ((dword_591080 != 0) + 1)]; + if ( dword_F8B19C == -1 ) + { + pDialogueWindow->Release(); + } + else + { + for ( i = 0; i < uNumDialogueNPCPortraits; ++i ) + GUIButton::_41D0D8((GUIButton *)array_5913D8[i + 7]); + } + v4 = 1; + pDialogueWindow = GUIWindow::Create(0, 0, 0x280u, 0x159u, WINDOW_Credits, 0, 0); + ptr_5076F4 = pDialogueWindow->CreateButton( + 471u, + 445u, + 169u, + 35u, + 1, + 0, + 0x71u, + 0, + 0, + pGlobalTXT_LocalizationStrings[74],// "End Conversation" + (Texture *)(uTextureID_506438 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_506438] : 0), + 0); + pDialogueWindow->CreateButton(8u, 8u, 0x1C2u, 0x140u, 1, 0, 0x51u, 0, 0, nullstring, 0); + if ( array_5913D8[6] == (NPCData *)1 && dword_591080 ) + { + result = (GUIButton *)sub_4B3B42(dword_F8B198); + } + else + { + if ( v17->joins ) + { + v1 = 1; + pDialogueWindow->CreateButton(480u, 160u, 140u, 30u, 1, 0, 0xAFu, 0xDu, 0, nullstring, 0); + } + v5 = (void *)v17->bDrawSomeAnim; + if ( v5 ) + { + if ( v1 < 4 ) + { + v6 = sub_4466C4(v5); + if ( v6 == 1 || v6 == 2 ) + pDialogueWindow->CreateButton( + 480u, + 30 * v1++ + 160, + 140u, + 30u, + 1, + 0, + 0xAFu, + 0x13u, + 0, + nullstring, + 0); + } + } + v7 = (void *)v17->evtb; + if ( v7 ) + { + if ( v1 < 4 ) + { + v8 = sub_4466C4(v7); + if ( v8 == 1 || v8 == 2 ) + pDialogueWindow->CreateButton( + 480u, + 30 * v1++ + 160, + 140u, + 30u, + 1, + 0, + 0xAFu, + 0x14u, + 0, + nullstring, + 0); + } + } + v9 = (void *)v17->evtc; + if ( v9 ) + { + if ( v1 < 4 ) + { + v10 = sub_4466C4(v9); + if ( v10 == 1 || v10 == 2 ) + pDialogueWindow->CreateButton( + 480u, + 30 * v1++ + 160, + 140u, + 30u, + 1, + 0, + 0xAFu, + 0x15u, + 0, + nullstring, + 0); + } + } + v11 = (void *)v17->evtd; + if ( v11 ) + { + if ( v1 < 4 ) + { + v12 = sub_4466C4(v11); + if ( v12 == 1 || v12 == 2 ) + pDialogueWindow->CreateButton( + 0x1E0u, + 30 * v1++ + 160, + 0x8Cu, + 0x1Eu, + 1, + 0, + 0xAFu, + 0x16u, + 0, + nullstring, + 0); + } + } + v13 = (void *)v17->evte; + if ( v13 ) + { + if ( v1 < 4 ) + { + v14 = sub_4466C4(v13); + if ( v14 == 1 || v14 == 2 ) + pDialogueWindow->CreateButton( + 0x1E0u, + 30 * v1++ + 160, + 0x8Cu, + 0x1Eu, + 1, + 0, + 0xAFu, + 0x17u, + 0, + nullstring, + 0); + } + } + v15 = (void *)v17->evtf; + if ( v15 ) + { + if ( v1 < 4 ) + { + v16 = sub_4466C4(v15); + if ( v16 == 1 || v16 == 2 ) + pDialogueWindow->CreateButton( + 0x1E0u, + 30 * v1++ + 160, + 0x8Cu, + 0x1Eu, + 1, + 0, + 0xAFu, + 0x18u, + 0, + nullstring, + 0); + } + } + pDialogueWindow->_41D08F(v1, 1, 0, 2); + v4 = 1; + result = (GUIButton *)pDialogueWindow->field_28; + dword_F8B1E0 = pDialogueWindow->field_28; + } + dword_F8B19C = v4; + } + return result; +} + + + +//----- (004B46A5) -------------------------------------------------------- +char __fastcall sub_4B46A5(const char *Str, int a5) +{ + const char *v2; // esi@1 + int v3; // edi@1 + int v4; // eax@1 + + v2 = Str; + v3 = a5; + pRenderer->DrawTextureRGB(0, 0x160u, pTexture_StatusBar); + v4 = pFontLucida->AlignText_Center(0x1C2u, v2); + return pGUIWindow0->DrawText(pFontLucida, v4 + 11, 357, v3, v2, 0, 0, 0); +} + +//----- (004B46F8) -------------------------------------------------------- +int __fastcall sub_4B46F8(int a1) +{ + int v1; // eax@1 + int i; // edx@1 + + v1 = 0; + for ( i = 0; i < a1; ++i ) + v1 += i + 1; + return 1000 * v1; +} + +//----- (004B4710) -------------------------------------------------------- +int __cdecl ui_training() +{ + Player *v0; // ebx@1 + int color2; // eax@1 + unsigned int v2; // ecx@1 + int v3; // eax@1 + signed int v4; // edx@1 + int v5; // edi@3 + unsigned int v6; // esi@3 + void *v7; // ecx@3 + int v8; // edx@4 + double v9; // st7@6 + signed int v10; // esi@6 + int v11; // ecx@6 + int result; // eax@9 + GUIWindow *v13; // edi@14 + signed int v14; // esi@14 + unsigned int v15; // esi@16 + int v16; // eax@16 + unsigned int v17; // eax@17 + int v18; // eax@19 + int v19; // ecx@24 + GUIButton *v20; // eax@26 + GUIButton *v21; // esi@26 + int v22; // eax@26 + const char *v23; // eax@28 + int v24; // eax@28 + unsigned int v25; // ecx@28 + int v26; // eax@28 + unsigned __int16 v27; // ax@28 + int v28; // eax@32 + unsigned __int16 v29; // ST14_2@34 + int v30; // eax@34 + const char *v31; // ST18_4@36 + unsigned __int16 v32; // ST14_2@36 + int v33; // eax@36 + int v34; // eax@37 + unsigned int v35; // edi@38 + unsigned int v36; // eax@38 + int v37; // ecx@41 + char *v38; // eax@41 + int *v39; // eax@45 + unsigned int v40; // eax@46 + void *v41; // ecx@46 + unsigned int v42; // eax@46 + GUIWindow *v43; // ecx@59 + int v44; // edx@59 + char **v45; // esi@60 + int v46; // eax@62 + int v47; // eax@68 + int v48; // edx@69 + int v49; // ebx@69 + unsigned __int8 v50; // sf@69 + char **v51; // edi@70 + GUIButton *v52; // eax@71 + GUIButton *v53; // esi@71 + int v54; // eax@71 + unsigned int v55; // ecx@71 + int v56; // eax@71 + unsigned __int16 v57; // ax@71 + unsigned __int16 v58; // [sp-Ch] [bp-90h]@38 + const char *v59; // [sp-Ch] [bp-90h]@63 + char *v60; // [sp-8h] [bp-8Ch]@38 + char *v61; // [sp-8h] [bp-8Ch]@63 + unsigned int v62; // [sp-4h] [bp-88h]@38 + int v63; // [sp-4h] [bp-88h]@52 + char *v64; // [sp-4h] [bp-88h]@63 + GUIWindow v65; // [sp+Ch] [bp-78h]@1 + __int64 v66; // [sp+60h] [bp-24h]@3 + unsigned int white; // [sp+68h] [bp-1Ch]@1 + int v68; // [sp+6Ch] [bp-18h]@3 + int v69; // [sp+70h] [bp-14h]@6 + unsigned int i; // [sp+74h] [bp-10h]@1 + int v71; // [sp+78h] [bp-Ch]@1 + int v72; // [sp+7Ch] [bp-8h]@16 + int v73; // [sp+80h] [bp-4h]@14 + + v0 = pPlayers[uActiveCharacter]; + memcpy(&v65, ptr_507BC0, sizeof(v65)); + v65.uFrameX = 483; + v65.uFrameWidth = 148; + v65.uFrameZ = 334; + white = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu); + color2 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xE1u, 0xCDu, 0x23u); + v2 = v0->uLevel; + v71 = color2; + v3 = 0; + v4 = 0; + for ( i = v2; v4 < (signed int)v2; ++v4 ) + v3 += v4 + 1; + v5 = 1000 * v3; + v6 = HIDWORD(v0->uExperience); + v7 = ptr_507BC0->ptr_1C; + v68 = (unsigned __int16)word_4F0866[(signed int)v7]; + v66 = 1000 * v3; + if ( (signed __int64)__PAIR__(v6, LODWORD(v0->uExperience)) >= v66 ) + { + v8 = v0->uClass % 4 + 1; + if ( v8 == 4 ) + v8 = 3; + v9 = (double)(signed int)i; + i = 0; + v69 = v8; + //v10 = (signed __int64)(v9 * p2DEvents_minus1__20[13 * (signed int)v7] * (double)v8); + v10 = (signed __int64)(v9 * p2DEvents[(signed int)v7 - 1].fPriceMultiplier * (double)v8); + v11 = v10 * (100 - v0->GetMerchant()) / 100; + if ( v11 < v10 / 3 ) + v11 = v10 / 3; + i = v11; + } + result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win(); + if ( result ) + { + if ( dword_F8B19C != 1 ) + { + if ( dword_F8B19C != 17 ) + { + result = dword_F8B19C - 96; + if ( dword_F8B19C == 96 ) + { + result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win(); + if ( result ) + { + i = 0; + v13 = pDialogueWindow; + //v14 = (signed __int64)(*(float *)&p2DEvents_minus1__24[13 * (unsigned int)ptr_507BC0->ptr_1C] * 500.0); + v14 = (signed __int64)(p2DEvents[(unsigned int)ptr_507BC0->ptr_1C - 1].flt_24 * 500.0); + v73 = v14 * (100 - v0->GetMerchant()) / 100; + if ( v73 < v14 / 3 ) + v73 = v14 / 3; + v15 = v13->field_38; + v16 = v13->field_28; + v72 = 0; + if ( (signed int)v15 >= (signed int)(v15 + v16) ) + goto LABEL_76; + do + { + v17 = v13->GetControl(v15)->uControlParam - 36; + if ( byte_4ED970_skill_learn_ability_by_class_table[v0->uClass][v17] && !v0->pActiveSkills[v17] ) + { + v18 = pFontArrus->CalcTextHeight(pSkillNames[v17], &v65, 0, 0); + i += v18; + ++v72; + } + ++v15; + } + while ( (signed int)v15 < v13->field_28 + v13->field_38 ); + if ( v72 ) + { + sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[401], v73);// "Skill Cost: %lu" + v65.DrawText2(pFontArrus, 0, 0x92u, 0, pTmpBuf, 3u); + v73 = (signed int)(149 - i) / v72; + if ( v73 > 32 ) + v73 = 32; + result = v13->field_38; + v19 = (signed int)(149 - v72 * v73 - i) / 2 - v73 / 2 + 162; + i = result; + v68 = v19; + if ( result < result + v13->field_28 ) + { + v72 = 2; + do + { + v20 = v13->GetControl(i); + v21 = v20; + v22 = v20->uControlParam - 36; + if ( !byte_4ED970_skill_learn_ability_by_class_table[v0->uClass][v22] || v0->pActiveSkills[v22] ) + { + v21->uW = 0; + v21->uHeight = 0; + v21->uY = 0; + } + else + { + v23 = pSkillNames[v22]; + v21->uY = v73 + v68; + HIDWORD(v66) = (int)v23; + v24 = pFontArrus->CalcTextHeight(v23, &v65, 0, 0); + v25 = v21->uY; + v21->uHeight = v24; + v26 = v25 + v24 - 1; + v21->uW = v26; + v68 = v26; + v27 = v71; + if ( pDialogueWindow->field_2C_focus_id != v72 ) + v27 = white; + v65.DrawText2(pFontArrus, 0, v25, v27, (char *)HIDWORD(v66), 3u); + } + v28 = v13->field_38; + ++i; + result = v13->field_28 + v28; + ++v72; + } + while ( (signed int)i < result ); + } + } + else + { +LABEL_76: + sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[544], v0->pName, pClassNames[v0->uClass]);// + // "Seek knowledge elsewhere %s the %s" + strcat(pTmpBuf, "\n \n"); + strcat(pTmpBuf, pGlobalTXT_LocalizationStrings[528]);// "I can offer you nothing further." + v29 = v71; + v30 = pFontArrus->CalcTextHeight(pTmpBuf, &v65, 0, 0); + result = (int)v65.DrawText2(pFontArrus, 0, (174 - v30) / 2 + 138, v29, pTmpBuf, 3u); + } + } + } + return result; + } + if ( !sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() ) + { + v31 = _721A3C_npc_text; + v32 = v71; + v33 = pFontArrus->CalcTextHeight(_721A3C_npc_text, &v65, 0, 0); + v65.DrawText2(pFontArrus, 0, (212 - v33) / 2 + 101, v32, v31, 3u); + result = (int)pDialogueWindow; + pDialogueWindow->field_28 = 0; + return result; + } + v34 = v0->uLevel; + if ( v34 < v68 ) + { + if ( (signed __int64)v0->uExperience >= v66 ) + { + if ( pParty->uNumGold >= i ) + { + Party::TakeGold(i); + HousePlaySomeSound((unsigned int)ptr_507BC0->ptr_1C, 2); + ++v0->uLevel; + v0->uSkillPoints += v0->uLevel / 10 + 5; + v0->sHealth = v0->GetMaxHealth(); + v0->sMana = v0->GetMaxMana(); + v37 = 0; + v38 = byte_F8B148; + do + { + if ( *(int *)v38 > v37 ) + v37 = *(int *)v38; + v38 += 4; + } + while ( (signed int)v38 < (signed int)word_F8B158 ); + v39 = &dword_F8B144 + uActiveCharacter; + ++*v39; + if ( *v39 > v37 ) + { + v40 = sub_494820(pParty->uCurrentHour); + v41 = ptr_507BC0->ptr_1C; + v42 = 60 * (v40 + 4) - pParty->uCurrentMinute; + if ( v41 == (void *)94 || v41 == (void *)95 ) + v42 += 720; + RestAndHeal((signed int)(v42 + 10080)); + if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor ) + pOutdoor->SetFog(); + } + v0->PlaySound(87, 0); + sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[430], v0->pName, v0->uLevel, v0->uLevel / 10 + 5);// + // "%s is now Level %lu and has earned %lu Skill Points!" + ShowStatusBarString(pTmpBuf, 2u); + goto LABEL_56; + } + ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2u);// "You don't have enough gold" + v63 = 4; +LABEL_55: + HousePlaySomeSound((unsigned int)ptr_507BC0->ptr_1C, v63); +LABEL_56: + result = pMessageQueue_50CBD0->uNumMessages; + if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + { + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1; + result = 3 * pMessageQueue_50CBD0->uNumMessages + 3; + *(&pMessageQueue_50CBD0->uNumMessages + result) = 0; + ++pMessageQueue_50CBD0->uNumMessages; + } + return result; + } + sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[538], v5 - LODWORD(v0->uExperience), v34 + 1);// + // "You need %d more experience to train to level %d" + v35 = 0; + v62 = 3; + v60 = pTmpBuf; + v58 = v71; + v36 = (212 - pFontArrus->CalcTextHeight(pTmpBuf, &v65, 0, 0)) / 2 + 88; + } + else + { + sprintfex(pTmpBuf, "%s\n \n%s", pGlobalTXT_LocalizationStrings[536], pGlobalTXT_LocalizationStrings[529]);// + // ""With your skills, you should be working here as a teacher."" + // ""Sorry, but we are unable to train you."" + v35 = 0; + v62 = 3; + v60 = pTmpBuf; + v58 = v71; + v36 = (212 - pFontArrus->CalcTextHeight(pTmpBuf, &v65, 0, 0)) / 2 + 101; + } + v65.DrawText2(pFontArrus, v35, v36, v58, v60, v62); + v63 = 3; + goto LABEL_55; + } + result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win(); + if ( result ) + { + v43 = pDialogueWindow; + v72 = 0; + pShopOptions[0] = pTmpBuf; + pShopOptions[1] = pGlobalTXT_LocalizationStrings[160];// "Learn Skills" + v44 = pDialogueWindow->field_28; + v73 = pDialogueWindow->field_38; + if ( v73 < v73 + v44 ) + { + v45 = pShopOptions; + do + { + if ( v43->GetControl(v73)->uControlParam == 17 ) + { + v46 = v0->uLevel; + if ( v46 < v68 ) + { + if ( (signed __int64)v0->uExperience < v66 ) + { + v64 = (char *)(v46 + 1); + v61 = (char *)(v5 - LODWORD(v0->uExperience)); + v59 = pGlobalTXT_LocalizationStrings[538];// "You need %d more experience to train to level %d" + } + else + { + v64 = (char *)i; + v61 = (char *)(v46 + 1); + v59 = pGlobalTXT_LocalizationStrings[537];// "Train to level %d for %d gold" + } + } + else + { + v64 = pGlobalTXT_LocalizationStrings[529];// ""Sorry, but we are unable to train you."" + v61 = pGlobalTXT_LocalizationStrings[536];// ""With your skills, you should be working here as a teacher."" + v59 = "%s\n \n%s"; + } + sprintfex(*v45, v59, v61, v64); + } + v47 = pFontArrus->CalcTextHeight(*v45, &v65, 0, 0); + v43 = pDialogueWindow; + v72 += v47; + ++v45; + ++v73; + } + while ( v73 < pDialogueWindow->field_28 + pDialogueWindow->field_38 ); + } + HIDWORD(v66) = (174 - v72) / 2; + result = v43->field_38; + v48 = result + v43->field_28; + v49 = (2 * (87 - (174 - v72) / 2) - v72) / 2 - (174 - v72) / 2 / 2 + 138; + v50 = -v43->field_28 < 0; + v73 = v43->field_38; + if ( v50 ^ __OFSUB__(result, v48) ) + { + i = 2; + v51 = pShopOptions; + do + { + v52 = v43->GetControl(v73); + v53 = v52; + v52->uY = HIDWORD(v66) + v49; + v54 = pFontArrus->CalcTextHeight(*v51, &v65, 0, 0); + v55 = v53->uY; + v53->uHeight = v54; + v56 = v54 + v55 - 1; + v53->uW = v56; + v49 = v56; + v57 = v71; + if ( pDialogueWindow->field_2C_focus_id != i ) + v57 = white; + v65.DrawText2(pFontArrus, 0, v55, v57, *v51, 3u); + v43 = pDialogueWindow; + ++i; + ++v51; + ++v73; + result = pDialogueWindow->field_28 + pDialogueWindow->field_38; + } + while ( v73 < result ); + } + } + } + return result; +} + + + + + + + + + +//----- (004B4FCF) -------------------------------------------------------- +int __cdecl ui_shop_teachers() +{ + Player *v0; // ebx@1 + int result; // eax@6 + signed int v2; // esi@8 + unsigned int v3; // ebx@10 + char *v4; // eax@11 + char *v5; // eax@12 + unsigned int v6; // eax@12 + int v7; // ST08_4@14 + int v8; // eax@14 + unsigned __int8 v9; // dl@14 + char *v10; // ecx@14 + signed int v11; // esi@16 + int v12; // ST08_4@19 + int v13; // eax@19 + int v14; // edi@21 + char **v15; // esi@21 + int v16; // eax@22 + GUIWindow *v17; // ecx@23 + int v18; // edx@23 + int v19; // edi@23 + unsigned __int8 v20; // sf@23 + GUIButton *v21; // esi@25 + const char **v22; // eax@25 + int v23; // eax@25 + unsigned int v24; // ecx@25 + const char **v25; // edx@25 + unsigned __int16 v26; // ax@25 + signed int v27; // esi@30 + int v28; // ST08_4@34 + int v29; // eax@34 + char *v30; // edx@35 + GUIWindow *v31; // edi@40 + void *v32; // eax@40 + signed int v33; // esi@40 + unsigned int v34; // esi@42 + int v35; // eax@42 + unsigned int v36; // eax@43 + int v37; // eax@45 + int v38; // ecx@50 + GUIButton *v39; // eax@52 + GUIButton *v40; // esi@52 + int v41; // eax@52 + char *v42; // eax@54 + int v43; // eax@54 + unsigned int v44; // ecx@54 + int v45; // edx@54 + int v46; // eax@54 + unsigned __int16 v47; // ax@54 + int v48; // eax@58 + signed int v49; // esi@62 + Texture *v50; // ecx@64 + unsigned int v51; // edi@64 + unsigned int v52; // esi@66 + int v53; // edx@70 + Texture *v54; // ecx@76 + unsigned int v55; // edi@76 + unsigned int v56; // esi@76 + int v57; // edx@80 + Texture *v58; // ecx@86 + unsigned int v59; // edi@86 + unsigned int v60; // esi@88 + int v61; // edx@92 + Texture *v62; // ecx@98 + unsigned int v63; // edi@98 + unsigned int v64; // esi@100 + int v65; // edx@104 + signed int v66; // ecx@109 + SHORT v67; // di@117 + bool v68; // eax@117 + const char *v69; // ecx@119 + POINT *v70; // esi@124 + int v71; // ecx@125 + int v72; // eax@125 + int v73; // ecx@125 + ItemGen *v74; // esi@125 + int v75; // eax@130 + int v76; // esi@131 + char **v77; // edi@131 + int v78; // eax@132 + GUIWindow *v79; // ecx@133 + int v80; // edx@133 + int v81; // edi@133 + GUIButton *v82; // esi@135 + const char **v83; // eax@135 + int v84; // eax@135 + unsigned int v85; // ecx@135 + int v86; // edx@135 + unsigned __int16 v87; // ax@135 + GUIWindow *v88; // [sp-18h] [bp-110h]@35 + int v89; // [sp-14h] [bp-10Ch]@35 + ItemGen *v90; // [sp-10h] [bp-108h]@14 + int v91; // [sp-10h] [bp-108h]@35 + unsigned __int16 v92; // [sp-Ch] [bp-104h]@12 + void *v93; // [sp-Ch] [bp-104h]@14 + int v94; // [sp-8h] [bp-100h]@11 + char *v95; // [sp-8h] [bp-100h]@12 + __int64 *v96; // [sp-4h] [bp-FCh]@11 + unsigned int v97; // [sp-4h] [bp-FCh]@12 + POINT v98; // [sp+Ch] [bp-ECh]@8 + POINT v99; // [sp+14h] [bp-E4h]@16 + POINT v100; // [sp+1Ch] [bp-DCh]@124 + POINT v101; // [sp+24h] [bp-D4h]@17 + POINT v102; // [sp+2Ch] [bp-CCh]@124 + POINT v103; // [sp+34h] [bp-C4h]@9 + POINT v104; // [sp+3Ch] [bp-BCh]@31 + POINT v105; // [sp+44h] [bp-B4h]@16 + POINT v106; // [sp+4Ch] [bp-ACh]@30 + POINT v107; // [sp+54h] [bp-A4h]@16 + POINT v108; // [sp+5Ch] [bp-9Ch]@30 + POINT a2; // [sp+64h] [bp-94h]@8 + POINT v110; // [sp+6Ch] [bp-8Ch]@30 + POINT v111; // [sp+74h] [bp-84h]@8 + GUIWindow v112; // [sp+7Ch] [bp-7Ch]@1 + char *Str; // [sp+D0h] [bp-28h]@54 + int v114; // [sp+D4h] [bp-24h]@23 + unsigned int color2; // [sp+D8h] [bp-20h]@1 + unsigned int white; // [sp+DCh] [bp-1Ch]@1 + __int32 v117; // [sp+E0h] [bp-18h]@8 + int v118; // [sp+E4h] [bp-14h]@40 + const char **v119; // [sp+E8h] [bp-10h]@24 + Player *_this; // [sp+ECh] [bp-Ch]@1 + unsigned __int8 uPlayerID; // [sp+F3h] [bp-5h]@14 + int v122; // [sp+F4h] [bp-4h]@23 + + v0 = pPlayers[uActiveCharacter]; + _this = pPlayers[uActiveCharacter]; + memcpy(&v112, ptr_507BC0, sizeof(v112)); + v112.uFrameX = 483; + v112.uFrameWidth = 148; + v112.uFrameZ = 334; + white = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu); + color2 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xE1u, 0xCDu, 0x23u); + if ( dword_F8B19C > 5 ) + { + if ( dword_F8B19C == 94 ) + { + draw_leather(); + CharacterUI_InventoryTab_Draw(uActiveCharacter, 1); + pShopOptions[0] = pGlobalTXT_LocalizationStrings[200];// "Sell" + pShopOptions[1] = pGlobalTXT_LocalizationStrings[113];// "Identify" + pShopOptions[2] = pGlobalTXT_LocalizationStrings[179];// "Repair" + v76 = 0; + v77 = pShopOptions; + do + { + v78 = pFontArrus->CalcTextHeight(*v77, &v112, 0, 0); + ++v77; + v76 += v78; + } + while ( (signed int)v77 < (signed int)&pShopOptions[3] ); + v79 = pDialogueWindow; + _this = (Player *)((174 - v76) / 3); + result = pDialogueWindow->field_38; + v80 = result + pDialogueWindow->field_28; + v81 = (3 * (58 - (signed int)_this) - v76) / 2 - (174 - v76) / 3 / 2 + 138; + v20 = -pDialogueWindow->field_28 < 0; + v118 = pDialogueWindow->field_38; + if ( v20 ^ __OFSUB__(result, v80) ) + { + v122 = 2; + v119 = (const char **)pShopOptions; + do + { + v82 = v79->GetControl(v118); + v83 = v119; + v82->uY = (unsigned int)((char *)_this + v81); + v84 = pFontArrus->CalcTextHeight(*v83, &v112, 0, 0); + v85 = v82->uY; + v86 = v122; + v82->uHeight = v84; + v81 = v84 + v85 - 1; + v82->uW = v81; + v87 = color2; + if ( pDialogueWindow->field_2C_focus_id != v86 ) + v87 = white; + v112.DrawText2(pFontArrus, 0, v85, v87, *v119, 3u); + v79 = pDialogueWindow; + ++v122; + ++v119; + ++v118; + result = pDialogueWindow->field_28 + pDialogueWindow->field_38; + } + while ( v118 < result ); + } + return result; + } + if ( dword_F8B19C != 95 ) + { + result = dword_F8B19C - 96; + if ( dword_F8B19C == 96 ) + { + result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win(); + if ( result ) + { + v31 = pDialogueWindow; + v3 = 0; + v32 = ptr_507BC0->ptr_1C; + v118 = 0; + //v33 = (signed __int64)(*(float *)&p2DEvents_minus1__24[13 * (signed int)v32] * 500.0); + v33 = (signed __int64)(p2DEvents[(signed int)v32 - 1].flt_24 * 500.0); + v119 = (const char **)(v33 * (100 - _this->GetMerchant()) / 100); + if ( (signed int)v119 < v33 / 3 ) + v119 = (const char **)(v33 / 3); + v34 = v31->field_38; + v35 = v34 + v31->field_28; + v122 = 0; + if ( (signed int)v34 >= v35 ) + goto LABEL_140; + do + { + v36 = v31->GetControl(v34)->uControlParam - 36; + if ( byte_4ED970_skill_learn_ability_by_class_table[_this->uClass][v36] && !_this->pActiveSkills[v36] ) + { + v37 = pFontArrus->CalcTextHeight(pSkillNames[v36], &v112, 0, 0); + v118 += v37; + ++v122; + } + ++v34; + } + while ( (signed int)v34 < v31->field_28 + v31->field_38 ); + if ( !v122 ) + { +LABEL_140: + sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[544], _this->pName, pClassNames[_this->uClass]);// + // "Seek knowledge elsewhere %s the %s" + strcat(pTmpBuf, "\n \n"); + strcat(pTmpBuf, pGlobalTXT_LocalizationStrings[528]);// "I can offer you nothing further." + v30 = pTmpBuf; + v97 = 3; + v95 = pTmpBuf; + v92 = color2; + v91 = 0; + v89 = 0; + v88 = &v112; + goto LABEL_61; + } + sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[401], v119);// "Skill Cost: %lu" + v112.DrawText2(pFontArrus, 0, 0x92u, 0, pTmpBuf, 3u); + v119 = (const char **)((149 - v118) / v122); + if ( (149 - v118) / v122 > 32 ) + v119 = (const char **)32; + result = v31->field_38; + v38 = (149 - v122 * (signed int)v119 - v118) / 2 - (signed int)v119 / 2 + 162; + v118 = result; + v114 = v38; + if ( result < result + v31->field_28 ) + { + v122 = 2; + do + { + v39 = v31->GetControl(v118); + v40 = v39; + v41 = v39->uControlParam - 36; + if ( !byte_4ED970_skill_learn_ability_by_class_table[_this->uClass][v41] || _this->pActiveSkills[v41] ) + { + v40->uW = 0; + v40->uHeight = 0; + v40->uY = 0; + } + else + { + v42 = pSkillNames[v41]; + v40->uY = (unsigned int)((char *)v119 + v114); + Str = v42; + v43 = pFontArrus->CalcTextHeight(v42, &v112, 0, 0); + v44 = v40->uY; + v45 = v122; + v40->uHeight = v43; + v46 = v44 + v43 - 1; + v40->uW = v46; + v114 = v46; + v47 = color2; + if ( pDialogueWindow->field_2C_focus_id != v45 ) + v47 = white; + v112.DrawText2(pFontArrus, 0, v44, v47, Str, 3u); + } + v48 = v31->field_38; + ++v118; + result = v31->field_28 + v48; + ++v122; + } + while ( v118 < result ); + } + } + } + return result; + } + } + else + { + if ( dword_F8B19C == 5 ) + { + draw_leather(); + CharacterUI_InventoryTab_Draw(uActiveCharacter, 1); + sub_4B46A5(pGlobalTXT_LocalizationStrings[198], 0);// "Select the Item to Repair" + result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win(); + if ( !result + || (v27 = pMouse->GetCursorPos(&v110)->x - 14, + v117 = (v27 >> 5) + 14 * ((pMouse->GetCursorPos(&v108)->y - 17) >> 5), + result = (int)pMouse->GetCursorPos(&v106), + *(int *)result <= 13) + || (result = (int)pMouse->GetCursorPos(&v104), *(int *)result >= 462) + || (result = v0->GetItemIDAtInventoryIndex((int *)&v117), v3 = 0, !result) + || (result *= 9, !(_this->field_1F5[4 * result + 15] & 2)) ) + return result; + v96 = 0; + v94 = 5; + v93 = ptr_507BC0->ptr_1C; + v90 = (ItemGen *)&_this->pDarkSpellbook.bIsSpellAvailable[4 * result + 5]; + v28 = (int)ptr_507BC0->ptr_1C; + uPlayerID = uActiveCharacter - 1; + v29 = _this->_490EEE((ItemGen *)&_this->pDarkSpellbook.bIsSpellAvailable[4 * result + 5], 3, v28, 5); + v9 = uPlayerID; + v10 = (char *)pMerchantsRepairPhrases[v29]; + goto LABEL_35; + } + if ( dword_F8B19C == 1 ) + { + result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win(); + if ( result ) + { + pShopOptions[0] = pGlobalTXT_LocalizationStrings[134];// "Buy Standard" + pShopOptions[1] = pGlobalTXT_LocalizationStrings[152];// "Buy Special" + pShopOptions[2] = pGlobalTXT_LocalizationStrings[159];// "Display Inventory" + v14 = 0; + pShopOptions[3] = pGlobalTXT_LocalizationStrings[160];// "Learn Skills" + v15 = pShopOptions; + do + { + v16 = pFontArrus->CalcTextHeight(*v15, &v112, 0, 0); + ++v15; + v14 += v16; + } + while ( (signed int)v15 < (signed int)&unk_F8B1C8 ); + v17 = pDialogueWindow; + v114 = (174 - v14) / 4; + result = pDialogueWindow->field_38; + v18 = result + pDialogueWindow->field_28; + v19 = (174 - 4 * (174 - v14) / 4 - v14) / 2 - (174 - v14) / 4 / 2 + 138; + v20 = -pDialogueWindow->field_28 < 0; + v122 = pDialogueWindow->field_38; + if ( v20 ^ __OFSUB__(result, v18) ) + { + v119 = (const char **)2; + _this = (Player *)pShopOptions; + do + { + v21 = v17->GetControl(v122); + v22 = (const char **)_this; + v21->uY = v114 + v19; + v23 = pFontArrus->CalcTextHeight(*v22, &v112, 0, 0); + v24 = v21->uY; + v25 = v119; + v21->uHeight = v23; + v19 = v24 + v23 - 1; + v21->uW = v19; + v26 = color2; + if ( (const char **)pDialogueWindow->field_2C_focus_id != v25 ) + v26 = white; + v112.DrawText2(pFontArrus, 0, v24, v26, (const char *)LODWORD(_this->pConditions[0]), 3u); + v17 = pDialogueWindow; + v119 = (const char **)((char *)v119 + 1); + _this = (Player *)((char *)_this + 4); + ++v122; + result = pDialogueWindow->field_28 + pDialogueWindow->field_38; + } + while ( v122 < result ); + } + } + return result; + } + if ( dword_F8B19C != 2 ) + { + if ( dword_F8B19C != 3 ) + { + result = dword_F8B19C - 4; + if ( dword_F8B19C == 4 ) + { + draw_leather(); + CharacterUI_InventoryTab_Draw(uActiveCharacter, 1); + sub_4B46A5(pGlobalTXT_LocalizationStrings[197], 0);// "Select the Item to Identify" + result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win(); + if ( result ) + { + v2 = pMouse->GetCursorPos(&a2)->x - 14; + v117 = (v2 >> 5) + 14 * ((pMouse->GetCursorPos(&v98)->y - 17) >> 5); + result = (int)pMouse->GetCursorPos(&v111); + if ( *(int *)result > 13 ) + { + result = (int)pMouse->GetCursorPos(&v103); + if ( *(int *)result < 462 ) + { + result = v0->GetItemIDAtInventoryIndex((int *)&v117); + v3 = 0; + if ( result ) + { + v96 = 0; + v94 = 4; + v4 = &_this->pDarkSpellbook.bIsSpellAvailable[36 * result + 5]; + if ( v4[20] & 1 ) + { + v5 = sub_495461("%24", uActiveCharacter - 1, (ItemGen *)v4, (char *)ptr_507BC0->ptr_1C, 4, 0); + v97 = 3; + v95 = v5; + v92 = white; + v6 = (212 - pFontArrus->CalcTextHeight(v5, &v112, 0, 0)) / 2 + 101; + return (int)v112.DrawText2(pFontArrus, v3, v6, v92, v95, v97); + } + v93 = ptr_507BC0->ptr_1C; + v90 = (ItemGen *)v4; + v7 = (int)ptr_507BC0->ptr_1C; + uPlayerID = uActiveCharacter - 1; + v8 = ((Player *)_this)->_490EEE((ItemGen *)v4, 3, v7, 4); + v9 = uPlayerID; + v10 = (char *)pMerchantsIdentifyPhrases[v8]; + goto LABEL_35; + } + } + } + } + } + return result; + } + draw_leather(); + CharacterUI_InventoryTab_Draw(uActiveCharacter, 1); + sub_4B46A5(pGlobalTXT_LocalizationStrings[199], 0);// "Select the Item to Sell" + result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win(); + if ( !result + || (v11 = pMouse->GetCursorPos(&v107)->x - 14, + v117 = (v11 >> 5) + 14 * ((pMouse->GetCursorPos(&v99)->y - 17) >> 5), + result = (int)pMouse->GetCursorPos(&v105), + *(int *)result <= 13) + || (result = (int)pMouse->GetCursorPos(&v101), *(int *)result >= 462) + || (result = v0->GetItemIDAtInventoryIndex((int *)&v117), v3 = 0, !result) ) + return result; + v96 = 0; + v94 = 3; + v93 = ptr_507BC0->ptr_1C; + v90 = (ItemGen *)&_this->pDarkSpellbook.bIsSpellAvailable[36 * result + 5]; + v12 = (int)ptr_507BC0->ptr_1C; + uPlayerID = uActiveCharacter - 1; + v13 = _this->_490EEE(v90, 3, v12, 3); + v9 = uPlayerID; + v10 = (char *)pMerchantsSellPhrases[v13]; +LABEL_35: + v30 = sub_495461(v10, v9, v90, (char *)v93, v94, v96); + v97 = 3; + v95 = v30; + v92 = white; + v91 = v3; + v89 = v3; + v88 = &v112; +LABEL_61: + v6 = (174 - pFontArrus->CalcTextHeight(v30, v88, v89, v91)) / 2 + 138; + return (int)v112.DrawText2(pFontArrus, v3, v6, v92, v95, v97); + } + } + pRenderer->DrawTextureIndexed(8u, 8u, dword_F8B164); + v3 = 0; + v49 = 0; + v122 = 0; + if ( dword_F8B19C == 2 ) + { + do + { + if ( pParty->field_777C[9 * (v49 + 12 * (unsigned int)ptr_507BC0->ptr_1C)] ) + { + v50 = dword_F8B168[v49]; + v51 = 152 - v50->uTextureHeight; + if ( (signed int)v51 < 1 ) + v51 = 0; + v52 = 75 * v49 - v50->uTextureWidth / 2 + 40; + if ( v122 ) + { + if ( v122 == 5 ) + { + v53 = dword_F8B168[5]->uTextureWidth; + if ( (signed int)v52 > 457 - v53 ) + v52 = 457 - v53; + } + } + else + { + if ( (signed int)v52 < 18 ) + v52 = 18; + } + pRenderer->DrawTextureTransparent(v52, v51, v50); + sub_40F92A(&pRenderer->pActiveZBuffer[v52 + 640 * v51], dword_F8B168[v122], v122 + 1); + v49 = v122; + } + ++v49; + v122 = v49; + } + while ( v49 < 6 ); + v122 = 0; + do + { + if ( pParty->field_777C[9 * (v122 + 12 * (unsigned int)ptr_507BC0->ptr_1C) + 54] ) + { + v54 = dword_F8B168[v122 + 6]; + v55 = 306 - v54->uTextureHeight; + v56 = 75 * v122 - v54->uTextureWidth / 2 + 40; + if ( v122 ) + { + if ( v122 == 5 ) + { + v57 = dword_F8B168[11]->uTextureWidth; + if ( (signed int)v56 > 457 - v57 ) + v56 = 457 - v57; + } + } + else + { + if ( (signed int)v56 < 18 ) + v56 = 18; + } + pRenderer->DrawTextureTransparent(v56, v55, v54); + sub_40F92A(&pRenderer->pActiveZBuffer[v56 + 640 * v55], dword_F8B168[v122 + 6], v122 + 7); + } + ++v122; + } + while ( v122 < 6 ); + } + else + { + do + { + if ( pParty->field_C59C[9 * (v49 + 12 * (unsigned int)ptr_507BC0->ptr_1C) + 724] ) + { + v58 = dword_F8B168[v49]; + v59 = 152 - v58->uTextureHeight; + if ( (signed int)v59 < 1 ) + v59 = 0; + v60 = 75 * v49 - v58->uTextureWidth / 2 + 40; + if ( v122 ) + { + if ( v122 == 5 ) + { + v61 = dword_F8B168[5]->uTextureWidth; + if ( (signed int)v60 > 457 - v61 ) + v60 = 457 - v61; + } + } + else + { + if ( (signed int)v60 < 18 ) + v60 = 18; + } + pRenderer->DrawTextureTransparent(v60, v59, v58); + sub_40F92A(&pRenderer->pActiveZBuffer[v60 + 640 * v59], dword_F8B168[v122], v122 + 1); + v49 = v122; + } + ++v49; + v122 = v49; + } + while ( v49 < 6 ); + v122 = 0; + do + { + if ( pParty->field_C59C[9 * (v122 + 12 * (unsigned int)ptr_507BC0->ptr_1C) + 778] ) + { + v62 = dword_F8B168[v122 + 6]; + v63 = 306 - v62->uTextureHeight; + if ( (signed int)v63 < 1 ) + v63 = 0; + v64 = 75 * v122 - v62->uTextureWidth / 2 + 40; + if ( v122 ) + { + if ( v122 == 5 ) + { + v65 = dword_F8B168[11]->uTextureWidth; + if ( (signed int)v64 > 457 - v65 ) + v64 = 457 - v65; + } + } + else + { + if ( (signed int)v64 < 18 ) + v64 = 18; + } + pRenderer->DrawTextureTransparent(v64, v63, v62); + sub_40F92A(&pRenderer->pActiveZBuffer[v64 + 640 * v63], dword_F8B168[v122 + 6], v122 + 7); + } + ++v122; + } + while ( v122 < 6 ); + } + result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win(); + if ( result ) + { + v66 = 0; + v117 = 0; + if ( dword_F8B19C == 2 ) + { + do + { + if ( pParty->field_777C[9 * (v66 + 12 * (unsigned int)ptr_507BC0->ptr_1C)] ) + ++v117; + ++v66; + } + while ( v66 < 12 ); + } + else + { + do + { + if ( pParty->field_C59C[9 * (v66 + 12 * (unsigned int)ptr_507BC0->ptr_1C) + 724] ) + ++v117; + ++v66; + } + while ( v66 < 12 ); + } + v67 = GetAsyncKeyState(VK_CONTROL); + v68 = _this->CanSteal(); + Str = (char *)v68; + if ( v67 && v68 ) + { + v69 = pGlobalTXT_LocalizationStrings[185];// "Steal item" + } + else + { + v69 = pGlobalTXT_LocalizationStrings[195];// "Select the Item to Buy" + if ( dword_F8B19C != 2 ) + v69 = pGlobalTXT_LocalizationStrings[196];// "Select the Special Item to Buy" + } + sub_4B46A5(v69, 0); + if ( !v117 ) + return (int)v112._4B1854( + __PAIR__( + pParty->field_3C.field_50[2 * (unsigned int)ptr_507BC0->ptr_1C + 1], + pParty->field_3C.field_50[2 * (unsigned int)ptr_507BC0->ptr_1C]) + - pParty->uTimePlayed); + v70 = pMouse->GetCursorPos(&v102); + result = v70->x + pSRZBufferLineOffsets[pMouse->GetCursorPos(&v100)->y]; + if ( pRenderer->pActiveZBuffer[result] & 0xFFFF ) + { + v71 = (pRenderer->pActiveZBuffer[result] & 0xFFFF) - 1; + v117 = v71; + v72 = (int)ptr_507BC0->ptr_1C; + v73 = 9 * (v71 + 12 * v72); + v74 = (ItemGen *)&pParty->field_777C[v73]; + if ( dword_F8B19C != 2 ) + v74 = (ItemGen *)&pParty->field_C59C[v73 + 724]; + if ( v67 && Str ) + { + v10 = pGlobalTXT_LocalizationStrings[181];// "Steal %24" + v96 = 0; + v94 = 2; + v93 = ptr_507BC0->ptr_1C; + v90 = v74; + v9 = uActiveCharacter - 1; + } + else + { + v96 = 0; + v94 = 2; + v93 = ptr_507BC0->ptr_1C; + v90 = v74; + uPlayerID = uActiveCharacter - 1; + v75 = _this->_490EEE(v74, 3, v72, 2); + v9 = uPlayerID; + v10 = (char *)pMerchantsBuyPhrases[v75]; + } + goto LABEL_35; + } + } + return result; +} + +//----- (004BC49B) -------------------------------------------------------- +void __thiscall sub_4BC49B(unsigned int _this) +{ + unsigned int v1; // esi@1 + NPCData *v2; // ebp@1 + unsigned int v3; // eax@1 + int v4; // ecx@10 + signed int v5; // edi@14 + char *v6; // esi@15 + const char *v7; // ecx@22 + signed int v8; // edi@37 + unsigned int v9; // eax@56 + unsigned int v10; // ecx@57 + void *v11; // [sp-Ch] [bp-1Ch]@46 + int v12; // [sp-8h] [bp-18h]@46 + char *v13; // [sp-8h] [bp-18h]@60 + size_t v14; // [sp-4h] [bp-14h]@46 + const char *v15; // [sp-4h] [bp-14h]@60 + + v1 = _this; + v2 = GetNPCData(uDialogue_SpeakingActorNPC_ID); + v3 = v1; + uDialogueType = v1; + if ( !v2->uFlags ) + { + v2->uFlags = 1; + v3 = uDialogueType; + } + if ( (signed int)v3 > 22 ) + { + if ( v3 == 23 ) + { + v4 = v2->evte; + goto LABEL_74; + } + if ( v3 == 24 ) + { + v4 = v2->evtf; + goto LABEL_74; + } + if ( v3 != 76 ) + { + if ( v3 == 77 ) + { + byte_F8B1EC ^= 1u; + } + else + { + if ( (signed int)v3 > 84 && (signed int)v3 <= 88 ) + { + ArenaFight(); + return; + } + } + goto LABEL_87; + } + if ( v2->uFlags & 0x80 ) + { + v8 = 0; + if ( (signed int)pNPCStats->uNumNewNPCs > 0 ) + { + v6 = (char *)pNPCStats->pNewNPCData; + while ( !(v6[8] & 0x80) || strcmp(v2->pName, *(const char **)v6) ) + { + ++v8; + v6 += 76; + if ( v8 >= (signed int)pNPCStats->uNumNewNPCs ) + goto LABEL_44; + } + goto LABEL_43; + } +LABEL_44: + if ( !pParty->pHirelings[0].pName || _strcmpi(pParty->pHirelings[0].pName, v2->pName) ) + { + if ( !pParty->pHirelings[1].pName || _strcmpi(pParty->pHirelings[1].pName, v2->pName) ) + { +LABEL_51: + pParty->field_709 = 0; + sub_44A56A(); + dword_591084 = 0; + if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + { + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; + ++pMessageQueue_50CBD0->uNumMessages; + } + goto LABEL_89; + } + v14 = 76; + v12 = 0; + v11 = &pParty->pHirelings[1]; + } + else + { + v14 = 76; + v12 = 0; + v11 = pParty->pHirelings; + } + memset(v11, v12, v14); + goto LABEL_51; + } + if ( pParty->pHirelings[0].pName && pParty->pHirelings[1].pName ) + { + v7 = pGlobalTXT_LocalizationStrings[533]; // ""I cannot join you, you're party is full"" +LABEL_64: + ShowStatusBarString(v7, 2u); + goto LABEL_87; + } + v9 = v2->uProfession; + if ( v9 != 51 ) + { + v10 = *(&pNPCStats->field_13A58 + 5 * v9); + if ( pParty->uNumGold < v10 ) + { + ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2u);// "You don't have enough gold" + byte_F8B1EC = 0; + uDialogueType = 13; + if ( uActiveCharacter ) + pPlayers[uActiveCharacter]->PlaySound(38, 0); + v7 = pGlobalTXT_LocalizationStrings[155]; + goto LABEL_64; + } + Party::TakeGold(v10); + } + LOBYTE(v2->uFlags) |= 0x80u; + if ( pParty->pHirelings[0].pName ) + { + memcpy(&pParty->pHirelings[1], v2, sizeof(pParty->pHirelings[1])); + v15 = v2->pName; + v13 = pParty->pHireling2Name; + } + else + { + memcpy(pParty->pHirelings, v2, 0x4Cu); + v15 = v2->pName; + v13 = pParty->pHireling1Name; + } + strcpy(v13, v15); + pParty->field_709 = 0; + sub_44A56A(); + if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + { + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; + ++pMessageQueue_50CBD0->uNumMessages; + } + if ( (uDialogue_SpeakingActorNPC_ID & 0x80000000u) == 0 ) + pDialogue_SpeakingActor->uAIState = 11; + if ( uActiveCharacter ) + pPlayers[uActiveCharacter]->PlaySound(61, 0); + goto LABEL_87; + } + if ( v3 == 22 ) + { + v4 = v2->evtd; + goto LABEL_74; + } + if ( v3 == 9 ) + { + if ( !sub_4BB756(v2->uProfession) ) + { + if ( v2->uProfession != 41 ) + v2->bHasUsedTheAbility = 1; + if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + { + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; + ++pMessageQueue_50CBD0->uNumMessages; + } + goto LABEL_87; + } + v7 = pGlobalTXT_LocalizationStrings[140]; + goto LABEL_64; + } + if ( v3 == 13 ) + { + if ( !(v2->uFlags & 0x80) ) + { + sub_4B3E1E(); + byte_F8B1EC = 0; + goto LABEL_87; + } + v5 = 0; + if ( (signed int)pNPCStats->uNumNewNPCs > 0 ) + { + v6 = (char *)pNPCStats->pNewNPCData; + while ( !(v6[8] & 0x80) || strcmp(v2->pName, *(const char **)v6) ) + { + ++v5; + v6 += 76; + if ( v5 >= (signed int)pNPCStats->uNumNewNPCs ) + goto LABEL_44; + } +LABEL_43: + v6[8] &= 0x7Fu; + goto LABEL_44; + } + goto LABEL_44; + } + if ( v3 == 19 ) + { + v4 = v2->bDrawSomeAnim; + goto LABEL_74; + } + if ( v3 == 20 ) + { + v4 = v2->evtb; + goto LABEL_74; + } + if ( v3 == 21 ) + { + v4 = v2->evtc; +LABEL_74: + if ( v4 < 200 || v4 > 310 ) + { + if ( v4 < 400 || v4 > 410 ) + { + switch ( v4 ) + { + case 139: + sub_4B1ECE(); + break; + case 311: + sub_4BBA85_bounties(); + break; + case 399: + sub_4BBCDD(); + break; + default: + _5C3420_pDecoration = (LevelDecoration *)1; + ptr_F8B1E8 = 0; + EventProcessor(v4, 0, 1); + _5C3420_pDecoration = 0; + break; + } + } + else + { + dword_F8B1D8 = v3; + sub_4B3EF0(v4 - 400); + } + } + else + { + sub_4B3FE5(v4); + } + } +LABEL_87: + if ( !dword_7241C8 ) + pGame->Draw(); +LABEL_89: + dword_7241C8 = 0; +} + + + +//----- (004BDAAF) -------------------------------------------------------- +bool __fastcall sub_4BDAAF(ItemGen *a1, int _2da_idx) +{ + int v2; // edx@1 + unsigned int v3; // esi@1 + unsigned int v4; // eax@1 + signed int v5; // edi@1 + int v6; // edx@8 + int v7; // edx@9 + int v8; // edx@10 + unsigned __int8 v9; // zf@16 + char v10; // sf@16 + unsigned __int8 v11; // of@16 + + auto a2 = _2da_idx; + //v2 = p2DEvents_minus1___00[26 * a2]; + v2 = p2DEvents[a2 - 1].uType; + v3 = a1->uItemID; + v4 = a1->uItemID; + v5 = pItemsTable->pItems[v4].uEquipType; + if ( (v2 != 4 || (signed int)v3 < 740 || (signed int)v3 > 771) + && ((signed int)v3 >= 600 || (signed int)v3 >= 529 && (signed int)v3 <= 599) + || BYTE1(a1->uAttributtes) & 1 ) + return 0; + v6 = v2 - 1; + if ( !v6 ) + { + v11 = __OFSUB__(v5, 2); + v9 = v5 == 2; + v10 = v5 - 2 < 0; + goto LABEL_23; + } + v7 = v6 - 1; + if ( v7 ) + { + v8 = v7 - 1; + if ( !v8 ) + { + if ( pItemsTable->pItems[v4].uSkillType != 38 ) + return v5 == 16; + return 1; + } + if ( v8 != 1 || v5 < 13 ) + return 0; + if ( v5 <= 14 ) + return 1; + if ( v5 != 17 || (signed int)v3 < 740 ) + return 0; + v11 = __OFSUB__(v3, 771); + v9 = v3 == 771; + v10 = ((v3 - 771) & 0x80000000u) != 0; +LABEL_23: + if ( !((unsigned __int8)(v10 ^ v11) | v9) ) + return 0; + return 1; + } + if ( v5 >= 3 ) + { + v11 = __OFSUB__(v5, 9); + v9 = v5 == 9; + v10 = v5 - 9 < 0; + goto LABEL_23; + } + return 0; +} + + + +//----- (004B5D7C) -------------------------------------------------------- +int __cdecl sub_4B5D7C() +{ + GUIWindow *v0; // ebx@1 + Player *v1; // edi@1 + signed int v2; // ebx@1 + int v3; // edi@6 + int result; // eax@11 + unsigned int v5; // ebx@13 + int v6; // esi@13 + signed int v7; // esi@17 + int v8; // esi@22 + signed int v9; // ecx@22 + char *v10; // eax@22 + const char *v11; // ecx@26 + POINT *v12; // esi@30 + int v13; // ecx@30 + void *v14; // ST1C_4@31 + ItemGen *v15; // ST18_4@31 + int v16; // ST10_4@31 + int v17; // eax@31 + char *v18; // edx@31 + int v19; // eax@32 + GUIWindow *v20; // edi@35 + int v21; // esi@35 + int v22; // eax@35 + unsigned int v23; // eax@36 + int v24; // eax@39 + int v25; // eax@40 + int v26; // ecx@47 + GUIButton *v27; // eax@49 + GUIButton *v28; // esi@49 + unsigned int v29; // eax@49 + char *v30; // eax@52 + int v31; // eax@55 + unsigned int v32; // ecx@55 + int v33; // eax@55 + unsigned __int16 v34; // ax@55 + int v35; // eax@58 + const char *v36; // ST20_4@61 + unsigned __int16 v37; // ST1C_2@61 + int v38; // eax@61 + GUIWindow *v39; // [sp-18h] [bp-304h]@31 + int v40; // [sp-14h] [bp-300h]@31 + int v41; // [sp-10h] [bp-2FCh]@31 + unsigned __int16 v42; // [sp-Ch] [bp-2F8h]@31 + char *v43; // [sp-8h] [bp-2F4h]@31 + unsigned int v44; // [sp-4h] [bp-2F0h]@31 + char Dest[100]; // [sp+Ch] [bp-2E0h]@3 + char v46[100]; // [sp+70h] [bp-27Ch]@3 + char v47[100]; // [sp+D4h] [bp-218h]@3 + char v48[100]; // [sp+138h] [bp-1B4h]@3 + char v49[100]; // [sp+19Ch] [bp-150h]@3 + POINT v50; // [sp+264h] [bp-88h]@30 + POINT v51; // [sp+26Ch] [bp-80h]@30 + GUIWindow v52; // [sp+274h] [bp-78h]@1 + signed int v53; // [sp+27Ch] [bp-70h]@1 + signed int v54; // [sp+284h] [bp-68h]@1 + int v55; // [sp+2C8h] [bp-24h]@47 + int v56; // [sp+2CCh] [bp-20h]@1 + int v57; // [sp+2D0h] [bp-1Ch]@1 + Player *v58; // [sp+2D4h] [bp-18h]@1 + unsigned __int8 uPlayerID; // [sp+2DBh] [bp-11h]@31 + char *Str; // [sp+2DCh] [bp-10h]@35 + int v61; // [sp+2E0h] [bp-Ch]@35 + unsigned int v62; // [sp+2E4h] [bp-8h]@13 + int v63; // [sp+2E8h] [bp-4h]@1 + + v0 = ptr_507BC0; + memcpy(&v52, ptr_507BC0, sizeof(v52)); + v58 = pPlayers[uActiveCharacter]; + v1 = v58; + v52.uFrameX = 483; + v53 = 148; + v54 = 334; + v56 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu); + v57 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); + //v2 = (signed __int64)(p2DEvents_minus1__20[13 * (unsigned int)v0->ptr_1C] * 500.0); + v2 = (signed __int64)(p2DEvents[(unsigned int)v0->ptr_1C - 1].fPriceMultiplier * 500.0); + v63 = v2 * (100 - v1->GetMerchant()) / 100; + if ( v63 < v2 / 3 ) + v63 = v2 / 3; + strcpy(Dest, nullstring); + strcpy(v46, nullstring); + strcpy(v47, nullstring); + strcpy(v48, nullstring); + strcpy(v49, nullstring); + if ( dword_F8B19C != 1 ) + { + if ( dword_F8B19C != 18 ) + { + if ( sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() ) + { + v3 = (int)(&v1->uIntelligence + dword_F8B19C); + if ( *(short *)v3 ) + { + sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[403], pClassNames[dword_F8B19C + 20]); + ShowStatusBarString(pTmpBuf, 2u); + pAudioPlayer->PlaySound(SOUND_27, 0, 0, -1, 0, 0, 0, 0); + } + else + { + if ( pParty->uNumGold < v63 ) + { + ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2u); + HousePlaySomeSound((unsigned int)ptr_507BC0->ptr_1C, 2); + } + else + { + Party::TakeGold(v63); + *(short *)v3 = 1; + } + } + } + result = pMessageQueue_50CBD0->uNumMessages; + if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + { + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1; + result = 3 * pMessageQueue_50CBD0->uNumMessages + 3; + *(&pMessageQueue_50CBD0->uNumMessages + result) = 0; + ++pMessageQueue_50CBD0->uNumMessages; + } + return result; + } + pRenderer->DrawTextureIndexed(8u, 8u, dword_F8B164); + v5 = 0; + v6 = 0; + v62 = 0; + v63 = 32; + do + { + if ( *(&pParty->pPlayers[1].pInstalledBeacons[0].field_18 + 9 * (v6 + 12 * (unsigned int)ptr_507BC0->ptr_1C)) ) + { + pRenderer->DrawTextureTransparent(v63, 0x5Au, dword_F8B168[v6]); + ZBuffer_DoFill((int *)((char *)pRenderer->pActiveZBuffer + v62 + 230528), dword_F8B168[v6], v6 + 1); + v1 = v58; + } + v63 += 70; + v62 += 280; + ++v6; + } + while ( v63 < 452 ); + v62 = 1680; + v7 = 6; + v63 = 32; + do + { + if ( *(&pParty->pPlayers[1].pInstalledBeacons[0].field_18 + 9 * (v7 + 12 * (unsigned int)ptr_507BC0->ptr_1C)) ) + { + pRenderer->DrawTextureTransparent(v63, 0xFAu, dword_F8B168[v7]); + ZBuffer_DoFill((int *)((char *)pRenderer->pActiveZBuffer + v62 + 638448), dword_F8B168[v7], v7 + 1); + v1 = v58; + } + v63 += 70; + v62 += 280; + ++v7; + } + while ( v63 < 452 ); + result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win(); + if ( result ) + { + v8 = 0; + v9 = 12; + v10 = (char *)(&pParty->pPlayers[1].pInstalledBeacons[0].field_18 + 108 * (unsigned int)ptr_507BC0->ptr_1C); + do + { + if ( *(int *)v10 ) + ++v8; + v10 += 36; + --v9; + } + while ( v9 ); + GetAsyncKeyState(17); + v11 = pGlobalTXT_LocalizationStrings[195]; + if ( dword_F8B19C != 2 ) + v11 = pGlobalTXT_LocalizationStrings[196]; + sub_4B46A5(v11, 0); + if ( !v8 ) + return (int)v52._4B1854( + __PAIR__( + *(int *)&stru_AA1058[3].pSounds[8 * (unsigned int)ptr_507BC0->ptr_1C + 44472], + *(int *)&stru_AA1058[3].pSounds[8 * (unsigned int)ptr_507BC0->ptr_1C + 44468]) + - pParty->uTimePlayed); + v12 = pMouse->GetCursorPos(&v51); + result = v12->x + pSRZBufferLineOffsets[pMouse->GetCursorPos(&v50)->y]; + v13 = pRenderer->pActiveZBuffer[result] & 0xFFFF; + if ( pRenderer->pActiveZBuffer[result] & 0xFFFF ) + { + v14 = ptr_507BC0->ptr_1C; + v15 = (ItemGen *)(&pParty->pPlayers[1].uExpressionTimeLength + 18 * (v13 + 12 * (int)v14)); + v16 = (int)ptr_507BC0->ptr_1C; + uPlayerID = uActiveCharacter - 1; + v17 = v1->_490EEE( + (ItemGen *)&pParty->pPlayers[1].uExpressionTimeLength + v13 + 12 * (int)v14, + 3, + v16, + 2); + v18 = sub_495461((char *)pMerchantsBuyPhrases[v17], uPlayerID, v15, (char *)v14, 2, 0); + v44 = 3; + v43 = v18; + v42 = v56; + v41 = 0; + v40 = 0; + v39 = &v52; +LABEL_32: + v19 = pFontArrus->CalcTextHeight(v18, v39, v40, v41); + return (int)v52.DrawText2(pFontArrus, v5, (174 - v19) / 2 + 138, v42, v43, v44); + } + } + return result; + } + if ( !(unsigned __int16)_449B57_test_bit( + (unsigned __int8 *)v1->field_152, + word_4F0704[2 * (unsigned int)ptr_507BC0->ptr_1C]) ) + { + v36 = dword_721A34; + v37 = v57; + v38 = pFontArrus->CalcTextHeight(dword_721A34, &v52, 0, 0); + v52.DrawText2(pFontArrus, 0, (212 - v38) / 2 + 101, v37, v36, 3u); + result = (int)pDialogueWindow; + pDialogueWindow->field_28 = 0; + return result; + } + result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win(); + if ( !result ) + return result; + v20 = pDialogueWindow; + v5 = 0; + v62 = 0; + Str = 0; + v21 = pDialogueWindow->field_38; + v22 = v21 + pDialogueWindow->field_28; + v61 = 0; + if ( v21 >= v22 ) + goto LABEL_64; + do + { + v23 = v20->GetControl(v21)->uControlParam; + if ( v23 == 18 ) + { + v25 = pFontArrus->CalcTextHeight(pGlobalTXT_LocalizationStrings[400], &v52, 0, 0); + v62 += v25; + ++v61; + } + else + { + if ( *(&byte_4ED94C[37 * v58->uClass] + v23) && !*(&v58->uIntelligence + v23) ) + { + v24 = pFontArrus->CalcTextHeight(pClassNames[v23 + 20], &v52, 0, 0); + v62 += v24; + ++v61; + ++Str; + } + } + ++v21; + } + while ( v21 < v20->field_28 + v20->field_38 ); + if ( !v61 ) + { +LABEL_64: + sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[544], v58->pName, pClassNames[v58->uClass]); + strcat(pTmpBuf, "\n \n"); + strcat(pTmpBuf, pGlobalTXT_LocalizationStrings[528]); + v18 = pTmpBuf; + v44 = 3; + v43 = pTmpBuf; + v42 = v57; + v41 = 0; + v40 = 0; + v39 = &v52; + goto LABEL_32; + } + if ( Str ) + { + sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[401], v63); + v52.DrawText2(pFontArrus, 0, 0x92u, 0, pTmpBuf, 3u); + } + v63 = (signed int)(149 - v62) / v61; + if ( v63 > 32 ) + v63 = 32; + result = v20->field_38; + v26 = (signed int)(149 - v61 * v63 - v62) / 2 - v63 / 2 + 162; + v62 = result; + v55 = v26; + if ( result < result + v20->field_28 ) + { + v61 = 2; + while ( 1 ) + { + v27 = v20->GetControl(v62); + v28 = v27; + v29 = v27->uControlParam; + if ( v29 == 18 ) + break; + if ( *(&byte_4ED94C[37 * v58->uClass] + v29) && !*(&v58->uIntelligence + v29) ) + { + v30 = pClassNames[v29 + 20]; +LABEL_55: + Str = v30; + v28->uY = v63 + v55; + v31 = pFontArrus->CalcTextHeight(v30, &v52, 0, 0); + v32 = v28->uY; + v28->uHeight = v31; + v33 = v32 + v31 - 1; + v28->uW = v33; + v55 = v33; + v34 = v57; + if ( pDialogueWindow->field_2C_focus_id != v61 ) + v34 = v56; + v52.DrawText2(pFontArrus, 0, v32, v34, Str, 3u); + goto LABEL_58; + } + v28->uW = 0; + v28->uHeight = 0; + v28->uY = 0; +LABEL_58: + v35 = v20->field_38; + ++v62; + result = v20->field_28 + v35; + ++v61; + if ( (signed int)v62 >= result ) + return result; + } + v30 = pGlobalTXT_LocalizationStrings[400]; + goto LABEL_55; + } + return result; +} + + + +//----- (004B705E) -------------------------------------------------------- +int __cdecl sub_4B705E() +{ + GUIWindow *v0; // ebx@1 + Player *v1; // esi@1 + int v2; // edi@1 + int result; // eax@4 + GUIWindow *v4; // edi@6 + void *v5; // eax@6 + int v6; // eax@6 + unsigned int v7; // eax@8 + int v8; // ecx@8 + unsigned int v9; // eax@9 + int v10; // eax@11 + int v11; // eax@12 + GUIWindow *v12; // ecx@16 + int v13; // edx@16 + GUIButton *v14; // eax@19 + GUIButton *v15; // edi@19 + int v16; // eax@19 + const char *v17; // eax@21 + int v18; // eax@21 + unsigned int v19; // ecx@21 + int v20; // eax@21 + unsigned __int16 v21; // ax@21 + unsigned __int16 v22; // ST14_2@27 + int v23; // eax@27 + double v24; // st7@28 + unsigned int v25; // ebx@28 + DDM_DLV_Header *v26; // edi@29 + int v27; // eax@31 + int v28; // eax@32 + unsigned int v29; // ecx@34 + unsigned int v30; // edx@36 + unsigned int v31; // edx@38 + unsigned int v32; // edx@40 + unsigned int v33; // edx@42 + unsigned int v34; // edx@44 + int v35; // edi@50 + signed int v36; // eax@50 + unsigned __int8 v37; // al@54 + int v38; // ecx@54 + GUIWindow *v39; // eax@56 + unsigned __int8 v40; // al@61 + GUIButton *v41; // edi@64 + int v42; // esi@66 + GUIWindow *v43; // ecx@66 + int v44; // edi@66 + int v45; // eax@68 + signed int v46; // edi@69 + int v47; // edi@71 + GUIButton *v48; // eax@73 + const char *v49; // edx@73 + GUIButton *v50; // esi@73 + int v51; // eax@73 + unsigned int v52; // ecx@73 + unsigned __int16 v53; // ax@73 + char a1[100]; // [sp+10h] [bp-1B4h]@64 + char Dest; // [sp+74h] [bp-150h]@66 + char v56; // [sp+D8h] [bp-ECh]@66 + GUIWindow v57; // [sp+13Ch] [bp-88h]@1 + __int64 v58; // [sp+190h] [bp-34h]@1 + __int64 v59; // [sp+198h] [bp-2Ch]@1 + __int64 v60; // [sp+1A0h] [bp-24h]@1 + GUIWindow *v61; // [sp+1ACh] [bp-18h]@6 + unsigned int v62; // [sp+1B0h] [bp-14h]@8 + unsigned __int8 v63; // [sp+1B7h] [bp-Dh]@64 + int v64; // [sp+1B8h] [bp-Ch]@6 + unsigned int v65; // [sp+1BCh] [bp-8h]@6 + DDM_DLV_Header *v66; // [sp+1C0h] [bp-4h]@6 + + v0 = ptr_507BC0; + memcpy(&v57, ptr_507BC0, sizeof(v57)); + v57.uFrameX = 483; + v57.uFrameWidth = 148; + v57.uFrameZ = 334; + HIDWORD(v58) = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu); + HIDWORD(v59) = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); + v1 = pPlayers[uActiveCharacter]; + //v2 = pPlayers[uActiveCharacter]->_4B807C(p2DEvents_minus1__20[13 * (unsigned int)v0->ptr_1C]); + v2 = pPlayers[uActiveCharacter]->_4B807C(p2DEvents[(unsigned int)v0->ptr_1C - 1].fPriceMultiplier); + HIDWORD(v60) = v2; + if ( dword_F8B19C != 1 ) + { + if ( dword_F8B19C != 10 ) + { + if ( dword_F8B19C != 11 ) + { + result = dword_F8B19C - 96; + if ( dword_F8B19C == 96 ) + { + result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win(); + if ( result ) + { + v4 = pDialogueWindow; + v61 = pDialogueWindow; + v5 = ptr_507BC0->ptr_1C; + v66 = 0; + //v65 = (signed __int64)(*(float *)&p2DEvents_minus1__24[13 * (signed int)v5] * 500.0); + v65 = (signed __int64)(p2DEvents[(signed int)v5 - 1].flt_24 * 500.0); + v6 = v1->GetMerchant(); + v64 = (signed int)(v65 * (100 - v6)) / 100; + if ( v64 < (signed int)v65 / 3 ) + v64 = (signed int)v65 / 3; + v7 = v4->field_38; + v8 = v7 + v4->field_28; + v65 = 0; + v62 = v7; + if ( (signed int)v7 >= v8 ) + goto LABEL_78; + do + { + v9 = v4->GetControl(v62)->uControlParam - 36; + if ( byte_4ED970_skill_learn_ability_by_class_table[v1->uClass][v9] && !v1->pActiveSkills[v9] ) + { + v10 = pFontArrus->CalcTextHeight(pSkillNames[v9], &v57, 0, 0); + v66 = (DDM_DLV_Header *)((char *)v66 + v10); + ++v65; + } + v11 = v4->field_38; + ++v62; + } + while ( (signed int)v62 < v4->field_28 + v11 ); + if ( v65 ) + { + sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[401], v64); + v57.DrawText2(pFontArrus, 0, 0x92u, 0, pTmpBuf, 3u); + v64 = (149 - (signed int)v66) / (signed int)v65; + if ( v64 > 32 ) + v64 = 32; + v65 = (signed int)(149 - v65 * v64 - (int)v66) / 2 - v64 / 2 + 162; + v12 = v61; + result = v61->field_38; + v13 = result + v61->field_28; + v62 = v61->field_38; + if ( result < v13 ) + { + v66 = (DDM_DLV_Header *)2; + while ( 1 ) + { + v14 = v12->GetControl(v62); + v15 = v14; + v16 = v14->uControlParam - 36; + if ( !byte_4ED970_skill_learn_ability_by_class_table[v1->uClass][v16] || v1->pActiveSkills[v16] ) + { + v15->uW = 0; + v15->uHeight = 0; + v15->uY = 0; + } + else + { + v17 = pSkillNames[v16]; + v15->uY = v64 + v65; + HIDWORD(v60) = (uint32)v17; + v18 = pFontArrus->CalcTextHeight(v17, &v57, 0, 0); + v19 = v15->uY; + v15->uHeight = v18; + v20 = v19 + v18 - 1; + v15->uW = v20; + v65 = v20; + v21 = WORD2(v59); + if ( (DDM_DLV_Header *)pDialogueWindow->field_2C_focus_id != v66 ) + v21 = WORD2(v58); + v57.DrawText2(pFontArrus, 0, v19, v21, (const char *)HIDWORD(v60), 3u); + } + result = (int)v61; + ++v62; + v66 = (DDM_DLV_Header *)((char *)v66 + 1); + if ( (signed int)v62 >= v61->field_28 + v61->field_38 ) + break; + v12 = v61; + } + } + } + else + { +LABEL_78: + sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[544], v1->pName, pClassNames[v1->uClass]); + strcat(pTmpBuf, "\n \n"); + strcat(pTmpBuf, pGlobalTXT_LocalizationStrings[528]); + v22 = WORD2(v59); + v23 = pFontArrus->CalcTextHeight(pTmpBuf, &v57, 0, 0); + result = (int)v57.DrawText2(pFontArrus, 0, (174 - v23) / 2 + 138, v22, pTmpBuf, 3u); + } + } + } + return result; + } + //v24 = p2DEvents_minus1__20[13 * (unsigned int)ptr_507BC0->ptr_1C]; + v24 = p2DEvents[(unsigned int)ptr_507BC0->ptr_1C - 1].fPriceMultiplier; + v25 = 0; + if ( pParty->uNumGold >= (unsigned int)(signed __int64)v24 ) + { + Party::TakeGold((signed __int64)v24); + v26 = &pOutdoor->ddm; + if ( uCurrentlyLoadedLevelType != LEVEL_Outdoor ) + v26 = &pIndoor->dlv; + v27 = v26->uReputation; + v66 = v26; + if ( v27 > -5 ) + { + v28 = v27 - 1; + v26->uReputation = v28; + if ( v28 < -5 ) + v26->uReputation = -5; + } + v29 = uActiveCharacter; + if ( (unsigned __int8)byte_F8B1EF[uActiveCharacter] == pParty->uDaysPlayed % 7 ) + { + if ( v26->uReputation <= -5 ) + { + v30 = pParty->uDaysPlayed % 7 + 1; + LOBYTE(v30) = v30 | 0x80; + _42777D_CastSpell_UseWand_ShootArrow(12, uActiveCharacter - 1, v30, 48, 0); + v29 = uActiveCharacter; + } + if ( v26->uReputation <= -10 ) + { + v31 = pParty->uDaysPlayed % 7 + 1; + LOBYTE(v31) = v31 | 0x80; + _42777D_CastSpell_UseWand_ShootArrow(50, v29 - 1, v31, 48, 0); + v29 = uActiveCharacter; + v26 = v66; + } + if ( v26->uReputation <= -15 ) + { + v32 = pParty->uDaysPlayed % 7 + 1; + LOBYTE(v32) = v32 | 0x80; + _42777D_CastSpell_UseWand_ShootArrow(75, v29 - 1, v32, 48, 0); + v29 = uActiveCharacter; + v26 = v66; + } + if ( v26->uReputation <= -20 ) + { + v33 = pParty->uDaysPlayed % 7 + 1; + LOBYTE(v33) = v33 | 0x80; + _42777D_CastSpell_UseWand_ShootArrow(86, v29 - 1, v33, 48, 0); + v29 = uActiveCharacter; + v26 = v66; + } + if ( v26->uReputation <= -25 ) + { + v34 = pParty->uDaysPlayed % 7 + 1; + LOBYTE(v34) = v34 | 0x80; + _42777D_CastSpell_UseWand_ShootArrow(85, v29 - 1, v34, 48, 0); + v29 = uActiveCharacter; + } + } + ++byte_F8B1EF[v29]; + v1->PlaySound(83, 0); + ShowStatusBarString(pGlobalTXT_LocalizationStrings[527], 2u); + goto LABEL_46; + } + goto LABEL_55; + } + result = v1->_4B6FF9(); + if ( !result ) + return result; + v25 = 0; + if ( pParty->uNumGold < v2 ) + { +LABEL_55: + ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2u); + HousePlaySomeSound((unsigned int)ptr_507BC0->ptr_1C, 2); + goto LABEL_46; + } + Party::TakeGold(v2); + v35 = LODWORD(v1->pConditions[17]); + v59 = v1->pConditions[14]; + v58 = v1->pConditions[15]; + v60 = v1->pConditions[16]; + v61 = (GUIWindow *)HIDWORD(v1->pConditions[17]); + memset(v1, 0, 0xA0u); + v1->sHealth = v1->GetMaxHealth(); + v1->sMana = v1->GetMaxMana(); + v36 = (signed int)ptr_507BC0->ptr_1C; + if ( v36 != 78 && (v36 <= 80 || v36 > 82) ) + { + if ( (unsigned int)v61 | v35 ) + { + v37 = LOBYTE(v1->field_1928); + v38 = v1->field_1924; + v1->uFace = v37; + v1->uVoiceID = v38; + ReloadPlayerPortraits(uActiveCharacter - 1, (char)v37); + } + goto LABEL_63; + } + v39 = v61; + if ( (unsigned int)v61 | v35 ) + { + LODWORD(v1->pConditions[17]) = v35; + } + else + { + if ( !v60 && !v58 && !v59 ) + goto LABEL_63; + v1->field_1928 = v1->uFace; + v1->field_1924 = v1->uVoiceID; + v1->SetCondition(0x11u, 1); + v1->uVoiceID = (v1->GetSexByVoice() != 0) + 23; + v40 = (v1->GetSexByVoice() != 0) + 23; + v1->uFace = v40; + ReloadPlayerPortraits(uActiveCharacter - 1, (char)v40); + LODWORD(v1->pConditions[17]) = LODWORD(pParty->uTimePlayed); + v39 = (GUIWindow *)HIDWORD(pParty->uTimePlayed); + } + HIDWORD(v1->pConditions[17]) = (int)v39; +LABEL_63: + pAudioPlayer->PlaySound((SoundID)(SOUND_GoldReceived|0x2), -1, 0, -1, 0, 0, 0, 0); + v1->PlaySound(82, 0); + pOtherOverlayList->_4418B1(20, uActiveCharacter + 99, 0, 65536); +LABEL_46: + result = pMessageQueue_50CBD0->uNumMessages; + if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + { + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1; + result = 3 * pMessageQueue_50CBD0->uNumMessages + 3; + *(&pMessageQueue_50CBD0->uNumMessages + result) = v25; + ++pMessageQueue_50CBD0->uNumMessages; + } + return result; + } + v63 = 1; + v41 = pDialogueWindow->GetControl(pDialogueWindow->field_38); + strcpy(a1, nullstring); + v41->uHeight = 0; + v41->uY = 0; + if ( v1->_4B6FF9() ) + { + sprintfex(a1, "%s %d %s", pGlobalTXT_LocalizationStrings[104], HIDWORD(v60), pGlobalTXT_LocalizationStrings[97]); + v63 = 0; + } + strcpy(&Dest, pGlobalTXT_LocalizationStrings[68]); + strcpy(&v56, pGlobalTXT_LocalizationStrings[160]); + v42 = v63; + v43 = pDialogueWindow; + v44 = v63; + v66 = 0; + if ( v63 < pDialogueWindow->field_28 ) + { + v61 = (GUIWindow *)&a1[100 * v63]; + do + { + v45 = pFontArrus->CalcTextHeight((const char *)v61, &v57, 0, 0); + v66 = (DDM_DLV_Header *)((char *)v66 + v45); + v43 = pDialogueWindow; + v61 = (GUIWindow *)((char *)v61 + 100); + ++v44; + } + while ( v44 < pDialogueWindow->field_28 ); + } + v46 = v43->field_28 - v42; + v64 = (174 - (signed int)v66) / v46; + if ( v64 > 32 ) + v64 = 32; + result = v43->field_38; + v47 = (174 - v64 * v46 - (signed int)v66) / 2 - v64 / 2 + 138; + v65 = v42 + result; + if ( v42 + result < result + v43->field_28 ) + { + v61 = (GUIWindow *)(v42 + 2); + v66 = (DDM_DLV_Header *)&a1[100 * v42]; + do + { + v48 = v43->GetControl(v65); + v49 = (const char *)v66; + v50 = v48; + v48->uY = v64 + v47; + v51 = pFontArrus->CalcTextHeight(v49, &v57, 0, 0); + v52 = v50->uY; + v50->uHeight = v51; + v47 = v52 + v51 - 1; + v50->uW = v47; + v53 = WORD2(v59); + if ( (GUIWindow *)pDialogueWindow->field_2C_focus_id != v61 ) + v53 = WORD2(v58); + v57.DrawText2(pFontArrus, 0, v52, v53, (const char *)v66, 3u); + v43 = pDialogueWindow; + v66 = (DDM_DLV_Header *)((char *)v66 + 100); + v61 = (GUIWindow *)((char *)v61 + 1); + ++v65; + result = pDialogueWindow->field_28 + pDialogueWindow->field_38; + } + while ( (signed int)v65 < result ); + } + return result; +} + + + +//----- (004B8F94) -------------------------------------------------------- +void *__cdecl sub_4B8F94() +{ + GUIWindow *v0; // edi@1 + signed int v1; // ebp@1 + int v2; // ebx@1 + signed int v3; // esi@1 + int v4; // eax@3 + int v5; // ebx@3 + int v6; // ecx@3 + bool v7; // eax@5 + bool v8; // ST1C_4@5 + int v9; // eax@5 + int v10; // eax@10 + void *result; // eax@15 + signed int v12; // [sp-4h] [bp-18h]@7 + + v0 = ptr_507BC0; + v1 = 0; + v2 = (int)&ptr_507BC0->ptr_1C; + v3 = (signed int)ptr_507BC0->ptr_1C; + //if ( _4F063C_smthn_by_2da_uType[p2DEvents_minus1___00[26 * (unsigned int)ptr_507BC0->ptr_1C]] ) + if ( _4F063C_smthn_by_2da_uType[p2DEvents[(unsigned int)ptr_507BC0->ptr_1C - 1].uType] ) + { + while ( v3 > 14 ) + { + if ( v3 <= 28 ) + { + v7 = v1 > 3; + v8 = v7; + v9 = 5 * (v7 + 2 * v3 - 30); + v3 = (signed int)v0->ptr_1C; + v5 = word_4F06D8[v9]; + v6 = word_4F05AE[5 * (v8 + 2 * v3) + rand() % 4]; + goto LABEL_13; + } + if ( v3 <= 41 ) + { + v5 = word_4F07B6[v3]; + v12 = 22; + goto LABEL_12; + } + if ( v3 <= 53 ) + { + if ( v1 >= 6 ) + { + v5 = word_4F07B6[v3 + 1]; + v12 = 44; +LABEL_12: + v6 = v12; +LABEL_13: + pItemsTable->GenerateItem(v5, v6, (ItemGen *)&pParty->field_C59C[9 * (v1 + 12 * v3) + 724]); + v0 = ptr_507BC0; + v2 = (int)&ptr_507BC0->ptr_1C; + pParty->field_C59C[9 * (v1 + 12 * (unsigned int)ptr_507BC0->ptr_1C) + 729] = 1; + goto LABEL_14; + } + auto _a = (ItemGen *)&pParty->field_C59C[9 * (v1 + 12 * v3) + 724]; + _a->Reset(); + v2 = (int)&v0->ptr_1C; + v10 = rand(); + v0 = ptr_507BC0; + pParty->field_C59C[9 * (v1 + 12 * *(int *)v2) + 724] = v10 % 32 + 740; + } +LABEL_14: + v3 = *(int *)v2; + ++v1; + //if ( v1 >= (unsigned __int8)_4F063C_smthn_by_2da_uType[p2DEvents_minus1___00[26 * *(int *)v2]] ) + if ( v1 >= (unsigned __int8)_4F063C_smthn_by_2da_uType[p2DEvents[*(int *)v2 - 1].uType] ) + goto LABEL_15; + } + v4 = 5 * v3; + v3 = (signed int)v0->ptr_1C; + v5 = word_4F063E[v4]; + v6 = word_4F063E[5 * v3 + rand() % 4 + 1]; + goto LABEL_13; + } +LABEL_15: + result = v0->ptr_1C; + *(int *)&pParty->field_16154[4 * (int)result] = 0; + return result; +} + + +//----- (004B6478) -------------------------------------------------------- +int __cdecl sub_4B6478() +{ + GUIWindow *v0; // ebx@1 + Player *v1; // edi@1 + unsigned int v2; // eax@1 + signed int v3; // esi@1 + int v4; // ebx@1 + unsigned int v5; // esi@5 + int v6; // edi@6 + int result; // eax@13 + GUIWindow *v8; // ebx@17 + int v9; // eax@17 + int v10; // ecx@17 + unsigned int v11; // ecx@18 + int v12; // eax@20 + int v13; // eax@21 + GUIButton *v14; // esi@27 + int v15; // ecx@27 + unsigned int v16; // eax@28 + const char *v17; // ebx@29 + int v18; // eax@29 + unsigned int v19; // ecx@29 + int v20; // eax@29 + unsigned __int16 v21; // ax@29 + unsigned __int16 v22; // ST14_2@36 + int v23; // eax@36 + const char *v24; // ST18_4@37 + unsigned __int16 v25; // ST14_2@37 + int v26; // eax@37 + int v27; // [sp-4h] [bp-80h]@8 + GUIWindow v28; // [sp+Ch] [bp-70h]@1 + GUIWindow *v29; // [sp+60h] [bp-1Ch]@17 + unsigned int v30; // [sp+64h] [bp-18h]@1 + int v31; // [sp+68h] [bp-14h]@1 + int v32; // [sp+6Ch] [bp-10h]@1 + int v33; // [sp+70h] [bp-Ch]@17 + int v34; // [sp+74h] [bp-8h]@17 + int v35; // [sp+78h] [bp-4h]@17 + + v0 = ptr_507BC0; + memcpy(&v28, ptr_507BC0, sizeof(v28)); + v1 = pPlayers[uActiveCharacter]; + v28.uFrameX = 483; + v28.uFrameWidth = 148; + v28.uFrameZ = 334; + v30 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu); + v31 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); + v2 = 52 * (unsigned int)v0->ptr_1C; + //v32 = (unsigned __int8)(((p2DEvents_minus1___00[v2 / 2] != 18) - 1) & 0x96) + 100; + v32 = (unsigned __int8)(((p2DEvents[(unsigned int)v0->ptr_1C - 1].uType != 18) - 1) & 0x96) + 100; + //v3 = (signed __int64)((double)v32 * p2DEvents_minus1__20[v2 / 4]); + v3 = (signed __int64)((double)v32 * p2DEvents[(unsigned int)v0->ptr_1C - 1].fPriceMultiplier); + v4 = v3 * (100 - v1->GetMerchant()) / 100; + v32 = v4; + if ( v4 < v3 / 3 ) + { + v4 = v3 / 3; + v32 = v3 / 3; + } + if ( dword_F8B19C != 1 ) + { + if ( sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() ) + { + v5 = 0; + if ( !*(&byte_4ED94C[37 * v1->uClass / 3] + dword_F8B19C) + || (v6 = (int)(&v1->uIntelligence + dword_F8B19C), *(short *)v6) ) + { + pAudioPlayer->PlaySound(SOUND_27, 0, 0, -1, 0, 0, 0, 0); + } + else + { + if ( pParty->uNumGold < v4 ) + { + ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2u); + v27 = 4; + } + else + { + Party::TakeGold(v4); + *(short *)v6 = 1; + v27 = 2; + } + HousePlaySomeSound((unsigned int)ptr_507BC0->ptr_1C, v27); + } + } + else + { + v5 = 0; + } + result = pMessageQueue_50CBD0->uNumMessages; + if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + { + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1; + result = 3 * pMessageQueue_50CBD0->uNumMessages + 3; + *(&pMessageQueue_50CBD0->uNumMessages + result) = v5; + ++pMessageQueue_50CBD0->uNumMessages; + } + return result; + } + if ( !(unsigned __int16)_449B57_test_bit( + (unsigned __int8 *)v1->field_152, + word_4F0754[2 * (unsigned int)ptr_507BC0->ptr_1C]) ) + { + v24 = dword_721BC4; + v25 = v31; + v26 = pFontArrus->CalcTextHeight(dword_721BC4, &v28, 0, 0); + v28.DrawText2(pFontArrus, 0, (212 - v26) / 2 + 101, v25, v24, 3u); + result = (int)pDialogueWindow; + pDialogueWindow->field_28 = 0; + return result; + } + result = sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win(); + if ( !result ) + return result; + v8 = pDialogueWindow; + v33 = 0; + v34 = 0; + v29 = pDialogueWindow; + v9 = pDialogueWindow->field_38; + v10 = v9 + pDialogueWindow->field_28; + v35 = pDialogueWindow->field_38; + if ( v9 >= v10 ) + goto LABEL_40; + do + { + v11 = v8->GetControl(v35)->uControlParam - 36; + if ( byte_4ED970_skill_learn_ability_by_class_table[v1->uClass / 3][v11] && !v1->pActiveSkills[v11] ) + { + v12 = pFontArrus->CalcTextHeight(pSkillNames[v11], &v28, 0, 0); + v33 += v12; + ++v34; + } + v13 = v8->field_38; + ++v35; + } + while ( v35 < v8->field_28 + v13 ); + if ( !v34 ) + { +LABEL_40: + sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[544], v1->pName, pClassNames[v1->uClass]); + strcat(pTmpBuf, "\n \n"); + strcat(pTmpBuf, pGlobalTXT_LocalizationStrings[528]); + v22 = v31; + v23 = pFontArrus->CalcTextHeight(pTmpBuf, &v28, 0, 0); + return (int)v28.DrawText2(pFontArrus, 0, (174 - v23) / 2 + 138, v22, pTmpBuf, 3u); + } + sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[401], v32); + v28.DrawText2(pFontArrus, 0, 0x92u, 0, pTmpBuf, 3u); + v32 = (149 - v33) / v34; + if ( (149 - v33) / v34 > 32 ) + v32 = 32; + result = v8->field_38; + v35 = result; + v34 = (149 - v34 * v32 - v33) / 2 - v32 / 2 + 162; + if ( result < result + v8->field_28 ) + { + v33 = 2; + do + { + v14 = v8->GetControl(v35); + v15 = v14->uControlParam - 36; + if ( byte_4ED970_skill_learn_ability_by_class_table[v1->uClass / 3][v15] ) + { + v16 = 0; + if ( !v1->pActiveSkills[v15] ) + { + v17 = pSkillNames[v15]; + v14->uY = v32 + v34; + v18 = pFontArrus->CalcTextHeight(v17, &v28, 0, 0); + v19 = v14->uY; + v14->uHeight = v18; + v20 = v19 + v18 - 1; + v14->uW = v20; + v34 = v20; + v21 = v31; + if ( pDialogueWindow->field_2C_focus_id != v33 ) + v21 = v30; + v28.DrawText2(pFontArrus, 0, v19, v21, v17, 3u); + goto LABEL_34; + } + } + else + { + v16 = 0; + } + v14->uW = v16; + v14->uHeight = v16; + v14->uY = v16; +LABEL_34: + v8 = v29; + ++v35; + ++v33; + result = v29->field_28 + v29->field_38; + } + while ( v35 < result ); + } + return result; +} + + + +//----- (004B6943) -------------------------------------------------------- +void __cdecl TravelByTransport() +{ + GUIWindow *v0; // ebx@1 + Player *v1; // esi@1 + signed int v2; // edi@1 + unsigned int v3; // eax@1 + signed int v4; // ebx@1 + char *v5; // esi@7 + int v6; // eax@9 + int v7; // eax@9 + int v8; // eax@12 + int v9; // edi@12 + int v10; // edx@12 + int v11; // ecx@12 + signed int v12; // esi@13 + signed int v13; // edi@14 + DWORD v14; // eax@26 + DWORD v15; // edi@26 + GUIWindow *v16; // ebx@36 + int v17; // esi@36 + int v18; // eax@36 + int v19; // ecx@36 + int v20; // esi@36 + int v21; // eax@36 + void *v22; // eax@39 + Player *v23; // esi@39 + GUIButton *v24; // ebx@39 + signed int v25; // eax@41 + int v26; // esi@44 + const char *v27; // eax@46 + char *v28; // eax@62 + int v29; // eax@62 + unsigned int v30; // ecx@62 + char *v31; // eax@63 + char v32; // [sp-3Ch] [bp-2CCh]@62 + int v33; // [sp-38h] [bp-2C8h]@62 + int v34; // [sp-34h] [bp-2C4h]@62 + int v35; // [sp-30h] [bp-2C0h]@62 + int v36; // [sp-2Ch] [bp-2BCh]@62 + int v37; // [sp-28h] [bp-2B8h]@62 + int v38; // [sp-24h] [bp-2B4h]@62 + int v39; // [sp-20h] [bp-2B0h]@62 + int v40; // [sp-1Ch] [bp-2ACh]@62 + int v41; // [sp-18h] [bp-2A8h]@62 + int v42; // [sp-14h] [bp-2A4h]@62 + char *v43; // [sp-10h] [bp-2A0h]@62 + char *v44; // [sp-Ch] [bp-29Ch]@62 + unsigned int v45; // [sp-8h] [bp-298h]@62 + char *v46; // [sp-4h] [bp-294h]@62 + const char *v47[5]; // [sp+0h] [bp-290h]@7 + char v48; // [sp+14h] [bp-27Ch]@37 + char v49; // [sp+78h] [bp-218h]@68 + char v50; // [sp+DCh] [bp-1B4h]@68 + char v51; // [sp+140h] [bp-150h]@68 + char Dest; // [sp+1A4h] [bp-ECh]@36 + GUIWindow v53; // [sp+208h] [bp-88h]@1 + int v54; // [sp+25Ch] [bp-34h]@36 + int v55; // [sp+260h] [bp-30h]@36 + unsigned int v56; // [sp+264h] [bp-2Ch]@1 + __int16 v57[2]; // [sp+268h] [bp-28h]@1 + Player *v58; // [sp+26Ch] [bp-24h]@36 + GUIWindow *v59; // [sp+270h] [bp-20h]@1 + unsigned int v60; // [sp+274h] [bp-1Ch]@36 + Player *v61; // [sp+278h] [bp-18h]@1 + int v62; // [sp+27Ch] [bp-14h]@36 + int v63; // [sp+280h] [bp-10h]@14 + char *a1; // [sp+284h] [bp-Ch]@37 + unsigned int s1; // [sp+288h] [bp-8h]@1 + int v66; // [sp+28Ch] [bp-4h]@48 + + v0 = ptr_507BC0; + memcpy(&v53, ptr_507BC0, sizeof(v53)); + v2 = 255; + v61 = pPlayers[uActiveCharacter]; + v1 = v61; + v53.uFrameX = 483; + v53.uFrameWidth = 148; + v53.uFrameZ = 334; + *(int *)v57 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu); + v56 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); + v3 = 52 * (unsigned int)v0->ptr_1C; + //v59 = (GUIWindow *)((((p2DEvents_minus1___00[v3 / 2] != 27) - 1) & 0xFFFFFFE7) + 50); + v59 = (GUIWindow *)((((p2DEvents[(unsigned int)v0->ptr_1C - 1].uType != 27) - 1) & 0xFFFFFFE7) + 50); + //v4 = (signed __int64)((double)(signed int)v59 * p2DEvents_minus1__20[v3 / 4]); + v4 = (signed __int64)((double)(signed int)v59 * p2DEvents[(unsigned int)v0->ptr_1C - 1].fPriceMultiplier); + s1 = v4 * (100 - v1->GetMerchant()) / 100; + if ( (signed int)s1 < v4 / 3 ) + s1 = v4 / 3; + if ( dword_F8B19C == 1 ) + { + if ( sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win() ) + { + v16 = pDialogueWindow; + v58 = (Player *)-1; + v62 = 0; + v17 = LOBYTE(pFontArrus->uFontHeight) - 3; + v59 = pDialogueWindow; + v54 = v17; + strcpy(&Dest, nullstring); + sprintfex(pTmpBuf2, pGlobalTXT_LocalizationStrings[405], s1); + v18 = pFontArrus->CalcTextHeight(pTmpBuf2, &v53, 0, 0); + v19 = v16->field_28; + v20 = v18 + v17 + 146; + v21 = v16->field_38; + v63 = v20; + v55 = v20; + v60 = v21; + if ( v21 >= v21 + v19 ) + goto LABEL_71; + s1 = 2; + a1 = &v48; + while ( 1 ) + { + v47[1] = (const char *)v60; + v22 = ptr_507BC0->ptr_1C; + v23 = (Player *)(unsigned __int8)*(&_4F0D38_TravelInfo[4 * (signed int)v22] + v62); + v61 = (Player *)(unsigned __int8)*(&_4F0D38_TravelInfo[4 * (signed int)v22] + v62); + v24 = v16->GetControl(v60); + if ( v23 != v58 + && ((signed int)s1 >= 6 ? (v25 = 1) : (v25 = (unsigned __int8)*(&byte_4F09B1[32 * (int)v23] + + pParty->uDaysPlayed % 7)), + v25 + && ((v26 = 8 * (int)v23, !dword_4F09CC[v26]) + || (unsigned __int16)_449B57_test_bit(pParty->_award_bits, LOWORD(dword_4F09CC[v26])))) ) + { + v58 = v61; + v27 = (const char *)v56; + if ( pDialogueWindow->field_2C_focus_id != s1 ) + v27 = *(const char **)v57; + v47[1] = v27; + sprintfex(a1, format_4E2DC8, v27); + v66 = (unsigned __int8)byte_4F09B8[v26 * 4]; + if ( (signed int)ptr_507BC0->ptr_1C >= 63 ) + { + if ( CheckHiredNPCSpeciality(8u) ) + v66 -= 2; + if ( CheckHiredNPCSpeciality(9u) ) + v66 -= 3; + v47[1] = (const char *)45; + } + else + { + v47[1] = (const char *)35; + } + if ( CheckHiredNPCSpeciality((unsigned int)v47[1]) ) + v66 -= 2; + if ( CheckHiredNPCSpeciality(0x2Cu) ) + --v66; + if ( v66 < 1 ) + v66 = 1; + if ( v61 != (Player *)v2 ) + { + memcpy(&v32, (char *)&pMapStats + 68 * (unsigned __int8)byte_4F09B0[v26 * 4], 0x44u); + sprintfex( + pTmpBuf, + pGlobalTXT_LocalizationStrings[404], + v66, + *(int *)&v32, + v33, + v34, + v35, + v36, + v37, + v38, + v39, + v40, + v41, + v42, + v43, + v44, + v45, + v46, + *(_QWORD *)v47); + strcat(a1, pTmpBuf); + v28 = a1; + a1 += 100; + ++v62; + ++s1; + strcat(v28, "\n \n"); + v24->uY = v63; + v29 = pFontArrus->CalcTextHeight(pTmpBuf, &v53, 0, 0); + v30 = v24->uY; + v24->uHeight = v29; + v2 = 255; + v24->uW = v30 + v29 - 1; + v63 += v54 + v29; + } + } + else + { + v31 = a1; + ++v62; + ++s1; + a1 += 100; + strcpy(v31, nullstring); + if ( v24 ) + { + v24->uW = 0; + v24->uHeight = 0; + v24->uY = 0; + } + } + ++v60; + if ( (signed int)v60 >= v59->field_28 + v59->field_38 ) + break; + v16 = v59; + } + if ( v63 != v55 ) + { + v47[1] = &Dest; + v47[0] = &v51; + v46 = &v50; + v45 = (unsigned int)&v49; + v44 = &v48; + v43 = pTmpBuf2; + sprintfex(pTmpBuf, "%s\n \n%s%s%s%s%s", pTmpBuf2, &v48, &v49, &v50, &v51, &Dest); + v53.DrawText2(pFontArrus, 0, 0x92u, 0, pTmpBuf, 3u); + } + else + { +LABEL_71: + v47[1] = (const char *)3; + v47[0] = pGlobalTXT_LocalizationStrings[561]; + v46 = *(char **)v57; + v45 = (174 - pFontArrus->CalcTextHeight(pGlobalTXT_LocalizationStrings[561], &v53, 0, 0)) / 2 + 138; + v53.DrawText2(pFontArrus, 0, v45, (unsigned __int16)v46, v47[0], (unsigned int)v47[1]); + pAudioPlayer->StopChannels(-1, -1); + } + } + } + else + { + if ( dword_F8B19C > 104 && dword_F8B19C <= 108 ) + { + if ( pParty->uNumGold < s1 ) + { + ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2u); + HousePlaySomeSound((unsigned int)ptr_507BC0->ptr_1C, 3); + if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) + return; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1; + goto LABEL_33; + } + Party::TakeGold(s1); + v47[1] = (const char *)7; + v5 = &byte_4F09B0[32 * (unsigned __int8)*(&byte_4F0CCF[4 * (unsigned int)ptr_507BC0->ptr_1C] + dword_F8B19C)]; + if ( v5[pParty->uDaysPlayed % 7 + 1] ) + { + if ( _strcmpi(pCurrentMapName, pMapStats->pInfos[(unsigned __int8)*v5].pFilename) ) + { + SaveGame(1, 0); + strcpy(pCurrentMapName, pMapStats->pInfos[(unsigned __int8)*v5].pFilename); + v8 = *((int *)v5 + 6); + v9 = *((int *)v5 + 5); + v10 = *((int *)v5 + 4); + dword_6BE364_game_settings_1 |= 1u; + _5B65B8_npcdata_hiword_house_or_other = 0; + dword_5B65BC = 0; + _5B65B4_npcdata_loword_house_or_other = v8; + v11 = *((int *)v5 + 3); + uGameState = 2; + _5B65A8_npcdata_uflags_or_other = v11; + _5B65AC_npcdata_fame_or_other = v10; + _5B65B0_npcdata_rep_or_other = v9; + dword_5B65C0 = v11 | v10 | v9 | v8; + } + else + { + v6 = *((int *)v5 + 3); + pParty->sRotationX = 0; + pParty->vPosition.x = v6; + v7 = *((int *)v5 + 4); + pIndoorCamera->sRotationY = 0; + pParty->uFlags |= 2u; + pParty->vPosition.z = v7; + pParty->vPosition.y = *((int *)v5 + 5); + pParty->uFallStartY = pParty->vPosition.y; + pParty->sRotationY = *((int *)v5 + 6); + } + HousePlaySomeSound((unsigned int)ptr_507BC0->ptr_1C, 2); + v12 = (unsigned __int8)v5[8]; + if ( (signed int)ptr_507BC0->ptr_1C >= 63 ) + { + v63 = 72; + v13 = 2500; + if ( CheckHiredNPCSpeciality(8u) ) + v12 -= 2; + if ( CheckHiredNPCSpeciality(9u) ) + v12 -= 3; + v47[1] = (const char *)45; + } + else + { + v63 = 71; + v13 = 1500; + v47[1] = (const char *)35; + } + if ( CheckHiredNPCSpeciality((unsigned int)v47[1]) ) + v12 -= 2; + if ( CheckHiredNPCSpeciality(0x2Cu) ) + --v12; + if ( v12 < 1 ) + v12 = 1; + RestAndHeal(1440 * v12); + v61->PlaySound(v63, 0); + v14 = GetTickCount(); + v15 = v14 + v13; + if ( v15 < v14 ) + v15 = v14; + while ( GetTickCount() < v15 ) + sqrt(3.1415926); + while ( sub_4BD8B5() ) + ; + if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + { + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; +LABEL_33: + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; + ++pMessageQueue_50CBD0->uNumMessages; + return; + } + } + else + { + dword_F8B19C = 1; + pAudioPlayer->PlaySound(SOUND_27, 0, 0, -1, 0, 0, 0, 0); + } + } + } +} + + + + + +//----- (00405CFF) -------------------------------------------------------- +void stru262_TurnBased::End(unsigned int bPlaySound) +{ + stru262_TurnBased *v2; // edi@1 + int v3; // ebx@1 + int v4; // esi@1 + unsigned __int8 v5; // zf@1 + unsigned __int8 v6; // sf@1 + TurnBased_QueueElem *v7; // ecx@2 + unsigned __int16 *pAttributes; // ecx@7 + size_t v9; // edx@7 + unsigned __int16 v10; // ax@8 + TurnBased_QueueElem *v11; // ebx@12 + ObjectType objType; // eax@13 + int objID; // esi@13 + int v14; // [sp+Ch] [bp-4h]@11 + + v2 = this; + v3 = 0; + v4 = 0; + v5 = this->uActorQueueSize == 0; + v6 = this->uActorQueueSize < 0; + this->field_4 = 0; + if ( !(v6 | v5) ) + { + v7 = this->pQueue; + do + { + if ( (v7->uPackedID & 7) == OBJECT_Actor ) + LOBYTE(pActors[v7->uPackedID >> 3].uAttributes) &= 0x7Fu; + ++v4; + ++v7; + } + while ( v4 < v2->uActorQueueSize ); + } + if ( (signed int)uNumLayingItems > 0 ) + { + pAttributes = &pLayingItems[0].uAttributes; + v9 = uNumLayingItems; + do + { + v10 = *pAttributes; + if ( *pAttributes & 4 ) + { + LOBYTE(v10) = v10 & 0xFB; + *pAttributes = v10; + } + pAttributes += 56; + --v9; + } + while ( v9 ); + } + v14 = 0; + if ( v2->uActorQueueSize > 0 ) + { + v11 = v2->pQueue; + do + { + objType = (ObjectType)(v11->uPackedID & 7); + objID = v11->uPackedID >> 3; + if ( objType == OBJECT_Player ) + { + pPlayers[objID + 1]->uTimeToRecovery = (signed __int64)((double)v11->field_4 * 2.133333333333333); + } + else + { + if ( objType == OBJECT_Actor ) + pActors[objID].pMonsterInfo.uRecoveryTime = (signed __int64)((double)v11->field_4 * 2.133333333333333); + } + ++v14; + ++v11; + } + while ( v14 < v2->uActorQueueSize ); + v3 = 0; + } + pAudioPlayer->StopChannels(-1, -1); + if ( bPlaySound != v3 ) + pAudioPlayer->PlaySound((SoundID)(SOUND_GoldReceived|SOUND_EnteringAHouse), v3, v3, -1, v3, v3, v3, v3); + pTurnEngine->field_18 &= 0xFFFFFFFDu; + pEventTimer->StopGameTime(); + dword_50C994 = v3; + dword_50C998_turnbased_icon_1A = v3; +} +// 50C994: using guessed type int dword_50C994; +// 50C998: using guessed type int dword_50C998_turnbased_icon_1A; + +//----- (00405E14) -------------------------------------------------------- +void stru262_TurnBased::_405E14() +{ + stru262_TurnBased *v1; // esi@1 + int v2; // ecx@1 + SpellBuff *v3; // edi@2 + Actor *v4; // ebx@3 + signed int v5; // edx@20 + AIDirection *v6; // esi@21 + int v7; // eax@21 + int v8; // eax@21 + int v9; // eax@22 + int v10; // eax@23 + int v11; // eax@37 + int v12; // eax@44 + AIDirection a3; // [sp+4h] [bp-68h]@21 + AIDirection v14; // [sp+20h] [bp-4Ch]@21 + AIDirection v15; // [sp+3Ch] [bp-30h]@21 + SpellBuff *v16; // [sp+58h] [bp-14h]@2 + int v17; // [sp+5Ch] [bp-10h]@6 + stru262_TurnBased *v18; // [sp+60h] [bp-Ch]@1 + int v19; // [sp+64h] [bp-8h]@8 + unsigned int v20; // [sp+68h] [bp-4h]@1 + + v1 = this; + v2 = 0; + v18 = v1; + v20 = 0; + if ( (signed int)uNumActors > 0 ) + { + v3 = pActors[0].pActorBuffs; + v16 = pActors[0].pActorBuffs; + do + { + v4 = (Actor *)((char *)&v3[-13] - 4); + if ( SHIDWORD(v3[3].uExpireTime) < v2 || SHIDWORD(v3[3].uExpireTime) <= v2 && LODWORD(v3[3].uExpireTime) <= v2 ) + v17 = v2; + else + v17 = 1; + v19 = v2; + do + { + if ( v19 != 10 ) + { + v3->_4585CA(pParty->uTimePlayed); + v2 = 0; + } + ++v19; + ++v3; + } + while ( v19 < 22 ); + if ( v17 != v2 + && SHIDWORD(v4->pActorBuffs[3].uExpireTime) <= v2 + && (SHIDWORD(v4->pActorBuffs[3].uExpireTime) < v2 || LODWORD(v4->pActorBuffs[3].uExpireTime) <= v2) ) + v4->uActorHeight = pMonsterList->pMonsters[v4->pMonsterInfo.uID - 1].uMonsterHeight; + if ( !(v4->uAttributes & 0x80) ) + { + if ( !v4->pActorBuffs[5].uExpireTime ) + { + if ( !v4->pActorBuffs[6].uExpireTime ) + { + v5 = v4->uCurrentActionLength; + v4->uCurrentActionTime += pMiscTimer->uTimeElapsed; + if ( (signed int)v4->uCurrentActionTime >= v5 ) + { + v17 = dword_4F6E08[v20]; + v6 = Actor::GetDirectionInfo(8 * v20 | 3, v17, &a3, v2); + v7 = v4->uAIState; + memcpy(&v15, v6, sizeof(v15)); + v8 = v7 - 4; + memcpy(&v14, &v15, sizeof(v14)); + if ( v8 ) + { + v9 = v8 - 1; + if ( v9 ) + { + v10 = v9 - 6; + if ( v10 ) + { + if ( v10 != 8 ) + Actor::_403F58(v20, v17, 32, &v14); + } + } + } + else + { + v4->uCurrentActionTime = 0; + v4->uCurrentActionLength = 0; + v4->uAIState = 5; + v4->UpdateAnimation(); + } + v1 = v18; + v2 = 0; + } + } + } + } + ++v20; + v3 = (SpellBuff *)((char *)v16 + 836); + v16 = (SpellBuff *)((char *)v16 + 836); + } + while ( (signed int)v20 < (signed int)uNumActors ); + } + if ( v1->field_4 == 1 ) + { + v12 = v1->field_8; + if ( v12 == 64 ) + { + v1->_406A63(); + } + else + { + if ( v12 > v2 ) + { + v1->_406B9F(); + } + else + { + v1->_406AFE(); + v1->field_10 = 100; + } + } + v1->field_8 -= pEventTimer->uTimeElapsed; + return; + } + if ( v1->field_4 == 2 ) + { + if ( !(v1->field_18 & 1) ) + { + v11 = v1->field_10; + if ( v11 == 100 ) + { + v1->StartTurn(); +LABEL_39: + v1->_40652A(); + return; + } + if ( v11 > v2 || v1->pQueue[0].field_4 <= v2 ) + { + v1->_4065B0(); + goto LABEL_39; + } + } + v1->NextTurn(); + return; + } + if ( v1->field_4 == 3 ) + { + if ( v1->uActionPointsLeft <= v2 || v1->field_18 & 8 ) + { + v1->field_18 &= 0xFFFFFFF7u; + v1->field_4 = 1; + v1->field_8 = 64; + } + else + { + v1->_406FA8(); + } + } +} + + + + +//----- (0043FDED) -------------------------------------------------------- +unsigned int __cdecl PrepareActorRenderList_BLV() +{ + RenderBillboard *v0; // esi@0 + unsigned int result; // eax@1 + char *v2; // edi@2 + unsigned __int16 v3; // ax@3 + unsigned int v4; // eax@5 + unsigned __int16 v5; // cx@5 + int v6; // esi@5 + unsigned int v7; // eax@7 + int v8; // eax@10 + SpriteFrame *v9; // eax@16 + SpriteFrame *v10; // ebx@18 + int *v11; // eax@18 + int v12; // ecx@28 + Actor *v13; // ecx@35 + IndoorCameraD3D **v14; // eax@36 + double v15; // st7@36 + float v16; // eax@36 + double v17; // ST30_8@36 + signed __int64 v18; // qtt@36 + int v19; // ST5C_4@36 + signed __int64 v20; // qtt@37 + int v21; // ST5C_4@37 + signed __int16 v22; // cx@39 + int v23; // ST50_4@40 + signed int v24; // ecx@40 + int v25; // edx@44 + __int16 v26; // ax@44 + MonsterDesc *v27; // edx@44 + int v28; // ecx@44 + unsigned __int8 v29; // zf@44 + unsigned __int8 v30; // sf@44 + unsigned int v31; // [sp-8h] [bp-5Ch]@15 + int v32; // [sp+1Ch] [bp-38h]@5 + int a3; // [sp+20h] [bp-34h]@5 + int a2; // [sp+24h] [bp-30h]@5 + int a1a; // [sp+28h] [bp-2Ch]@5 + __int16 a5; // [sp+2Ch] [bp-28h]@5 + int a5a; // [sp+2Ch] [bp-28h]@36 + int a5b; // [sp+2Ch] [bp-28h]@40 + unsigned int v39; // [sp+30h] [bp-24h]@1 + int v40; // [sp+34h] [bp-20h]@2 + __int16 v41; // [sp+3Ch] [bp-18h]@18 + int a6; // [sp+40h] [bp-14h]@34 + int v43; // [sp+44h] [bp-10h]@34 + int z; // [sp+48h] [bp-Ch]@32 + signed int y; // [sp+4Ch] [bp-8h]@32 + int x; // [sp+50h] [bp-4h]@32 + + result = 0; + v39 = 0; + if ( (signed int)uNumActors > 0 ) + { + v40 = 0; + v2 = (char *)&pActors[0].uAttributes; + while ( 1 ) + { + v3 = *((_WORD *)v2 + 70); + *(_DWORD *)v2 &= 0xFFFFFFF7u; + if ( v3 != 11 ) + { + if ( v3 != 19 ) + break; + } +LABEL_48: + ++v39; + v40 += 32; + result = v39; + v2 += 836; + if ( (signed int)v39 >= (signed int)uNumActors ) + return result; + } + a5 = *((_WORD *)v2 + 61); + a2 = *((_WORD *)v2 + 54); + a1a = *((_WORD *)v2 + 53); + a3 = *((_WORD *)v2 + 55); + v4 = stru_5C6E00->Atan2(a1a - pBLVRenderParams->vPartyPos.x, a2 - pBLVRenderParams->vPartyPos.y); + LOWORD(v0) = *((_WORD *)v2 + 59); + v5 = *((_WORD *)v2 + 71); + v6 = ((signed int)((char *)v0 + ((signed int)stru_5C6E00->uIntegerPi >> 3) - v4 + stru_5C6E00->uIntegerPi) >> 8) & 7; + v32 = v6; + if ( pParty->bTurnBasedModeOn ) + { + if ( v5 == 1 ) + { + v7 = pMiscTimer->uTotalGameTimeElapsed; + goto LABEL_10; + } + } + else + { + if ( v5 == 1 ) + { + v7 = pBLVRenderParams->field_0_timer_; +LABEL_10: + v8 = v40 + v7; + goto LABEL_12; + } + } + v8 = *((_DWORD *)v2 + 37); +LABEL_12: + if ( *((_QWORD *)v2 + 32) > 0i64 || *((_QWORD *)v2 + 34) > 0i64 ) + v8 = 0; + v31 = *(_WORD *)&v2[2 * (signed __int16)v5 + 152]; + if ( *((_WORD *)v2 + 70) == 16 ) + v9 = pSpriteFrameTable->GetFrameBy_x(v31, v8); + else + v9 = pSpriteFrameTable->GetFrame(v31, v8); + v41 = 0; + v10 = v9; + v11 = (int *)v9->uFlags; + if ( (unsigned __int8)v11 & 2 ) + v41 = 2; + if ( (unsigned int)v11 & 0x40000 ) + v41 |= 0x40u; + if ( (unsigned int)v11 & 0x20000 ) + LOBYTE(v41) = v41 | 0x80; + v0 = (RenderBillboard *)(256 << v6); + if ( (unsigned int)v0 & (unsigned int)v11 ) + v41 |= 4u; + if ( v10->uGlowRadius ) + { + LOBYTE(v11) = byte_4E94D3; + pMobileLightsStack->AddLight( + a1a, + a2, + a3, + a5, + v10->uGlowRadius, + 0xFFu, + 0xFFu, + 0xFFu, + v11); + } + v12 = 0; + if ( pStru170->field_53730 <= 0 ) + goto LABEL_48; + while ( pStru170->pSectorIDs_toDrawDecorationsFrom[v12] != *((_WORD *)v2 + 61) ) + { + ++v12; + if ( v12 >= pStru170->field_53730 ) + goto LABEL_48; + } + if ( !pGame->pIndoorCameraD3D->ApplyViewTransform_TrueIfStillVisible(a1a, a2, a3, &x, &y, &z, 1) + || (v0 = (RenderBillboard *)abs(x), (signed int)v0 < abs(y)) ) + goto LABEL_48; + pGame->pIndoorCameraD3D->Project(x, y, z, &v43, &a6); + result = uNumBillboardsToDraw; + v0 = &pBillboardRenderList[uNumBillboardsToDraw]; + if ( (signed int)uNumBillboardsToDraw >= 500 ) + return result; + ++uNumBillboardsToDraw; + ++uNumSpritesDrawnThisFrame; + v13 = (Actor *)(v2 - 36); + *(_DWORD *)v2 |= 8u; + v29 = pRenderer->pRenderD3D == 0; + v0->uHwSpriteID = v10->pHwSpriteIDs[v32]; + v0->uPalette = v10->uPaletteIndex; + v0->uIndoorSectorID = a5; + if ( v29 ) + { + LODWORD(v20) = pBLVRenderParams->field_40 << 16; + HIDWORD(v20) = pBLVRenderParams->field_40 >> 16; + v21 = v20 / x; + v0->field_0 = (unsigned __int64)(v10->scale * v20 / x) >> 16; + a5a = (unsigned __int64)(v10->scale * (signed __int64)v21) >> 16; + } + else + { + v14 = &pGame->pIndoorCameraD3D; + v0->flt_8 = pGame->pIndoorCameraD3D->flt_D0; + v15 = (*v14)->flt_D4; + v16 = v0->flt_8; + v0->flt_C = v15; + v17 = v16 + 6.7553994e15; + LODWORD(v18) = 0; + HIDWORD(v18) = SLOWORD(v17); + v19 = v18 / x; + v0->field_0 = (unsigned __int64)(v10->scale * v18 / x) >> 16; + a5a = (unsigned __int64)(v10->scale * (signed __int64)v19) >> 16; + } + v0->field_4 = a5a; + if ( (signed __int64)v13->pActorBuffs[3].uExpireTime <= 0 ) + { + if ( (signed __int64)v13->pActorBuffs[10].uExpireTime > 0 ) + { + a5b = (unsigned __int64)(pGame->pStru6Instance->_4A806F((Actor *)(v2 - 36)) * (signed __int64)v0->field_4) >> 16; + goto LABEL_43; + } + } + else + { + v22 = v13->pActorBuffs[3].uPower; + if ( v22 ) + { + v23 = (unsigned __int64)(65536 / (unsigned __int16)v22 * (signed __int64)v0->field_0) >> 16; + v24 = *((_WORD *)v2 + 116); + v0->field_0 = v23; + a5b = (unsigned __int64)(65536 / v24 * (signed __int64)v0->field_4) >> 16; +LABEL_43: + v0->field_4 = a5b; + goto LABEL_44; + } + } +LABEL_44: + HIWORD(v25) = HIWORD(x); + v0->field_20 = a1a; + v0->field_22 = a2; + v0->field_24 = a3; + v0->field_26 = v43; + v0->field_28 = a6; + LOWORD(v25) = 0; + LOBYTE(v26) = v41; + v0->sZValue = v25 + (8 * v39 | 3); + v27 = pMonsterList->pMonsters; + v28 = *((_WORD *)v2 + 30); + v29 = *((_DWORD *)v2 + 65) == 0; + v30 = *((_DWORD *)v2 + 65) < 0; + v0->field_1E = v41; + v0->pSpriteFrame = v10; + v0->field_2C_prolly_tint = *((_DWORD *)&v27[v28] - 36); + if ( !v30 && (!(v30 | v29) || *((_DWORD *)v2 + 64)) ) + { + HIBYTE(v26) = HIBYTE(v41) | 1; + v0->field_1E = v26; + } + goto LABEL_48; + } + return result; +} + + + + + +//----- (00444732) -------------------------------------------------------- +char *_444732_GetEventHintString(unsigned int uEventID) +{ + signed int v1; // edx@1 + char *v2; // eax@2 + int v3; // ebx@4 + int v4; // esi@4 + char *result; // eax@6 + int v6; // eax@9 + char *i; // esi@11 + int v8; // edx@12 + + v1 = 0; + if ( (signed int)uLevelEVT_NumEvents <= 0 ) + { +LABEL_6: + result = 0; + } + else + { + v2 = (char *)&pLevelEVT_Events[0].uEventOffsetInEVT; + while ( 1 ) + { + if ( *((int *)v2 - 2) == uEventID ) + { + v3 = *(int *)v2; + v4 = *((int *)v2 + 3); + if ( pLevelEVT[*(int *)v2 + 4] == 4 ) + break; + } + ++v1; + v2 += 12; + if ( v1 >= (signed int)uLevelEVT_NumEvents ) + goto LABEL_6; + } + if ( pLevelEVT[v4 + 4] == 2 ) + { + v6 = (unsigned __int8)pLevelEVT[v4 + 5] + + (((unsigned __int8)pLevelEVT[v4 + 6] + + (((unsigned __int8)pLevelEVT[v4 + 7] + ((unsigned __int8)pLevelEVT[v4 + 8] << 8)) << 8)) << 8); +LABEL_10: + //result = (char *)p2DEvents_minus1_::04[13 * v6]; + result = (char *)p2DEvents[v6 - 1].pName; + } + else + { + for ( i = (char *)pLevelEVT_Events + 4 * (3 * v1 + 3); *(int *)i == uEventID; i += 12 ) + { + v8 = *((int *)i + 2); + if ( pLevelEVT[v8 + 4] == 2 ) + { + v6 = (unsigned __int8)pLevelEVT[v8 + 5] + + (((unsigned __int8)pLevelEVT[v8 + 6] + + (((unsigned __int8)pLevelEVT[v8 + 7] + ((unsigned __int8)pLevelEVT[v8 + 8] << 8)) << 8)) << 8); + if ( (unsigned int)v6 < 0x258 ) + goto LABEL_10; + } + } + result = &pLevelStr[pLevelStrOffsets[(unsigned __int8)pLevelEVT[v3 + 5]]]; + } + } + return result; +} + + + + +//----- (00444839) -------------------------------------------------------- +unsigned int __fastcall sub_444839_move_map(unsigned int a1, int a2, int x, int y, int z, int directiony, int directionx, int a8, const char *pLocationName) +{ + unsigned int v9; // ebx@1 + int v10; // edi@1 + signed int v11; // eax@1 + unsigned int v12; // eax@6 + const char *v13; // ST0C_4@6 + unsigned int v14; // eax@8 + const char *v15; // eax@14 + unsigned int v16; // eax@16 + unsigned int result; // eax@26 + const char *v18; // [sp-8h] [bp-40h]@9 + const char *v19; // [sp-4h] [bp-3Ch]@2 + char *v20; // [sp-4h] [bp-3Ch]@9 + const char *v21; // [sp-4h] [bp-3Ch]@11 + char pContainer[40]; // [sp+Ch] [bp-2Ch]@1 + unsigned int v23; // [sp+34h] [bp-4h]@1 + + v9 = a1; + v10 = a2; + v23 = IndoorLocation::GetLocationIndex(pLocationName); + dword_59117C_teleportx = x; + dword_591178_teleporty = y; + dword_591174_teleportz = z; + dword_591170_teleport_directiony = directiony; + dword_59116C_teleport_directionx = directionx; + dword_591168_teleport_speedz = a8; + dword_591164_teleport_map_name = (char *)pLocationName; + uCurrentHouse_Animation = v9; + pEventTimer->Pause(); + pAudioPlayer->StopChannels(-1, -1); + v11 = const_2(); + sprintfex(pContainer, "evt%02d", v11); + if ( pParty->uAlignment ) + { + if ( pParty->uAlignment != 2 ) + goto LABEL_6; + v19 = "-c"; + } + else + { + v19 = "-b"; + } + strcat(pContainer, v19); +LABEL_6: + v12 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); + v13 = pHouse_ExitPictures[v10]; + pTexture_Dialogue_Background = &pIcons_LOD->pTextures[v12]; + pTexture_outside = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v13, TEXTURE_16BIT_PALETTE)]; + if ( v9 ) + { + if ( !v23 ) + //pVideoPlayer->_4BF28F(pAnimatedRooms[p2DEvents_minus1___02[26 * v9]].field_0, 1u); + pVideoPlayer->_4BF28F(pAnimatedRooms[p2DEvents[v9 - 1].uAnimationID].field_0, 1u); + } + else + { + if ( !v23 ) + { + v14 = pMapStats->GetMapInfo(pCurrentMapName); + if ( v14 ) + { + v20 = pMapStats->pInfos[v14].pName; + v18 = pGlobalTXT_LocalizationStrings[410]; +LABEL_10: + sprintfex(byte_591098, v18, v20); + goto LABEL_20; + } + v21 = pGlobalTXT_LocalizationStrings[79]; + goto LABEL_19; + } + } + v15 = pLocationName; + if ( *pLocationName == 48 ) + v15 = pCurrentMapName; + v16 = pMapStats->GetMapInfo(v15); + if ( v16 ) + { + v20 = pMapStats->pInfos[v16].pName; + v18 = pGlobalTXT_LocalizationStrings[411]; + goto LABEL_10; + } + v21 = pGlobalTXT_LocalizationStrings[73]; +LABEL_19: + strcpy(byte_591098, v21); +LABEL_20: + pDialogueWindow = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, (enum WindowType)26, 0, (int)byte_591098); + //if ( BYTE1(pAnimatedRooms[p2DEvents_minus1___02[26 * v9]].field_C) ) + if ( BYTE1(pAnimatedRooms[p2DEvents[v9 - 1].uAnimationID].field_C) ) + HousePlaySomeSound(v9, 1); + if ( uCurrentlyLoadedLevelType == LEVEL_Indoor && uActiveCharacter && pParty->uFlags & 0x30 ) + pPlayers[uActiveCharacter]->PlaySound(47, 0); + result = v23; + if ( v23 ) + uCurrentHouse_Animation = v23; + return result; +} + + +//----- (0044606A) -------------------------------------------------------- +int __fastcall PrepareHouse(unsigned int uHouseID) +{ + unsigned int v1; // ebx@1 + signed int v2; // esi@1 + int uExitPic; // edi@1 + __int16 uExitMapID; // ax@2 + int result; // eax@5 + unsigned int *v6; // ecx@8 + int v7; // ebx@11 + int v8; // esi@16 + unsigned int v9; // eax@16 + unsigned int v10; // eax@19 + int v11; // ecx@19 + char pContainer[36]; // [sp+Ch] [bp-54h]@16 + int v13; // [sp+30h] [bp-30h]@11 + int Dst[6]; // [sp+34h] [bp-2Ch]@1 + unsigned int v15; // [sp+4Ch] [bp-14h]@1 + int uAnimationID; // [sp+50h] [bp-10h]@1 + unsigned int *v17; // [sp+54h] [bp-Ch]@3 + unsigned int v18; // [sp+58h] [bp-8h]@1 + int v19; // [sp+5Ch] [bp-4h]@7 + + v15 = uHouseID; + v1 = 52 * uHouseID; + //uAnimationID = p2DEvents_minus1___02[26 * uHouseID]; + uAnimationID = p2DEvents[uHouseID - 1].uAnimationID; + v2 = 0; + v18 = 52 * uHouseID; + memset(Dst, 0, 0x18u); + //uExitPic = *(__int16 *)((char *)p2DEvents_minus1_::2C + v1); + uExitPic = p2DEvents[uHouseID - 1].uExitPicID; + uNumDialogueNPCPortraits = 0; + uHouse_ExitPic = uExitPic; + if ( uExitPic ) + { + //uExitMapID = *(__int16 *)((char *)p2DEvents_minus1_::30 + v1); + uExitMapID = p2DEvents[uHouseID - 1]._quest_related; + if ( uExitMapID > 0 ) + { + v17 = (unsigned int *)(uExitMapID - 1); + if ( !((unsigned __int8)(0x80u >> (signed int)v17 % 8) & pParty->_award_bits[(uExitMapID - 1) >> 3]) ) + { + uExitPic = 0; + uHouse_ExitPic = 0; + } + } + } + dword_591080 = pAnimatedRooms[uAnimationID].field_8; + result = dword_591080; + if ( dword_591080 ) + { + v2 = 1; + Dst[0] = dword_591080; + uNumDialogueNPCPortraits = 1; + } + v19 = 1; + if ( (signed int)pNPCStats->uNumNewNPCs > 1 ) + { + v6 = &pNPCStats->pNewNPCData[1].uFlags; + v17 = &pNPCStats->pNewNPCData[1].uFlags; + do + { + if ( v6[3] == v15 ) + { + if ( !(*(char *)v6 & 0x80) ) + { + v7 = v2++ - (result != 0); + array_5913D8[v7] = (NPCData *)(v6 - 2); + v6 = v17; + *(&v13 + v2) = *(v17 - 1); + v1 = v18; + if ( (*v6 & 3) != 2 ) + ++*v6; + } + } + ++v19; + v6 += 19; + v17 = v6; + } + while ( v19 < (signed int)pNPCStats->uNumNewNPCs ); + uNumDialogueNPCPortraits = v2; + } + v19 = 0; + if ( v2 > 0 ) + { + do + { + v8 = v19; + sprintfex(pContainer, "npc%03u", Dst[v19]); + v9 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); + ++v19; + pDialogueNPCPortraits[v8] = &pIcons_LOD->pTextures[v9]; + result = v19; + } + while ( v19 < uNumDialogueNPCPortraits ); + uExitPic = uHouse_ExitPic; + } + if ( uExitPic ) + { + v10 = pIcons_LOD->LoadTexture(pHouse_ExitPictures[uExitPic], TEXTURE_16BIT_PALETTE); + v11 = uNumDialogueNPCPortraits++; + pDialogueNPCPortraits[v11] = &pIcons_LOD->pTextures[v10]; + //result = *(__int16 *)((char *)p2DEvents_minus1_::2E + v1); + result = p2DEvents[uHouseID - 1].uExitMapID; + uHouse_ExitPic = result; + } + return result; +} + + + + + +//----- (0044622E) -------------------------------------------------------- +bool __fastcall EnterHouse(enum HOUSE_TYPE uHouseID) +{ + enum HOUSE_TYPE v1; // edi@1 + int v2; // edi@5 + unsigned int uOpenTime; // eax@5 + int uCloseTime; // esi@5 + unsigned int v5; // esi@5 + int v6; // edx@5 + signed int v7; // ecx@10 + signed int v8; // eax@10 + int v9; // esi@10 + unsigned int v10; // esi@16 + int v11; // ecx@17 + unsigned int v12; // kr00_4@25 + void *v13; // esi@25 + int v14; // eax@25 + Player *v15; // esi@27 + signed int v16; // eax@32 + unsigned int v17; // eax@37 + signed int v18; // edi@37 + signed int v19; // edi@41 + unsigned int v20; // ecx@41 + const char *v22; // [sp-4h] [bp-40h]@33 + char pContainer[40]; // [sp+Ch] [bp-30h]@32 + unsigned int v24; // [sp+34h] [bp-8h]@5 + enum HOUSE_TYPE v25; // [sp+38h] [bp-4h]@1 + + v1 = uHouseID; + v25 = uHouseID; + GameUI_StatusBar_TimedString[0] = 0; + pStatusBarString[0] = 0; + ShowStatusBarString(nullstring, 2u); + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + viewparams->bRedrawGameUI = 1; + uDialogueType = 0; + pKeyActionMap->_459ED1(3); + pKeyActionMap->ResetKeys(); + if ( v1 == 600 || v1 == 601 ) + { + GameOverMenu(0); + return 0; + } + v2 = 26 * v1; + //uOpenTime = p2DEvents_minus1_::uOpenTime[v2]; + uOpenTime = p2DEvents[v1 - 1].uOpenTime; + //uCloseTime = p2DEvents_minus1_::uCloseTime[v2]; + uCloseTime = p2DEvents[v1 - 1].uCloseTime; + ptr_F8B1E8 = 0; + v24 = uOpenTime; + v5 = uCloseTime - 1; + dword_F8B1E4 = 0; + dword_F8B1F4 = 0; + memset(byte_F8B1F0, 0, 4u); + memset(byte_F8B148, 0, 0x10u); + pRenderer->ClearZBuffer(0, 479); + v6 = v24; + if ( (signed int)v5 <= (signed int)v24 ) + { + if ( pParty->uCurrentHour >= v24 ) + goto LABEL_16; + } + else + { + if ( pParty->uCurrentHour < v24 ) + { +LABEL_10: + v7 = 0; + v8 = 0; + v9 = v5 + 1; + if ( (signed int)v24 > 12 ) + { + v6 = v24 - 12; + v7 = 1; + } + if ( v9 > 12 ) + { + v9 -= 12; + v8 = 1; + } + sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[414], v6, aAMPMNames[v7], v9, aAMPMNames[v8]); + ShowStatusBarString(pTmpBuf, 2u); + if ( uActiveCharacter ) + pPlayers[uActiveCharacter]->PlaySound(3, 0); + return 0; + } + } + if ( pParty->uCurrentHour > v5 ) + goto LABEL_10; +LABEL_16: + v10 = v25; + if ( (signed int)v25 >= 53 ) + goto LABEL_21; + v11 = pParty->field_3C._shop_ban_times[2 * v25 + 1]; + if ( !(v11 | pParty->field_3C._shop_ban_times[2 * v25]) + || (signed __int64)__PAIR__(v11, pParty->field_3C._shop_ban_times[2 * v25]) <= (signed __int64)pParty->uTimePlayed ) + { + pParty->field_3C._shop_ban_times[2 * v25] = 0; + pParty->field_3C._shop_ban_times[2 * v10 + 1] = 0; +LABEL_21: + if ( !dword_597F18 ) + pAudioPlayer->StopChannels(-1, -1); + //uCurrentHouse_Animation = p2DEvents_minus1___02[v2]; + uCurrentHouse_Animation = p2DEvents[v2 / sizeof(_2devent) - 1].uAnimationID; + dword_F8B198 = LOBYTE(pAnimatedRooms[uCurrentHouse_Animation].field_C); + if ( dword_F8B198 == 20 && pParty->uFine ) + { + uCurrentHouse_Animation = (signed __int16)p2DEvents[186].uAnimationID; + v25 = (HOUSE_TYPE)187; + v12 = LODWORD(pParty->uTimePlayed); + LODWORD(pParty->uTimePlayed) += 0x7620000u; + v13 = &pParty->pPlayers[0].uNumDivineInterventionCastsThisDay; + v14 = LOBYTE(pAnimatedRooms[(signed __int16)p2DEvents[186].uAnimationID].field_C); + pParty->uTimePlayed = __PAIR__(HIDWORD(pParty->uTimePlayed), v12) + 0x7620000; + dword_F8B198 = v14; + do + { + *((short *)v13 - 258) = 0; + memset(v13, 0, 4u); + v13 = (char *)v13 + 6972; + } + while ( (signed int)v13 < (signed int)&pParty->field_871C[694] ); + ++pParty->uNumPrisonTerms; + pParty->uFine = 0; + v15 = pParty->pPlayers; + do + { + v15->SetVariable(VAR_Award, 87); + ++v15; + } + while ( (signed int)v15 < (signed int)pParty->pHirelings ); + v10 = v25; + } + ++pIcons_LOD->uTexturePacksCount; + if ( !pIcons_LOD->uNumPrevLoadedFiles ) + pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles; + v16 = const_2(); + sprintfex(pContainer, "evt%02d", v16); + if ( pParty->uAlignment ) + { + if ( pParty->uAlignment != 2 ) + goto LABEL_37; + v22 = "-c"; + } + else + { + v22 = "-b"; + } + strcat(pContainer, v22); +LABEL_37: + v17 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); + array_5913D8[6] = 0; + pTexture_Dialogue_Background = &pIcons_LOD->pTextures[v17]; + uTextureID_507B04 = uTextureID_right_panel; + PrepareHouse(v10); + v18 = 1; + uTextureID_507B04 = uTextureID_right_panel; + if ( uNumDialogueNPCPortraits == 1 ) + array_5913D8[6] = (NPCData *)1; + pVideoPlayer->_4BF28F(pAnimatedRooms[uCurrentHouse_Animation].field_0, 1u); + if ( (signed int)v10 < 139 || (signed int)v10 > 172 ) + { + if ( (signed int)v10 >= 54 && (signed int)v10 <= 73 && !sub_4B68EA(v10 - 54) ) + goto LABEL_49; + v20 = v10; + } + else + { + v19 = word_4F0704[2 * v10] - 1; + v20 = v10; + if ( !((unsigned __int8)(0x80u >> v19 % 8) & pPlayers[uActiveCharacter]->field_152[v19 >> 3]) ) + { + HousePlaySomeSound(v10, 3); + v18 = 1; +LABEL_49: + dword_5C35D4 = v18; + return v18; + } + v18 = 1; + } + HousePlaySomeSound(v20, v18); + goto LABEL_49; + } + ShowStatusBarString(pGlobalTXT_LocalizationStrings[191], 2u);// "You've been banned from this shop!" + return 0; +}