Mercurial > might-and-magic-trilogy
diff mm7_1.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_1.cpp Fri Oct 05 16:07:14 2012 +0200 @@ -0,0 +1,7680 @@ +/* This file has been generated by the Hex-Rays decompiler. + Copyright (c) 2007-2011 Hex-Rays <info@hex-rays.com> + + Detected compiler: Visual C++ +*/ + +//#include <defs.h> +#include "MM7.h" + +#include "MapInfo.h" +#include "Game.h" +#include "GUIWindow.h" +#include "GUIFont.h" +#include "GUIButton.h" +#include "GUIProgressBar.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 "Time.h" +#include "IconFrameTable.h" +#include "stru179.h" +#include "Awards.h" +#include "Autonotes.h" +#include "stru160.h" +#include "stru279.h" +#include "TurnEngine.h" +#include "stru277.h" +#include "Weather.h" +#include "stru272.h" +#include "stru298.h" +#include "StorylineTextTable.h" +#include "Events2D.h" + +#include "mm7_data.h" + + + + +int __stdcall aWinProc(HWND hWnd, UINT Msg, WPARAM wParam, unsigned int lParam); +int __stdcall InsertMM7CDDialogFunc(HWND hDlg, int a2, __int16 a3, int a4); +bool __fastcall FindMM7CD(HWND hWnd, char *pCDDrive); +bool __fastcall Initialize(HINSTANCE hInst, char *pCmdLine); + + + + + + +void __cdecl crt_deconstruct_ptr_6A0118() +{ + for (int i = 0; i < 40; ++i) + pAllocator->FreeChunk(pSavegameThumbnails[i].pPixels); +} + + +//----- (004196A0) -------------------------------------------------------- +void __cdecl sub_4196A0() +{ + GUIButton *i; // esi@2 + GUIButton *j; // esi@7 + + if ( dword_507CC0 ) + { + dword_507CC0 = 0; + for ( i = pGUIWindow_CurrentMenu->pControlsHead; i; i = i->pNext ) + { + if ( BYTE1(i->field_1C) & 0x80 ) + GUIButton::_41D0D8(i); + } + for ( j = pGUIWindow_CurrentMenu->pControlsHead; j; j = j->pNext ) + { + if ( j->uControlID == 120 ) + { + j->uX = dword_50698C; + j->uY = dword_506988; + j->uZ = dword_506984; + j->uW = dword_506980; + pGUIWindow_CurrentMenu->_41D08F(1, 0, 0, 0); + } + } + } +} +// 506980: using guessed type int dword_506980; +// 506984: using guessed type int dword_506984; +// 506988: using guessed type int dword_506988; +// 50698C: using guessed type int dword_50698C; +// 507CC0: using guessed type int dword_507CC0; + +//----- (00419719) -------------------------------------------------------- +char __fastcall CharacterUI_SkillsTab_Draw(unsigned int uPlayerID) +{ + unsigned int v1; // esi@1 + Player *pPlayer; // ebp@1 + unsigned int v3; // eax@1 + signed int v4; // ecx@1 + int v5; // edi@3 + GUIWindow *v6; // ecx@3 + int v7; // eax@4 + GUIButton *v8; // edx@5 + int v9; // eax@7 + unsigned int v10; // ecx@9 + unsigned __int16 v11; // ax@9 + int v12; // eax@9 + unsigned __int8 v13; // cf@12 + unsigned __int8 v14; // zf@12 + unsigned int v15; // eax@12 + char *v16; // ecx@22 + GUIWindow *v17; // ecx@33 + int v18; // edx@34 + GUIButton *v19; // eax@35 + int v20; // edx@37 + unsigned __int16 v21; // cx@39 + unsigned int v22; // eax@39 + int v23; // edi@39 + unsigned int v24; // eax@42 + char v25; // sf@52 + char *v26; // ecx@52 + int v27; // edi@63 + GUIWindow *v28; // ecx@63 + int v29; // edx@64 + GUIButton *v30; // eax@65 + int v31; // edx@67 + unsigned int v32; // ecx@69 + int v33; // eax@69 + unsigned int v34; // eax@72 + char *v35; // ecx@82 + GUIWindow *v36; // ecx@93 + int v37; // edx@94 + GUIButton *v38; // eax@94 + int v39; // edx@97 + unsigned __int16 v40; // cx@99 + unsigned int v41; // eax@99 + int v42; // edi@99 + unsigned int v43; // eax@102 + char *v44; // ecx@112 + char *v46; // [sp-Ch] [bp-4Ch]@19 + char *v47; // [sp-Ch] [bp-4Ch]@49 + char *v48; // [sp-Ch] [bp-4Ch]@79 + char *v49; // [sp-Ch] [bp-4Ch]@109 + unsigned int v50; // [sp-8h] [bp-48h]@19 + unsigned int v51; // [sp-8h] [bp-48h]@49 + unsigned int v52; // [sp-8h] [bp-48h]@79 + unsigned int v53; // [sp-8h] [bp-48h]@109 + int v54; // [sp-4h] [bp-44h]@19 + int v55; // [sp-4h] [bp-44h]@49 + int v56; // [sp-4h] [bp-44h]@79 + int v57; // [sp-4h] [bp-44h]@109 + unsigned int v58; // [sp+10h] [bp-30h]@9 + unsigned int v59; // [sp+10h] [bp-30h]@39 + unsigned int v60; // [sp+10h] [bp-30h]@69 + unsigned int v61; // [sp+10h] [bp-30h]@99 + int v62; // [sp+14h] [bp-2Ch]@4 + int v63; // [sp+14h] [bp-2Ch]@34 + int v64; // [sp+14h] [bp-2Ch]@64 + int v65; // [sp+14h] [bp-2Ch]@94 + signed int i; // [sp+18h] [bp-28h]@4 + signed int v67; // [sp+18h] [bp-28h]@34 + signed int v68; // [sp+18h] [bp-28h]@64 + signed int v69; // [sp+18h] [bp-28h]@94 + int v70; // [sp+1Ch] [bp-24h]@3 + int v71; // [sp+1Ch] [bp-24h]@33 + int v72; // [sp+1Ch] [bp-24h]@63 + int v73; // [sp+1Ch] [bp-24h]@93 + int uY; // [sp+20h] [bp-20h]@9 + int uYa; // [sp+20h] [bp-20h]@33 + int uYb; // [sp+20h] [bp-20h]@69 + int uYc; // [sp+20h] [bp-20h]@93 + unsigned int a5; // [sp+24h] [bp-1Ch]@1 + unsigned int v79; // [sp+28h] [bp-18h]@1 + int *v80; // [sp+2Ch] [bp-14h]@3 + int *v81; // [sp+2Ch] [bp-14h]@33 + int *v82; // [sp+2Ch] [bp-14h]@63 + int *v83; // [sp+2Ch] [bp-14h]@93 + unsigned int v84; // [sp+30h] [bp-10h]@1 + int v85; // [sp+34h] [bp-Ch]@1 + unsigned int v86; // [sp+38h] [bp-8h]@1 + unsigned __int16 v87; // [sp+3Ch] [bp-4h]@9 + char *v88; // [sp+3Ch] [bp-4h]@24 + char *v89; // [sp+3Ch] [bp-4h]@54 + unsigned __int16 v90; // [sp+3Ch] [bp-4h]@69 + char *v91; // [sp+3Ch] [bp-4h]@84 + char *v92; // [sp+3Ch] [bp-4h]@114 + + v1 = uPlayerID; + a5 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); + v84 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0, 0xAFu, 0xFFu); + v85 = pGUIWindow_CurrentMenu->field_2C_focus_id; + v86 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0, 0); + v79 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0, 0xFFu, 0); + pPlayer = (Player *)&stru_AA1058[3].pSounds[6972 * v1 + 40552]; + v3 = pIcons_LOD->LoadTexture("fr_skill", TEXTURE_16BIT_PALETTE); + pRenderer->DrawTextureIndexed(8u, 8u, (Texture *)(v3 != -1 ? (int)&pIcons_LOD->pTextures[v3] : 0)); + v4 = v79; + if ( !pPlayer->uSkillPoints ) + v4 = 65535; + sprintfex( + pTmpBuf, + "%s ", + pGlobalTXT_LocalizationStrings[206], // Skills for + a5, + pPlayer->pName, + pGlobalTXT_LocalizationStrings[207], // Skill Points + v4, + pPlayer->uSkillPoints); + pGUIWindow_CurrentMenu->DrawText(pFontArrus, 24, 18, 0, pTmpBuf, 0, 0, 0); + v5 = 2 * LOBYTE(pFontLucida->uFontHeight) + 13;// Weapons, Level + sprintfex(pTmpBuf, "%s\r400%s", pGlobalTXT_LocalizationStrings[242], pGlobalTXT_LocalizationStrings[131]); + pGUIWindow_CurrentMenu->DrawText(pFontArrus, 24, v5, a5, pTmpBuf, 0, 0, 0); + v6 = pGUIWindow_CurrentMenu; + v70 = 0; + v80 = dword_4E2A2C; + do + { + v62 = *v80; + v7 = 0; + for ( i = 0; i < (signed int)v6->uNumControls; v7 = i++ + 1 ) + { + v8 = v6->pControlsHead; + if ( v7 > 0 ) + { + do + { + v8 = v8->pNext; + --v7; + } + while ( v7 ); + } + v9 = v8->field_1C; + if ( SBYTE1(v9) >= 0 ) + continue; + BYTE1(v9) &= 0x7Fu; + if ( v9 != v62 ) + continue; + v5 = v8->uY; + v10 = pPlayer->uSkillPoints; + ++v70; + v11 = pPlayer->pActiveSkills[v62]; + v87 = pPlayer->pActiveSkills[v62]; + v12 = v11 & 0x3F; + v58 = 0; + uY = v12; + if ( v10 >= v12 + 1 ) + v58 = v84; + if ( v85 == i ) + { + v13 = v10 < v12; + v14 = v10 == v12; + v15 = v86; + if ( !(v13 | v14) ) + v15 = v79; + v58 = v15; + } + else + { + v15 = v58; + } + if ( HIBYTE(v87) & 1 ) + { + if ( !v15 ) + v15 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); + v54 = uY; + v50 = v58; + v46 = pGlobalTXT_LocalizationStrings[96]; + } + else + { + if ( !(v87 & 0xC0) ) + { + sprintfex(pTmpBuf, "%s\r400%2d", pSkillNames[v62], uY); + goto LABEL_28; + } + v16 = pGlobalTXT_LocalizationStrings[432]; + if ( (v87 & 0x80u) == 0 ) + v16 = pGlobalTXT_LocalizationStrings[433]; + v88 = v16; + if ( !v15 ) + v15 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); + v54 = uY; + v50 = v58; + v46 = v88; + } + sprintfex(pTmpBuf, "%s ", pSkillNames[v62], v15, v46, v50, v54); +LABEL_28: + pGUIWindow_CurrentMenu->DrawText(pFontLucida, 24, v5, v58, pTmpBuf, 0, 0, 0); + v6 = pGUIWindow_CurrentMenu; + } + ++v80; + } + while ( (signed int)v80 < (signed int)dword_4E2A50 ); + if ( !v70 ) + { + v5 = v5 + LOBYTE(pFontLucida->uFontHeight) - 3; + v6->DrawText(pFontLucida, 24, v5, 0, pGlobalTXT_LocalizationStrings[153], 0, 0, 0); + } + uYa = v5 + 2 * LOBYTE(pFontLucida->uFontHeight) - 10; + sprintfex(pTmpBuf, "%s\r400%s", pGlobalTXT_LocalizationStrings[138], pGlobalTXT_LocalizationStrings[131]); + pGUIWindow_CurrentMenu->DrawText(pFontArrus, 24, uYa, a5, pTmpBuf, 0, 0, 0); + v17 = pGUIWindow_CurrentMenu; + v71 = 0; + v81 = _4E2A80_skills; + do + { + v18 = 0; + v67 = 0; + v63 = *v81; + while ( v67 < (signed int)v17->uNumControls ) + { + v19 = v17->pControlsHead; + if ( v18 > 0 ) + { + do + { + v19 = v19->pNext; + --v18; + } + while ( v18 ); + } + v20 = v19->field_1C; + if ( SBYTE1(v20) >= 0 || (BYTE1(v20) &= 0x7Fu, v20 != v63) ) + goto LABEL_59; + ++v71; + uYa = v19->uY; + v21 = pPlayer->pActiveSkills[v63]; + v22 = pPlayer->uSkillPoints; + v23 = pPlayer->pActiveSkills[v63] & 0x3F; + v59 = 0; + if ( v22 >= v23 + 1 ) + v59 = v84; + if ( v85 == v67 ) + { + v13 = v22 < v23; + v14 = v22 == v23; + v24 = v86; + if ( !(v13 | v14) ) + v24 = v79; + v59 = v24; + } + else + { + v24 = v59; + } + if ( HIBYTE(v21) & 1 ) + { + if ( !v24 ) + v24 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); + v55 = v23; + v51 = v59; + v47 = pGlobalTXT_LocalizationStrings[96]; + } + else + { + if ( !(v21 & 0xC0) ) + { + sprintfex(pTmpBuf, "%s\r400%2d", pSkillNames[v63], v23); + goto LABEL_58; + } + v25 = (v21 & 0x80u) != 0; + v26 = pGlobalTXT_LocalizationStrings[432]; + if ( !v25 ) + v26 = pGlobalTXT_LocalizationStrings[433]; + v89 = v26; + if ( !v24 ) + v24 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); + v55 = v23; + v51 = v59; + v47 = v89; + } + sprintfex(pTmpBuf, "%s ", pSkillNames[v63], v24, v47, v51, v55); +LABEL_58: + pGUIWindow_CurrentMenu->DrawText(pFontLucida, 24, uYa, v59, pTmpBuf, 0, 0, 0); + v17 = pGUIWindow_CurrentMenu; +LABEL_59: + v18 = v67++ + 1; + } + ++v81; + } + while ( (signed int)v81 < (signed int)pAwardsTextColors ); + if ( !v71 ) + v17->DrawText( + pFontLucida, + 24, + LOBYTE(pFontLucida->uFontHeight) + uYa - 3, + 0, + pGlobalTXT_LocalizationStrings[153], + 0, + 0, + 0); + v27 = 2 * LOBYTE(pFontLucida->uFontHeight) + 13; + sprintfex(pTmpBuf, "%s\r177%s", pGlobalTXT_LocalizationStrings[11], pGlobalTXT_LocalizationStrings[131]); + pGUIWindow_CurrentMenu->DrawText(pFontArrus, 248, v27, a5, pTmpBuf, 0, 0, 0); + v28 = pGUIWindow_CurrentMenu; + v72 = 0; + v82 = dword_4E2A18; + do + { + v29 = 0; + v68 = 0; + v64 = *v82; + while ( v68 < (signed int)v28->uNumControls ) + { + v30 = v28->pControlsHead; + if ( v29 > 0 ) + { + do + { + v30 = v30->pNext; + --v29; + } + while ( v29 ); + } + v31 = v30->field_1C; + if ( SBYTE1(v31) >= 0 || (BYTE1(v31) &= 0x7Fu, v31 != v64) ) + goto LABEL_89; + v27 = v30->uY; + ++v72; + v60 = 0; + v90 = pPlayer->pActiveSkills[v64]; + v32 = pPlayer->uSkillPoints; + v33 = pPlayer->pActiveSkills[v64] & 0x3F; + uYb = v33; + if ( v32 >= v33 + 1 ) + v60 = v84; + if ( v85 == v68 ) + { + v13 = v32 < v33; + v14 = v32 == v33; + v34 = v86; + if ( !(v13 | v14) ) + v34 = v79; + v60 = v34; + } + else + { + v34 = v60; + } + if ( (pPlayer->pActiveSkills[v64] >> 8) & 1 ) + { + if ( !v34 ) + v34 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); + v56 = uYb; + v52 = v60; + v48 = pGlobalTXT_LocalizationStrings[96]; + } + else + { + if ( !(v90 & 0xC0) ) + { + sprintfex(pTmpBuf, "%s\r177%2d", pSkillNames[v64], uYb); + goto LABEL_88; + } + v35 = pGlobalTXT_LocalizationStrings[432]; + if ( (v90 & 0x80u) == 0 ) + v35 = pGlobalTXT_LocalizationStrings[433]; + v91 = v35; + if ( !v34 ) + v34 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); + v56 = uYb; + v52 = v60; + v48 = v91; + } + sprintfex(pTmpBuf, "%s ", pSkillNames[v64], v34, v48, v52, v56); +LABEL_88: + pGUIWindow_CurrentMenu->DrawText(pFontLucida, 248, v27, v60, pTmpBuf, 0, 0, 0); + v28 = pGUIWindow_CurrentMenu; +LABEL_89: + v29 = v68++ + 1; + } + ++v82; + } + while ( (signed int)v82 < (signed int)dword_4E2A2C ); + if ( !v72 ) + { + v27 = v27 + LOBYTE(pFontLucida->uFontHeight) - 3; + v28->DrawText(pFontLucida, 248, v27, 0, pGlobalTXT_LocalizationStrings[153], 0, 0, 0); + } + uYc = v27 + 2 * LOBYTE(pFontLucida->uFontHeight) - 10; + sprintfex(pTmpBuf, "%s\r177%s", pGlobalTXT_LocalizationStrings[143], pGlobalTXT_LocalizationStrings[131]); + pGUIWindow_CurrentMenu->DrawText(pFontArrus, 248, uYc, a5, pTmpBuf, 0, 0, 0); + v36 = pGUIWindow_CurrentMenu; + v73 = 0; + v83 = dword_4E2A50; + do + { + v37 = 0; + v69 = 0; + v38 = (GUIButton *)*v83; + v65 = *v83; + while ( v69 < (signed int)v36->uNumControls ) + { + v38 = v36->pControlsHead; + if ( v37 > 0 ) + { + do + { + v38 = v38->pNext; + --v37; + } + while ( v37 ); + } + v39 = v38->field_1C; + if ( SBYTE1(v39) >= 0 || (BYTE1(v39) &= 0x7Fu, v39 != v65) ) + goto LABEL_119; + ++v73; + uYc = v38->uY; + v40 = pPlayer->pActiveSkills[v65]; + v41 = pPlayer->uSkillPoints; + v42 = pPlayer->pActiveSkills[v65] & 0x3F; + v61 = 0; + if ( v41 >= v42 + 1 ) + v61 = v84; + if ( v85 == v69 ) + { + v13 = v41 < v42; + v14 = v41 == v42; + v43 = v86; + if ( !(v13 | v14) ) + v43 = v79; + v61 = v43; + } + else + { + v43 = v61; + } + if ( HIBYTE(v40) & 1 ) + { + if ( !v43 ) + v43 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); + v57 = v42; + v53 = v61; + v49 = pGlobalTXT_LocalizationStrings[96]; + } + else + { + if ( !(v40 & 0xC0) ) + { + sprintfex(pTmpBuf, "%s\r177%2d", pSkillNames[v65], v42); + goto LABEL_118; + } + v25 = (v40 & 0x80u) != 0; + v44 = pGlobalTXT_LocalizationStrings[432]; + if ( !v25 ) + v44 = pGlobalTXT_LocalizationStrings[433]; + v92 = v44; + if ( !v43 ) + v43 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); + v57 = v42; + v53 = v61; + v49 = v92; + } + sprintfex(pTmpBuf, "%s ", pSkillNames[v65], v43, v49, v53, v57); +LABEL_118: + LOBYTE(v38) = pGUIWindow_CurrentMenu->DrawText(pFontLucida, 248, uYc, v61, pTmpBuf, 0, 0, 0); + v36 = pGUIWindow_CurrentMenu; +LABEL_119: + v37 = v69++ + 1; + } + ++v83; + } + while ( (signed int)v83 < (signed int)_4E2A80_skills ); + if ( !v73 ) + LOBYTE(v38) = v36->DrawText( + pFontLucida, + 248, + LOBYTE(pFontLucida->uFontHeight) + uYc - 3, + 0, + pGlobalTXT_LocalizationStrings[153], + 0, + 0, + 0); + return (char)v38; +} + +//----- (0041A000) -------------------------------------------------------- +unsigned int __fastcall CharacterUI_AwardsTab_Draw(unsigned int uPlayerID) +{ + unsigned int v1; // esi@1 + unsigned int v2; // ebx@1 + unsigned int v3; // eax@1 + unsigned int result; // eax@1 + int v5; // eax@15 + char *v6; // ebx@15 + int v7; // eax@23 + int v8; // eax@24 + int v9; // eax@25 + int v10; // eax@27 + int v11; // eax@32 + int v12; // eax@33 + int v13; // eax@34 + signed int v14; // eax@43 + unsigned int v15; // eax@43 + int v16; // eax@43 + int v17; // [sp-4h] [bp-D4h]@16 + char Source[100]; // [sp+Ch] [bp-C4h]@1 + GUIWindow a1; // [sp+70h] [bp-60h]@1 + unsigned int v20; // [sp+C4h] [bp-Ch]@15 + int v21; // [sp+C8h] [bp-8h]@14 + int v22; // [sp+CCh] [bp-4h]@40 + + v1 = uPlayerID; + v2 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); + v3 = pIcons_LOD->LoadTexture("fr_award", TEXTURE_16BIT_PALETTE); + pRenderer->DrawTextureIndexed(8u, 8u, (Texture *)(v3 != -1 ? (int)&pIcons_LOD->pTextures[v3] : 0)); + sprintfex(pTmpBuf, "%s ", pGlobalTXT_LocalizationStrings[23], v2);// TODO check args + sprintfex( + Source, + pGlobalTXT_LocalizationStrings[429], + &stru_AA1058[3].pSounds[6972 * v1 + 40720], + pClassNames[stru_AA1058[3].pSounds[6972 * v1 + 40737]]); + strcat(pTmpBuf, Source); + strcat(pTmpBuf, byte_4E2FD4); + pGUIWindow_CurrentMenu->DrawText(pFontArrus, 24, 18, 0, pTmpBuf, 0, 0, 0); + result = dword_506528; + a1.uFrameX = 12; + a1.uFrameY = 48; + a1.uFrameWidth = 424; + a1.uFrameHeight = 290; + a1.uFrameZ = 435; + a1.uFrameW = 337; + if ( dword_506544 && dword_506520 + dword_506528 < dword_506524 ) + result = dword_506528++ + 1; + if ( dword_506548 && result ) + { + --result; + dword_506528 = result; + } + if ( dword_50651C < 0 ) + { + result += dword_506520; + dword_506528 = result; + if ( (signed int)(dword_506520 + result) <= dword_506524 ) + goto LABEL_14; + result = dword_506524 - dword_506520; + goto LABEL_13; + } + if ( dword_50651C > 0 ) + { + result -= dword_506520; + dword_506528 = result; + if ( (result & 0x80000000u) != 0 ) + { + result = 0; +LABEL_13: + dword_506528 = result; + goto LABEL_14; + } + } +LABEL_14: + dword_506544 = 0; + dword_506548 = 0; + dword_506520 = 0; + dword_50651C = 0; + v21 = result; + if ( (signed int)result < dword_506524 ) + { + while ( 1 ) + { + v5 = pStru179->field_0[v21]; + v20 = 8 * pStru179->field_0[v21]; + v6 = (char *)dword_723E80_award_related[v20 / 4]; + if ( v5 != 1 ) + break; + v17 = pParty->uFine; +LABEL_42: + sprintfex(pTmpBuf, v6, v17); + v6 = pTmpBuf; +LABEL_43: + v14 = dword_723E84[v20 / 4]; + ++dword_506520; + v15 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat( + pAwardsTextColors[3 * v14 % 6], + pAwardsTextColors[3 * v14 % 6 + 1], + pAwardsTextColors[3 * v14 % 6 + 2]); + a1.DrawText(pFontArrus, 0, 0, v15, v6, 0, 0, 0); + v16 = pFontArrus->CalcTextHeight(v6, &a1, 0, 0); + result = v16 + a1.uFrameY + 4; + if ( (signed int)result <= (signed int)a1.uFrameHeight ) + { + ++v21; + a1.uFrameY = result; + result = v21; + if ( v21 < dword_506524 ) + continue; + } + return result; + } + if ( (v5 < 85 || v5 > 91) && (v5 < 103 || v5 > 104) ) + goto LABEL_43; + if ( v5 > 89 ) + { + v11 = v5 - 90; + if ( !v11 ) + { + v10 = (unsigned __int8)pParty->uNumArenaKnightWins; + goto LABEL_40; + } + v12 = v11 - 1; + if ( !v12 ) + { + v10 = (unsigned __int8)pParty->uNumArenaLordWins; + goto LABEL_40; + } + v13 = v12 - 12; + if ( !v13 ) + { + v10 = pParty->field_874; + goto LABEL_40; + } + if ( v13 == 1 ) + { + v10 = pParty->field_878; + goto LABEL_40; + } + } + else + { + if ( v5 == 89 ) + { + v10 = (unsigned __int8)pParty->uNumArenaSquireWins; + goto LABEL_40; + } + v7 = v5 - 85; + if ( !v7 ) + { + v10 = pParty->uNumDeaths; + goto LABEL_40; + } + v8 = v7 - 1; + if ( !v8 ) + { + v10 = pParty->uNumBountiesCollected; + goto LABEL_40; + } + v9 = v8 - 1; + if ( !v9 ) + { + v10 = pParty->uNumPrisonTerms; + goto LABEL_40; + } + if ( v9 == 1 ) + { + v10 = (unsigned __int8)pParty->uNumArenaPageWins; +LABEL_40: + v22 = v10; + goto LABEL_41; + } + } +LABEL_41: + v17 = v22; + goto LABEL_42; + } + return result; +} +// 50651C: using guessed type int dword_50651C; +// 506520: using guessed type int dword_506520; +// 506524: using guessed type int dword_506524; +// 506528: using guessed type int dword_506528; +// 506544: using guessed type int dword_506544; +// 506548: using guessed type int dword_506548; +// 723E80: using guessed type int dword_723E80_award_related[]; +// 723E84: using guessed type int dword_723E84[]; + +//----- (0041A2C1) -------------------------------------------------------- +unsigned int __fastcall GetSizeInInventorySlots(unsigned int uNumPixels) +{ + if ( (signed int)uNumPixels < 14 ) + uNumPixels = 14; + return ((signed int)(uNumPixels - 14) >> 5) + 1; +} + +//----- (0041A2D1) -------------------------------------------------------- +void __fastcall CharacterUI_InventoryTab_Draw(unsigned int uPlayerID, char a2) +{ + Player *v2; // esi@1 + char v3; // bl@1 + unsigned int v4; // eax@2 + ItemGen *v5; // ebx@5 + unsigned int v6; // eax@6 + Texture *v7; // esi@6 + __int16 v8; // ax@6 + signed int v9; // edi@6 + signed int v10; // ecx@6 + signed int v11; // edx@6 + signed int v12; // eax@11 + int v13; // eax@13 + signed int v14; // edx@13 + int v15; // eax@13 + unsigned int v16; // ebx@15 + unsigned int v17; // edi@15 + Texture *v18; // ebx@24 + double v19; // st7@26 + const char *v20; // [sp-8h] [bp-40h]@20 + Player *v21; // [sp+14h] [bp-24h]@1 + int uTextureId; // [sp+18h] [bp-20h]@6 + int *v23; // [sp+1Ch] [bp-1Ch]@1 + int v24; // [sp+20h] [bp-18h]@5 + ItemGen *v25; // [sp+24h] [bp-14h]@5 + int v26; // [sp+28h] [bp-10h]@3 + signed int v27; // [sp+2Ch] [bp-Ch]@3 + int a2a; // [sp+30h] [bp-8h]@5 + int a3; // [sp+34h] [bp-4h]@5 + + v23 = pRenderer->pActiveZBuffer; + v2 = pPlayers[uPlayerID]; + v3 = a2; + v21 = pPlayers[uPlayerID]; + pRenderer->DrawTextureIndexed( + 8u, + 8u, + (Texture *)(uTextureID_507958 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_507958] : 0)); + if ( v3 ) + { + v4 = pIcons_LOD->LoadTexture("fr_strip", TEXTURE_16BIT_PALETTE); + pRenderer->DrawTextureIndexed(8u, 0x131u, (Texture *)(v4 != -1 ? (int)&pIcons_LOD->pTextures[v4] : 0)); + } + v27 = 0; + v26 = (int)v2->pInventoryIndices; + do + { + if ( *(int *)v26 > 0 ) + { + v24 = *(int *)v26 - 1; + a3 = 32 * v27 / 14 + 17; + v5 = &v2->pInventoryItems[v24]; + a2a = 32 * v27 % 14 + 14; + v25 = v5; + if ( v5->uItemID ) + { + v6 = pIcons_LOD->LoadTexture( + pItemsTable->pItems[v5->uItemID].pIconName, + TEXTURE_16BIT_PALETTE); + uTextureId = v6; + v7 = (Texture *)(v6 != -1 ? (int)&pIcons_LOD->pTextures[v6] : 0); + v8 = (v6 != -1 ? pIcons_LOD->pTextures[v6].uTextureWidth : 24); + v9 = v7->uTextureHeight; + v10 = v7->uTextureWidth; + v11 = v7->uTextureWidth; + if ( v10 < 14 ) + v11 = 14; + if ( (v11 - 14) >> 5 == 0 && v8 < 32 ) + a2a += (32 - v10) / 2; + v12 = v7->uTextureWidth; + if ( v10 < 14 ) + v12 = 14; + v13 = v12 - 14; + v14 = v7->uTextureHeight; + LOBYTE(v13) = v13 & 0xE0; + v15 = v13 + 32; + if ( v9 < 14 ) + v14 = 14; + v16 = v5->uAttributtes; + v17 = a2a + ((v15 - v10) >> 1) + pSRZBufferLineOffsets[a3 + ((((v14 - 14) & 0xFFFFFFE0) - v9 + 32) >> 1)]; + if ( !(v16 & 0xF0) ) + { + if ( v16 & 1 + || uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions != 13 ) + { + if ( v16 & 2 ) + pRenderer->_4A6776(a2a, a3, v7); + else + pRenderer->DrawTextureTransparent(a2a, a3, v7); + } + else + { + pRenderer->DrawTransparentGreenShade(a2a, a3, v7); + } + goto LABEL_33; + } + if ( (unsigned __int8)(v16 & 0xF0) != 16 ) + { + if ( (unsigned __int8)(v16 & 0xF0) == 32 ) + { + v20 = "sp28a"; + goto LABEL_24; + } + if ( (unsigned __int8)(v16 & 0xF0) == 64 ) + { + v20 = "sp30a"; + goto LABEL_24; + } + if ( (unsigned __int8)(v16 & 0xF0) == 128 ) + { + v20 = "sp91a"; +LABEL_24: + v18 = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v20, TEXTURE_16BIT_PALETTE)]; + dword_50C9A8 -= pEventTimer->uTimeElapsed; + if ( dword_50C9A8 <= 0 ) + { + dword_50C9A8 = 0; + LOBYTE(v25->uAttributtes) &= 0xFu; + ptr_50C9A4 = 0; + } + v19 = (double)GetTickCount() * 0.1; + pRenderer->_4A63E6(a2a, a3, v7, v18, (signed __int64)v19, 0, 255); +LABEL_33: + ZBuffer_Fill(&v23[v17], uTextureId, v24 + 1); + v2 = v21; + goto LABEL_34; + } + } + v20 = "sptext01"; + goto LABEL_24; + } + } +LABEL_34: + ++v27; + v26 += 4; + } + while ( v27 < 126 ); +} +// 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; +// 507958: using guessed type int uTextureID_507958; +// 50C9A8: using guessed type int dword_50C9A8; + +//----- (0041A556) -------------------------------------------------------- +void __cdecl draw_leather() +{ + pRenderer->DrawTextureIndexed( + 8u, + 8u, + (Texture *)(uTextureID_Leather != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_Leather] : 0)); +} + +//----- (0041A57E) -------------------------------------------------------- +char __cdecl QuickRefDraw() +{ + unsigned int v0; // ebx@1 + unsigned int v1; // eax@1 + Player *pPlayer; // ebp@2 + int v3; // eax@6 + int v4; // edi@6 + unsigned int v5; // eax@7 + unsigned int v6; // edi@9 + unsigned int v7; // edi@11 + signed int v8; // eax@13 + unsigned int v9; // eax@13 + unsigned int v10; // edi@13 + int v11; // eax@15 + unsigned int v12; // eax@15 + unsigned int v13; // edi@15 + int v14; // eax@17 + int v15; // ST18_4@17 + int v16; // ebx@17 + int v17; // eax@17 + unsigned int v18; // eax@17 + unsigned int v19; // edi@17 + int v20; // eax@19 + unsigned int v21; // edi@19 + char *v22; // eax@21 + unsigned int v23; // edi@21 + int v24; // eax@23 + unsigned int v25; // edi@23 + char *v26; // eax@25 + unsigned int v27; // edi@25 + int v28; // ecx@27 + char *v29; // eax@27 + signed int v30; // edx@27 + unsigned int v31; // edi@31 + unsigned int v32; // edi@33 + const char *v33; // ST10_4@35 + unsigned int v34; // eax@35 + unsigned int v35; // edi@35 + unsigned __int8 v36; // al@37 + char *v37; // eax@38 + int v38; // eax@41 + signed int v39; // edi@42 + char *v40; // eax@45 + unsigned int v41; // eax@45 + signed int v43; // [sp+10h] [bp-1Ch]@1 + unsigned int v44; // [sp+14h] [bp-18h]@2 + int v45; // [sp+18h] [bp-14h]@1 + unsigned int v46; // [sp+1Ch] [bp-10h]@1 + unsigned int v47; // [sp+20h] [bp-Ch]@1 + unsigned int v48; // [sp+24h] [bp-8h]@33 + unsigned int v49; // [sp+28h] [bp-4h]@1 + + v0 = 0; + v47 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); + v49 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0, 0); + v46 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0, 0xFFu, 0); + v1 = pIcons_LOD->LoadTexture("quikref", TEXTURE_16BIT_PALETTE); + pRenderer->DrawTextureIndexed(8u, 8u, (Texture *)(v1 != -1 ? (int)&pIcons_LOD->pTextures[v1] : 0)); + v43 = 0; + v45 = LOBYTE(pFontArrus->uFontHeight) + 1; + do + { + pPlayer = &pParty->pPlayers[v43]; + v44 = 94 * v43 + 89; + if ( v43 == v0 ) + pGUIWindow_CurrentMenu->DrawTextInRect( + pFontArrus, + 0x16u, + 0x12u, + v0, + pGlobalTXT_LocalizationStrings[149], + 60, + v0); + pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 94 * v43 + 89, 0x12u, v47, pPlayer->pName, 84, v0); + if ( v43 == v0 ) + pGUIWindow_CurrentMenu->DrawTextInRect( + pFontArrus, + 0x16u, + 0x2Fu, + v0, + pGlobalTXT_LocalizationStrings[131], + 60, + v0); + v3 = pPlayer->GetActualLevel(); + sprintfex(pTmpBuf, "%lu", v3); + v4 = pPlayer->GetBaseLevel(); + if ( pPlayer->GetActualLevel() <= v4 ) + v5 = pPlayer->GetExperienceDisplayColor(); + else + v5 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0, 0xFFu, v0); + pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, 0x2Fu, v5, pTmpBuf, 84, v0); + v6 = v45 + 47; + if ( v43 == v0 ) + pGUIWindow_CurrentMenu->DrawTextInRect( + pFontArrus, + 0x16u, + v45 + 47, + v0, + pGlobalTXT_LocalizationStrings[41], + 60, + v0); + pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, v6, v0, pClassNames[pPlayer->uClass], 84, v0); + v7 = v45 + v6; + if ( v43 == v0 ) + pGUIWindow_CurrentMenu->DrawTextInRect( + pFontArrus, + 0x16u, + v7, + v0, + pGlobalTXT_LocalizationStrings[107], + 60, + v0); + sprintfex(pTmpBuf, "%d", pPlayer->sHealth); + v8 = pPlayer->GetMaxHealth(); + v9 = sub_4178FE(pPlayer->sHealth, v8); + pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, v7, v9, pTmpBuf, 84, v0); + v10 = v45 + v7; + if ( v43 == v0 ) + pGUIWindow_CurrentMenu->DrawTextInRect( + pFontArrus, + 0x16u, + v10, + v0, + pGlobalTXT_LocalizationStrings[209], + 60, + v0); + sprintfex(pTmpBuf, "%d", pPlayer->sMana); + v11 = pPlayer->GetMaxMana(); + v12 = sub_4178FE(pPlayer->sMana, v11); + pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, v10, v12, pTmpBuf, 84, v0); + v13 = v45 + v10; + if ( v43 == v0 ) + pGUIWindow_CurrentMenu->DrawTextInRect( + pFontArrus, + 0x16u, + v13, + v0, + pGlobalTXT_LocalizationStrings[0], + 60, + v0); + v14 = pPlayer->GetActualAC(); + sprintfex(pTmpBuf, "%d", v14); + v15 = v0; + v16 = pPlayer->GetBaseAC(); + v17 = pPlayer->GetActualAC(); + v18 = sub_4178FE(v17, v16); + pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, v13, v18, pTmpBuf, 84, v15); + v0 = 0; + v19 = v45 + v13; + if ( !v43 ) + pGUIWindow_CurrentMenu->DrawTextInRect( + pFontArrus, + 0x16u, + v19, + 0, + pGlobalTXT_LocalizationStrings[18], + 60, + 0); + v20 = pPlayer->GetActualAttack(0); + sprintfex(pTmpBuf, "%+d", v20); + pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, v19, 0, pTmpBuf, 84, 0); + v21 = v45 + v19; + if ( !v43 ) + pGUIWindow_CurrentMenu->DrawTextInRect( + pFontArrus, + 0x16u, + v21, + 0, + pGlobalTXT_LocalizationStrings[66], + 60, + 0); + v22 = pPlayer->GetMeleeDamageString(); + pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, v21, 0, v22, 84, 0); + v23 = v45 + v21; + if ( !v43 ) + pGUIWindow_CurrentMenu->DrawTextInRect( + pFontArrus, + 0x16u, + v23, + 0, + pGlobalTXT_LocalizationStrings[203], + 60, + 0); + v24 = pPlayer->GetRangedAttack(); + sprintfex(pTmpBuf, "%+d", v24); + pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, v23, 0, pTmpBuf, 84, 0); + v25 = v45 + v23; + if ( !v43 ) + pGUIWindow_CurrentMenu->DrawTextInRect( + pFontArrus, + 0x16u, + v25, + 0, + pGlobalTXT_LocalizationStrings[66], + 60, + 0); + v26 = pPlayer->GetRangedDamageString(); + pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, v25, 0, v26, 84, 0); + v27 = v45 + v25; + if ( !v43 ) + pGUIWindow_CurrentMenu->DrawTextInRect( + pFontArrus, + 0x16u, + v27, + 0, + pGlobalTXT_LocalizationStrings[205], + 60, + 0); + v28 = 0; + v29 = (char *)pPlayer->pActiveSkills; + v30 = 36; + do + { + if ( *(short *)v29 ) + ++v28; + v29 += 2; + --v30; + } + while ( v30 ); + sprintfex(pTmpBuf, "%lu", v28); + pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, v27, 0, pTmpBuf, 84, 0); + v31 = v45 + v27; + if ( !v43 ) + pGUIWindow_CurrentMenu->DrawTextInRect( + pFontArrus, + 0x16u, + v31, + 0, + pGlobalTXT_LocalizationStrings[168], + 60, + 0); + sprintfex(pTmpBuf, "%lu", pPlayer->uSkillPoints); + pGUIWindow_CurrentMenu->DrawTextInRect( + pFontArrus, + v44, + v31, + pPlayer->uSkillPoints != 0 ? v46 : 0, + pTmpBuf, + 84, + 0); + v32 = v45 + v31; + v48 = pPlayer->GetMajorConditionrIdx(); + if ( !v43 ) + pGUIWindow_CurrentMenu->DrawTextInRect( + pFontArrus, + 0x16u, + v32, + 0, + pGlobalTXT_LocalizationStrings[45], + 60, + 0); + v33 = aCharacterConditionNames[v48]; + v34 = GetConditionDrawColor(v48); + pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, v32, v34, v33, 84, 0); + v35 = v45 + v32; + if ( !v43 ) + pGUIWindow_CurrentMenu->DrawTextInRect( + pFontArrus, + 0x16u, + v35, + 0, + pGlobalTXT_LocalizationStrings[170], + 60, + 0); + v36 = pPlayer->uQuickSpell; + if ( v36 ) + v37 = pSpellStats->pInfos[v36].pShortName; + else + v37 = pGlobalTXT_LocalizationStrings[153]; + pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, v44, v35, 0, v37, 84, 0); + ++v43; + } + while ( v43 < 4 ); + v38 = GetPartyReputation(); + if ( v38 >= 0 ) + { + v39 = v49; + if ( v38 <= 5 ) + v39 = 65535; + } + else + { + v39 = v46; + } + v40 = GetReputationString(v38); + sprintfex(pTmpBuf, "%s: ", pGlobalTXT_LocalizationStrings[180], v39, v40); + pGUIWindow_CurrentMenu->DrawText(pFontArrus, 22, 323, 0, pTmpBuf, 0, 0, 0); + v41 = pParty->GetPartyFame(); + sprintfex(pTmpBuf, "\r261%s: %d", pGlobalTXT_LocalizationStrings[84], v41);// Fame + return pGUIWindow_CurrentMenu->DrawText(pFontArrus, 0, 323, 0, pTmpBuf, 0, 0, 0); +} + +//----- (0041ABFD) -------------------------------------------------------- +void __thiscall CharacterUI_CharacterScreen_Draw(unsigned int uPlayerIdx) +{ + unsigned int v1; // edi@1 + unsigned int v2; // eax@6 + Texture *v3; // ecx@6 + GUIButton *v4; // eax@6 + unsigned int v5; // eax@7 + unsigned int v6; // eax@10 + unsigned int v7; // eax@11 + + v1 = uPlayerIdx; + if ( uPlayerIdx ) + { + pRenderer->ClearZBuffer(0, 479); + switch ( pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] ) + { + case 0x64: // stats + sub_4196A0(); + sub_419379(); + CharacterUI_StatsTab_Draw(v1); + v7 = pIcons_LOD->LoadTexture("ib-cd1-d", TEXTURE_16BIT_PALETTE); + v3 = (Texture *)(v7 != -1 ? (int)&pIcons_LOD->pTextures[v7] : 0); + v4 = pCharacterScreen_StatsBtn; + break; + case 0x65: // skills + if ( dword_507CC0 != uActiveCharacter ) + { + sub_4196A0(); + sub_419401(); + } + sub_419379(); + CharacterUI_SkillsTab_Draw(v1); + v6 = pIcons_LOD->LoadTexture("ib-cd2-d", TEXTURE_16BIT_PALETTE); + v3 = (Texture *)(v6 != -1 ? (int)&pIcons_LOD->pTextures[v6] : 0); + v4 = pCharacterScreen_SkillsBtn; + break; + case 0x66: // awards + sub_4196A0(); + sub_419379(); + sub_419220(); + CharacterUI_AwardsTab_Draw(v1); + v5 = pIcons_LOD->LoadTexture("ib-cd4-d", TEXTURE_16BIT_PALETTE); + v3 = (Texture *)(v5 != -1 ? (int)&pIcons_LOD->pTextures[v5] : 0); + v4 = pCharacterScreen_AwardsBtn; + break; + default: + if ( pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] != 103 ) + goto LABEL_13; + sub_4196A0(); + sub_419379(); + CharacterUI_InventoryTab_Draw(v1, 0); + v2 = pIcons_LOD->LoadTexture("ib-cd3-d", TEXTURE_16BIT_PALETTE); + v3 = (Texture *)(v2 != -1 ? (int)&pIcons_LOD->pTextures[v2] : 0); + v4 = pCharacterScreen_InventoryBtn; + break; + } + pRenderer->DrawTextureIndexed(v4->uX, v4->uY, v3); +LABEL_13: + if ( bRingsShownInCharScreen ) + CharacterUI_DrawPaperdollWithRingOverlay(v1); + else + CharacterUI_DrawPaperdoll(v1); + } +} +// 507CC0: using guessed type int dword_507CC0; +// 5118E0: using guessed type int bRingsShownInCharScreen; + +//----- (0041AD6E) -------------------------------------------------------- +void __cdecl GameUI_DrawRightPanelItems() +{ + if ( (signed int)((pParty->uTimePlayed - qword_507CC8) >> 32) <= 0 + && (((pParty->uTimePlayed - qword_507CC8) >> 32) & 0x80000000u) != 0i64 ) + qword_507CC8 = 0i64; + if ( (((pParty->uTimePlayed - qword_507CC8) >> 32) & 0x80000000u) == 0i64 + && (!(SHIDWORD(pParty->uTimePlayed) < (LODWORD(pParty->uTimePlayed) < (unsigned int)qword_507CC8) + + HIDWORD(qword_507CC8) | (pParty->uTimePlayed - qword_507CC8) >> 32 == 0) + || (unsigned int)(LODWORD(pParty->uTimePlayed) - qword_507CC8) > 0x80) ) + { + qword_507CC8 = pParty->uTimePlayed; + byte_50697C = byte_50697C == 0; + if ( byte_50697C + && uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions != 5 ) + { + if ( bFlashQuestBook ) + pRenderer->DrawTextureTransparent( + 493u, + 355u, + (Texture *)(uTextureID_ib_td1_A != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_ib_td1_A] : 0)); + if ( bFlashAutonotesBook ) + pRenderer->DrawTextureTransparent( + 527u, + 353u, + (Texture *)(uTextureID_ib_td2_A != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_ib_td2_A] : 0)); + if ( bFlashHistoryBook ) + pRenderer->DrawTextureTransparent( + 600u, + 361u, + (Texture *)(uTextureID_ib_td5_A != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_ib_td5_A] : 0)); + } + else + { + pRenderer->DrawTextureRGB(468u, 0, pTexture_RightFrame); + DrawHiredNPCs(); + } + } +} + +//----- (0041AEBB) -------------------------------------------------------- +void __cdecl GameUI_DrawFoodAndGold() +{ + unsigned int v0; // ebx@2 + unsigned int v1; // ebp@2 + int v2; // esi@2 + + if ( uGameState != GAME_STATE_FINAL_WINDOW ) + { + v0 = uGameUIFontMain; + v1 = uGameUIFontShadow; + v2 = sub_44100D() != 0 ? 381 : 322; + sprintfex(pTmpBuf, "\r087%lu", pParty->uNumFoodRations); + pGUIWindow0->DrawText(pFontSmallnum, 0, v2, v0, pTmpBuf, 0, 0, v1); + sprintfex(pTmpBuf, "\r028%lu", pParty->uNumGold); + pGUIWindow0->DrawText(pFontSmallnum, 0, v2, v0, pTmpBuf, 0, 0, v1); + } +} + +//----- (0041AF52) -------------------------------------------------------- +void Actor::DrawHealthBar(Actor *a1, GUIWindow *a2) +{ + unsigned int v2; // eax@1 + GUIWindow *v3; // edi@1 + unsigned int v4; // esi@1 + signed int v5; // ebx@4 + double v6; // st7@5 + unsigned int v7; // eax@6 + unsigned int v8; // ebx@10 + unsigned int v9; // [sp+14h] [bp-Ch]@4 + unsigned int v10; // [sp+1Ch] [bp-4h]@4 + + v2 = a1->pMonsterInfo.uHP; + v3 = a2; + v4 = 25; + if ( (signed int)v2 > 25 ) + { + v4 = 200; + if ( (signed int)v2 < 200 ) + v4 = a1->pMonsterInfo.uHP; + } + v5 = a1->sCurrentHP; + v10 = v4; + v9 = uTextureID_mhp_grn; + if ( v5 < (signed int)v2 ) + { + v6 = (double)(signed int)v2; + v10 = (signed __int64)((double)(signed int)v4 / (double)(signed int)v2 * (double)a1->sCurrentHP); + if ( v5 <= (signed int)(signed __int64)(0.34 * v6) ) + { + v7 = uTextureID_mhp_red; +LABEL_9: + v9 = v7; + goto LABEL_10; + } + if ( v5 <= (signed int)(signed __int64)(v6 * 0.67) ) + { + v7 = uTextureID_mhp_yel; + goto LABEL_9; + } + } +LABEL_10: + v8 = a2->uFrameX + (signed int)(a2->uFrameWidth - v4) / 2; + pRenderer->Clip(v8, a2->uFrameY + 32, v8 + v4, a2->uFrameY + 52); + pRenderer->DrawTextureIndexed( + v8, + v3->uFrameY + 32, + (Texture *)(uTextureID_mhp_bd != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_mhp_bd] : 0)); + pRenderer->Clip(v8, v3->uFrameY + 32, v8 + v10, v3->uFrameY + 52); + pRenderer->DrawTextureIndexed( + v8, + v3->uFrameY + 34, + (Texture *)(v9 != -1 ? (int)&pIcons_LOD->pTextures[v9] : 0)); + pRenderer->ResetClip(); + pRenderer->DrawTextureIndexed( + v8 - 5, + v3->uFrameY + 32, + (Texture *)(uTextureID_mhp_capl != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_mhp_capl] : 0)); + pRenderer->DrawTextureIndexed( + v8 + v4, + v3->uFrameY + 32, + (Texture *)(uTextureID_mhp_capr != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_mhp_capr] : 0)); +} + +//----- (0041B0C9) -------------------------------------------------------- +void __cdecl GameUI_DrawLifeManaBars() +{ + Texture *v0; // ebx@1 + Player *v1; // ecx@2 + float v2; // ST38_4@3 + double v3; // st7@3 + signed __int64 v4; // qax@6 + Player *v5; // ecx@24 + float v6; // ST30_4@25 + double v7; // st7@25 + bool v8; // ST38_4@27 + Texture *v9; // [sp-4h] [bp-30h]@10 + Texture *v10; // [sp+Ch] [bp-20h]@1 + Player *v11; // [sp+10h] [bp-1Ch]@2 + int v12; // [sp+10h] [bp-1Ch]@24 + Texture *v13; // [sp+14h] [bp-18h]@1 + Texture *v14; // [sp+18h] [bp-14h]@1 + float v15; // [sp+1Ch] [bp-10h]@1 + signed int v16; // [sp+24h] [bp-8h]@1 + signed int v17; // [sp+28h] [bp-4h]@8 + + v0 = (Texture *)(uTextureID_BarGreen != -1 ? &pIcons_LOD->pTextures[uTextureID_BarGreen] : 0); + v14 = (Texture *)(uTextureID_BarYellow != -1 ? &pIcons_LOD->pTextures[uTextureID_BarYellow] : 0); + v13 = (Texture *)(uTextureID_BarRed != -1 ? &pIcons_LOD->pTextures[uTextureID_BarRed] : 0); + v16 = 0; + v10 = (Texture *)(uTextureID_BarBlue != -1 ? &pIcons_LOD->pTextures[uTextureID_BarBlue] : 0); + v15 = (double)(uTextureID_BarGreen != -1 ? pIcons_LOD->pTextures[uTextureID_BarGreen].uTextureHeight : 26); + do + { + v1 = &pParty->pPlayers[v16]; + v11 = v1; + if ( v1->sHealth <= 0 ) + goto LABEL_24; + v11 = &pParty->pPlayers[v16]; + v2 = (double)v1->sHealth; + v3 = v2 / (double)v1->GetMaxHealth(); + if ( v3 <= 0.5 ) + { + if ( v3 <= 0.25 ) + { + if ( v3 <= 0.0 ) + goto LABEL_24; + if ( v16 == 2 || v16 == 3 ) + v17 = 2; + else + v17 = 0; + pRenderer->Clip( + v17 + pHealthBarPos[v16], + (unsigned __int64)(signed __int64)((1.0 - v3) * v15) + 402, + v17 + pHealthBarPos[v16] + v13->uTextureWidth, + v13->uTextureHeight + 402); + v9 = v13; + } + else + { + if ( v16 == 2 || v16 == 3 ) + v17 = 2; + else + v17 = 0; + pRenderer->Clip( + v17 + pHealthBarPos[v16], + (unsigned __int64)(signed __int64)((1.0 - v3) * v15) + 402, + v17 + pHealthBarPos[v16] + v14->uTextureWidth, + v14->uTextureHeight + 402); + v9 = v14; + } + } + else + { + if ( v3 > 1.0 ) + v3 = 1.0; + v4 = (signed __int64)((1.0 - v3) * v15); + if ( v16 == 2 || v16 == 3 ) + v17 = 2; + else + v17 = 0; + pRenderer->Clip( + v17 + pHealthBarPos[v16], + v4 + 402, + v17 + pHealthBarPos[v16] + v0->uTextureWidth, + v0->uTextureHeight + 402); + v9 = v0; + } + pRenderer->DrawTextureIndexed(v17 + pHealthBarPos[v16], 0x192u, v9); + pRenderer->ResetClip(); +LABEL_24: + v5 = v11; + v12 = v11->sMana; + if ( v12 > 0 ) + { + v6 = (double)v12; + v7 = v6 / (double)v5->GetMaxMana(); + if ( v7 > 1.0 ) + v7 = 1.0; + v8 = v16 == 2; + pRenderer->Clip( + (v16 == 2) + pManaBarPos[v16], + (unsigned __int64)(signed __int64)((1.0 - v7) * v15) + 402, + v8 + pManaBarPos[v16] + v10->uTextureWidth, + v10->uTextureHeight + 402); + pRenderer->DrawTextureIndexed(v8 + pManaBarPos[v16], 0x192u, v10); + pRenderer->ResetClip(); + } + ++v16; + } + while ( v16 < 4 ); +} + +//----- (0041B3B6) -------------------------------------------------------- +void __cdecl draw_right_panel() +{ + pRenderer->DrawTextureTransparent( + pViewport->uViewportZ, + 0, + (Texture *)(uTextureID_right_panel != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_right_panel] : 0)); +} + +//----- (0041B3E2) -------------------------------------------------------- +void __cdecl GameUI_DrawRightPanelFrames() +{ + pRenderer->DrawTextureRGB(0, 0, pTexture_TopFrame); + pRenderer->DrawTextureRGB(0, 8u, pTexture_LeftFrame); + pRenderer->DrawTextureRGB(468u, 0, pTexture_RightFrame); + pRenderer->DrawTextureRGB(0, 352u, pTexture_BottomFrame); + GameUI_DrawFoodAndGold(); + GameUI_DrawRightPanelItems(); +} + +//----- (0041B438) -------------------------------------------------------- +GUIButton *__fastcall GUI_HandleHotkey(unsigned __int8 uHotkey) +{ + char v1; // al@1 + int v2; // esi@1 + char v3; // dl@1 + GUIWindow *v4; // ecx@2 + GUIButton *result; // eax@2 + int v6; // edx@12 + + v1 = toupper(uHotkey); + v2 = uNumVisibleWindows; + v3 = v1; + if ( uNumVisibleWindows >= 0 ) + { + while ( 2 ) + { + v4 = (GUIWindow *)&pWindowList_at_506F50_minus1_indexing[21 * pVisibleWindowsIdxs[v2]]; + for ( result = v4->pControlsHead; result; result = result->pNext ) + { + if ( result->uHotkey == v3 ) + { + v6 = result->uControlParam; + if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + { + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)result->uControlID; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v6; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; + ++pMessageQueue_50CBD0->uNumMessages; + } + return result; + } + } + if ( v4->uFrameX || v4->uFrameY || !(v4->uFrameWidth == 640 & v4->uFrameHeight == 480) ) + { + --v2; + if ( v2 >= 0 ) + continue; + } + break; + } + } + return 0; +} +// 5075E0: using guessed type int pVisibleWindowsIdxs[20]; + +//----- (0041B4E1) -------------------------------------------------------- +int __fastcall GUI_ReplaceHotkey(unsigned __int8 uOldHotkey, unsigned __int8 uNewHotkey, char bFirstCall) +{ + unsigned __int8 v3; // bl@1 + int result; // eax@1 + int i; // edx@2 + GUIButton *j; // ecx@3 + int k; // edx@7 + GUIButton *l; // ecx@8 + unsigned __int8 v9; // [sp+4h] [bp-8h]@1 + char v10; // [sp+8h] [bp-4h]@1 + + v3 = uNewHotkey; + v10 = toupper(uOldHotkey); + result = toupper(v3); + v9 = result; + if ( bFirstCall ) + { + for ( i = uNumVisibleWindows; i >= 0; --i ) + { + result = 84 * pVisibleWindowsIdxs[i]; + for ( j = *(GUIButton **)((char *)pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_ + result); j; j = j->pNext ) + j->field_28 = 0; + } + } + for ( k = uNumVisibleWindows; k >= 0; --k ) + { + result = 84 * pVisibleWindowsIdxs[k]; + for ( l = *(GUIButton **)((char *)pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_ + result); l; l = l->pNext ) + { + LOBYTE(result) = v10; + if ( l->uHotkey == v10 ) + { + if ( !l->field_28 ) + { + LOBYTE(result) = v9; + l->field_28 = 1; + l->uHotkey = v9; + } + } + } + } + return result; +} +// 5075E0: using guessed type int pVisibleWindowsIdxs[20]; + +//----- (0041B578) -------------------------------------------------------- +void __cdecl MainMenuUI_LoadFontsAndSomeStuff() +{ + pIcons_LOD->SetupPalettes(pRenderer->uTargetRBits, + pRenderer->uTargetGBits, + pRenderer->uTargetBBits); + pPaletteManager->SetColorChannelInfo(pRenderer->uTargetRBits, + pRenderer->uTargetGBits, + pRenderer->uTargetBBits); + pPaletteManager->RecalculateAll(); + + for (uint i = 0; i < 480; ++i) + pSRZBufferLineOffsets[i] = 640 * i; + + pRenderer->ResetClip(); + + uTextureID_FONTPAL = pIcons_LOD->LoadTexture("FONTPAL", TEXTURE_16BIT_PALETTE); + pFontArrus = LoadFont("arrus.fnt", "FONTPAL", 0); + pFontLucida = LoadFont("lucida.fnt", "FONTPAL", 0); + pFontCreate = LoadFont("create.fnt", "FONTPAL", 0); + pFontSmallnum = LoadFont("smallnum.fnt", "FONTPAL", 0); + pFontComic = LoadFont("comic.fnt", "FONTPAL", 0); + pFontArrus->field_3 = 0; + pFontLucida->field_3 = 0; + pFontCreate->field_3 = 0; + + for (uint i = 0; i < 20; ++i) + pWindowList[i].uWindowType = 0; + + uNumVisibleWindows = -1; + memset(pVisibleWindowsIdxs, 0, sizeof(pVisibleWindowsIdxs)); +} + +//----- (0041B690) -------------------------------------------------------- +void __cdecl MainMenuUI_Create() +{ + unsigned int v0; // eax@1 + unsigned int v1; // eax@1 + unsigned int v2; // eax@1 + unsigned int v3; // eax@1 + unsigned int v4; // eax@1 + unsigned int v5; // eax@1 + Texture *v6; // ST78_4@1 + const char *v7; // ST5C_4@1 + unsigned __int8 v8; // al@1 + //Texture *v9; // ST60_4@1 + Texture *v10; // ST78_4@1 + const char *v11; // ST5C_4@1 + unsigned __int8 v12; // al@1 + //Texture *v13; // ST60_4@1 + unsigned int v14; // eax@1 + Texture *v15; // ST78_4@1 + const char *v16; // ST5C_4@1 + unsigned __int8 v17; // al@1 + //Texture *v18; // ST60_4@1 + unsigned int uTextureID_ib_td4_A; // eax@1 + Texture *v20; // ST78_4@1 + const char *v21; // ST5C_4@1 + unsigned __int8 v22; // al@1 + //Texture *v23; // ST60_4@1 + Texture *v24; // eax@1 + Texture *v25; // esi@1 + Texture *v26; // ST60_4@1 + const char *v27; // ST5C_4@1 + unsigned __int8 v28; // al@1 + Texture *v29; // eax@1 + Texture *v30; // esi@1 + Texture *v31; // ST60_4@1 + const char *v32; // ST5C_4@1 + unsigned __int8 v33; // al@1 + + v0 = pIconsFrameTable->FindIcon("wizeyeC"); + pIconsFrameTable->InitializeAnimation(v0); + v1 = pIconsFrameTable->FindIcon("wizeyeB"); + pIconsFrameTable->InitializeAnimation(v1); + v2 = pIconsFrameTable->FindIcon("wizeyeA"); + pIconsFrameTable->InitializeAnimation(v2); + v3 = pIconsFrameTable->FindIcon("torchC"); + pIconsFrameTable->InitializeAnimation(v3); + v4 = pIconsFrameTable->FindIcon("torchB"); + pIconsFrameTable->InitializeAnimation(v4); + v5 = pIconsFrameTable->FindIcon("torchA"); + pIconsFrameTable->InitializeAnimation(v5); + pTextureIDs_pMapDirs[0] = pIcons_LOD->LoadTexture("MAPDIR8", TEXTURE_16BIT_PALETTE); + pTextureIDs_pMapDirs[1] = pIcons_LOD->LoadTexture("MAPDIR1", TEXTURE_16BIT_PALETTE); + pTextureIDs_pMapDirs[2] = pIcons_LOD->LoadTexture("MAPDIR2", TEXTURE_16BIT_PALETTE); + pTextureIDs_pMapDirs[3] = pIcons_LOD->LoadTexture("MAPDIR3", TEXTURE_16BIT_PALETTE); + pTextureIDs_pMapDirs[4] = pIcons_LOD->LoadTexture("MAPDIR4", TEXTURE_16BIT_PALETTE); + pTextureIDs_pMapDirs[5] = pIcons_LOD->LoadTexture("MAPDIR5", TEXTURE_16BIT_PALETTE); + pTextureIDs_pMapDirs[6] = pIcons_LOD->LoadTexture("MAPDIR6", TEXTURE_16BIT_PALETTE); + pTextureIDs_pMapDirs[7] = pIcons_LOD->LoadTexture("MAPDIR7", TEXTURE_16BIT_PALETTE); + uTextureID_BarBlue = pIcons_LOD->LoadTexture("ib-statB", TEXTURE_16BIT_PALETTE); + uTextureID_BarGreen = pIcons_LOD->LoadTexture("ib-statG", TEXTURE_16BIT_PALETTE); + uTextureID_BarYellow = pIcons_LOD->LoadTexture("ib-statY", TEXTURE_16BIT_PALETTE); + uTextureID_BarRed = pIcons_LOD->LoadTexture("ib-statR", TEXTURE_16BIT_PALETTE); + uTextureID_mhp_bd = pIcons_LOD->LoadTexture("mhp_bg", TEXTURE_16BIT_PALETTE); + uTextureID_mhp_capl = pIcons_LOD->LoadTexture("mhp_capl", TEXTURE_16BIT_PALETTE); + uTextureID_mhp_capr = pIcons_LOD->LoadTexture("mhp_capr", TEXTURE_16BIT_PALETTE); + uTextureID_mhp_grn = pIcons_LOD->LoadTexture("mhp_grn", TEXTURE_16BIT_PALETTE); + uTextureID_mhp_red = pIcons_LOD->LoadTexture("mhp_red", TEXTURE_16BIT_PALETTE); + uTextureID_mhp_yel = pIcons_LOD->LoadTexture("mhp_yel", TEXTURE_16BIT_PALETTE); + uTextureID_Leather = pIcons_LOD->LoadTexture("LEATHER", TEXTURE_16BIT_PALETTE); + pTexture_Leather = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture("ibground", TEXTURE_16BIT_PALETTE)]; + uTextureID_x_x_u = pIcons_LOD->LoadTexture("x_x_u", TEXTURE_16BIT_PALETTE); + uTextureID_BUTTDESC2 = pIcons_LOD->LoadTexture("BUTTESC2", TEXTURE_16BIT_PALETTE); + uTextureID_x_ok_u = pIcons_LOD->LoadTexture("x_ok_u", TEXTURE_16BIT_PALETTE); + uTextureID_BUTTYES2 = pIcons_LOD->LoadTexture("BUTTYES2", TEXTURE_16BIT_PALETTE); + uTextureID_BUTTMAKE = pIcons_LOD->LoadTexture("BUTTMAKE", TEXTURE_16BIT_PALETTE); + uTextureID_BUTTMAKE2 = pIcons_LOD->LoadTexture("BUTTMAKE2", TEXTURE_16BIT_PALETTE); + pGUIWindow0 = GUIWindow::Create(0, 0, 640u, 480u, WINDOW_Credits, 0, 0); + pGUIWindow0->CreateButton(7u, 8u, 0x1CCu, 0x157u, 1, 0, 0xAu, 0, 0, nullstring, 0); + pGUIWindow0->CreateButton(0x3Du, 0x1A8u, 0x1Fu, 0x28u, 2, 94, 0x6Eu, 1u, 0x31u, nullstring, 0); + pGUIWindow0->CreateButton(0xB1u, 0x1A8u, 0x1Fu, 0x28u, 2, 94, 0x6Eu, 2u, 0x32u, nullstring, 0); + pGUIWindow0->CreateButton(0x124u, 0x1A8u, 0x1Fu, 0x28u, 2, 94, 0x6Eu, 3u, 0x33u, nullstring, 0); + pGUIWindow0->CreateButton(0x197u, 0x1A8u, 0x1Fu, 0x28u, 2, 94, 0x6Eu, 4u, 0x34u, nullstring, 0); + pGUIWindow0->CreateButton(0x18u, 0x194u, 5u, 0x31u, 1, 93, 0, 1u, 0, nullstring, 0); + pGUIWindow0->CreateButton(0x8Bu, 0x194u, 5u, 0x31u, 1, 93, 0, 2u, 0, nullstring, 0); + pGUIWindow0->CreateButton(0xFFu, 0x194u, 5u, 0x31u, 1, 93, 0, 3u, 0, nullstring, 0); + pGUIWindow0->CreateButton(0x172u, 0x194u, 5u, 0x31u, 1, 93, 0, 4u, 0, nullstring, 0); + pGUIWindow0->CreateButton(0x61u, 0x194u, 5u, 0x31u, 1, 93, 0, 1u, 0, nullstring, 0); + pGUIWindow0->CreateButton(0xD4u, 0x194u, 5u, 0x31u, 1, 93, 0, 2u, 0, nullstring, 0); + pGUIWindow0->CreateButton(0x148u, 0x194u, 5u, 0x31u, 1, 93, 0, 3u, 0, nullstring, 0); + pGUIWindow0->CreateButton(0x1BBu, 0x194u, 5u, 0x31u, 1, 93, 0, 4u, 0, nullstring, 0); + uTextureID_ib_td1_A = pIcons_LOD->LoadTexture("ib-td1-A", TEXTURE_16BIT_PALETTE); + v6 = (Texture *)(uTextureID_ib_td1_A != -1 ? &pIcons_LOD->pTextures[uTextureID_ib_td1_A] : 0); + v7 = pGlobalTXT_LocalizationStrings[174]; + v8 = pKeyActionMap->GetActionVKey(INPUT_Quest); + ptr_507A10 = pGUIWindow0->CreateButton( + 0x1EBu, + 0x161u, + v6->uTextureWidth, + v6->uTextureHeight, + 1, + 0, + 0xC8u, + 0, + v8, + v7, + v6, 0); + uTextureID_ib_td2_A = pIcons_LOD->LoadTexture("ib-td2-A", TEXTURE_16BIT_PALETTE); + v10 = (Texture *)(uTextureID_ib_td2_A != -1 ? &pIcons_LOD->pTextures[uTextureID_ib_td2_A] : 0); + v11 = pGlobalTXT_LocalizationStrings[154]; + v12 = pKeyActionMap->GetActionVKey(INPUT_Autonotes); + ptr_507A0C = pGUIWindow0->CreateButton( + 0x20Fu, + 0x161u, + v10->uTextureWidth, + v10->uTextureHeight, + 1, + 0, + 0xC9u, + 0, + v12, + v11, + v10); + v14 = pIcons_LOD->LoadTexture("ib-td3-A", TEXTURE_16BIT_PALETTE); + v15 = (Texture *)(v14 != -1 ? (int)&pIcons_LOD->pTextures[v14] : 0); + v16 = pGlobalTXT_LocalizationStrings[139]; + v17 = pKeyActionMap->GetActionVKey(INPUT_Mapbook); + ptr_507A08 = pGUIWindow0->CreateButton( + 0x222u, + 0x161u, + v15->uTextureWidth, + v15->uTextureHeight, + 1, + 0, + 0xCAu, + 0, + v17, + v16, + v15); + uTextureID_ib_td4_A = pIcons_LOD->LoadTexture("ib-td4-A", TEXTURE_16BIT_PALETTE); + v20 = (Texture *)(uTextureID_ib_td4_A != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_ib_td4_A] : 0); + v21 = pGlobalTXT_LocalizationStrings[78]; + v22 = pKeyActionMap->GetActionVKey(INPUT_TimeCal); + dword_507A04 = pGUIWindow0->CreateButton( + 0x23Au, + 0x161u, + v20->uTextureWidth, + v20->uTextureHeight, + 1, + 0, + 0xCBu, + 0, + v22, + v21, + v20); + uTextureID_ib_td5_A = pIcons_LOD->LoadTexture("ib-td5-A", TEXTURE_16BIT_PALETTE); + ptr_507A00 = pGUIWindow0->CreateButton( + 0x258u, + 0x169u, + (uTextureID_ib_td5_A != -1 ? pIcons_LOD->pTextures[uTextureID_ib_td5_A].uTextureWidth : 24), + (uTextureID_ib_td5_A != -1 ? pIcons_LOD->pTextures[uTextureID_ib_td5_A].uTextureHeight : 26), + 1, + 0, + 0xE0u, + 0, + 0x48u, + pGlobalTXT_LocalizationStrings[602], + (Texture *)(uTextureID_ib_td5_A != -1 ? &pIcons_LOD->pTextures[uTextureID_ib_td5_A] : 0), + 0); + v24 = &pIcons_LOD->pTextures[uTextureID_507980]; + v25 = (Texture *)(uTextureID_507980 != -1 ? (int)v24 : 0); + bFlashHistoryBook = 0; + v26 = (Texture *)(uTextureID_507980 != -1 ? (int)v24 : 0); + bFlashAutonotesBook = 0; + v27 = pGlobalTXT_LocalizationStrings[252]; + bFlashQuestBook = 0; + v28 = pKeyActionMap->GetActionVKey(INPUT_ZoomIn); + dword_507A18 = pGUIWindow0->CreateButton( + 0x23Eu, + 0x88u, + v25->uTextureWidth, + v25->uTextureHeight, + 2, + 0, + 0x170u, + 0, + v28, + v27, + v26, + 0); + v29 = &pIcons_LOD->pTextures[uTextureID_507984]; + v30 = (Texture *)(uTextureID_507984 != -1 ? (int)v29 : 0); + v31 = (Texture *)(uTextureID_507984 != -1 ? (int)v29 : 0); + v32 = pGlobalTXT_LocalizationStrings[251]; + v33 = pKeyActionMap->GetActionVKey(INPUT_ZoomOut); + dword_507A14 = pGUIWindow0->CreateButton( + 0x207u, + 0x88u, + v30->uTextureWidth, + v30->uTextureHeight, + 2, + 0, + 0x16Fu, + 0, + v33, + v32, + v31, + 0); + pGUIWindow0->CreateButton(0x1E1u, 0, 0x99u, 0x43u, 1, 92, 0, 0, 0, nullstring, 0); + pGUIWindow0->CreateButton(0x1EBu, 0x95u, 0x40u, 0x4Au, 1, 0, 0x86u, 0, 0x35u, nullstring, 0); + pGUIWindow0->CreateButton(0x231u, 0x95u, 0x40u, 0x4Au, 1, 0, 0x87u, 0, 0x36u, nullstring, 0); + pGUIWindow0->CreateButton(0x1DCu, 0x142u, 0x4Du, 0x11u, 1, 100, 0, 0, 0, nullstring, 0); + pGUIWindow0->CreateButton(0x22Bu, 0x142u, 0x4Du, 0x11u, 1, 101, 0, 0, 0, nullstring, 0); + ptr_5079F8 = pGUIWindow0->CreateButton( + 0x1DCu, + 0x1C2u, + (uTextureID_50797C != -1 ? pIcons_LOD->pTextures[uTextureID_50797C].uTextureWidth : 24), + (uTextureID_50797C != -1 ? pIcons_LOD->pTextures[uTextureID_50797C].uTextureHeight : 26), + 1, + 0, + 0x69u, + 0, + 0x43u, + pGlobalTXT_LocalizationStrings[38], + (Texture *)(uTextureID_50797C != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_50797C] : 0), + 0); + ptr_5079FC = pGUIWindow0->CreateButton( + 0x206u, + 0x1C2u, + (uTextureID_507978 != -1 ? pIcons_LOD->pTextures[uTextureID_507978].uTextureWidth : 24), + (uTextureID_507978 != -1 ? pIcons_LOD->pTextures[uTextureID_507978].uTextureHeight : 26), + 1, + 0, + 0x68u, + 0, + 0x52u, + pGlobalTXT_LocalizationStrings[182], + (Texture *)(uTextureID_507978 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_507978] : 0), + 0); + ptr_5079F4 = pGUIWindow0->CreateButton( + 0x230u, + 0x1C2u, + (dword_507974 != -1 ? pIcons_LOD->pTextures[dword_507974].uTextureWidth : 24), + (dword_507974 != -1 ? pIcons_LOD->pTextures[dword_507974].uTextureHeight : 26), + 1, + 0, + 0x6Au, + 0, + 0x5Au, + pGlobalTXT_LocalizationStrings[173], + (Texture *)(dword_507974 != -1 ? &pIcons_LOD->pTextures[dword_507974] : 0), + 0); + ptr_5079F0 = pGUIWindow0->CreateButton( + 0x25Au, + 0x1C2u, + (uTextureID_507970 != -1 ? pIcons_LOD->pTextures[uTextureID_507970].uTextureWidth : 24), + (uTextureID_507970 != -1 ? pIcons_LOD->pTextures[uTextureID_507970].uTextureHeight : 26), + 1, + 0, + 0x6Bu, + 0, + 0, + pGlobalTXT_LocalizationStrings[93], + (Texture *)(uTextureID_507970 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_507970] : 0), + 0); + ptr_5079EC = pGUIWindow0->CreateButton( + 0x1D5u, + 0xB2u, + (uTextureID_507990 != -1 ? pIcons_LOD->pTextures[uTextureID_507990].uTextureWidth : 24), + (uTextureID_507990 != -1 ? pIcons_LOD->pTextures[uTextureID_507990].uTextureHeight : 26), + 1, + 0, + 0xBCu, + 0, + 0, + nullstring, + (Texture *)(uTextureID_507990 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_507990] : 0), + 0); + ptr_5079E8 = pGUIWindow0->CreateButton( + 0x272u, + 0xB2u, + (uTextureID_50798C != -1 ? pIcons_LOD->pTextures[uTextureID_50798C].uTextureWidth : 24), + (uTextureID_50798C != -1 ? pIcons_LOD->pTextures[uTextureID_50798C].uTextureHeight : 26), + 1, + 0, + 0xBCu, + 1u, + 0, + nullstring, + (Texture *)(uTextureID_50798C != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_50798C] : 0), + 0); + Load_isn_spells_21_27(); +} + + + +//----- (0041C047) -------------------------------------------------------- +void __cdecl GameUI_DrawStatusBar_2() +{ + unsigned int v0; // eax@1 + char *v1; // edx@2 + unsigned int v2; // ST18_4@5 + const char *v3; // ST0C_4@5 + unsigned int v4; // ST08_4@5 + int v5; // eax@5 + + pRenderer->DrawTextureRGB(0, 352u, pTexture_StatusBar); + if ( GameUI_StatusBar_TimedStringTimeLeft ) + { + v1 = GameUI_StatusBar_TimedString; + } + else + { + if ( !pStatusBarString[0] ) + return; + v1 = pStatusBarString; + } + LOWORD(v0) = uGameUIFontShadow; + v2 = v0; + LOWORD(v0) = uGameUIFontMain; + v3 = v1; + v4 = v0; + v5 = pFontLucida->AlignText_Center(0x1C2u, v1); + pGUIWindow0->DrawText(pFontLucida, v5 + 11, 357, v4, v3, 0, 0, v2); +} + +//----- (0041C0B8) -------------------------------------------------------- +void __thiscall sub_41C0B8_set_status_string(const char *pStr) +{ + const char *v1; // esi@1 + int i; // eax@7 + int j; // eax@11 + + v1 = pStr; + if ( pStr && strcmp(pStr, "test") && !IsBadStringPtrA(v1, 1u) && (*v1 || GameUI_StatusBar_TimedStringTimeLeft) ) + { + if ( GameUI_StatusBar_TimedStringTimeLeft ) + { + for ( i = pFontLucida->GetLineWidth(GameUI_StatusBar_TimedString); + i > 450; + i = pFontLucida->GetLineWidth(GameUI_StatusBar_TimedString) ) + byte_5C3427[strlen(GameUI_StatusBar_TimedString)] = 0; + } + else + { + strcpy(pStatusBarString, v1); + for ( j = pFontLucida->GetLineWidth(pStatusBarString); + j > 450; + j = pFontLucida->GetLineWidth(pStatusBarString) ) + GameUI_StatusBar_TimedString[strlen(pStatusBarString) + 199] = 0; + } + } +} + +//----- (0041C179) -------------------------------------------------------- +void __cdecl GameUI_DrawStatusBar() +{ + unsigned int v0; // ebp@1 + char *v1; // edi@5 + int v2; // eax@5 + unsigned int v3; // esi@5 + size_t v4; // eax@6 + GUIFont *v5; // ecx@6 + int v6; // eax@9 + size_t v7; // eax@10 + GUIFont *v8; // ecx@10 + char v9; // zf@12 + unsigned int v10; // ST08_4@13 + int v11; // eax@13 + + v0 = uGameUIFontShadow; + if ( pStatusBarString[0] || GameUI_StatusBar_TimedStringTimeLeft || bForceDrawStatusBar ) + { + pRenderer->DrawTextureRGB(0, 352u, pTexture_StatusBar); + if ( GameUI_StatusBar_TimedStringTimeLeft ) + { + v1 = GameUI_StatusBar_TimedString; + v2 = pFontLucida->GetLineWidth(GameUI_StatusBar_TimedString); + v3 = 450; + while ( v2 > 450 ) + { + v4 = strlen(GameUI_StatusBar_TimedString); + v5 = pFontLucida; + byte_5C3427[v4] = 0; + v2 = pFontLucida->GetLineWidth(GameUI_StatusBar_TimedString); + } + } + else + { + v1 = pStatusBarString; + v6 = pFontLucida->GetLineWidth(pStatusBarString); + v3 = 450; + while ( v6 > 450 ) + { + v7 = strlen(pStatusBarString); + v8 = pFontLucida; + GameUI_StatusBar_TimedString[v7 + 199] = 0; + v6 = pFontLucida->GetLineWidth(pStatusBarString); + } + } + v9 = *v1 == 0; + bForceDrawStatusBar = 0; + if ( !v9 ) + { + v10 = uGameUIFontMain; + v11 = pFontLucida->AlignText_Center(v3, v1); + pGUIWindow0->DrawText(pFontLucida, v11 + 11, 357, v10, v1, 0, 0, v0); + } + } +} +// 5C35BC: using guessed type int bForceDrawStatusBar; + + +//----- (0041CD4F) -------------------------------------------------------- +bool __thiscall sub_41CD4F(unsigned int _this) +{ + unsigned int v1; // edi@1 + unsigned int v2; // eax@2 + int v3; // esi@3 + int v4; // ecx@10 + GUIButton *v5; // eax@11 + int v6; // edx@12 + int v7; // ecx@20 + char v8; // zf@21 + GUIButton *v9; // ecx@24 + int v10; // esi@24 + int v11; // edx@26 + int v12; // edx@28 + int v13; // esi@32 + GUIButton *v14; // eax@37 + int v15; // edx@38 + int v17; // ecx@50 + int v18; // edx@50 + GUIButton *v19; // ecx@54 + int v20; // esi@54 + int v21; // edx@56 + int v22; // ecx@59 + int v23; // edx@59 + int v24; // ecx@60 + int v25; // esi@63 + unsigned int v26; // [sp+Ch] [bp-14h]@1 + int v27; // [sp+10h] [bp-10h]@1 + int v28; // [sp+14h] [bp-Ch]@10 + int v29; // [sp+14h] [bp-Ch]@36 + unsigned int uClickX; // [sp+18h] [bp-8h]@10 + unsigned int uClickY; // [sp+1Ch] [bp-4h]@10 + + v1 = 0; + v26 = _this; + v27 = uNumVisibleWindows; + if ( uNumVisibleWindows < 0 ) + return 0; + v2 = pMessageQueue_50CBD0->uNumMessages; + while ( 1 ) + { + v3 = pVisibleWindowsIdxs[v27] - 1; + if ( pWindowList[v3].field_44 == v1 ) + goto LABEL_47; + if ( v26 != 34 ) + break; + if ( pWindowList[v3].field_30 != v1 ) + { + pMouse->GetClickPos(&uClickX, &uClickY); + v4 = pWindowList[v3].field_38; + v29 = v4 + pWindowList[v3].field_28; + if ( v4 < v4 + pWindowList[v3].field_28 ) + { + while ( 1 ) + { + v14 = pWindowList[v3].pControlsHead; + if ( v4 > 0 ) + { + v15 = v4; + do + { + v14 = v14->pNext; + --v15; + } + while ( v15 ); + } + if ( (signed int)uClickX >= (signed int)v14->uX + && (signed int)uClickX <= (signed int)v14->uZ + && (signed int)uClickY >= (signed int)v14->uY + && (signed int)uClickY <= (signed int)v14->uW ) + goto LABEL_66; + ++v4; + if ( v4 >= v29 ) + { +LABEL_45: + v1 = 0; + goto LABEL_46; + } + } + } + goto LABEL_46; + } +LABEL_47: + --v27; + if ( v27 < 0 ) + return 0; + } + if ( v26 == 37 ) + { + v12 = pWindowList[v3].field_34; + if ( pWindowList[v3].field_2C_focus_id - pWindowList[v3].field_38 - v12 >= 0 ) + { + v8 = uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions == 21; + pWindowList[v3].field_2C_focus_id -= v12; + if ( v8 ) + { + pAudioPlayer->PlaySound((SoundID)66, v1, v1, -1, v1, v1, v1, v1); + v2 = pMessageQueue_50CBD0->uNumMessages; + } + } + if ( pWindowList[v3].field_30 != v1 ) + goto LABEL_47; + v9 = pWindowList[v3].pControlsHead; + v13 = pWindowList[v3].field_2C_focus_id; + if ( v13 > (signed int)v1 ) + { + do + { + v9 = v9->pNext; + --v13; + } + while ( v13 ); + } +LABEL_26: + v11 = v9->uControlParam; + if ( (signed int)v2 < 40 ) + { + pMessageQueue_50CBD0->pMessages[v2].eType = (UIMessageType)v9->uControlID; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v11; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = v1; + v2 = pMessageQueue_50CBD0->uNumMessages + 1; + ++pMessageQueue_50CBD0->uNumMessages; + } + goto LABEL_47; + } + if ( v26 != 38 ) + { + if ( v26 == 39 ) + { + v7 = pWindowList[v3].field_2C_focus_id + pWindowList[v3].field_34; + if ( v7 < pWindowList[v3].field_28 + pWindowList[v3].field_38 ) + { + v8 = uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions == 21; + pWindowList[v3].field_2C_focus_id = v7; + if ( v8 ) + { + pAudioPlayer->PlaySound((SoundID)66, v1, v1, -1, v1, v1, v1, v1); + v2 = pMessageQueue_50CBD0->uNumMessages; + } + } + if ( pWindowList[v3].field_30 != v1 ) + goto LABEL_47; + v9 = pWindowList[v3].pControlsHead; + v10 = pWindowList[v3].field_2C_focus_id; + if ( v10 > (signed int)v1 ) + { + do + { + v9 = v9->pNext; + --v10; + } + while ( v10 ); + } + goto LABEL_26; + } + if ( v26 == 40 ) + { + v17 = pWindowList[v3].field_38; + v18 = pWindowList[v3].field_2C_focus_id; + if ( v18 >= pWindowList[v3].field_28 + v17 - 1 ) + pWindowList[v3].field_2C_focus_id = v17; + else + pWindowList[v3].field_2C_focus_id = v18 + 1; + if ( pWindowList[v3].field_30 != v1 ) + return 1; + v19 = pWindowList[v3].pControlsHead; + v20 = pWindowList[v3].field_2C_focus_id; + if ( v20 > (signed int)v1 ) + { + do + { + v19 = v19->pNext; + --v20; + } + while ( v20 ); + } + goto LABEL_56; + } + if ( v26 == 41 ) + { + pMouse->GetClickPos(&uClickX, &uClickY); + v4 = pWindowList[v3].field_38; + v28 = v4 + pWindowList[v3].field_28; + if ( v4 < v4 + pWindowList[v3].field_28 ) + { + while ( 1 ) + { + v5 = pWindowList[v3].pControlsHead; + if ( v4 > 0 ) + { + v6 = v4; + do + { + v5 = v5->pNext; + --v6; + } + while ( v6 ); + } + if ( (signed int)uClickX >= (signed int)v5->uX + && (signed int)uClickX <= (signed int)v5->uZ + && (signed int)uClickY >= (signed int)v5->uY + && (signed int)uClickY <= (signed int)v5->uW ) + break; + ++v4; + if ( v4 >= v28 ) + goto LABEL_45; + } +LABEL_66: + pWindowList[v3].field_2C_focus_id = v4; + return 1; + } +LABEL_46: + v2 = pMessageQueue_50CBD0->uNumMessages; + goto LABEL_47; + } + goto LABEL_47; + } + v22 = pWindowList[v3].field_2C_focus_id; + v23 = pWindowList[v3].field_38; + if ( v22 <= v23 ) + v24 = pWindowList[v3].field_28 + v23 - 1; + else + v24 = v22 - 1; + v8 = pWindowList[v3].field_30 == v1; + pWindowList[v3].field_2C_focus_id = v24; + if ( !v8 ) + return 1; + v19 = pWindowList[v3].pControlsHead; + v25 = pWindowList[v3].field_2C_focus_id; + if ( v25 > (signed int)v1 ) + { + do + { + v19 = v19->pNext; + --v25; + } + while ( v25 ); + } +LABEL_56: + v21 = v19->uControlParam; + if ( (signed int)v2 < 40 ) + { + pMessageQueue_50CBD0->pMessages[v2].eType = (UIMessageType)v19->uControlID; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v21; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = v1; + ++pMessageQueue_50CBD0->uNumMessages; + } + return 1; +} + +//----- (0041D20D) -------------------------------------------------------- +char __fastcall sub_41D20D_buff_remaining_time_string(int ecx0, GUIWindow *edx0, __int64 a3, GUIFont *a2) +{ + unsigned int v4; // edi@1 + unsigned int v5; // esi@1 + unsigned int v6; // ebp@1 + unsigned int v7; // ebx@1 + signed __int64 v8; // ST34_8@1 + signed __int64 v9; // kr00_8@1 + char *v10; // eax@2 + char *v11; // eax@7 + char *v12; // eax@13 + char *v13; // eax@19 + int uY; // [sp+0h] [bp-20h]@1 + GUIWindow *a1; // [sp+4h] [bp-1Ch]@1 + signed __int64 v17; // [sp+10h] [bp-10h]@1 + signed __int64 v18; // [sp+18h] [bp-8h]@1 + unsigned int v19; // [sp+24h] [bp+4h]@1 + + a1 = edx0; + uY = ecx0; + v4 = (unsigned __int64)(signed __int64)((double)a3 * 0.234375) >> 32; + v5 = (signed __int64)((double)a3 * 0.234375); + v6 = (unsigned __int64)((signed __int64)((double)a3 * 0.234375) / 60) >> 32; + v7 = (signed __int64)((double)a3 * 0.234375) / 60; + v8 = (signed __int64)((double)a3 * 0.234375) / 60 / 60; + v19 = (unsigned int)v8 / 0x18; + v18 = (signed __int64)__PAIR__(v4, v5) % 60; + v17 = (signed __int64)__PAIR__(v6, v7) % 60; + v9 = v8 % 24; + strcpy(pTmpBuf, "\r020"); + if ( (unsigned int)v8 / 0x18 ) + { + v10 = pGlobalTXT_LocalizationStrings[57]; // Days + if ( v19 <= 1 ) + v10 = pGlobalTXT_LocalizationStrings[56]; // Day + sprintfex(pTmpBuf2, "%d %s ", v19, v10); + strcat(pTmpBuf, pTmpBuf2); + } + if ( v9 ) + { + if ( v9 <= 1 ) + v11 = pGlobalTXT_LocalizationStrings[109];// Hour + else + v11 = pGlobalTXT_LocalizationStrings[110];// Hours + sprintfex(pTmpBuf2, "%d %s ", v9, v11); + strcat(pTmpBuf, pTmpBuf2); + } + if ( v17 && !v19 ) + { + if ( v17 <= 1 ) + v12 = pGlobalTXT_LocalizationStrings[437];// Minute + else + v12 = pGlobalTXT_LocalizationStrings[436];// Minutes + sprintfex(pTmpBuf2, "%d %s ", v17, v12); + strcat(pTmpBuf, pTmpBuf2); + } + if ( v18 && !v9 ) + { + if ( v18 <= 1 ) + v13 = pGlobalTXT_LocalizationStrings[439];// Second + else + v13 = pGlobalTXT_LocalizationStrings[438];// Seconds + sprintfex(pTmpBuf2, "%d %s ", v18, v13); + strcat(pTmpBuf, pTmpBuf2); + } + return a1->DrawText(a2, 32, uY, 0, pTmpBuf, 0, 0, 0); +} + + +//----- (0041D895) -------------------------------------------------------- +void __thiscall GameUI_DrawItemInfo(ItemGen *ecx0) +{ + ItemGen *v1; // esi@1 + unsigned int v2; // eax@3 + char *v3; // edi@5 + unsigned int v4; // eax@5 + unsigned int v5; // esi@5 + signed int v6; // eax@5 + int v7; // edx@5 + ItemGen *v8; // ecx@10 + unsigned int v9; // eax@12 + char v10; // zf@16 + ItemGen *v11; // eax@16 + ItemGen *v12; // eax@25 + unsigned int v13; // ecx@32 + unsigned int v14; // eax@32 + Render *v15; // edi@33 + const char *v16; // eax@34 + int v17; // eax@36 + int v18; // esi@37 + unsigned __int16 v19; // ax@37 + char v20; // al@40 + char v21; // al@44 + char v22; // al@48 + char v23; // al@51 + int v24; // eax@52 + int v25; // eax@57 + int v26; // eax@60 + int v27; // eax@67 + const char *v28; // edi@69 + int v29; // eax@70 + char *v30; // edi@78 + const char *v31; // eax@78 + int v32; // ecx@81 + unsigned int v33; // eax@81 + int v34; // esi@81 + const char *v35; // eax@85 + const char *v36; // eax@87 + unsigned int v37; // eax@109 + unsigned int v38; // eax@109 + int v39; // eax@113 + GUIFont *v40; // edx@113 + signed int v41; // [sp-20h] [bp-298h]@113 + int v42; // [sp-1Ch] [bp-294h]@113 + char *v43; // [sp-18h] [bp-290h]@46 + unsigned int v44; // [sp-18h] [bp-290h]@113 + int v45; // [sp-14h] [bp-28Ch]@46 + const char *v46; // [sp-14h] [bp-28Ch]@58 + char *v47; // [sp-14h] [bp-28Ch]@110 + char *v48; // [sp-10h] [bp-288h]@46 + const char *v49; // [sp-10h] [bp-288h]@56 + char *v50; // [sp-10h] [bp-288h]@58 + int v51; // [sp-10h] [bp-288h]@110 + const char *v52; // [sp-Ch] [bp-284h]@36 + int v53; // [sp-Ch] [bp-284h]@46 + char *v54; // [sp-Ch] [bp-284h]@56 + int v55; // [sp-Ch] [bp-284h]@58 + int v56; // [sp-Ch] [bp-284h]@110 + unsigned int v57; // [sp-8h] [bp-280h]@36 + int v58; // [sp-8h] [bp-280h]@46 + int v59; // [sp-8h] [bp-280h]@56 + int v60; // [sp-8h] [bp-280h]@58 + unsigned int v61; // [sp-8h] [bp-280h]@110 + char a1[100]; // [sp+8h] [bp-270h]@40 + char Dest[100]; // [sp+6Ch] [bp-20Ch]@40 + char v64[100]; // [sp+D0h] [bp-1A8h]@40 + char v65[120]; // [sp+134h] [bp-144h]@92 + char Source[40]; // [sp+1ACh] [bp-CCh]@49 + int v67; // [sp+1D4h] [bp-A4h]@91 + int v68; // [sp+1D8h] [bp-A0h]@106 + int v69; // [sp+1DCh] [bp-9Ch]@101 + int v70; // [sp+1E0h] [bp-98h]@97 + int v71; // [sp+1E8h] [bp-90h]@93 + int v72; // [sp+1ECh] [bp-8Ch]@91 + int var88; // [sp+1F0h] [bp-88h]@1 + Texture *v73; // [sp+1F4h] [bp-84h]@5 + unsigned int v75; // [sp+1F8h] [bp-80h]@5 + char *v76; // [sp+1FCh] [bp-7Ch]@5 + int v77; // [sp+200h] [bp-78h]@12 + int v78; // [sp+204h] [bp-74h]@5 + GUIWindow v79; // [sp+208h] [bp-70h]@2 + POINT a2; // [sp+25Ch] [bp-1Ch]@2 + int v81; // [sp+264h] [bp-14h]@5 + GUIFont *v82; // [sp+268h] [bp-10h]@1 + char *v83; // [sp+26Ch] [bp-Ch]@18 + char *Str; // [sp+270h] [bp-8h]@65 + ItemGen *_this; // [sp+274h] [bp-4h]@1 + + v1 = ecx0; + _this = ecx0; + var88 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); + v82 = pFontComic; + if ( v1->uItemID ) + { + v79.str_48 = 0; + v79.uFrameWidth = 384; + v79.uFrameHeight = 180; + v79.uFrameY = 40; + if ( pMouse->GetCursorPos(&a2)->x <= 320 ) + v2 = pMouse->GetCursorPos(&a2)->x + 30; + else + v2 = pMouse->GetCursorPos(&a2)->x - v79.uFrameWidth - 30; + v79.uFrameX = v2; + v3 = (char *)&pItemsTable->pItems[_this->uItemID].pIconName; + v76 = v3; + v4 = pIcons_LOD->LoadTexture(*(const char **)v3, TEXTURE_16BIT_PALETTE); + v5 = v4; + v4 *= 72; + v75 = v4; + v73 = (struct Texture *)((char *)pIcons_LOD->pTextures + v4); + v6 = 100 - *(unsigned __int16 *)((char *)&pIcons_LOD->pTextures[0].uTextureWidth + v4); + v7 = v73->uTextureHeight; + v78 = v6; + v81 = 144 - v7; + if ( v6 > 0 ) + v78 = v6 >> 1; + if ( v81 <= 0 ) + v81 = 0; + else + v81 >>= 1; + v8 = _this; + if ( !v3[46] ) + _this->uAttributtes |= 1u; + v9 = v8->uAttributtes; + v77 = 0; + a2.y = v9 & 2; + if ( pItemsTable->pItems[v8->uItemID].uEquipType == 18 ) + v77 = v8->uAdditionalValue; + if ( uActiveCharacter ) + { + if ( !(v9 & 1) ) + { + v10 = pPlayers[uActiveCharacter]->CanIdentify(_this) == 1; + v11 = _this; + if ( v10 ) + _this->uAttributtes |= 1u; + v10 = (v11->uAttributtes & 1) == 0; + v83 = (char *)9; + if ( v10 ) + { + ShowStatusBarString(pGlobalTXT_LocalizationStrings[446], 2u); + } + else + { + v83 = (char *)8; + if ( _this->GetValue() < 100 * (pPlayers[uActiveCharacter]->uLevel + 5) ) + v83 = (char *)7; + } + if ( dword_4E455C ) + { + pPlayers[uActiveCharacter]->PlaySound((int)v83, 0); + dword_4E455C = 0; + } + } + _this->UpdateTempBonus(pParty->uTimePlayed); + if ( a2.y ) + { + v10 = pPlayers[uActiveCharacter]->CanRepair(_this) == 1; + v12 = _this; + if ( v10 ) + _this->uAttributtes = _this->uAttributtes & 0xFFFFFFFD | 1; + v10 = (v12->uAttributtes & 2) == 0; + v83 = (char *)11; + if ( v10 ) + v83 = (char *)10; + else + ShowStatusBarString(pGlobalTXT_LocalizationStrings[448], 2u); + if ( dword_4E455C ) + { + pPlayers[uActiveCharacter]->PlaySound((int)v83, 0); + dword_4E455C = 0; + } + } + } + v13 = _this->uAttributtes; + v14 = _this->uAttributtes & 1; + a2.y = _this->uAttributtes & 1; + if ( v13 & 2 ) + { + v79._415551(0); + //v15 = &; + pRenderer->Clip( + v79.uFrameX + 12, + v79.uFrameY + 12, + v79.uFrameX + v79.uFrameWidth - 12, + v79.uFrameY + v79.uFrameHeight - 12); + v79.uFrameWidth -= 24; + v79.uFrameHeight -= 12; + v79.uFrameZ = v79.uFrameX + v79.uFrameWidth - 1; + v79.uFrameW = v79.uFrameY + v79.uFrameHeight - 1; + pRenderer->_4A6776( + v79.uFrameX + v78, + v81 + v79.uFrameY + 30, + (Texture *)(v5 != -1 ? (int)((char *)pIcons_LOD->pTextures + v75) : 0)); + if ( a2.y ) + v16 = _this->GetIdentifiedName(); + else + v16 = (const char *)*((int *)v76 + 2); + v79.DrawText2(pFontArrus, 0, 0xCu, var88, v16, 3u); + v17 = pFontArrus->CalcTextHeight(pGlobalTXT_LocalizationStrings[32], &v79, 0, 0); + v57 = 3; + v52 = pGlobalTXT_LocalizationStrings[32]; + goto LABEL_37; + } + if ( !v14 ) + { + v79._415551(0); + v15 = pRenderer; + pRenderer->Clip( + v79.uFrameX + 12, + v79.uFrameY + 12, + v79.uFrameX + v79.uFrameWidth - 12, + v79.uFrameY + v79.uFrameHeight - 12); + v79.uFrameWidth -= 24; + v79.uFrameHeight -= 12; + v79.uFrameZ = v79.uFrameX + v79.uFrameWidth - 1; + v79.uFrameW = v79.uFrameY + v79.uFrameHeight - 1; + pRenderer->DrawTextureTransparent( + v79.uFrameX + v78, + v81 + v79.uFrameY + 30, + (Texture *)(v5 != -1 ? (int)((char *)pIcons_LOD->pTextures + v75) : 0)); + v79.DrawText2(pFontArrus, 0, 0xCu, var88, *((const char **)v76 + 2), 3u); + v17 = pFontArrus->CalcTextHeight(pGlobalTXT_LocalizationStrings[232], &v79, 0, 0); + v57 = 3; + v52 = pGlobalTXT_LocalizationStrings[232]; +LABEL_37: + v18 = v17 >> 1; + v19 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0x19u, 0x19u); + v79.DrawText2(pFontArrus, 0x64u, ((signed int)v79.uFrameHeight >> 1) - v18, v19, v52, v57); + goto LABEL_116; + } + sprintfex(a1, pGlobalTXT_LocalizationStrings[463], *((int *)v3 + 2)); + strcpy(Dest, nullstring); + strcpy(v64, nullstring); + v20 = v3[28]; + if ( (unsigned __int8)v20 <= 1u ) + { + v58 = (unsigned __int8)v3[31]; + v53 = (unsigned __int8)v3[30]; + v48 = pGlobalTXT_LocalizationStrings[53]; + v45 = (unsigned __int8)v3[32]; + v43 = pGlobalTXT_LocalizationStrings[18]; + } + else + { + if ( v20 != 2 ) + { + if ( (unsigned __int8)v20 > 2u ) + { + if ( (unsigned __int8)v20 <= 0xBu ) + { + v21 = v3[30]; + if ( v21 ) + sprintfex( + Dest, + "%s: +%d", + pGlobalTXT_LocalizationStrings[11], + (unsigned __int8)v21 + (unsigned __int8)v3[32]); + } + } + goto LABEL_50; + } + v58 = (unsigned __int8)v3[31]; + v53 = (unsigned __int8)v3[30]; + v48 = pGlobalTXT_LocalizationStrings[53]; + v45 = (unsigned __int8)v3[32]; + v43 = pGlobalTXT_LocalizationStrings[203]; + } + sprintfex(Dest, "%s: +%d %s: %dd%d", v43, v45, v48, v53, v58); + v22 = v3[32]; + if ( v22 ) + { + sprintfex(Source, " +%d", (unsigned __int8)v22); + strcat(Dest, Source); + } +LABEL_50: + if ( v77 ) + goto LABEL_65; + v23 = v3[28]; + if ( v23 == 14 ) + { + v24 = _this->_bonus_type; + if ( v24 ) + goto LABEL_56; +LABEL_65: + v79.uFrameWidth -= 12; + a2.y = 3; + v79.uFrameZ = v79.uFrameX + v79.uFrameWidth - 1; + v79.uFrameW = v79.uFrameY + v79.uFrameHeight - 1; + Str = (char *)(3 * (LOBYTE(pFontArrus->uFontHeight) + 8)); + v83 = a1; + do + { + if ( *v83 ) + { + v27 = v82->CalcTextHeight(v83, &v79, 100, 0); + Str += v27 + 3; + } + v83 += 100; + --a2.y; + } + while ( a2.y ); + v28 = (const char *)*((int *)v3 + 3); + if ( *v28 ) + { + v29 = pFontSmallnum->CalcTextHeight(v28, &v79, 100, 0); + Str += v29; + } + v79.uFrameHeight = v73->uTextureHeight + v81 + 54; + if ( (signed int)Str > (signed int)v79.uFrameHeight ) + v79.uFrameHeight = (unsigned int)Str; + if ( _this->uAttributtes & 8 && (_this->uAdditionalValue || _this->_bonus_type) ) + v79.uFrameHeight += LOBYTE(v82->uFontHeight); + v83 = 0; + if ( LOBYTE(pFontArrus->uFontHeight) ) + { + v79.uFrameWidth -= 24; + v30 = (char *)LOBYTE(pFontArrus->uFontHeight); + v31 = _this->GetIdentifiedName(); + if ( pFontArrus->CalcTextHeight(v31, &v79, 0, 0) / (signed int)v30 ) + v83 = v30; + v79.uFrameWidth += 24; + } + v79.uFrameWidth += 12; + v79.uFrameHeight += (unsigned int)v83; + v79.uFrameW = v79.uFrameY + v79.uFrameHeight - 1; + v79.uFrameZ = v79.uFrameX + v79.uFrameWidth - 1; + v79._415551(0); + v15 = pRenderer; + pRenderer->Clip( + v79.uFrameX + 12, + v79.uFrameY + 12, + v79.uFrameX + v79.uFrameWidth - 12, + v79.uFrameY + v79.uFrameHeight - 12); + v79.uFrameWidth -= 12; + v32 = v73->uTextureHeight; + v33 = v79.uFrameHeight; + v79.uFrameHeight -= 12; + v79.uFrameZ = v79.uFrameX + v79.uFrameWidth - 1; + v79.uFrameW = v79.uFrameY + v79.uFrameHeight - 1; + pRenderer->DrawTextureTransparent( + v79.uFrameX + v78, + v79.uFrameY + (signed int)(v33 - v32) / 2, + (Texture *)(v5 != -1 ? (int)((char *)pIcons_LOD->pTextures + v75) : 0)); + a2.y = 3; + v34 = (int)(v83 + 35); + Str = a1; + do + { + if ( *Str ) + { + v79.DrawText(v82, 100, v34, 0, Str, 0, 0, 0); + v34 += v82->CalcTextHeight(Str, &v79, 100, 0) + 3; + } + Str += 100; + --a2.y; + } + while ( a2.y ); + v35 = (const char *)*((int *)v76 + 3); + if ( *v35 ) + v79.DrawText(pFontSmallnum, 100, v34, 0, v35, 0, 0, 0); + v79.uFrameX += 12; + v79.uFrameWidth -= 24; + v36 = _this->GetIdentifiedName(); + v79.DrawText2(pFontArrus, 0, 0xCu, var88, v36, 3u); + v79.uFrameWidth += 24; + v79.uFrameX -= 12; + if ( v77 ) + { + sprintfex(pTmpBuf, "%s: %lu", pGlobalTXT_LocalizationStrings[465], v77); + v40 = v82; + v61 = 0; + v56 = 0; + v51 = 0; + v47 = pTmpBuf; + v44 = 0; + v42 = v79.uFrameHeight - LOBYTE(v82->uFontHeight); + v41 = 100; + } + else + { + if ( _this->uAttributtes & 8 && (_this->uAdditionalValue || _this->_bonus_type) ) + { + sub_493F79((stru351 *)&v67, _this->uExpireTime - pParty->uTimePlayed); + strcpy(pTmpBuf, "Duration:"); + Str = (char *)(v72 - 1168); + if ( v72 != 1168 ) + { + sprintfex(v65, " %d:yr", v72 - 1168); + strcat(pTmpBuf, v65); + } + if ( (((v71 || Str) && ((sprintfex(v65, " %d:mo", v71), strcat(pTmpBuf, v65), v71) || Str) || v70) + && ((sprintfex(v65, " %d:dy", v70), strcat(pTmpBuf, v65), v71) || Str || v70) + || v69) + && ((sprintfex(v65, " %d:hr", v69), strcat(pTmpBuf, v65), v71) || Str || v70 || v69) + || v68 ) + { + sprintfex(v65, " %d:mn", v68); + strcat(pTmpBuf, v65); + } + v79.DrawText(v82, 100, v79.uFrameHeight - 2 * LOBYTE(v82->uFontHeight), 0, pTmpBuf, 0, 0, 0); + } + v37 = _this->GetValue(); + sprintfex(pTmpBuf, "%s: %lu", pGlobalTXT_LocalizationStrings[465], v37); + v79.DrawText(v82, 100, v79.uFrameHeight - LOBYTE(v82->uFontHeight), 0, pTmpBuf, 0, 0, 0); + v38 = _this->uAttributtes; + if ( BYTE1(v38) & 1 ) + { + v61 = 0; + v56 = 0; + v51 = 0; + v47 = pGlobalTXT_LocalizationStrings[187]; + } + else + { + if ( !(BYTE1(v38) & 2) ) + goto LABEL_116; + v61 = 0; + v56 = 0; + v51 = 0; + v47 = pGlobalTXT_LocalizationStrings[651]; + } + LOWORD(v38) = LOWORD(pRenderer->uTargetRMask); + v44 = v38; + v42 = v79.uFrameHeight - LOBYTE(v82->uFontHeight); + v39 = v82->GetLineWidth(pTmpBuf); + v40 = v82; + v41 = v39 + 132; + } + v79.DrawText(v40, v41, v42, v44, v47, v51, v56, v61); +LABEL_116: + pRenderer->ResetClip(); + if ( !areWeLoadingTexture ) + { + v73->Release(); + pIcons_LOD->_40F9C5(); + } + return; + } + if ( v23 == 13 ) + { + v24 = pItemsTable->pItems[_this->uItemID].uDamageDice; +LABEL_56: + v59 = v24; + v54 = pGlobalTXT_LocalizationStrings[449]; + v49 = "%s: %d"; +LABEL_64: + sprintfex(v64, v49, v54, v59); + goto LABEL_65; + } + v25 = _this->_bonus_type; + if ( v25 ) + { + v60 = _this->_bonus_strength; + v55 = *((int *)&pItemsTable->pItems[799].uDamageMod + 5 * v25); + v50 = pGlobalTXT_LocalizationStrings[210]; + v46 = "%s: %s +%d"; + } + else + { + v26 = _this->uAdditionalValue; + if ( !v26 ) + { + if ( _this->uNumCharges ) + { + v59 = _this->uNumCharges; + v54 = pGlobalTXT_LocalizationStrings[464]; + v49 = "%s: %lu"; + goto LABEL_64; + } + goto LABEL_65; + } + v60 = _this->_bonus_strength; + v55 = *((int *)&pItemsTable->pEnchantments[23].pName + 7 * v26); + v50 = pGlobalTXT_LocalizationStrings[210]; + v46 = "%s: %s"; + } + sprintfex(v64, v46, v50, v55, v60); + goto LABEL_65; + } +} +// 4E455C: using guessed type int dword_4E455C; +// 506128: using guessed type int areWeLoadingTexture; + +//----- (0041E360) -------------------------------------------------------- +char *__fastcall MonsterPopup_Draw(unsigned int uActorID, GUIWindow *edx0) +{ + unsigned int v2; // esi@1 + Actor *v3; // esi@3 + int v4; // eax@3 + unsigned int v5; // ecx@3 + NPCData *v6; // eax@3 + unsigned __int16 v7; // cx@3 + int v8; // eax@4 + unsigned __int16 v9; // dx@4 + SpriteFrame *v10; // edi@17 + int v11; // esi@17 + unsigned int v12; // ecx@17 + Sprite *v13; // edi@18 + int v14; // ecx@18 + int v15; // edx@18 + int v16; // edx@18 + int v17; // eax@18 + unsigned int v18; // ecx@19 + unsigned int v19; // eax@21 + char *v20; // esi@28 + int v21; // edx@29 + unsigned __int16 *v22; // ecx@29 + int v23; // eax@29 + int v24; // eax@32 + int v25; // esi@32 + char *v26; // edx@34 + unsigned __int8 v27; // sf@36 + unsigned __int8 v28; // of@36 + int v29; // esi@40 + char *v30; // ecx@40 + int v31; // eax@40 + int v32; // esi@43 + unsigned __int16 v33; // ax@45 + int v34; // edx@45 + int v35; // eax@45 + int v36; // eax@49 + char *v37; // eax@52 + int v38; // eax@55 + unsigned __int16 v39; // ax@59 + SpellBuff *v40; // eax@60 + int v41; // edi@61 + unsigned int v42; // eax@61 + int v43; // eax@62 + int v44; // eax@63 + signed int v45; // edi@65 + unsigned __int16 v46; // ax@73 + Player *v47; // ecx@77 + unsigned int v48; // eax@85 + GUIFont *v49; // edi@90 + int v50; // edi@90 + SpellBuff *v51; // eax@91 + char *v52; // ecx@98 + char *v53; // ecx@101 + char *v54; // ST0C_4@118 + unsigned int v55; // eax@118 + GUIFont *v56; // edi@124 + unsigned __int8 v57; // al@128 + int v58; // eax@132 + Actor *v59; // ecx@133 + unsigned __int8 v60; // dl@138 + char *v61; // eax@145 + char *v62; // eax@147 + int v63; // eax@152 + char *result; // eax@152 + int v65; // eax@155 + const char *v66; // [sp-10h] [bp-1FCh]@121 + const char *v67; // [sp-10h] [bp-1FCh]@125 + const char *v68; // [sp-10h] [bp-1FCh]@142 + int v69; // [sp-Ch] [bp-1F8h]@121 + char *v70; // [sp-Ch] [bp-1F8h]@125 + char *v71; // [sp-Ch] [bp-1F8h]@142 + char *v72; // [sp-8h] [bp-1F4h]@54 + int v73; // [sp-8h] [bp-1F4h]@79 + int v74; // [sp-8h] [bp-1F4h]@121 + int v75; // [sp-8h] [bp-1F4h]@125 + int v76; // [sp-8h] [bp-1F4h]@142 + size_t v77; // [sp-4h] [bp-1F0h]@54 + unsigned int v78; // [sp-4h] [bp-1F0h]@121 + unsigned int v79; // [sp-4h] [bp-1F0h]@125 + char *v80; // [sp-4h] [bp-1F0h]@142 + char *v81; // [sp-4h] [bp-1F0h]@148 + DDBLTFX Dst; // [sp+Ch] [bp-1E0h]@18 + DDSURFACEDESC2 pDesc; // [sp+70h] [bp-17Ch]@18 + RECT v84; // [sp+ECh] [bp-100h]@26 + char *v85; // [sp+FCh] [bp-F0h]@145 + char *v86; // [sp+100h] [bp-ECh]@145 + char *v87; // [sp+104h] [bp-E8h]@145 + char *v88; // [sp+108h] [bp-E4h]@145 + char *v89; // [sp+10Ch] [bp-E0h]@145 + char *v90; // [sp+110h] [bp-DCh]@145 + char *v91; // [sp+114h] [bp-D8h]@145 + char *v92; // [sp+118h] [bp-D4h]@145 + char *v93; // [sp+11Ch] [bp-D0h]@145 + char *v94; // [sp+120h] [bp-CCh]@145 + char *v95; // [sp+124h] [bp-C8h]@127 + char *v96; // [sp+128h] [bp-C4h]@127 + char *v97; // [sp+12Ch] [bp-C0h]@127 + char *v98; // [sp+130h] [bp-BCh]@127 + char *v99; // [sp+134h] [bp-B8h]@127 + char *v100; // [sp+138h] [bp-B4h]@127 + char *v101; // [sp+13Ch] [bp-B0h]@127 + char *v102; // [sp+140h] [bp-ACh]@127 + char *v103; // [sp+144h] [bp-A8h]@127 + char *v104; // [sp+148h] [bp-A4h]@127 + char *v105; // [sp+14Ch] [bp-A0h]@127 + RenderBillboardTransform_local0 v106; // [sp+150h] [bp-9Ch]@3 + unsigned int v107; // [sp+1A0h] [bp-4Ch]@18 + unsigned __int16 *v108; // [sp+1A4h] [bp-48h]@34 + unsigned int v109; // [sp+1A8h] [bp-44h]@32 + LPVOID v110; // [sp+1ACh] [bp-40h]@28 + unsigned int v111; // [sp+1B0h] [bp-3Ch]@29 + char **v112; // [sp+1B4h] [bp-38h]@3 + IDirectDrawSurface *v222; // [sp+1B8h] [bp-34h]@18 + unsigned __int8 v114; // [sp+1BFh] [bp-2Dh]@133 + int v115; // [sp+1C0h] [bp-2Ch]@3 + unsigned int v116; // [sp+1C4h] [bp-28h]@18 + int i; // [sp+1C8h] [bp-24h]@18 + Player *a2; // [sp+1CCh] [bp-20h]@28 + int v119; // [sp+1D0h] [bp-1Ch]@18 + SpellBuff *v120; // [sp+1D4h] [bp-18h]@18 + Actor *v121; // [sp+1D8h] [bp-14h]@3 + int a5; // [sp+1DCh] [bp-10h]@3 + GUIWindow *a1; // [sp+1E0h] [bp-Ch]@1 + int v124; // [sp+1E4h] [bp-8h]@18 + char *a4; // [sp+1E8h] [bp-4h]@18 + + a1 = edx0; + v2 = uActorID; + + static Actor pMonsterInfoUI_Doll; + /*if ( !(bMonsterInfoUI_bDollInitialized & 1) ) + { + bMonsterInfoUI_bDollInitialized |= 1u; + Actor::Actor(&pMonsterInfoUI_Doll); + atexit(nullsub_3); + }*/ + v106.uParentBillboardID = -1; + v3 = &pActors[v2]; + v121 = v3; + v4 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xE1u, 0xFFu, 0x9Bu); + v5 = v3->uNPC_ID; + a5 = v4; + v6 = GetNPCData(v5); + v7 = v3->pMonsterInfo.uID; + v112 = (char **)v6; + v115 = byte_4E2B70[((signed __int16)v7 - 1) / 3] - 40; + if ( v7 == pMonsterInfoUI_Doll.pMonsterInfo.uID ) + { + v9 = pMonsterInfoUI_Doll.uCurrentActionLength; + } + else + { + memcpy(&pMonsterInfoUI_Doll, v3, sizeof(pMonsterInfoUI_Doll)); + pMonsterInfoUI_Doll.uCurrentActionAnimation = 7; + pMonsterInfoUI_Doll.uCurrentActionTime = 0; + v8 = rand(); + v3 = v121; + v9 = v8 % 256 + 128; + pMonsterInfoUI_Doll.uCurrentActionLength = v8 % 256 + 128; + } + if ( (signed int)pMonsterInfoUI_Doll.uCurrentActionTime > (signed __int16)v9 ) + { + pMonsterInfoUI_Doll.uCurrentActionTime = 0; + if ( pMonsterInfoUI_Doll.uCurrentActionAnimation == 7 || pMonsterInfoUI_Doll.uCurrentActionAnimation == 2 ) + { + pMonsterInfoUI_Doll.uCurrentActionAnimation = 0; + pMonsterInfoUI_Doll.uCurrentActionLength = rand() % 128 + 128; + } + else + { + rand(); + pMonsterInfoUI_Doll.uCurrentActionAnimation = 7; + if ( (pMonsterInfoUI_Doll.pMonsterInfo.uID < 115 || pMonsterInfoUI_Doll.pMonsterInfo.uID > 186) + && (pMonsterInfoUI_Doll.pMonsterInfo.uID < 232 || pMonsterInfoUI_Doll.pMonsterInfo.uID > 249) + && rand() % 30 < 100 ) + pMonsterInfoUI_Doll.uCurrentActionAnimation = 2; + pMonsterInfoUI_Doll.uCurrentActionLength = 8 + * pSpriteFrameTable->pSpriteSFrames[v3->pSpriteIDs[(signed __int16)pMonsterInfoUI_Doll.uCurrentActionAnimation]].uAnimLength; + } + } + v10 = pSpriteFrameTable->GetFrame( + v3->pSpriteIDs[(signed __int16)pMonsterInfoUI_Doll.uCurrentActionAnimation], + pMonsterInfoUI_Doll.uCurrentActionTime); + v11 = 40 * v10->pHwSpriteIDs[0] + 7218180; + v106.pTarget = pRenderer->pTargetSurface; + v106.pTargetZ = pRenderer->pActiveZBuffer; + v106.uTargetPitch = pRenderer->uTargetSurfacePitch; + v12 = a1->uFrameY + 52; + v106.uViewportX = a1->uFrameX + 13; + v106.uViewportY = v12; + v106.uViewportW = v12 + 128; + v106.uViewportZ = v106.uViewportX + 128; + v106.field_8 = (signed int)(v106.uViewportX + 128 + v106.uViewportX) / 2; + v106.field_10 = 65536; + v106.field_14 = 65536; + v106.field_C = v115 + v12 + *(short *)(v11 + 18); + v106.pPalette = PaletteManager::Get_Dark_or_Red_LUT(v10->uPaletteIndex, 0, 1); + v106.field_28 = 0; + v106.uFlags = 0; + pRenderer->Clip_v2(0, 0, 0x27Fu, 0x1DFu); + pRenderer->FillRect(v106.uViewportX - 1, v106.uViewportY - 1, v106.uViewportX + 129, v106.uViewportY - 1, a5); + pRenderer->FillRect( + v106.uViewportX + 129, + v106.uViewportY - 1, + v106.uViewportX + 129, + v106.uViewportW + 1, + a5); + pRenderer->FillRect(v106.uViewportX + 129, v106.uViewportW + 1, v106.uViewportX - 1, v106.uViewportW + 1, a5); + pRenderer->FillRect(v106.uViewportX - 1, v106.uViewportW + 1, v106.uViewportX - 1, v106.uViewportY - 1, a5); + if ( pRenderer->pRenderD3D ) + { + v13 = &pSprites_LOD->pHardwareSprites[v10->pHwSpriteIDs[0]]; + v106.field_C = v115 + v106.uViewportY + v13->uBufferHeight; + v222 = v13->pTextureSurface; + memset(&Dst, 0, 0x64u); + Dst.dwSize = 100; + Dst.dwFillColor = 0; + memset(&pDesc, 0, 0x7Cu); + pDesc.dwSize = 124; + v222->GetSurfaceDesc((LPDDSURFACEDESC)&pDesc); + v14 = v13->uBufferHeight; + v120 = (SpellBuff *)v13->uBufferWidth; + v107 = 0; + v15 = v13->uAreaX; + v119 = (signed int)v120 / 2; + i = 0; + a4 = (char *)(v106.field_8 + v15 - (signed int)v120 / 2); + v115 = v13->uAreaY; + v16 = v13->uAreaWidth + (signed int)v120 / 2 + v15 - (int)v120; + v124 = v106.field_C + v115 - v14; + v17 = v13->uAreaHeight + v115 - v14; + v116 = v106.field_8 + v16; + v119 = v106.field_C + v17; + if ( (signed int)a4 < (signed int)v106.uViewportX ) + { + v18 = v106.uViewportX - (int)a4; + a4 = (char *)v106.uViewportX; + v107 = v18; + } + if ( v124 < (signed int)v106.uViewportY ) + { + v19 = v106.uViewportY - v124; + v124 = v106.uViewportY; + i = v19; + } + if ( (signed int)v116 > (signed int)v106.uViewportZ ) + v116 = v106.uViewportZ; + if ( v119 > (signed int)v106.uViewportW ) + v119 = v106.uViewportW; + pRenderer->FillRect2( + 0, + v106.uViewportX, + v106.uViewportY, + v106.uViewportZ - v106.uViewportX, + v106.uViewportW - v106.uViewportY, + LOWORD(pRenderer->uTargetBMask) | LOWORD(pRenderer->uTargetGMask)); + pRenderer->FillRect2( + 0, + v106.uViewportX, + v106.uViewportY, + v106.uViewportZ - v106.uViewportX, + v106.uViewportW - v106.uViewportY, + LOWORD(pRenderer->uTargetBMask) | LOWORD(pRenderer->uTargetGMask)); + v84.left = v106.uViewportX; + v84.top = v106.uViewportY; + v84.right = v106.uViewportZ; + v84.bottom = v106.uViewportW; + ErrD3D(pRenderer->pBackBuffer4->Blt(&v84, 0, 0, 16778240u, &Dst)); + if ( pRenderer->uTargetGBits == 5 ) + { + memset(&pDesc, 0, 0x7Cu); + pDesc.dwSize = 124; + if ( !pRenderer->LockSurface_DDraw4((IDirectDrawSurface4 *)v222, &pDesc, 1u) ) + goto LABEL_51; + v20 = (char *)v124; + v110 = pDesc.lpSurface; + a2 = (Player *)v124; + if ( v124 < v119 ) + { + v111 = 2 * pRenderer->uTargetSurfacePitch; + v21 = (int)a4; + v22 = &pRenderer->pTargetSurface[(int)&a4[v124 * pRenderer->uTargetSurfacePitch]]; + v23 = i - v124; + v120 = (SpellBuff *)&pRenderer->pTargetSurface[(int)&a4[v124 * pRenderer->uTargetSurfacePitch]]; + v115 = i - v124; + while ( 1 ) + { + v124 = v21; + if ( v21 < (signed int)v116 ) + { + v24 = (int)&v20[v23]; + v25 = v107 - v21; + v109 = v24; + for ( i = v107 - v21; ; v25 = i ) + { + v108 = (unsigned __int16 *)((pDesc.lPitch >> 1) * pDesc.dwHeight * v109 / v13->uAreaHeight); + v26 = (char *)v108 + pDesc.dwWidth * (v25 + v124++) / v13->uAreaWidth; + *v22 = *((short *)v110 + (int)v26); + ++v22; + if ( v124 >= (signed int)v116 ) + break; + } + v23 = v115; + } + v22 = (unsigned __int16 *)((char *)v120 + v111); + v20 = (char *)&a2->pConditions[0] + 1; + v28 = __OFSUB__((int)&a2->pConditions[0] + 1, v119); + v27 = (signed int)((char *)&a2->pConditions[0] + -v119 + 1) < 0; + a2 = (Player *)((char *)a2 + 1); + v120 = (SpellBuff *)((char *)v120 + v111); + if ( !(v27 ^ v28) ) + break; + v21 = (int)a4; + } + } + goto LABEL_37; + } + memset(&pDesc, 0, 0x7Cu); + pDesc.dwSize = 124; + if ( pRenderer->LockSurface_DDraw4((IDirectDrawSurface4 *)v222, &pDesc, 1u) ) + { + v108 = (unsigned __int16 *)pDesc.lpSurface; + a2 = (Player *)v124; + if ( v124 < v119 ) + { + v109 = 2 * pRenderer->uTargetSurfacePitch; + v29 = (int)a4; + v30 = (char *)&pRenderer->pTargetSurface[(int)&a4[v124 * pRenderer->uTargetSurfacePitch]]; + v31 = i - v124; + v120 = (SpellBuff *)&pRenderer->pTargetSurface[(int)&a4[v124 * pRenderer->uTargetSurfacePitch]]; + v115 = i - v124; + while ( 1 ) + { + v124 = v29; + if ( v29 < (signed int)v116 ) + { + v32 = v107 - (int)a4; + v111 = (unsigned int)((char *)a2 + v31); + for ( i = v107 - (int)a4; ; v32 = i ) + { + v110 = (LPVOID)((pDesc.lPitch >> 1) * pDesc.dwHeight * v111 / v13->uAreaHeight); + v33 = v108[(int)((char *)v110 + pDesc.dwWidth * (v32 + v124) / v13->uAreaWidth)]; + v34 = v33 & 0x1F | 2 + * (unsigned __int16)(v108[(int)((char *)v110 + + pDesc.dwWidth * (v32 + v124++) / v13->uAreaWidth)] & 0xFFE0); + v35 = v124; + *(short *)v30 = v34; + v30 += 2; + if ( v35 >= (signed int)v116 ) + break; + } + v31 = v115; + } + a2 = (Player *)((char *)a2 + 1); + v30 = (char *)v120 + v109; + v120 = (SpellBuff *)((char *)v120 + v109); + if ( (signed int)a2 >= v119 ) + break; + v29 = (int)a4; + } + } +LABEL_37: + v222->Unlock(0); + goto LABEL_51; + } + } + else + { + pRenderer->FillRect2( + 0, + v106.uViewportX, + v106.uViewportY, + v106.uViewportZ - v106.uViewportX, + v106.uViewportW - v106.uViewportY, + 0); + v36 = v10->pHwSpriteIDs[0]; + if ( v36 >= 0 ) + pSprites_LOD->pSpriteHeaders[v36]._4ACC38(&v106, 0); + } +LABEL_51: + if ( v121->uNPC_ID ) + { + v37 = v112[6]; + if ( v37 ) + { + sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[429], *v112, aNPCProfessionNames[(signed int)v37]); + goto LABEL_59; + } + v77 = 2000; + v72 = *v112; + } + else + { + v38 = v121->dword_000334_unique_name; + v77 = 2000; + if ( v38 ) + v72 = (char *)*(&pMonsterStats->pPlacement.uNumStrings + v38); + else + v72 = pMonsterStats->pInfos[v121->pMonsterInfo.uID].pName; + } + strncpy(pTmpBuf, v72, v77); +LABEL_59: + v39 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); + a1->DrawText2(pFontComic, 0, 0xCu, v39, pTmpBuf, 3u); + Actor::DrawHealthBar(v121, a1); + v119 = 0; + pMonsterInfoUI_Doll.uCurrentActionTime += pMiscTimer->uTimeElapsed; + v115 = 0; + v116 = 0; + i = 0; + v112 = 0; + if ( !uActiveCharacter ) + { + v45 = 1; + goto LABEL_84; + } + LOBYTE(v40) = pPlayers[uActiveCharacter]->GetActualSkillLevel(PLAYER_SKILL_MONSTER_ID); + v120 = v40; + if ( !v40 ) + goto LABEL_72; + v41 = (unsigned __int8)v40 & 0x3F; + v42 = SkillToMastery((unsigned __int16)v40) - 1; + if ( !v42 ) + { + if ( v41 + 10 >= v121->pMonsterInfo.uLevel ) + { + v45 = 1; + v119 = 1; + goto LABEL_73; + } + goto LABEL_72; + } + v43 = v42 - 1; + if ( !v43 ) + { + if ( 2 * v41 + 10 >= v121->pMonsterInfo.uLevel ) + { + v45 = 1; + v119 = 1; + v116 = 1; + goto LABEL_73; + } + goto LABEL_72; + } + v44 = v43 - 1; + if ( !v44 ) + { + if ( 3 * v41 + 10 >= v121->pMonsterInfo.uLevel ) + { + v45 = 1; + v119 = 1; + v116 = 1; + i = 1; + goto LABEL_73; + } +LABEL_72: + v45 = 1; + goto LABEL_73; + } + if ( v44 != 1 ) + goto LABEL_72; + v45 = 1; + v119 = 1; + v116 = 1; + i = 1; + v112 = (char **)1; +LABEL_73: + v46 = v121->uAIState; + if ( v46 != 5 && v46 != 4 && !dword_507BF0_is_there_popup_onscreen && v120 ) + { + v47 = pPlayers[uActiveCharacter]; + if ( v119 | v116 | i | (unsigned int)v112 ) + { + if ( v121->pMonsterInfo.uLevel >= v47->uLevel - 5 ) + v73 = 105; + else + v73 = 104; + } + else + { + v73 = 106; + } + v47->PlaySound(v73, 0); + } +LABEL_84: + a2 = pParty->pPlayers; + do + { + LOBYTE(v48) = a2->GetActualSkillLevel(PLAYER_SKILL_MONSTER_ID); + v111 = v48; + v120 = (SpellBuff *)138; + do + { + if ( (signed int)SkillToMastery(v111) >= 3 ) + v115 = v45; + v120 = (SpellBuff *)((char *)v120 - 1); + } + while ( v120 ); + ++a2; + } + while ( (signed int)a2 < (signed int)pParty->pHirelings ); + v49 = pFontSmallnum; + a2 = (Player *)pFontSmallnum; + a1->DrawText(pFontSmallnum, 12, 196, a5, pGlobalTXT_LocalizationStrings[631], 0, 0, 0); + v50 = LOBYTE(v49->uFontHeight) + 193; + if ( !v115 ) + { + v78 = 0; + v74 = 0; + v69 = 0; + v66 = pGlobalTXT_LocalizationStrings[630]; + goto LABEL_123; + } + a4 = 0; + v51 = &v121->pActorBuffs[1]; + v222 = 0; + v120 = &v121->pActorBuffs[1]; + do + { + if ( (signed __int64)v51->uExpireTime > 0 ) + { + switch ( (int)v51 ) + { + case 0u: + v124 = 60; + a4 = pGlobalTXT_LocalizationStrings[591]; + break; + case 1u: + v124 = 82; + a4 = pGlobalTXT_LocalizationStrings[649]; + break; + case 2u: + v124 = 92; + a4 = pGlobalTXT_LocalizationStrings[592]; + break; + case 3u: + v124 = 63; + a4 = pGlobalTXT_LocalizationStrings[4]; + break; + case 4u: + v52 = pGlobalTXT_LocalizationStrings[220]; + goto LABEL_100; + case 5u: + v52 = pGlobalTXT_LocalizationStrings[162]; +LABEL_100: + a4 = v52; + v124 = 81; + break; + case 6u: + v53 = pGlobalTXT_LocalizationStrings[593]; + v124 = 35; + goto LABEL_103; + case 8u: + v53 = pGlobalTXT_LocalizationStrings[608]; + v124 = 62; +LABEL_103: + a4 = v53; + break; + case 7u: + case 9u: + a4 = 0; + v124 = 0; + goto LABEL_119; + case 0xAu: + v124 = 47; + a4 = pGlobalTXT_LocalizationStrings[221]; + break; + case 0xBu: + v124 = 66; + a4 = pGlobalTXT_LocalizationStrings[607]; + break; + case 0xCu: + v124 = 85; + a4 = pGlobalTXT_LocalizationStrings[610]; + break; + case 0xDu: + v124 = 86; + a4 = pGlobalTXT_LocalizationStrings[609]; + break; + case 0xEu: + v124 = 17; + a4 = pGlobalTXT_LocalizationStrings[279]; + break; + case 0xFu: + v124 = 38; + a4 = pGlobalTXT_LocalizationStrings[442]; + break; + case 0x10u: + v124 = 46; + a4 = pGlobalTXT_LocalizationStrings[443]; + break; + case 0x11u: + v124 = 51; + a4 = pGlobalTXT_LocalizationStrings[440]; + break; + case 0x12u: + v124 = 5; + a4 = pGlobalTXT_LocalizationStrings[441]; + break; + case 0x13u: + v124 = 95; + a4 = pGlobalTXT_LocalizationStrings[229]; + break; + case 0x14u: + v124 = 73; + a4 = pGlobalTXT_LocalizationStrings[228]; + break; + default: + a4 = 0; + break; + } + if ( a4 ) + { + v54 = a4; + v55 = GetSpellColor(v124); + a1->DrawText((GUIFont *)a2, 28, v50, v55, v54, 0, 0, 0); + v50 = v50 + BYTE5(a2->pConditions[0]) - 3; + v51 = v120; + } + } +LABEL_119: + ++v51; + v222 = (IDirectDrawSurface *)((char *)v222 + 1); + v120 = v51; + + __debugbreak(); // fix condition + } + //while ( (signed int)((char *)&v222->lpVtbl + 1) < 22 ); + while (true); + if ( !a4 ) + { + v78 = 0; + v74 = 0; + v69 = 0; + v66 = pGlobalTXT_LocalizationStrings[153]; +LABEL_123: + a1->DrawText((GUIFont *)a2, 28, v50, a5, v66, v69, v74, v78); + } + v56 = pFontSmallnum; + a4 = (char *)v106.uViewportY; + if ( v119 ) + { + sprintfex(pTmpBuf, "%s", pGlobalTXT_LocalizationStrings[108], 0, v121->pMonsterInfo.uHP); + a1->DrawText(v56, 150, (int)a4, a5, pTmpBuf, 0, 0, 0); + a4 = &a4[LOBYTE(v56->uFontHeight) - 3]; + v79 = v121->pMonsterInfo.uAC; + v75 = 0; + v70 = pGlobalTXT_LocalizationStrings[12]; + v67 = "%s"; + } + else + { + sprintfex(pTmpBuf, "%s", pGlobalTXT_LocalizationStrings[108], 0, pGlobalTXT_LocalizationStrings[630]); + a1->DrawText(v56, 150, (int)a4, a5, pTmpBuf, 0, 0, 0); + v79 = (unsigned int)pGlobalTXT_LocalizationStrings[630]; + v75 = 0; + v70 = pGlobalTXT_LocalizationStrings[12]; + a4 = &a4[LOBYTE(v56->uFontHeight) - 3]; + v67 = "%s"; + } + sprintfex(pTmpBuf, v67, v70, v75, v79); + a1->DrawText(v56, 150, (int)a4, a5, pTmpBuf, 0, 0, 0); + a4 = &a4[LOBYTE(v56->uFontHeight) - 6] + LOBYTE(v56->uFontHeight); + v95 = pGlobalTXT_LocalizationStrings[87]; + v96 = pGlobalTXT_LocalizationStrings[6]; + v97 = pGlobalTXT_LocalizationStrings[240]; + v98 = pGlobalTXT_LocalizationStrings[70]; + v99 = pGlobalTXT_LocalizationStrings[624]; + v100 = pGlobalTXT_LocalizationStrings[138]; + v101 = pGlobalTXT_LocalizationStrings[214]; + v102 = pGlobalTXT_LocalizationStrings[142]; + v103 = pGlobalTXT_LocalizationStrings[29]; + v104 = pGlobalTXT_LocalizationStrings[133]; + v105 = pGlobalTXT_LocalizationStrings[54]; + if ( v116 ) + { + sprintfex(pTmpBuf, "%s", pGlobalTXT_LocalizationStrings[18], 0, (&v95)[4 * v121->pMonsterInfo.uAttack1Type]); + a1->DrawText(v56, 150, (int)a4, a5, pTmpBuf, 0, 0, 0); + a4 = &a4[LOBYTE(v56->uFontHeight) - 3]; + v57 = v121->pMonsterInfo.uAttack1DamageBonus; + if ( v57 ) + sprintfex( + pTmpBuf, + "%s", + pGlobalTXT_LocalizationStrings[53], + 0, + v121->pMonsterInfo.uAttack1DamageDiceRolls, + v121->pMonsterInfo.uAttack1DamageDiceSides, + v57); + else + sprintfex( + pTmpBuf, + "%s", + pGlobalTXT_LocalizationStrings[53], + 0, + v121->pMonsterInfo.uAttack1DamageDiceRolls, + v121->pMonsterInfo.uAttack1DamageDiceSides); + } + else + { + sprintfex(pTmpBuf, "%s", pGlobalTXT_LocalizationStrings[18], 0, pGlobalTXT_LocalizationStrings[630]); + a1->DrawText(v56, 150, (int)a4, a5, pTmpBuf, 0, 0, 0); + a4 = &a4[LOBYTE(v56->uFontHeight) - 3]; + sprintfex(pTmpBuf, "%s", pGlobalTXT_LocalizationStrings[53], 0, pGlobalTXT_LocalizationStrings[630]); + } + a1->DrawText(v56, 150, (int)a4, a5, pTmpBuf, 0, 0, 0); + v58 = LOBYTE(v56->uFontHeight); + a4 = &a4[v58 - 6] + v58; + if ( !i ) + { + v80 = pGlobalTXT_LocalizationStrings[630]; + v76 = 0; + v71 = pGlobalTXT_LocalizationStrings[628]; + v68 = "%s"; + goto LABEL_144; + } + v120 = (SpellBuff *)pGlobalTXT_LocalizationStrings[628]; + v59 = v121; + v114 = v121->pMonsterInfo.uSpell1ID; + if ( v114 && v121->pMonsterInfo.uSpell2ID ) + v120 = (SpellBuff *)pGlobalTXT_LocalizationStrings[629]; + if ( v114 ) + { + sprintfex(pTmpBuf, "%s", v120, 0, pSpellStats->pInfos[v114].pShortName); + a1->DrawText(v56, 150, (int)a4, a5, pTmpBuf, 0, 0, 0); + v58 = LOBYTE(v56->uFontHeight); + a4 = &a4[v58 - 3]; + v59 = v121; + } + v60 = v59->pMonsterInfo.uSpell2ID; + if ( v60 ) + { + sprintfex(pTmpBuf, &byte_4E3318, 0, pSpellStats->pInfos[v60].pShortName); + a1->DrawText(v56, 150, (int)a4, a5, pTmpBuf, 0, 0, 0); + v58 = LOBYTE(v56->uFontHeight); + a4 = &a4[v58 - 3]; + v59 = v121; + } + if ( !v59->pMonsterInfo.uSpell1ID && !v59->pMonsterInfo.uSpell2ID ) + { + v80 = pGlobalTXT_LocalizationStrings[153]; + v76 = 0; + v71 = pGlobalTXT_LocalizationStrings[628]; + v68 = "%s"; +LABEL_144: + sprintfex(pTmpBuf, v68, v71, v76, v80); + a1->DrawText(v56, 150, (int)a4, a5, pTmpBuf, 0, 0, 0); + v58 = LOBYTE(v56->uFontHeight); + a4 = &a4[v58 - 3]; + } + a4 = &a4[v58 - 3]; + a1->DrawText(v56, 150, (int)a4, a5, pGlobalTXT_LocalizationStrings[626], 0, 0, 0); + a4 = &a4[LOBYTE(v56->uFontHeight) - 3]; + v85 = pGlobalTXT_LocalizationStrings[87]; + v86 = pGlobalTXT_LocalizationStrings[6]; + v87 = pGlobalTXT_LocalizationStrings[240]; + v88 = pGlobalTXT_LocalizationStrings[70]; + v89 = pGlobalTXT_LocalizationStrings[142]; + v90 = pGlobalTXT_LocalizationStrings[214]; + v91 = pGlobalTXT_LocalizationStrings[29]; + v92 = pGlobalTXT_LocalizationStrings[133]; + v93 = pGlobalTXT_LocalizationStrings[54]; + v94 = pGlobalTXT_LocalizationStrings[624]; + v96 = (char *)v121->pMonsterInfo.uResFire; + v97 = (char *)v121->pMonsterInfo.uResAir; + v98 = (char *)v121->pMonsterInfo.uResWater; + v99 = (char *)v121->pMonsterInfo.uResEarth; + v100 = (char *)v121->pMonsterInfo.uResMind; + v101 = (char *)v121->pMonsterInfo.uResSpirit; + v102 = (char *)v121->pMonsterInfo.uResBody; + v103 = (char *)v121->pMonsterInfo.uResLight; + v61 = (char *)v121->pMonsterInfo.uResPhysical; + v104 = (char *)v121->pMonsterInfo.uResDark; + v105 = v61; + if ( v112 ) + { + v124 = 0; + do + { + v62 = (&v96)[v124]; + if ( v62 == (char *)200 ) + { + v81 = pGlobalTXT_LocalizationStrings[625]; + } + else + { + if ( v62 ) + v81 = pGlobalTXT_LocalizationStrings[627]; + else + v81 = pGlobalTXT_LocalizationStrings[153]; + } + sprintfex(pTmpBuf, "%s", (&v85)[v124], 0, v81); + a1->DrawText(v56, 170, (int)a4, a5, pTmpBuf, 0, 0, 0); + v63 = LOBYTE(v56->uFontHeight); + v124 += 4; + result = &a4[v63 - 3]; + a4 = result; + } + while ( v124 < 40 ); + } + else + { + i = 0; + do + { + sprintfex(pTmpBuf, "%s", (&v85)[4 * i], 0, pGlobalTXT_LocalizationStrings[630]); + a1->DrawText(v56, 170, (int)a4, a5, pTmpBuf, 0, 0, 0); + v65 = LOBYTE(v56->uFontHeight); + ++i; + result = &a4[v65 - 3]; + a4 = result; + } + while ( i < 10 ); + } + if ( (signed __int64)pParty->pPartyBuffs[3].uExpireTime > 0 ) + { + sprintfex(pTmpBuf, "%s: %d", pGlobalTXT_LocalizationStrings[650], v121->sCurrentHP); + pFontSmallnum->GetLineWidth(pTmpBuf); + result = a1->DrawText2( + pFontSmallnum, + 0, + a1->uFrameHeight - LOBYTE(pFontSmallnum->uFontHeight) - 12, + 0, + pTmpBuf, + 3u); + } + return result; +} + + + +//----- (0041F54A) -------------------------------------------------------- +void __cdecl LoadActualSkyFrame() +{ + if ( pTexture_RestUI_CurrentSkyFrame ) + pTexture_RestUI_CurrentSkyFrame->Release(); + if ( pTexture_RestUI_CurrentHourglassFrame ) + pTexture_RestUI_CurrentHourglassFrame->Release(); + pIcons_LOD->_40F9C5(); + sprintfex(pTmpBuf, "TERRA%03d", pParty->uCurrentMinute / 6 + 10 * pParty->uCurrentHour); + pTexture_RestUI_CurrentSkyFrame = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(pTmpBuf, TEXTURE_16BIT_PALETTE)]; +} + +//----- (0041F5BE) -------------------------------------------------------- +void __cdecl Sleep6Hours() +{ + if ( _506F18_num_hours_to_sleep < 6 ) + { + pParty->pPlayers[3].pConditions[2] = 0i64; + pParty->pPlayers[2].pConditions[2] = 0i64; + pParty->pPlayers[1].pConditions[2] = 0i64; + pParty->pPlayers[0].pConditions[2] = 0i64; + if ( _506F18_num_hours_to_sleep ) + { + Rest(_506F18_num_hours_to_sleep); + _506F18_num_hours_to_sleep = 0; + LoadActualSkyFrame(); + } + if ( dword_506F14 == 2 ) + { + pGUIWindow_CurrentMenu->Release(); + pEventTimer->Resume(); + if ( pTexture_RestUI_CurrentSkyFrame ) + pTexture_RestUI_CurrentSkyFrame->Release(); + if ( pTexture_RestUI_CurrentHourglassFrame ) + pTexture_RestUI_CurrentHourglassFrame->Release(); + pTexture_RestUI_CurrentHourglassFrame = 0; + pTexture_RestUI_CurrentSkyFrame = 0; + pIcons_LOD->_4114F2(); + pIcons_LOD->_40F9C5(); + uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = 0; + viewparams->bRedrawGameUI = 1; + if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor) + { + pOutdoor->UpdateSunlightVectors(); + pOutdoor->UpdateFog(); + } + } + dword_506F14 = 0; + } + else + { + Rest(6u); + _506F18_num_hours_to_sleep -= 6; + LoadActualSkyFrame(); + } + viewparams->bRedrawGameUI = 1; +} + +//----- (0041F6C1) -------------------------------------------------------- +void __cdecl RestUI_Initialize() +{ + char *v0; // eax@10 + + if ( !dword_506F14 ) + pAudioPlayer->StopChannels(-1, -1); + if ( uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions ) + { + pGUIWindow_CurrentMenu->Release(); + uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = 0; + viewparams->bRedrawGameUI = 1; + } + pEventTimer->Pause(); + if ( dword_506F14 != 2 ) + GUIWindow::Create(518u, 450u, 0, 0, (enum WindowType)90, (int)ptr_5079FC, 0); + _506F18_num_hours_to_sleep = 0; + dword_506F14 = 0; + uRestUI_FoodRequiredToRest = 2; + if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor) + uRestUI_FoodRequiredToRest = pOutdoor->GetNumFoodRequiredToRestInCurrentPos( + pParty->vPosition.x, + pParty->vPosition.z, + pParty->vPosition.y); + if ( sub_476387() ) + { + v0 = (char *)&pParty->pPlayers[0].uClass; + while ( *v0 != 31 ) + { + v0 += 6972; + if ( (signed int)v0 >= (signed int)((char *)&pParty->pPickedItem.uExpireTime + 5) ) + goto LABEL_15; + } + ++uRestUI_FoodRequiredToRest; + } +LABEL_15: + if ( CheckHiredNPCSpeciality(0x1Du) ) + --uRestUI_FoodRequiredToRest; + if ( CheckHiredNPCSpeciality(0x1Eu) ) + uRestUI_FoodRequiredToRest -= 2; + if ( CheckHiredNPCSpeciality(0x30u) ) + --uRestUI_FoodRequiredToRest; + if ( uRestUI_FoodRequiredToRest < 1 ) + uRestUI_FoodRequiredToRest = 1; + if ( !_strcmpi(pCurrentMapName, "d29.blv") && (unsigned __int16)_449B57_test_bit(pParty->_award_bits, 98) ) + uRestUI_FoodRequiredToRest = 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 = 5; + _507CD4_RestUI_hourglass_anim_controller = 0; + uTextureID_RestUI_restmain = pIcons_LOD->LoadTexture("restmain", TEXTURE_16BIT_PALETTE); + uTextureID_RestUI_restb1 = pIcons_LOD->LoadTexture("restb1", TEXTURE_16BIT_PALETTE); + uTextureID_RestUI_restb2 = pIcons_LOD->LoadTexture("restb2", TEXTURE_16BIT_PALETTE); + uTextureID_RestUI_restb3 = pIcons_LOD->LoadTexture("restb3", TEXTURE_16BIT_PALETTE); + uTextureID_RestUI_restb4 = pIcons_LOD->LoadTexture("restb4", TEXTURE_16BIT_PALETTE); + uTextureID_RestUI_restexit = pIcons_LOD->LoadTexture("restexit", TEXTURE_16BIT_PALETTE); + LoadActualSkyFrame(); + pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640u, 480u, (enum WindowType)16, 0, 0); + pButton_RestUI_Exit = pGUIWindow_CurrentMenu->CreateButton( + 280u, + 297u, + 154u, + 37u, + 1, + 0, + 0xA7u, + 0, + 0, + nullstring, + (Texture *)(uTextureID_RestUI_restexit != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_RestUI_restexit] : 0), + 0); + pButton_RestUI_507634 = pGUIWindow_CurrentMenu->CreateButton( + 24u, + 154u, + 225u, + 37u, + 1, + 0, + 0x61u, + 0, + 0x52u, + nullstring, + (Texture *)(uTextureID_RestUI_restb4 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_RestUI_restb4] : 0), + 0); + pButton_RestUI_WaitUntilDawn = pGUIWindow_CurrentMenu->CreateButton( + 61u, + 232u, + 154u, + 33u, + 1, + 0, + 0x6Du, + 0, + 0x44u, + nullstring, + (Texture *)(uTextureID_RestUI_restb1 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_RestUI_restb1] : 0), + 0); + pButton_RestUI_Wait1Hour = pGUIWindow_CurrentMenu->CreateButton( + 61u, + 264u, + 154u, + 33u, + 1, + 0, + 0x60u, + 0, + 0x48u, + nullstring, + (Texture *)(uTextureID_RestUI_restb2 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_RestUI_restb2] : 0), + 0); + pButton_RestUI_Wait5Minutes = pGUIWindow_CurrentMenu->CreateButton( + 61u, + 296u, + 154u, + 33u, + 1, + 0, + 0x5Fu, + 0, + 0x4Du, + nullstring, + (Texture *)(uTextureID_RestUI_restb3 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_RestUI_restb3] : 0), + 0); +} + +//----- (0041FA01) -------------------------------------------------------- +void __cdecl RestUI_Draw() +{ + int v0; // esi@1 + Player **ppPlayers; // ecx@1 + Player *pPlayer; // eax@2 + unsigned int v3; // eax@15 + char v4; // al@17 + bool v5; // eax@21 + GUIButton Dst; // [sp+8h] [bp-DCh]@19 + double v7; // [sp+C4h] [bp-20h]@17 + float v8; // [sp+CCh] [bp-18h]@17 + __int64 v9; // [sp+D0h] [bp-14h]@17 + unsigned int v10; // [sp+D8h] [bp-Ch]@9 + __int16 a9[2]; // [sp+DCh] [bp-8h]@1 + int a5; // [sp+E0h] [bp-4h]@1 + + v0 = 0; + a5 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xAu, 0, 0); + *(int *)a9 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xE6u, 0xD6u, 0xC1u); + ppPlayers = &pPlayers[1]; + do + { + pPlayer = *ppPlayers; + if ( !(*ppPlayers)->pConditions[14] && !pPlayer->pConditions[16] && pPlayer->sHealth > 0 ) + ++v0; + ++ppPlayers; + } + while ( (signed int)ppPlayers <= (signed int)&pPlayers[4] ); + if ( v0 ) + { + pRenderer->DrawTextureIndexed( + 8u, + 8u, + (Texture *)(uTextureID_RestUI_restmain != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_RestUI_restmain] : 0)); + v10 = pParty->uCurrentHour; + dword_506F1C = pGUIWindow_CurrentMenu->field_2C_focus_id; + if ( (signed int)pParty->uCurrentHour <= 12 ) + { + if ( !v10 ) + v10 = 12; + } + else + { + v10 -= 12; + } + pRenderer->DrawTextureIndexed(16u, 26u, pTexture_RestUI_CurrentSkyFrame); + if ( pTexture_RestUI_CurrentHourglassFrame ) + { + pTexture_RestUI_CurrentHourglassFrame->Release(); + pIcons_LOD->_40F9C5(); + } + v3 = pEventTimer->uTimeElapsed + _507CD4_RestUI_hourglass_anim_controller; + _507CD4_RestUI_hourglass_anim_controller += pEventTimer->uTimeElapsed; + if ( (unsigned int)_507CD4_RestUI_hourglass_anim_controller >= 512 ) + { + v3 = 0; + _507CD4_RestUI_hourglass_anim_controller = 0; + } + v9 = v3; + v8 = (double)v3 * 0.001953125 * 120.0; + v7 = v8 + 6.7553994e15; + HIDWORD(v9) = LODWORD(v7); + v4 = LOBYTE(v7) + 1; + byte_4E2BC8 = LOBYTE(v7) + 1; + if ( (unsigned __int8)(LOBYTE(v7) + 1) >= 0x78u ) + { + v4 = 1; + byte_4E2BC8 = 1; + } + sprintfex(pTmpBuf, "hglas%03d", (unsigned __int8)v4); + pTexture_RestUI_CurrentHourglassFrame = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(pTmpBuf, TEXTURE_16BIT_PALETTE)]; + pRenderer->DrawTextureIndexed(0x10Bu, 0x9Fu, pTexture_RestUI_CurrentHourglassFrame); + memset(&Dst, 0, 0xBCu); + Dst.uX = 24; + Dst.uY = 154; + Dst.uWidth = 171; + Dst.uHeight = 37; + Dst.uZ = 194; + Dst.uW = 190; + Dst.pParent = pButton_RestUI_WaitUntilDawn->pParent; + Dst.DrawLabel(pGlobalTXT_LocalizationStrings[183], pFontCreate, a5, *(int **)a9); + Dst.pParent = 0; + sprintfex(pTmpBuf, "\r408%d", uRestUI_FoodRequiredToRest); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, 0, 164, a5, pTmpBuf, 0, 0, *(unsigned int *)a9); + pButton_RestUI_WaitUntilDawn->DrawLabel( + pGlobalTXT_LocalizationStrings[237], + pFontCreate, + a5, + *(int **)a9); + pButton_RestUI_Wait1Hour->DrawLabel(pGlobalTXT_LocalizationStrings[239], pFontCreate, a5, *(int **)a9); + pButton_RestUI_Wait5Minutes->DrawLabel(pGlobalTXT_LocalizationStrings[238], pFontCreate, a5, *(int **)a9); + pButton_RestUI_Exit->DrawLabel(pGlobalTXT_LocalizationStrings[81], pFontCreate, a5, *(int **)a9); + memset(&Dst, 0, 0xBCu); + Dst.uX = 45; + Dst.uY = 199; + Dst.uWidth = 185; + Dst.uHeight = 30; + Dst.uZ = 229; + Dst.uW = 228; + Dst.pParent = pButton_RestUI_WaitUntilDawn->pParent; + Dst.DrawLabel(pGlobalTXT_LocalizationStrings[236], pFontCreate, a5, *(int **)a9); + Dst.pParent = 0; + v5 = pParty->uCurrentHour >= 0xC && pParty->uCurrentHour < 0x18; + sprintfex(pTmpBuf, "%d:%02d %s", v10, pParty->uCurrentMinute, aAMPMNames[v5]); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, 368, 168, a5, pTmpBuf, 0, 0, *(unsigned int *)a9); + sprintfex(pTmpBuf, "%s\r190%d", pGlobalTXT_LocalizationStrings[56], pParty->uDaysPlayed + 1); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, 350, 190, a5, pTmpBuf, 0, 0, *(unsigned int *)a9); + sprintfex(pTmpBuf, "%s\r190%d", pGlobalTXT_LocalizationStrings[146], pParty->uCurrentMonth + 1); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, 350, 222, a5, pTmpBuf, 0, 0, *(unsigned int *)a9); + sprintfex(pTmpBuf, "%s\r190%d", pGlobalTXT_LocalizationStrings[245], pParty->uCurrentYear); + pGUIWindow_CurrentMenu->DrawText(pFontCreate, 350, 254, a5, pTmpBuf, 0, 0, *(unsigned int *)a9); + if ( dword_506F14 ) + Sleep6Hours(); + } + else + { + GUIWindow::Create( + pButton_RestUI_Exit->uX, + pButton_RestUI_Exit->uY, + 0, + 0, + (enum WindowType)96, + (int)pButton_RestUI_Exit, + (int)pGlobalTXT_LocalizationStrings[81]); + } +} +// 4E2BC8: using guessed type char byte_4E2BC8; +// 506F14: using guessed type int dword_506F14; +// 506F1C: using guessed type int dword_506F1C; +// 50765C: using guessed type int uTextureID_RestUI_restmain; +// 507CD4: using guessed type int 507CD4_RestUI_hourglass_anim_controller; + +//----- (0041FE71) -------------------------------------------------------- +int Chest::CanPlaceItemAt(signed int a1, int a2, unsigned int uChestID) +{ + int v3; // eax@1 + unsigned int v4; // eax@1 + Texture *v5; // ecx@1 + signed int v6; // eax@1 + signed int v7; // edi@3 + signed int v8; // eax@3 + int v9; // edi@3 + int v10; // ebx@5 + int v11; // esi@9 + int v12; // edx@10 + int v13; // ecx@11 + char *v14; // eax@12 + int v16; // [sp+Ch] [bp-Ch]@1 + signed int v17; // [sp+10h] [bp-8h]@1 + signed int v18; // [sp+14h] [bp-4h]@1 + + v17 = a1; + v3 = pChests[uChestID].uChestBitmapID; + v16 = pChestHeightsByType[v3]; + v18 = pChestWidthsByType[v3]; + v4 = pIcons_LOD->LoadTexture(pItemsTable->pItems[a2].pIconName, TEXTURE_16BIT_PALETTE); + v5 = (Texture *)(v4 != -1 ? (int)&pIcons_LOD->pTextures[v4] : 0); + v6 = (v4 != -1 ? pIcons_LOD->pTextures[v4].uTextureWidth : 24); + if ( v6 < 14 ) + v6 = 14; + v7 = v6 - 14; + v8 = v5->uTextureHeight; + v9 = (v7 >> 5) + 1; + if ( v8 < 14 ) + v8 = 14; + v10 = ((v8 - 14) >> 5) + 1; + if ( !areWeLoadingTexture ) + { + v5->Release(); + pIcons_LOD->_40F9C5(); + } + if ( v9 + v17 % v18 <= v18 && v10 + v17 / v18 <= v16 ) + { + v11 = 0; + if ( v10 <= 0 ) + return 1; + v12 = 0; + while ( 1 ) + { + v13 = 0; + if ( v9 > 0 ) + break; +LABEL_15: + v12 += v18; + ++v11; + if ( v11 >= v10 ) + return 1; + } + v14 = (char *)&pChests[0].pInventoryIndices[v17 + v12 + 2662 * uChestID]; + while ( !*(short *)v14 ) + { + ++v13; + v14 += 2; + if ( v13 >= v9 ) + goto LABEL_15; + } + } + return 0; +} +// 506128: using guessed type int areWeLoadingTexture; + +//----- (0041FF64) -------------------------------------------------------- +int Chest::_41FF64(unsigned int uChestID) +{ + unsigned int v1; // ecx@1 + signed int result; // eax@1 + int v3; // edx@1 + ItemGen *pItem; // ecx@2 + + v1 = uChestID; + result = 0; + v3 = pChestWidthsByType[pChests[v1].uChestBitmapID] * pChestHeightsByType[pChests[v1].uChestBitmapID]; + if ( v3 <= 0 ) + { +LABEL_5: + result = -1; + } + else + { + pItem = pChests[v1].mm7__vector_pItems; + while ( pItem->uItemID ) + { + ++result; + ++pItem; + if ( result >= v3 ) + goto LABEL_5; + } + } + return result; +} + +//----- (0041FFA2) -------------------------------------------------------- +int Chest::_41FFA2(int a1, ItemGen *a2, unsigned int uChestID) +{ + int v3; // eax@1 + ItemGen *v4; // edi@1 + int v5; // esi@1 + int result; // eax@11 + unsigned int v7; // eax@12 + int v8; // edx@12 + int v9; // ecx@12 + signed int v10; // eax@12 + signed int v11; // edi@14 + unsigned int v12; // esi@14 + int v13; // edi@16 + void *v14; // edi@21 + int v15; // edi@21 + int i; // ecx@21 + ItemGen *Src; // [sp+Ch] [bp-18h]@1 + signed int v18; // [sp+10h] [bp-14h]@2 + int v19; // [sp+14h] [bp-10h]@1 + int v20; // [sp+18h] [bp-Ch]@19 + signed int v21; // [sp+1Ch] [bp-8h]@1 + signed int v22; // [sp+20h] [bp-4h]@3 + int v23; // [sp+20h] [bp-4h]@19 + + v21 = 0; + v3 = pChests[uChestID].uChestBitmapID; + v4 = a2; + v5 = pChestWidthsByType[v3] * pChestHeightsByType[v3]; + Src = a2; + v19 = pChestWidthsByType[v3]; + if ( a1 == -1 ) + { + v18 = _41FF64(uChestID); + if ( v18 == -1 ) + return 0; + v22 = 0; + if ( v5 > 0 ) + { + while ( !Chest::CanPlaceItemAt(v22, v4->uItemID, (unsigned int)ptr_507BB8->ptr_1C) ) + { + ++v22; + if ( v22 >= v5 ) + goto LABEL_8; + } + v21 = v22; + } +LABEL_8: + if ( v22 == v5 ) + { + if ( uActiveCharacter ) + pPlayers[uActiveCharacter]->PlaySound(15, 0); + return 0; + } + v7 = pIcons_LOD->LoadTexture(pItemsTable->pItems[v4->uItemID].pIconName, TEXTURE_16BIT_PALETTE); + HIWORD(v8) = 0; + v9 = v7 != -1 ? (int)&pIcons_LOD->pTextures[v7] : 0; + v10 = (v7 != -1 ? pIcons_LOD->pTextures[v7].uTextureWidth : 24); + if ( v10 < 14 ) + v10 = 14; + v11 = *(short *)(v9 + 26); + v12 = ((v10 - 14) >> 5) + 1; + if ( v11 < 14 ) + v11 = 14; + v13 = ((v11 - 14) >> 5) + 1; + if ( !areWeLoadingTexture ) + { + ((Texture *)v9)->Release(); + pIcons_LOD->_40F9C5(); + } + if ( v13 > 0 ) + { + v23 = 0; + v20 = v13; + do + { + if ( (signed int)v12 > 0 ) + { + v14 = &pChests[0].pInventoryIndices[v21 + v23 + 2662 * uChestID]; + LOWORD(v8) = -1 - v21; + v8 <<= 16; + LOWORD(v8) = -1 - v21; + memset32(v14, v8, v12 >> 1); + v15 = (int)((char *)v14 + 4 * (v12 >> 1)); + for ( i = v12 & 1; i; --i ) + { + *(short *)v15 = v8; + v15 += 2; + } + } + v23 += v19; + --v20; + } + while ( v20 ); + } + pChests[0].pInventoryIndices[v21 + 2662 * uChestID] = v18 + 1; + memcpy(&pChests[uChestID].mm7__vector_pItems[v18], Src, 0x24u); + result = v21 + 1; + } + else + { + result = 1; + } + return result; +} +// 506128: using guessed type int areWeLoadingTexture; + +//----- (0042013E) -------------------------------------------------------- +unsigned int Chest::PlaceItemAt(unsigned int a1, unsigned int uItemIdx, unsigned int uChestID) +{ + int v3; // esi@1 + unsigned int v4; // ebx@1 + int uItemID; // edi@1 + int v6; // edx@4 + unsigned int v7; // eax@5 + Texture *v8; // ecx@5 + signed int v9; // eax@5 + signed int v10; // edi@7 + unsigned int v11; // ebx@7 + int v12; // edi@9 + int v13; // edx@12 + void *v14; // edi@14 + int v15; // edi@14 + int i; // ecx@14 + unsigned int result; // eax@18 + __int16 v18; // [sp+Ch] [bp-10h]@1 + int v19; // [sp+10h] [bp-Ch]@11 + int v20; // [sp+14h] [bp-8h]@12 + unsigned int v21; // [sp+18h] [bp-4h]@1 + + v3 = 5324 * uChestID; + v21 = a1; + v4 = 5324 * uChestID + 36 * uItemIdx; + v18 = uItemIdx; + uItemID = *(unsigned int *)((char *)&pChests[0].mm7__vector_pItems[0].uItemID + v4); + pItemsTable->SetSpecialBonus((ItemGen *)((char *)pChests[0].mm7__vector_pItems + v4)); + if ( uItemID >= 135 && uItemID <= 159 && !*(int *)((char *)&pChests[0].mm7__vector_pItems[0].uNumCharges + v4) ) + { + v6 = rand() % 21 + 10; + *(int *)((char *)&pChests[0].mm7__vector_pItems[0].uNumCharges + v4) = v6; + *(&pChests[0].mm7__vector_pItems[0].uMaxCharges + v4) = v6; + } + v7 = pIcons_LOD->LoadTexture(pItemsTable->pItems[uItemID].pIconName, TEXTURE_16BIT_PALETTE); + v8 = (Texture *)(v7 != -1 ? (int)&pIcons_LOD->pTextures[v7] : 0); + v9 = (v7 != -1 ? pIcons_LOD->pTextures[v7].uTextureWidth : 24); + if ( v9 < 14 ) + v9 = 14; + v10 = v8->uTextureHeight; + v11 = ((v9 - 14) >> 5) + 1; + if ( v10 < 14 ) + v10 = 14; + v12 = ((v10 - 14) >> 5) + 1; + if ( !areWeLoadingTexture ) + { + v8->Release(); + pIcons_LOD->_40F9C5(); + } + v19 = pChestWidthsByType[*(unsigned __int16 *)((char *)&pChests[0].uChestBitmapID + v3)]; + if ( v12 > 0 ) + { + v13 = 0; + v20 = v12; + do + { + if ( (signed int)v11 > 0 ) + { + v14 = &pChests[0].pInventoryIndices[v21 + v13 + 2662 * uChestID]; + LOWORD(v3) = -1 - v21; + v3 <<= 16; + LOWORD(v3) = -1 - v21; + memset32(v14, v3, v11 >> 1); + v15 = (int)((char *)v14 + 4 * (v11 >> 1)); + for ( i = v11 & 1; i; --i ) + { + *(short *)v15 = v3; + v15 += 2; + } + } + v13 += v19; + --v20; + } + while ( v20 ); + } + result = v21 + 2662 * uChestID; + pChests[0].pInventoryIndices[result] = v18 + 1; + return result; +} +// 506128: using guessed type int areWeLoadingTexture; + +//----- (00420284) -------------------------------------------------------- +char *Chest::_420284(unsigned int uChestID) +{ + int v1; // ebx@1 + unsigned int v2; // esi@1 + unsigned int v3; // esi@1 + int uChestArea; // edi@1 + int v5; // eax@2 + int v6; // ebx@11 + char *result; // eax@18 + char Dst[144]; // [sp+Ch] [bp-A0h]@1 + int v9; // [sp+9Ch] [bp-10h]@10 + unsigned int v10; // [sp+A0h] [bp-Ch]@1 + unsigned int v11; // [sp+A4h] [bp-8h]@8 + unsigned int *v12; // [sp+A8h] [bp-4h]@9 + + v1 = 0; + v2 = uChestID; + v10 = uChestID; + pRenderer->ClearZBuffer(0, 479); + v3 = v2; + uChestArea = pChestWidthsByType[pChests[v3].uChestBitmapID] * pChestHeightsByType[pChests[v3].uChestBitmapID]; + memset(Dst, 0, 0x90u); + if ( uChestArea > 0 ) + { + do + { + do + v5 = (unsigned __int8)rand(); + while ( v5 >= uChestArea ); + while ( Dst[v5] ) + { + ++v5; + if ( v5 == uChestArea ) + v5 = 0; + } + Dst[v5] = v1++; + } + while ( v1 < uChestArea ); + } + v11 = 0; + if ( uChestArea > 0 ) + { + v12 = &pChests[v3].mm7__vector_pItems[0].uAttributtes; + do + { + v9 = *(v12 - 5); + if ( v9 ) + { + v6 = 0; + while ( !Chest::CanPlaceItemAt((unsigned __int8)Dst[v6], v9, v10) ) + { + ++v6; + if ( v6 >= uChestArea ) + goto LABEL_17; + } + Chest::PlaceItemAt((unsigned __int8)Dst[v6], v11, v10); + if ( pChests[v3].uFlags & 4 ) + *v12 |= 1u; + } +LABEL_17: + ++v11; + v12 += 9; + } + while ( (signed int)v11 < uChestArea ); + } + result = (char *)&pChests[v3].uFlags; + pChests[v3].uFlags = pChests[v3].uFlags & 0xFFFB | 2; + return result; +} +// 420284: using guessed type char Dst[144]; + +//----- (0042038D) -------------------------------------------------------- +void __cdecl sub_42038D() +{ + POINT *v0; // esi@2 + int v1; // ecx@2 + const char *v2; // eax@3 + POINT v3; // [sp+0h] [bp-10h]@2 + POINT a2; // [sp+8h] [bp-8h]@1 + + if ( pMouse->GetCursorPos(&a2)->y < 350 ) + { + v0 = pMouse->GetCursorPos(&a2); + v1 = pRenderer->pActiveZBuffer[v0->x + pSRZBufferLineOffsets[pMouse->GetCursorPos(&v3)->y]]; + if ( v1 ) + { + auto _w = (ItemGen *)(&pOtherOverlayList->pOverlays[49].field_4 + + 2662 * (unsigned int)ptr_507BB8->ptr_1C + + 18 + * *((short *)&pChests[0].mm7__vector_pItems[139].uExpireTime + + v1 + + 2662 * (unsigned int)ptr_507BB8->ptr_1C + + 3)); + v2 = _w->GetDisplayName(); + sub_41C0B8_set_status_string(v2); + } + } +} + +//----- (0042041E) -------------------------------------------------------- +bool Chest::Open(unsigned int uChestID) +{ + char *v1; // edi@5 + unsigned int v2; // eax@8 + GUIWindow *v3; // eax@15 + int v5; // edx@16 + int v6; // eax@16 + ODMFace *v7; // eax@19 + int v8; // edx@19 + int v9; // edi@19 + signed int v10; // ebx@19 + int v11; // ecx@19 + int v12; // eax@19 + BLVFace *v13; // eax@20 + int v14; // ebx@21 + int v15; // edi@21 + int v16; // ecx@22 + __int64 v17; // qax@22 + double v18; // st7@23 + double v19; // st6@23 + double v20; // st7@23 + int v21; // ecx@26 + char v22[12]; // ST4C_12@28 + unsigned int *v23; // edi@28 + unsigned __int16 v24; // di@28 + signed int v25; // ecx@28 + char *v26; // edx@29 + unsigned __int16 v27; // ax@32 + //LayingItem a1; // [sp+14h] [bp-B0h]@28 + int v29; // [sp+84h] [bp-40h]@16 + int v30; // [sp+88h] [bp-3Ch]@16 + int v31; // [sp+8Ch] [bp-38h]@16 + int v32; // [sp+90h] [bp-34h]@16 + float v33; // [sp+94h] [bp-30h]@23 + char *v34; // [sp+98h] [bp-2Ch]@5 + int v35; // [sp+9Ch] [bp-28h]@16 + Vec3_int_ pOut; // [sp+A0h] [bp-24h]@28 + int a4; // [sp+ACh] [bp-18h]@1 + int v38; // [sp+B0h] [bp-14h]@21 + int sRotX; // [sp+B4h] [bp-10h]@23 + float v40; // [sp+B8h] [bp-Ch]@23 + float v41; // [sp+BCh] [bp-8h]@23 + int sRotY; // [sp+C0h] [bp-4h]@8 + + a4 = uChestID; + if ( (uChestID & 0x80000000u) != 0 || (signed int)uChestID >= 20 ) + return 0; + ++pIcons_LOD->uTexturePacksCount; + if ( !pIcons_LOD->uNumPrevLoadedFiles ) + pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles; + v1 = (char *)&pChests[uChestID].uFlags; + v34 = v1; + if ( !(*v1 & CHEST_ITEMS_PLACED) ) + Chest::_420284(uChestID); + if ( !uActiveCharacter ) + return 0; + *(float *)&sRotY = 0.0; + v2 = pMapStats->GetMapInfo(pCurrentMapName); + if ( !(*v1 & 1) || !v2 ) + goto LABEL_12; + if ( pPlayers[uActiveCharacter]->GetDisarmTrap() < 2 * pMapStats->pInfos[v2].field_2D ) + { + v29 = 811; + v30 = 812; + v31 = 813; + v32 = 814; + v5 = rand() % 4; + v6 = dword_5B5920 >> 3; + v35 = v5; + if ( (dword_5B5920 & 7) == 5 ) + { + v16 = v6; + v14 = pLevelDecorations[v6].vPosition.x; + v38 = pLevelDecorations[v6].vPosition.y; + v17 = pDecorationList->pDecorations[pLevelDecorations[v6].uDecorationDescID].uDecorationHeight; + v15 = pLevelDecorations[v16].vPosition.z + (((signed int)v17 - HIDWORD(v17)) >> 1); + } + else + { + if ( (dword_5B5920 & 7) != 6 ) + goto LABEL_12; + if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor) + { + v7 = &pOutdoor->pBModels[dword_5B5920 >> 9].pFaces[(dword_5B5920 >> 3) & 0x3F]; + v8 = v7->pBoundingBox.y1; + v9 = v7->pBoundingBox.z2; + v10 = v7->pBoundingBox.x1 + v7->pBoundingBox.x2; + v11 = v7->pBoundingBox.y2; + v12 = v7->pBoundingBox.z1; + } + else + { + v13 = &pIndoor->pFaces[v6]; + v8 = v13->pBounding.y1; + v9 = v13->pBounding.z2; + v10 = v13->pBounding.x1 + v13->pBounding.x2; + v11 = v13->pBounding.y2; + v12 = v13->pBounding.z1; + } + v14 = v10 >> 1; + v38 = (v8 + v11) >> 1; + v15 = (v12 + v9) >> 1; + } + v18 = (double)pParty->vPosition.x - (double)v14; + *(float *)&a4 = v18; + v19 = (double)pParty->vPosition.z - (double)v38; + v33 = v19; + v41 = (double)pParty->sEyelevel + (double)pParty->vPosition.y - (double)v15; + *(float *)&sRotY = v19 * v19; + *(float *)&sRotX = v18 * v18; + v20 = sqrt(v41 * v41 + *(float *)&sRotX + *(float *)&sRotY); + v40 = v20; + if ( v20 <= 1.0 ) + { + *(float *)&sRotX = 0.0; + *(float *)&sRotY = 0.0; + } + else + { + sRotY = (signed __int64)sqrt(*(float *)&sRotX + *(float *)&sRotY); + sRotX = stru_5C6E00->Atan2((signed __int64)*(float *)&a4, (signed __int64)v33); + sRotY = stru_5C6E00->Atan2(sRotY, (signed __int64)v41); + } + v21 = 256; + if ( v40 < 256.0 ) + v21 = (signed __int64)v40 / 4; + *(int *)&v22[8] = v15; + *(_QWORD *)v22 = __PAIR__(v38, v14); + Vec3_int_::Rotate(v21, sRotX, sRotY, *(Vec3_int_ *)v22, &pOut.x, &pOut.z, &pOut.y); + v23 = (unsigned int *)(&v29 + v35); + sub_42F7EB_DropItemAt(*v23, pOut.x, pOut.z, pOut.y, 0, 1, 0, 0x30u, 0); + + LayingItem a1; // [sp+14h] [bp-B0h]@28 + //LayingItem::LayingItem(&a1); + + a1.stru_24.Reset(); + v24 = *(short *)v23; + v25 = 0; + a1.field_50 = 0; + a1.field_4C = 0; + a1.field_48 = 0; + a1.field_54 = 0; + a1.uItemType = v24; + if ( (signed int)pObjectList->uNumObjects <= 0 ) + { +LABEL_32: + v27 = 0; + } + else + { + v26 = (char *)&pObjectList->pObjects->uObjectID; + while ( v24 != *(short *)v26 ) + { + ++v25; + v26 += 56; + if ( v25 >= (signed int)pObjectList->uNumObjects ) + goto LABEL_32; + } + v27 = v25; + } + a1.uObjectDescID = v27; + a1.vPosition.y = pOut.z; + a1.vPosition.x = pOut.x; + a1.vPosition.z = pOut.y; + a1.uSoundID = 0; + a1.uAttributes = 48; + a1.uSectorID = pIndoor->GetSector(pOut.x, pOut.z, pOut.y); + a1.uSpriteFrameID = 0; + a1.field_58 = 0; + a1.field_5C = 0; + a1.uFacing = 0; + a1.Create(0, 0, 0, 0); + pAudioPlayer->PlaySound(SOUND_8, 0, 0, -1, 0, 0, 0, 0); + a1._438E35(); + *v34 &= 0xFEu; + if ( uActiveCharacter && !qword_A750D8 && !dword_507CD8 ) + { + qword_A750D8 = 256i64; + word_A750E0 = 5; + word_A750E2 = uActiveCharacter; + } + pIcons_LOD->_4114F2(); + dword_507CD8 = 0; + return 0; + } + *v1 &= 0xFEu; + sRotY = 1; +LABEL_12: + pAudioPlayer->StopChannels(-1, -1); + pAudioPlayer->PlaySound((SoundID)208, 0, 0, -1, 0, 0, 0, 0); + if ( *(float *)&sRotY != 0.0 ) + { + if ( !dword_507CD8 ) + pPlayers[uActiveCharacter]->PlaySound(4, 0); + } + dword_507CD8 = 0; + v3 = GUIWindow::Create(0, 0, 640u, 480u, WINDOW_Chest, a4, 0); + pGUIWindow_CurrentMenu = v3; + ptr_507BB8 = v3; + ptr_5076F4 = v3->CreateButton( + 0x1D7u, + 0x1BDu, + 0xA9u, + 0x23u, + 1, + 0, + 0x71u, + 0, + 0, + pGlobalTXT_LocalizationStrings[79],// Exit + (Texture *)(uTextureID_506438 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_506438] : 0), + 0); + ptr_507BB8->CreateButton(7u, 8u, 460u, 343u, 1, 0, 0xCu, 0, 0, nullstring, 0); + uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = 10; + pEventTimer->Pause(); + return 1; +} + +//----- (0042092D) -------------------------------------------------------- +void Chest::DrawChestUI(unsigned int uChestID) +{ + Render *v1; // edi@1 + unsigned int v2; // ebx@1 + unsigned int v3; // ebx@1 + int v4; // eax@1 + unsigned int v5; // eax@1 + int v6; // ecx@3 + unsigned int v7; // eax@4 + Texture *v8; // esi@4 + signed int v9; // ecx@4 + signed int v10; // edx@4 + signed int v11; // eax@4 + int v12; // eax@6 + int v13; // eax@6 + unsigned int v14; // ST34_4@8 + int v15; // edi@8 + int *v16; // [sp+Ch] [bp-28h]@1 + int v17; // [sp+10h] [bp-24h]@4 + int v18; // [sp+14h] [bp-20h]@1 + signed int v19; // [sp+18h] [bp-1Ch]@1 + int v20; // [sp+1Ch] [bp-18h]@1 + signed int v21; // [sp+20h] [bp-14h]@1 + char *v22; // [sp+2Ch] [bp-8h]@2 + signed int v23; // [sp+30h] [bp-4h]@1 + + v1 = pRenderer; + v2 = uChestID; + v16 = pRenderer->pActiveZBuffer; + pRenderer->ClearZBuffer(0, 479); + v3 = v2; + v4 = pChests[v3].uChestBitmapID; + v20 = pChestSmthn1ByType[v4]; + v18 = pChestSmthn2ByType[v4]; + v21 = pChestWidthsByType[v4]; + v19 = pChestHeightsByType[v4]; + sprintfex(pTmpBuf, "chest%02d", pChestList->pChests[pChests[v3].uChestBitmapID].uTextureID); + v5 = pIcons_LOD->LoadTexture(pTmpBuf, TEXTURE_16BIT_PALETTE); + pRenderer->DrawTextureIndexed(8u, 8u, (Texture *)(v5 != -1 ? (int)&pIcons_LOD->pTextures[v5] : 0)); + v23 = 0; + if ( v21 * v19 > 0 ) + { + v22 = (char *)pChests[v3].pInventoryIndices; + do + { + v6 = *(short *)v22; + if ( v6 > 0 ) + { + v17 = v18 + 32 * v23 / v19; + v7 = pIcons_LOD->LoadTexture( + pItemsTable->pItems[*(int *)((char *)&pOtherOverlayList->pOverlays[49].field_4 + 36 * v6 + v3 * 5324)].pIconName, + TEXTURE_16BIT_PALETTE); + v8 = (Texture *)(v7 != -1 ? &pIcons_LOD->pTextures[v7] : 0); + v9 = (v7 != -1 ? pIcons_LOD->pTextures[v7].uTextureWidth : 24); + v10 = (v7 != -1 ? pIcons_LOD->pTextures[v7].uTextureHeight : 26); + v11 = (v7 != -1 ? pIcons_LOD->pTextures[v7].uTextureWidth : 24); + if ( v9 < 14 ) + v11 = 14; + v12 = v11 - 14; + LOBYTE(v12) = v12 & 0xE0; + v13 = v12 + 32; + if ( (signed int)v8->uTextureHeight < 14 ) + v10 = 14; + v14 = v20 + 32 * v23 % v21 + ((v13 - v9) >> 1); + v15 = v17 + ((((v10 - 14) & 0xFFFFFFE0) - v8->uTextureHeight + 32) >> 1); + pRenderer->DrawTextureTransparent( + v14, + v17 + ((((v10 - 14) & 0xFFFFFFE0) - v8->uTextureHeight + 32) >> 1), + v8); + sub_40F92A(&v16[v14 + pSRZBufferLineOffsets[v15]], v8, v23 + 1); + v1 = pRenderer; + } + ++v23; + v22 += 2; + } + while ( v23 < v21 * v19 ); + } + pRenderer->DrawTextureIndexed( + ptr_5076F4->uX, + ptr_5076F4->uY, + (Texture *)(uTextureID_506438 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_506438] : 0)); +} + +//----- (00420B13) -------------------------------------------------------- +void __fastcall sub_420B13(int a1, int a2) +{ + void *v2; // eax@1 + ItemGen *v3; // ebx@1 + unsigned int v4; // eax@1 + Texture *v5; // ecx@1 + signed int v6; // eax@1 + signed int v7; // edi@3 + signed int v8; // eax@3 + int v9; // edi@3 + int v10; // eax@5 + int v11; // esi@8 + unsigned int v12; // ecx@10 + void *v13; // edi@10 + unsigned __int8 v14; // cf@10 + int v15; // edi@10 + int i; // ecx@10 + int v17; // [sp+Ch] [bp-14h]@1 + int v18; // [sp+10h] [bp-10h]@3 + int v19; // [sp+14h] [bp-Ch]@1 + void *v20; // [sp+18h] [bp-8h]@1 + int v21; // [sp+1Ch] [bp-4h]@5 + int v22; // [sp+1Ch] [bp-4h]@8 + + v19 = a2; + v2 = ptr_507BB8->ptr_1C; + v20 = v2; + v2 = (void *)(5324 * (int)v2); + v3 = (ItemGen *)((char *)v2 + 36 * a1 + (int)((char *)pChests + 4)); + v17 = pChestWidthsByType[*(short *)((char *)v2 + (int)pChests)]; + v4 = pIcons_LOD->LoadTexture(pItemsTable->pItems[v3->uItemID].pIconName, TEXTURE_16BIT_PALETTE); + v5 = (Texture *)(v4 != -1 ? (int)&pIcons_LOD->pTextures[v4] : 0); + v6 = (v4 != -1 ? pIcons_LOD->pTextures[v4].uTextureWidth : 24); + if ( v6 < 14 ) + v6 = 14; + v7 = v6 - 14; + v8 = v5->uTextureHeight; + v9 = (v7 >> 5) + 1; + v18 = v9; + if ( v8 < 14 ) + v8 = 14; + v10 = ((v8 - 14) >> 5) + 1; + v21 = v10; + if ( !areWeLoadingTexture ) + { + v5->Release(); + pIcons_LOD->_40F9C5(); + v10 = v21; + } + if ( v10 > 0 ) + { + v11 = 0; + v22 = v10; + do + { + if ( v9 > 0 ) + { + v12 = v9; + v13 = &pChests[0].pInventoryIndices[v19 + v11 + 2662 * (int)v20]; + v14 = v12 & 1; + v12 >>= 1; + memset(v13, 0, 4 * v12); + v15 = (int)((char *)v13 + 4 * v12); + for ( i = v14; i; --i ) + { + *(short *)v15 = 0; + v15 += 2; + } + v9 = v18; + } + v11 += v17; + --v22; + } + while ( v22 ); + } + v3->Reset(); +} +// 506128: using guessed type int areWeLoadingTexture; + +//----- (00420C05) -------------------------------------------------------- +void __fastcall party_finds_gold(unsigned int uNumGold, int _1_dont_share_with_followers___2_the_same_but_without_a_message__else_normal) +{ + unsigned int v2; // edi@1 + int v3; // ebp@1 + unsigned int v4; // esi@1 + int v5; // ecx@6 + NPCData *v6; // eax@6 + signed int v7; // edx@8 + signed int v8; // ebx@10 + char *v9; // edi@11 + signed int v10; // ecx@17 + int v11; // eax@21 + NPCData *v12; // ecx@21 + unsigned int v13; // ecx@23 + signed int v14; // [sp+Ch] [bp-4h]@6 + + v2 = 0; + v3 = 0; + v4 = uNumGold; + if ( _1_dont_share_with_followers___2_the_same_but_without_a_message__else_normal ) + { + if ( _1_dont_share_with_followers___2_the_same_but_without_a_message__else_normal == 1 ) + { + sprintfex(pTmpBuf2, pGlobalTXT_LocalizationStrings[467], uNumGold);// You found %lu gold! + } + else + { + if ( _1_dont_share_with_followers___2_the_same_but_without_a_message__else_normal == 2 ) + pTmpBuf2[0] = 0; + } + } + else + { + v14 = 0; + v5 = 0; + v6 = pParty->pHirelings; + do + { + if ( v6->pName ) + { + v7 = v14++; + pTmpBuf[v7] = v5; + } + ++v6; + ++v5; + } + while ( (signed int)v6 < (signed int)&pParty->pPickedItem ); + v8 = 0; + if ( (signed int)pNPCStats->uNumNewNPCs > 0 ) + { + v9 = (char *)pNPCStats->pNewNPCData; + do + { + if ( v9[8] & 0x80 + && (!pParty->pHirelings[0].pName || strcmp(*(const char **)v9, pParty->pHirelings[0].pName)) + && (!pParty->pHirelings[1].pName || strcmp(*(const char **)v9, pParty->pHirelings[1].pName)) ) + { + v10 = v14++; + pTmpBuf[v10] = v8 + 2; + } + ++v8; + v9 += 76; + } + while ( v8 < (signed int)pNPCStats->uNumNewNPCs ); + v2 = 0; + } + if ( v14 > 0 ) + { + do + { + v11 = (unsigned __int8)pTmpBuf[v2]; + v12 = &pNPCStats->pNPCData[v11 + 499]; + if ( (unsigned __int8)pTmpBuf[v2] < 2u ) + v12 = &pParty->pHirelings[v11]; + v13 = v12->uProfession; + if ( v13 ) + v3 += *(&pNPCStats->field_13A58 + 5 * v13); + ++v2; + } + while ( (signed int)v2 < v14 ); + } + if ( CheckHiredNPCSpeciality(0x1Fu) ) + v4 += (signed int)(10 * v4) / 100; + if ( CheckHiredNPCSpeciality(0x20u) ) + v4 += (signed int)(20 * v4) / 100; + if ( CheckHiredNPCSpeciality(0x2Du) ) + v4 += (signed int)(10 * v4) / 100; + if ( v3 ) + { + v3 = (signed int)(v4 * v3 / 100) / 100; + if ( v3 < 1 ) + v3 = 1; + sprintfex(pTmpBuf2, pGlobalTXT_LocalizationStrings[466], v4, v3);// You found %lu gold (followers take %lu)! + } + else + { + sprintfex(pTmpBuf2, pGlobalTXT_LocalizationStrings[467], v4);// You found %lu gold! + } + v2 = 0; + } + pParty->uNumGold += v4 - v3; + pUIAnim_Gold->uAnimTime = v2; + pUIAnim_Gold->uAnimLength = 8 * pIconsFrameTable->pIcons[(signed __int16)pUIAnim_Gold->uIconID].uAnimLength; + if ( pTmpBuf2[0] ) + ShowStatusBarString(pTmpBuf2, 2u); + pAudioPlayer->PlaySound(SOUND_GoldReceived, v2, v2, -1, v2, v2, v2, v2); +} + +//----- (00420E01) -------------------------------------------------------- +void __cdecl sub_420E01() +{ + void *v0; // edi@1 + POINT *v1; // esi@2 + int v2; // eax@2 + int v3; // ebx@4 + int v4; // esi@6 + int v5; // ecx@6 + //LayingItem v6; // [sp+Ch] [bp-80h]@1 + char v7; // [sp+7Ch] [bp-10h]@2 + POINT a2; // [sp+84h] [bp-8h]@2 + + LayingItem v6; // [sp+Ch] [bp-80h]@1 + //LayingItem::LayingItem(&v6); + + v0 = pGUIWindow_CurrentMenu->ptr_1C; + if ( pParty->pPickedItem.uItemID ) + { + if ( Chest::_41FFA2(-1, &pParty->pPickedItem, (unsigned int)pGUIWindow_CurrentMenu->ptr_1C) ) + pMouse->RemoveHoldingItem(); + } + else + { + v1 = pMouse->GetCursorPos(&a2); + v2 = pRenderer->pActiveZBuffer[v1->x + pSRZBufferLineOffsets[pMouse->GetCursorPos((POINT *)&v7)->y]] & 0xFFFF; + if ( v2 ) + { + if ( v2 ) + v3 = v2 - 1; + else + v3 = -1; + v4 = pChests[0].pInventoryIndices[v3 + 2662 * (int)v0] - 1; + v5 = 5324 * (int)v0 + 36 * v4; + if ( pItemsTable->pItems[*(unsigned int *)((char *)&pChests[0].mm7__vector_pItems[0].uItemID + v5)].uEquipType == 18 ) + { + party_finds_gold(*(int *)((char *)&pChests[0].mm7__vector_pItems[0].uAdditionalValue + v5), 0); + viewparams->bRedrawGameUI = 1; + } + else + { + pParty->SetHoldingItem((ItemGen *)((char *)pChests[0].mm7__vector_pItems + v5)); + } + sub_420B13(v4, v3); + } + } +} + +//----- (00420EFF) -------------------------------------------------------- +void __cdecl GameUI_WritePointedObjectStatusString() +{ + unsigned int zero; // edi@1 + int v1; // ebx@6 + GUIWindow *v2; // edi@7 + GUIButton *i; // ecx@11 + Player *v4; // eax@19 + char v5; // cl@19 + unsigned int v6; // eax@19 + int v7; // ecx@19 + __int16 v8; // fps@23 + unsigned __int8 v9; // c0@23 + unsigned __int8 v10; // c3@23 + enum UIMessageType v11; // esi@24 + int v12; // edx@25 + char *v13; // ecx@28 + int v14; // eax@41 + ItemGen *v15; // ecx@44 + int v16; // ecx@46 + const char *v17; // eax@49 + signed int v18; // eax@55 + signed int v19; // ecx@63 + BLVFace *pFace; // eax@69 + __int16 v21; // ax@70 + const char *v22; // eax@72 + LevelDecoration *v23; // ecx@75 + LevelDecoration *v24; // esi@75 + __int16 v25; // ax@75 + const char *v26; // ecx@79 + Actor *pActor; // ecx@82 + char *v28; // esi@82 + int v29; // eax@82 + signed int v30; // ecx@88 + const char *v31; // eax@91 + __int16 v32; // fps@109 + unsigned __int8 v33; // c0@109 + unsigned __int8 v34; // c3@109 + enum UIMessageType v35; // esi@110 + int v36; // edx@111 + enum UIMessageType v37; // edx@117 + int v38; // ecx@118 + const char *v39; // [sp-8h] [bp-E8h]@20 + char *v40; // [sp-8h] [bp-E8h]@83 + int v41; // [sp-4h] [bp-E4h]@20 + char Str1[200]; // [sp+Ch] [bp-D4h]@129 + unsigned int pX; // [sp+D4h] [bp-Ch]@1 + unsigned int pY; // [sp+D8h] [bp-8h]@1 + unsigned int v45; // [sp+DCh] [bp-4h]@21 + + zero = 0; + pMouse->uPointingObjectID = 0; + pMouse->GetClickPos(&pX, &pY); + if ( (pX & 0x80000000u) != 0 || (signed int)pX > 639 || (pY & 0x80000000u) != 0 || (signed int)pY > 479 ) + return; + if ( !uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions ) + { + if ( (signed int)pX > 467 || (signed int)pY > 351 ) + goto _click_on_game_ui; + if ( pRenderer->pRenderD3D ) + { + v18 = pGame->pVisInstance->get_picked_object_zbuf_val(); + if ( (signed int)pX < (signed int)pViewport->uScreenX + || (signed int)pX > (signed int)pViewport->uScreenZ + || (signed int)pY < (signed int)pViewport->uScreenY + || (signed int)pY > (signed int)pViewport->uScreenW ) + v18 = -1; + if ( v18 == -1 ) + goto LABEL_61; + } + else + { + v18 = pRenderer->pActiveZBuffer[pX + pSRZBufferLineOffsets[pY]]; + } + pMouse->uPointingObjectID = (unsigned __int16)v18; + v19 = (signed int)(unsigned __int16)v18 >> 3; + if ( (v18 & 7) == OBJECT_Item ) + { + v30 = v19; + if ( pObjectList->pObjects[pLayingItems[v30].uObjectDescID].uFlags & 0x10 ) + goto LABEL_73; + if ( v18 >= (signed int)0x2000000u || pParty->pPickedItem.uItemID ) + { + v22 = pLayingItems[v30].stru_24.GetDisplayName(); +LABEL_93: + v26 = v22; + goto LABEL_87; + } + v31 = pLayingItems[v30].stru_24.GetDisplayName(); + v28 = pTmpBuf; + sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[470], v31);// "Get %s" + } + else + { + if ( (v18 & 7) != OBJECT_Actor ) + { + if ( (v18 & 7) == OBJECT_Decoration ) + { + v23 = &pLevelDecorations[v19]; + v24 = v23; + v25 = v23->field_16_event_id; + if ( !v25 ) + { + if ( v23->IsInteractive() ) + v26 = (const char *)dword_722240[2 * stru_5E4C90.field_0[v24->field_1C]]; + else + v26 = pDecorationList->pDecorations[v24->uDecorationDescID].field_20; + goto LABEL_87; + } + v22 = _444732_GetEventHintString(v25); + if ( !v22 ) + goto _return; + goto LABEL_93; + } + if ( (v18 & 7) == 6 ) // bmodel + { + if ( v18 < (signed int)0x2000000u ) + { + if ( uCurrentlyLoadedLevelType != LEVEL_Indoor) + { + v21 = pOutdoor->pBModels[(signed int)(unsigned __int16)v18 >> 9].pFaces[v19 & 0x3F].sCogTriggeredID; + goto LABEL_71; + } + pFace = &pIndoor->pFaces[v19]; + if ( BYTE3(pFace->uAttributes) & 6 ) + { + v21 = pIndoor->pFaceExtras[pFace->uFaceExtraID].uEventID; +LABEL_71: + if ( !v21 || (v22 = _444732_GetEventHintString(v21)) == 0 ) + goto LABEL_73; + goto LABEL_93; + } + } +LABEL_73: + pMouse->uPointingObjectID = 0; + goto LABEL_50; + } +LABEL_61: + pMouse->uPointingObjectID = 0; + goto _return; + } + if ( v18 >= 335544320 ) + goto LABEL_61; + pActor = &pActors[v19]; + v28 = pTmpBuf; + v29 = pActor->dword_000334_unique_name; + if ( v29 ) + v40 = (char *)*(&pMonsterStats->pPlacement.uNumStrings + v29); + else + v40 = pMonsterStats->pInfos[pActor->pMonsterInfo.uID].pName; + strncpy(pTmpBuf, v40, 0x7D0u); + } + v26 = v28; +LABEL_87: + sub_41C0B8_set_status_string(v26); + goto _return; + } + v1 = uNumVisibleWindows; + if ( uNumVisibleWindows <= 0 ) + { +LABEL_38: + if ( uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions == 10 ) + { + sub_42038D(); + goto _return; + } + if ( uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions == 13 ) + { + if ( dword_F8B19C != 2 + || (v16 = pRenderer->pActiveZBuffer[pX + pSRZBufferLineOffsets[pY]], v16 == zero) + || v16 == -65536 ) + goto _return; + v15 = (ItemGen *)((char *)&pParty->pPickedItem + 36 * (v16 + 12 * (unsigned int)ptr_507BC0->ptr_1C) + 4); +LABEL_49: + v17 = v15->GetDisplayName(); + sub_41C0B8_set_status_string(v17); +LABEL_50: + uLastPointedObjectID = 1; +_return: + if ( pMouse->uPointingObjectID == zero ) + { + if ( uLastPointedObjectID != zero ) + { + pStatusBarString[0] = 0; + bForceDrawStatusBar = 1; + } + } + uLastPointedObjectID = pMouse->uPointingObjectID; + return; + } + if ( (signed int)pY < 350 ) + { + v14 = pRenderer->pActiveZBuffer[pX + pSRZBufferLineOffsets[pY]]; + if ( v14 == zero || v14 == -65536 || (unsigned int)v14 >= 0x1388 ) + goto _return; + v15 = (ItemGen *)&pPlayers[uActiveCharacter]->pDarkSpellbook.bIsSpellAvailable[36 * v14 + 5]; + goto LABEL_49; + } +_click_on_game_ui: + if ( (signed int)pX >= (signed int)pWindowList[0].uFrameX + && (signed int)pX <= (signed int)pWindowList[0].uFrameZ + && (signed int)pY >= (signed int)pWindowList[0].uFrameY + && (signed int)pY <= (signed int)pWindowList[0].uFrameW ) + { + for ( i = pWindowList[0].pControlsHead; i != (GUIButton *)zero; i = i->pNext ) + { + if ( i->uButtonType == 1 ) + { + if ( (signed int)pX >= (signed int)i->uX + && (signed int)pX <= (signed int)i->uZ + && (signed int)pY >= (signed int)i->uY + && (signed int)pY <= (signed int)i->uW ) + { + v37 = (UIMessageType)i->field_1C; + if ( v37 == zero ) + goto LABEL_28; + v38 = i->uControlParam; + if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + { + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = v37; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v38; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = zero; + ++pMessageQueue_50CBD0->uNumMessages; + } + goto LABEL_131; + } + } + else + { + if ( i->uButtonType == 2 ) + { + v45 = pX - i->uX; + v45 = pY - i->uY; + if ( (double)(signed int)i->uWidth != 0.0 ) + { + if ( (double)(signed int)i->uHeight != 0.0 ) + { + //UNDEF(v32); + if ( v33 | v34 ) + { + v35 = (UIMessageType)i->field_1C; + if ( v35 != zero ) + { + v36 = i->uControlParam; + if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + { + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = v35; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v36; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = zero; + goto LABEL_27; + } + } + goto LABEL_28; + } + } + } + } + else + { + if ( i->uButtonType == 3 + && (signed int)pX >= (signed int)i->uX + && (signed int)pX <= (signed int)i->uZ + && (signed int)pY >= (signed int)i->uY + && (signed int)pY <= (signed int)i->uW ) + goto LABEL_19; + } + } + } + } + pMouse->uPointingObjectID = sub_46A99B(); + goto _return; + } + while ( 1 ) // some other fullscreen ui + { + v2 = &pWindowList[pVisibleWindowsIdxs[v1] - 1]; + if ( (signed int)pX >= (signed int)v2->uFrameX + && (signed int)pX <= (signed int)v2->uFrameZ + && (signed int)pY >= (signed int)v2->uFrameY + && (signed int)pY <= (signed int)v2->uFrameW ) + { + for ( i = v2->pControlsHead; ; i = i->pNext ) + { + if ( !i ) + break; + if ( i->uButtonType == 1 ) + { + if ( (signed int)pX >= (signed int)i->uX + && (signed int)pX <= (signed int)i->uZ + && (signed int)pY >= (signed int)i->uY + && (signed int)pY <= (signed int)i->uW ) + { +LABEL_24: + v11 = (UIMessageType)i->field_1C; + if ( v11 ) + { + v12 = i->uControlParam; + if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + { + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = v11; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v12; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; +LABEL_27: + ++pMessageQueue_50CBD0->uNumMessages; + } + } +LABEL_28: + v13 = i->pButtonName; +_set_status_and_ret: + sub_41C0B8_set_status_string(v13); +LABEL_131: + uLastPointedObjectID = 1; + return; + } + } + else + { + if ( i->uButtonType == 2 ) + { + v45 = pX - i->uX; + v45 = pY - i->uY; + if ( (double)(signed int)i->uWidth != 0.0 ) + { + if ( (double)(signed int)i->uHeight != 0.0 ) + { + //UNDEF(v8); + if ( v9 | v10 ) + goto LABEL_24; + } + } + } + else // click on skill + { + if ( i->uButtonType == 3 + && (signed int)pX >= (signed int)i->uX + && (signed int)pX <= (signed int)i->uZ + && (signed int)pY >= (signed int)i->uY + && (signed int)pY <= (signed int)i->uW ) + { +LABEL_19: + v4 = pPlayers[uActiveCharacter]; + v5 = LOBYTE(v4->pActiveSkills[i->uControlParam]); + v6 = v4->uSkillPoints; + v7 = (v5 & 0x3F) + 1; + if ( v6 < v7 ) + { + v41 = v7 - v6; + v39 = pGlobalTXT_LocalizationStrings[469];// "You need %d more Skill Points to advance here" + } + else + { + v41 = v7; + v39 = pGlobalTXT_LocalizationStrings[468];// "Clicking here will spend %d Skill Points" + } + sprintfex(Str1, v39, v41); + v13 = Str1; + goto _set_status_and_ret; + } + } + } + } + } + if ( v2->uFrameHeight == 480 ) + break; + --v1; + if ( v1 <= 0 ) + { + zero = 0; + goto LABEL_38; + } + } +} +// 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; +// 506578: using guessed type int uLastPointedObjectID; +// 5075E0: using guessed type int pVisibleWindowsIdxs[20]; +// 5C35BC: using guessed type int bForceDrawStatusBar; +// F8B19C: using guessed type int dword_F8B19C; + +//----- (00421626) -------------------------------------------------------- +GUIWindow *GameUI_InitializeCharacterWindow(unsigned int _this) +{ + unsigned int v1; // edi@1 + GUIWindow *v2; // edi@3 + + ++pIcons_LOD->uTexturePacksCount; + v1 = _this; + if ( !pIcons_LOD->uNumPrevLoadedFiles ) + pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles; + pEventTimer->Pause(); + pAudioPlayer->StopChannels(-1, -1); + bRingsShownInCharScreen = 0; + CharacterUI_LoadPaperdollTextures(); + uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = v1; + v2 = GUIWindow::Create(0, 0, 0x280u, 0x1E0u, WINDOW_CharacterRecord, uActiveCharacter, 0); + pCharacterScreen_StatsBtn = v2->CreateButton( + pViewport->uViewportX + 12, + pViewport->uViewportY + 308, + (papredoll_dbrds[9] != -1 ? pIcons_LOD->pTextures[papredoll_dbrds[9]].uTextureWidth : 24), + (papredoll_dbrds[9] != -1 ? pIcons_LOD->pTextures[papredoll_dbrds[9]].uTextureHeight : 26), + 1, + 0, + 0x73u, + 0, + 0x53u, + pGlobalTXT_LocalizationStrings[216], + (Texture *)(papredoll_dbrds[10] != -1 ? (int)&pIcons_LOD->pTextures[papredoll_dbrds[10]] : 0), + papredoll_dbrds[9] != -1 ? (int)&pIcons_LOD->pTextures[papredoll_dbrds[9]] : 0, + 0); + pCharacterScreen_SkillsBtn = v2->CreateButton( + pViewport->uViewportX + 102, + pViewport->uViewportY + 308, + (papredoll_dbrds[7] != -1 ? pIcons_LOD->pTextures[papredoll_dbrds[7]].uTextureWidth : 24), + (papredoll_dbrds[7] != -1 ? pIcons_LOD->pTextures[papredoll_dbrds[7]].uTextureHeight : 26), + 1, + 0, + 0x72u, + 0, + 0x4Bu, + pGlobalTXT_LocalizationStrings[205], + (Texture *)(papredoll_dbrds[8] != -1 ? (int)&pIcons_LOD->pTextures[papredoll_dbrds[8]] : 0), + papredoll_dbrds[7] != -1 ? (int)&pIcons_LOD->pTextures[papredoll_dbrds[7]] : 0, + 0); + pCharacterScreen_InventoryBtn = v2->CreateButton( + pViewport->uViewportX + 192, + pViewport->uViewportY + 308, + (papredoll_dbrds[5] != -1 ? pIcons_LOD->pTextures[papredoll_dbrds[5]].uTextureWidth : 24), + (papredoll_dbrds[5] != -1 ? pIcons_LOD->pTextures[papredoll_dbrds[5]].uTextureHeight : 26), + 1, + 0, + 0x74u, + 0, + 0x49u, + pGlobalTXT_LocalizationStrings[120], + (Texture *)(papredoll_dbrds[6] != -1 ? (int)&pIcons_LOD->pTextures[papredoll_dbrds[6]] : 0), + papredoll_dbrds[5] != -1 ? (int)&pIcons_LOD->pTextures[papredoll_dbrds[5]] : 0, + 0); + pCharacterScreen_AwardsBtn = v2->CreateButton( + pViewport->uViewportX + 282, + pViewport->uViewportY + 308, + (papredoll_dbrds[3] != -1 ? pIcons_LOD->pTextures[papredoll_dbrds[3]].uTextureWidth : 24), + (papredoll_dbrds[3] != -1 ? pIcons_LOD->pTextures[papredoll_dbrds[3]].uTextureHeight : 26), + 1, + 0, + 0x75u, + 0, + 0x41u, + pGlobalTXT_LocalizationStrings[22], + (Texture *)(papredoll_dbrds[4] != -1 ? (int)&pIcons_LOD->pTextures[papredoll_dbrds[4]] : 0), + papredoll_dbrds[3] != -1 ? (int)&pIcons_LOD->pTextures[papredoll_dbrds[3]] : 0, + 0); + ptr_50767C = v2->CreateButton( + pViewport->uViewportX + 371, + pViewport->uViewportY + 308, + (papredoll_dbrds[1] != -1 ? pIcons_LOD->pTextures[papredoll_dbrds[1]].uTextureWidth : 24), + (papredoll_dbrds[1] != -1 ? pIcons_LOD->pTextures[papredoll_dbrds[1]].uTextureHeight : 26), + 1, + 0, + 0xA8u, + 0, + 0, + pGlobalTXT_LocalizationStrings[79], + (Texture *)(papredoll_dbrds[2] != -1 ? (int)&pIcons_LOD->pTextures[papredoll_dbrds[2]] : 0), + papredoll_dbrds[1] != -1 ? (int)&pIcons_LOD->pTextures[papredoll_dbrds[1]] : 0, + 0); + v2->CreateButton(0, 0, 0x1DCu, 0x159u, 1, 122, 0x78u, 0, 0, nullstring, 0); + ptr_507694 = v2->CreateButton( + 0x258u, + 0x12Cu, + 0x1Eu, + 0x1Eu, + 1, + 0, + 0x55u, + 0, + 0, + pGlobalTXT_LocalizationStrings[64], + 0); + ptr_507690 = v2->CreateButton(0x1DCu, 0, 0xA4u, 0x159u, 1, 0, 0x85u, 0, 0, nullstring, 0); + v2->CreateButton(0x3Du, 0x1A8u, 0x1Fu, 0, 2, 94, 0x6Eu, 1u, 0x31u, nullstring, 0); + v2->CreateButton(0xB1u, 0x1A8u, 0x1Fu, 0, 2, 94, 0x6Eu, 2u, 0x32u, nullstring, 0); + v2->CreateButton(0x124u, 0x1A8u, 0x1Fu, 0, 2, 94, 0x6Eu, 3u, 0x33u, nullstring, 0); + v2->CreateButton(0x197u, 0x1A8u, 0x1Fu, 0, 2, 94, 0x6Eu, 4u, 0x34u, nullstring, 0); + v2->CreateButton(0, 0, 0, 0, 1, 0, 0xB0u, 0, 9u, nullstring, 0); + sub_419100(); + return v2; +} + + + +//----- (004219BE) -------------------------------------------------------- +GUIWindow *stru277::sub_4219BE() +{ + int v1; // esi@1 + GUIWindow *v2; // ebx@1 + + auto a4 = this; + v1 = (int)a4; + pEventTimer->Pause(); + pAudioPlayer->StopChannels(-1, -1); + bRingsShownInCharScreen = 0; + CharacterUI_LoadPaperdollTextures(); + uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = 23; + v2 = GUIWindow::Create(0, 0, 640u, 480u, WINDOW_HouseInterior|WINDOW_Options, v1, 0); + ptr_50767C = v2->CreateButton( + 394u, + 318u, + 75u, + 33u, + 1, + 0, + 0xA8u, + 0, + 0, + pGlobalTXT_LocalizationStrings[79], + (Texture *)(papredoll_dbrds[2] != -1 ? (int)&pIcons_LOD->pTextures[papredoll_dbrds[2]] : 0), + papredoll_dbrds[1] != -1 ? (int)&pIcons_LOD->pTextures[papredoll_dbrds[1]] : 0, + 0); + v2->CreateButton(0, 0, 0x1DCu, 0x159u, 1, 122, 0x78u, 0, 0, nullstring, 0); + ptr_507690 = v2->CreateButton(0x1DCu, 0, 0xA4u, 0x159u, 1, 0, 0x85u, 0, 0, nullstring, 0); + v2->CreateButton(61u, 424u, 0x1Fu, 0, 2, 94, 0x6Eu, 1u, 0x31u, nullstring, 0); + v2->CreateButton(177u, 424u, 0x1Fu, 0, 2, 94, 0x6Eu, 2u, 0x32u, nullstring, 0); + v2->CreateButton(292u, 424u, 0x1Fu, 0, 2, 94, 0x6Eu, 3u, 0x33u, nullstring, 0); + v2->CreateButton(407u, 424u, 0x1Fu, 0, 2, 94, 0x6Eu, 4u, 0x34u, nullstring, 0); + return v2; +} + + +//----- (00421B2C) -------------------------------------------------------- +bool __cdecl sub_421B2C_PlaceInInventory_or_DropPickedItem() +{ + unsigned int v0; // eax@2 + Texture *v1; // ebx@2 + int v2; // eax@3 + Player *v3; // esi@5 + int v4; // eax@6 + unsigned __int16 v5; // dx@11 + signed int v6; // eax@11 + char *v7; // edi@12 + __int16 v8; // ax@16 + LayingItem a1; // [sp+4h] [bp-78h]@11 + int v11; // [sp+74h] [bp-8h]@2 + int v12; // [sp+78h] [bp-4h]@5 + + if ( !pParty->pPickedItem.uItemID ) + return 1; + v0 = pIcons_LOD->LoadTexture( + pItemsTable->pItems[pParty->pPickedItem.uItemID].pIconName, + TEXTURE_16BIT_PALETTE); + v1 = (Texture *)(v0 != -1 ? (int)&pIcons_LOD->pTextures[v0] : 0); + v11 = areWeLoadingTexture; + if ( uActiveCharacter + && (v2 = pPlayers[uActiveCharacter]->AddItem(0xFFFFFFFFu, pParty->pPickedItem.uItemID)) != 0 ) + { + memcpy(&pPlayers[uActiveCharacter]->pDarkSpellbook.bIsSpellAvailable[36 * v2 + 5], &pParty->pPickedItem, 0x24u); + } + else + { + v12 = 0; + v3 = pParty->pPlayers; + while ( 1 ) + { + v4 = v3->AddItem(0xFFFFFFFFu, pParty->pPickedItem.uItemID); + if ( v4 ) + break; + ++v12; + ++v3; + if ( (signed int)v3 >= (signed int)pParty->pHirelings ) + goto LABEL_10; + } + memcpy(&pParty->pPlayers[v12].pDarkSpellbook.bIsSpellAvailable[36 * v4 + 5], &pParty->pPickedItem, 0x24u); + pMouse->RemoveHoldingItem(); +LABEL_10: + if ( v12 != 4 ) + goto LABEL_18; + v5 = pItemsTable->pItems[pParty->pPickedItem.uItemID].uSpriteID; + v6 = 0; + a1.uItemType = pItemsTable->pItems[pParty->pPickedItem.uItemID].uSpriteID; + if ( (signed int)pObjectList->uNumObjects <= 0 ) + { +LABEL_15: + LOWORD(v6) = 0; + } + else + { + v7 = (char *)&pObjectList->pObjects->uObjectID; + while ( v5 != *(short *)v7 ) + { + ++v6; + v7 += 56; + if ( v6 >= (signed int)pObjectList->uNumObjects ) + goto LABEL_15; + } + } + a1.field_58 = 4; + a1.uObjectDescID = v6; + a1.vPosition.y = pParty->vPosition.z; + a1.vPosition.x = pParty->vPosition.x; + a1.vPosition.z = pParty->sEyelevel + pParty->vPosition.y; + a1.uSoundID = 0; + a1.uFacing = 0; + a1.uAttributes = 8; + v8 = pIndoor->GetSector( + pParty->vPosition.x, + pParty->vPosition.z, + pParty->sEyelevel + pParty->vPosition.y); + a1.uSpriteFrameID = 0; + a1.uSectorID = v8; + memcpy(&a1.stru_24, &pParty->pPickedItem, sizeof(a1.stru_24)); + a1.Create(pParty->sRotationY, 184, 200, 0); + } + pMouse->RemoveHoldingItem(); +LABEL_18: + if ( !v11 ) + { + v1->Release(); + pIcons_LOD->_40F9C5(); + } + return 1; +} + + +//----- (00421D00) -------------------------------------------------------- +void __fastcall GameUI_OnPlayerPortraitLeftClick(unsigned int uPlayerID) +{ + unsigned int v1; // esi@1 + int v2; // eax@2 + Player *v3; // ecx@2 + Player *v4; // ecx@5 + unsigned int v5; // [sp-4h] [bp-10h]@21 + + v1 = uPlayerID; + if ( pParty->pPickedItem.uItemID ) + { + v2 = pPlayers[uPlayerID]->AddItem(0xFFFFFFFFu, pParty->pPickedItem.uItemID); + v3 = pPlayers[v1]; + if ( v2 ) + { + memcpy(&v3->pDarkSpellbook.bIsSpellAvailable[36 * v2 + 5], &pParty->pPickedItem, 0x24u); + viewparams->bRedrawGameUI = 1; + pMouse->RemoveHoldingItem(); + return; + } + if ( v3->CanAct() ) + { + v4 = pPlayers[v1]; + } + else + { + if ( !pPlayers[uActiveCharacter]->CanAct() ) + goto LABEL_9; + v4 = pPlayers[uActiveCharacter]; + } + v4->PlaySound(15, 0); + } +LABEL_9: + if ( !uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions ) + { + viewparams->bRedrawGameUI = 1; + if ( uActiveCharacter != v1 ) + goto LABEL_27; + v5 = 7; +LABEL_22: + pGUIWindow_CurrentMenu = GameUI_InitializeCharacterWindow(v5); + return; + } + if ( uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions == 8 ) + return; + if ( uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions == 10 ) + { +LABEL_23: + viewparams->bRedrawGameUI = 1; + if ( uActiveCharacter == v1 ) + { + pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 103; + uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = 15; + goto LABEL_28; + } +LABEL_27: + if ( pPlayers[v1]->uTimeToRecovery ) + return; + goto LABEL_28; + } + if ( uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions != 13 ) + { + if ( uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions == 14 ) + { +LABEL_28: + uActiveCharacter = v1; + return; + } + if ( uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions != 15 ) + { + viewparams->bRedrawGameUI = 1; + uActiveCharacter = v1; + if ( pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] == 102 ) + sub_419100(); + return; + } + goto LABEL_23; + } + if ( ptr_507BC0->field_40 == 1 ) + return; + viewparams->bRedrawGameUI = 1; + if ( uActiveCharacter != v1 ) + goto LABEL_28; + if ( dword_F8B19C == 2 || dword_F8B19C == 6 ) + { + pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 103; + v5 = 14; + goto LABEL_22; + } +} +// 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; +// F8B19C: using guessed type int dword_F8B19C; + +//----- (00421EA6) -------------------------------------------------------- +void __cdecl sub_421EA6_OnInventoryLeftClick() +{ + Player *v0; // ebx@1 + signed int v1; // eax@2 + signed int v2; // ecx@2 + int v3; // eax@2 + char v4; // sf@2 + int v5; // eax@2 + unsigned int v6; // eax@7 + unsigned int v7; // esi@12 + unsigned int v8; // eax@12 + unsigned int v9; // eax@16 + unsigned int v10; // eax@18 + ItemGen this_; // [sp+Ch] [bp-3Ch]@1 + POINT a2; // [sp+30h] [bp-18h]@4 + unsigned int v13; // [sp+38h] [bp-10h]@13 + unsigned int pY; // [sp+3Ch] [bp-Ch]@2 + unsigned int pX; // [sp+40h] [bp-8h]@2 + int a4; // [sp+44h] [bp-4h]@2 + + v0 = pPlayers[uActiveCharacter]; + if ( pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] != 103 + || (pMouse->GetClickPos(&pX, &pY), + v1 = pY - 17, + v2 = pX - 14, + pY = v1, + pX = v2, + v3 = 14 * (v1 >> 5), + v2 >>= 5, + v4 = v2 + v3 < 0, + v5 = v2 + v3, + a4 = v5, + v4) + || v5 > 126 + || pMouse->GetCursorPos(&a2)->x >= 462 + || pMouse->GetCursorPos(&a2)->x < 14 ) + return; + if ( unk_50C9A0 ) + { + v6 = v0->GetItemIDAtInventoryIndex(&a4); + if ( v6 ) + { + *((char *)ptr_507BD4->ptr_1C + 8) &= 0x7Fu; + *((short *)ptr_507BD4->ptr_1C + 2) = uActiveCharacter - 1; + *((int *)ptr_507BD4->ptr_1C + 3) = v6 - 1; + *((short *)ptr_507BD4->ptr_1C + 3) = a4; + ptr_50C9A4 = (ItemGen *)&v0->pDarkSpellbook.bIsSpellAvailable[36 * v6 + 5]; + unk_50C9A0 = 0; + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + pMouse->SetCursorBitmap("MICON1"); + dword_50C9D0 = 113; + dword_50C9D4 = 0; + dword_50C9D8 = 256; + } + return; + } + if ( ptr_50C9A4 ) + return; + v7 = pParty->pPickedItem.uItemID; + v8 = v0->GetItemIDAtInventoryIndex(&a4); + if ( !v7 ) + { + if ( !v8 ) + return; + memcpy(&pParty->pPickedItem, &v0->pDarkSpellbook.bIsSpellAvailable[36 * v8 + 5], sizeof(pParty->pPickedItem)); + v0->RemoveItemAtInventoryIndex(a4); + v9 = pParty->pPickedItem.uItemID; + goto LABEL_24; + } + v13 = v8; + if ( v8 ) + { + a2.y = (LONG)&v0->pDarkSpellbook.bIsSpellAvailable[36 * v8 + 5]; + memcpy(&this_, (const void *)a2.y, sizeof(this_)); + v0->RemoveItemAtInventoryIndex(a4); + pX = v0->AddItem2(a4, &pParty->pPickedItem); + if ( !pX ) + { + pX = v0->AddItem2(0xFFFFFFFFu, &pParty->pPickedItem); + if ( !pX ) + { + v0->_49298B(&this_, v13 - 1, a4); + memcpy((void *)a2.y, &this_, sizeof(ItemGen)); + return; + } + } + v9 = this_.uItemID; + memcpy(&pParty->pPickedItem, &this_, sizeof(pParty->pPickedItem)); +LABEL_24: + pMouse->SetCursorBitmap(pItemsTable->pItems[v9].pIconName); + return; + } + v10 = v0->AddItem(a4, v7); + pX = v10; + if ( v10 || (v10 = v0->AddItem(0xFFFFFFFFu, pParty->pPickedItem.uItemID), (pX = v10) != 0) ) + { + memcpy(&v0->pDarkSpellbook.bIsSpellAvailable[36 * v10 + 5], &pParty->pPickedItem, 0x24u); + pMouse->RemoveHoldingItem(); + } +} + + +//----- (0042213C) -------------------------------------------------------- +void __cdecl OnGameViewportClick() +{ + signed int v0; // ebx@2 + POINT *v1; // esi@3 + signed int v2; // eax@9 + BLVFace *v3; // eax@10 + unsigned int v4; // eax@11 + unsigned __int16 v5; // dx@14 + signed int v6; // eax@14 + char *v7; // esi@15 + int *v8; // eax@19 + int v9; // eax@19 + unsigned int v10; // eax@19 + int v11; // ecx@21 + ODMFace *v12; // eax@22 + LevelDecoration *v13; // esi@24 + __int16 v14; // ax@25 + int v15; // ecx@29 + signed int v16; // edx@30 + Actor *v17; // esi@30 + int v18; // ebx@47 + unsigned __int16 v19; // ax@50 + const char *v20; // eax@51 + signed int v21; // eax@58 + ItemGen *v22; // esi@62 + unsigned int v23; // eax@62 + LayingItem a1; // [sp+Ch] [bp-80h]@1 + POINT v25; // [sp+7Ch] [bp-10h]@3 + POINT a2; // [sp+84h] [bp-8h]@3 + + if ( pRenderer->pRenderD3D ) + { + v0 = pGame->pVisInstance->get_picked_object_zbuf_val(); + } + else + { + v1 = pMouse->GetCursorPos(&a2); + v0 = pRenderer->pActiveZBuffer[v1->x + pSRZBufferLineOffsets[pMouse->GetCursorPos(&v25)->y]]; + } + if ( (v0 & 7) == 2 ) + { + a2.y = (signed int)(unsigned __int16)v0 >> 3; + v21 = (signed int)(unsigned __int16)v0 >> 3; + if ( !(pObjectList->pObjects[pLayingItems[v21].uObjectDescID].uFlags & 0x10) + && a2.y < 1000 + && pLayingItems[v21].uObjectDescID + && (unsigned int)v0 < 0x2000000 ) + { + v22 = &pLayingItems[v21].stru_24; + v23 = pLayingItems[v21].stru_24.uItemID; + if ( pItemsTable->pItems[v23].uEquipType == 18 ) + { + party_finds_gold(v22->uAdditionalValue, 0); + viewparams->bRedrawGameUI = 1; + } + else + { + sprintfex(pTmpBuf2, pGlobalTXT_LocalizationStrings[471], pItemsTable->pItems[v23].pUnidentifiedName); + ShowStatusBarString(pTmpBuf2, 2u); + if ( v22->uItemID == 506 ) + _449B7E_toggle_bit((char *)pParty->_award_bits, 184, 1u); + if ( v22->uItemID == 455 ) + _449B7E_toggle_bit((char *)pParty->_award_bits, 185, 1u); + if ( !pParty->AddItem(v22) ) + pParty->SetHoldingItem(v22); + } + LayingItem::_42F933(a2.y); + return; + } + goto LABEL_13; + } + if ( (v0 & 7) != 3 ) + { + if ( (v0 & 7) == 5 ) + { + v13 = &pLevelDecorations[(signed int)(unsigned __int16)v0 >> 3]; + if ( (signed int)(((unsigned int)v0 >> 16) - pDecorationList->pDecorations[v13->uDecorationDescID].uRadius) >= 512 ) + goto LABEL_13; + v14 = v13->field_16_event_id; + if ( !v14 ) + { + if ( pLevelDecorations[(signed int)(unsigned __int16)v0 >> 3].IsInteractive() ) + { + v15 = stru_5E4C90.field_0[v13->field_1C] + 380; + _5C3420_pDecoration = &pLevelDecorations[(signed int)(unsigned __int16)v0 >> 3]; + EventProcessor(v15, 0, 1); + _5C3420_pDecoration = 0; + } + return; + } + v11 = v14; + } + else + { + if ( (v0 & 7) != 6 || (unsigned int)v0 >= 0x2000000 ) + goto LABEL_13; + v2 = (signed int)(unsigned __int16)v0 >> 3; + if ( uCurrentlyLoadedLevelType == LEVEL_Indoor) + { + v3 = &pIndoor->pFaces[v2]; + if ( !(v3->uAttributes & 0x2000000) ) + { +LABEL_11: + v4 = pParty->pPickedItem.uItemID; + if ( pParty->pPickedItem.uItemID ) + { +LABEL_14: + v5 = pItemsTable->pItems[v4].uSpriteID; + v6 = 0; + a1.uItemType = v5; + if ( (signed int)pObjectList->uNumObjects <= 0 ) + { +LABEL_18: + LOWORD(v6) = 0; + } + else + { + v7 = (char *)&pObjectList->pObjects->uObjectID; + while ( v5 != *(short *)v7 ) + { + ++v6; + v7 += 56; + if ( v6 >= (signed int)pObjectList->uNumObjects ) + goto LABEL_18; + } + } + a1.uObjectDescID = v6; + a1.vPosition.y = pParty->vPosition.z; + a1.field_58 = 4; + a1.vPosition.x = pParty->vPosition.x; + a1.vPosition.z = pParty->sEyelevel + pParty->vPosition.y; + a1.uSoundID = 0; + a1.uFacing = 0; + a1.uAttributes = 8; + a1.uSectorID = pIndoor->GetSector( + pParty->vPosition.x, + pParty->vPosition.z, + pParty->sEyelevel + pParty->vPosition.y); + a1.uSpriteFrameID = 0; + memcpy(&a1.stru_24, &pParty->pPickedItem, 0x24u); + v8 = (int *)pMouse->GetCursorPos(&v25); + v9 = UnprojectX(*v8); + a1.Create(pParty->sRotationY + v9, 184, 200, 0); + v10 = pIcons_LOD->LoadTexture( + pItemsTable->pItems[pParty->pPickedItem.uItemID].pIconName, + TEXTURE_16BIT_PALETTE); + if (v10 != -1) + pIcons_LOD->pTextures[v10].Release(); + pMouse->RemoveHoldingItem(); + pIcons_LOD->_40F9C5(); + return; + } + ShowNothingHereStatus(); +LABEL_13: + v4 = pParty->pPickedItem.uItemID; + if ( !pParty->pPickedItem.uItemID ) + return; + goto LABEL_14; + } + v11 = pIndoor->pFaceExtras[v3->uFaceExtraID].uEventID; + } + else + { + v12 = &pOutdoor->pBModels[(signed int)(unsigned __int16)v0 >> 9].pFaces[v2 & 0x3F]; + if ( !(v12->uFaceAttributes & 0x2000000) ) + goto LABEL_11; + v11 = v12->sCogTriggeredID; + } + } + EventProcessor(v11, (unsigned __int16)v0, 1); + return; + } + v16 = (signed int)(unsigned __int16)v0 >> 3; + a2.y = v16; + v17 = &pActors[v16]; + if ( v17->uAIState == 5 ) + { + if ( (unsigned int)v0 < 0x2000000 ) + { + stru_50C198.LootActor(&pActors[v16]); + return; + } + goto LABEL_13; + } + if ( GetAsyncKeyState(VK_SHIFT) >= 0 ) + { + if ( !v17->GetActorsRelation(0) && !(BYTE2(v17->uAttributes) & 8) ) + { + if ( (unsigned int)v0 >= 0x2000000 ) + goto LABEL_13; + if ( !v17->CanAct() ) + return; + v18 = a2.y; + Actor::FaceObject(a2.y, 4u, 0, 0); + if ( !v17->uNPC_ID ) + { + v19 = pNPCStats->pGroups_copy[v17->uGroup]; + if ( v19 ) + { + v20 = pNPCStats->pCatchPhrases[v19]; + if ( v20 ) + { + pParty->uFlags |= 2u; + strcpy(byte_5B0938, v20); + sub_4451A8_press_any_key(0, 0, 0); + } + } + return; + } + if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) + return; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)161; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v18; +LABEL_42: + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; + ++pMessageQueue_50CBD0->uNumMessages; + return; + } + if ( pParty->bTurnBasedModeOn == 1 && pTurnEngine->field_4 == 3 ) + { + pTurnEngine->field_18 |= 8u; + return; + } + if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + { + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)23; + goto LABEL_41; + } + } + else + { + if ( pParty->bTurnBasedModeOn == 1 && pTurnEngine->field_4 == 3 ) + { + pParty->uFlags |= 8u; + return; + } + if ( uActiveCharacter + && sub_427769_spell(pPlayers[uActiveCharacter]->uQuickSpell) + && (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + { + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)25; +LABEL_41: + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; + goto LABEL_42; + } + } +} + +//----- (004226C2) -------------------------------------------------------- +bool __cdecl sub_4226C2() +{ + if ( uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions + && uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions != 4 + && uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions != 17 ) + { + if ( uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions == 18 ) + return pVideoPlayer->pSmackerMovie != 0; + if ( uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions != 19 ) + return 1; + } + return 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; + +//----- (004226EF) -------------------------------------------------------- +void __fastcall SetUserInterface(int a1, bool bReplace) +{ + int v2; // ecx@2 + unsigned int v3; // eax@7 + unsigned __int16 v4; // dx@7 + unsigned __int16 v5; // cx@7 + unsigned __int16 v6; // [sp-4h] [bp-14h]@7 + + if ( a1 ) + { + v2 = a1 - 1; + if ( v2 ) + { + if ( v2 != 1 ) + return; + if ( bReplace ) + { + pTexture_RightFrame->Reload("ib-r-C.pcx"); + pTexture_BottomFrame->Reload("ib-b-C.pcx"); + pTexture_TopFrame->Reload("ib-t-C.pcx"); + pTexture_LeftFrame->Reload("ib-l-C.pcx"); + pTexture_StatusBar->Reload("IB-Foot-c.pcx"); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_right_panel], "ib-mb-C", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_5079D8], "ib-autmask-c", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_5079B4], "IB-COMP-C", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_5079D0], "IB-InitG-c", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_5079C8], "IB-InitY-c", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_5079CC], "IB-InitR-c", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_507990], "IB-NPCLD-C", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_50798C], "IB-NPCRD-C", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_507980], "ib-autout-C", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_507984], "ib-autin-C", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_50C98C], "IB-selec-C", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_50797C], "ib-m1d-c", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_507978], "ib-m2d-c", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_507974], "ib-m3d-c", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_507970], "ib-m4d-c", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_50796C], "isg-01-c", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_507968], "isg-02-c", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_507964], "isg-03-c", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_507960], "isg-04-c", 2); + pUIAnim_WizardEye->uIconID = pIconsFrameTable->FindIcon("wizeyeC"); + pIconsFrameTable->InitializeAnimation((signed __int16)pUIAnim_WizardEye->uIconID); + pUIAnum_Torchlight->uIconID = pIconsFrameTable->FindIcon("torchC"); + pIconsFrameTable->InitializeAnimation((signed __int16)pUIAnum_Torchlight->uIconID); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_506438], "ib-bcu-c", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_50795C], "evtnpc-c", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_507958], "fr_inven-c", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_Parchment], "parchment", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_5076B4], "cornr_ll-c", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_5076B0], "cornr_lr-c", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_5076AC], "cornr_ul-c", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_5076A8], "cornr_ur-c", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_5076A4], "edge_btm-c", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_5076A0], "edge_lf-c", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_50769C], "edge_rt-c", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_507698], "edge_top-c", 2); + pIcons_LOD->ReloadTexture(pTexture_591428, "endcap-c", 2); + } + else + { + pTexture_RightFrame->Load("ib-r-C.pcx", 0); + pTexture_BottomFrame->Load("ib-b-c.pcx", 0); + pTexture_TopFrame->Load("ib-t-C.pcx", 0); + pTexture_LeftFrame->Load("ib-l-C.pcx", 0); + pTexture_StatusBar->Load("IB-Foot-c.pcx", 0); + uTextureID_right_panel = pIcons_LOD->LoadTexture("ib-mb-C", TEXTURE_16BIT_PALETTE); + dword_5079D8 = pIcons_LOD->LoadTexture("ib-autmask-c", TEXTURE_16BIT_PALETTE); + dword_5079B4 = pIcons_LOD->LoadTexture("IB-COMP-C", TEXTURE_16BIT_PALETTE); + dword_5079D0 = pIcons_LOD->LoadTexture("IB-InitG-c", TEXTURE_16BIT_PALETTE); + dword_5079C8 = pIcons_LOD->LoadTexture("IB-InitY-c", TEXTURE_16BIT_PALETTE); + dword_5079CC = pIcons_LOD->LoadTexture("IB-InitR-c", TEXTURE_16BIT_PALETTE); + uTextureID_507990 = pIcons_LOD->LoadTexture("IB-NPCLD-C", TEXTURE_16BIT_PALETTE); + uTextureID_50798C = pIcons_LOD->LoadTexture("IB-NPCRD-C", TEXTURE_16BIT_PALETTE); + uTextureID_507980 = pIcons_LOD->LoadTexture("ib-autout-C", TEXTURE_16BIT_PALETTE); + uTextureID_507984 = pIcons_LOD->LoadTexture("ib-autin-C", TEXTURE_16BIT_PALETTE); + dword_50C98C = pIcons_LOD->LoadTexture("IB-selec-C", TEXTURE_16BIT_PALETTE); + uTextureID_50797C = pIcons_LOD->LoadTexture("ib-m1d-c", TEXTURE_16BIT_PALETTE); + uTextureID_507978 = pIcons_LOD->LoadTexture("ib-m2d-c", TEXTURE_16BIT_PALETTE); + dword_507974 = pIcons_LOD->LoadTexture("ib-m3d-c", TEXTURE_16BIT_PALETTE); + uTextureID_507970 = pIcons_LOD->LoadTexture("ib-m4d-c", TEXTURE_16BIT_PALETTE); + uTextureID_506438 = pIcons_LOD->LoadTexture("ib-bcu-c", TEXTURE_16BIT_PALETTE); + dword_50796C = pIcons_LOD->LoadTexture("isg-01-c", TEXTURE_16BIT_PALETTE); + dword_507968 = pIcons_LOD->LoadTexture("isg-02-c", TEXTURE_16BIT_PALETTE); + dword_507964 = pIcons_LOD->LoadTexture("isg-03-c", TEXTURE_16BIT_PALETTE); + dword_507960 = pIcons_LOD->LoadTexture("isg-04-c", TEXTURE_16BIT_PALETTE); + uTextureID_50795C = pIcons_LOD->LoadTexture("evtnpc-c", TEXTURE_16BIT_PALETTE); + uTextureID_507958 = pIcons_LOD->LoadTexture("fr_inven", TEXTURE_16BIT_PALETTE); + pUIAnim_WizardEye->uIconID = pIconsFrameTable->FindIcon("wizeyeC"); + pIconsFrameTable->InitializeAnimation((signed __int16)pUIAnim_WizardEye->uIconID); + pUIAnum_Torchlight->uIconID = pIconsFrameTable->FindIcon("torchC"); + pIconsFrameTable->InitializeAnimation((signed __int16)pUIAnum_Torchlight->uIconID); + } + v3 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xC8u, 0, 0); + v4 = 0; + v6 = 0; + v5 = 10; + } + else + { + if ( bReplace ) + { + pTexture_RightFrame->Reload("ib-r-a.pcx"); + pTexture_BottomFrame->Reload("ib-b-a.pcx"); + pTexture_TopFrame->Reload("ib-t-a.pcx"); + pTexture_LeftFrame->Reload("ib-l-a.pcx"); + pTexture_StatusBar->Reload("IB-Foot-a.pcx"); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_right_panel], "ib-mb-a", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_5079D8], "ib-autmask-a", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_5079B4], "IB-COMP-a", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_5079D0], "IB-InitG-a", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_5079C8], "IB-InitY-a", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_5079CC], "IB-InitR-a", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_507990], "IB-NPCLD-a", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_50798C], "IB-NPCRD-a", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_507980], "ib-autout-a", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_507984], "ib-autin-a", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_50C98C], "IB-selec-a", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_50797C], "ib-m1d-a", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_507978], "ib-m2d-a", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_507974], "ib-m3d-a", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_507970], "ib-m4d-a", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_50796C], "isg-01-a", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_507968], "isg-02-a", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_507964], "isg-03-a", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_507960], "isg-04-a", 2); + pUIAnim_WizardEye->uIconID = pIconsFrameTable->FindIcon("wizeyeA"); + pIconsFrameTable->InitializeAnimation((signed __int16)pUIAnim_WizardEye->uIconID); + pUIAnum_Torchlight->uIconID = pIconsFrameTable->FindIcon("torchA"); + pIconsFrameTable->InitializeAnimation((signed __int16)pUIAnum_Torchlight->uIconID); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_506438], "ib-bcu-a", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_50795C], "evtnpc", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_507958], "fr_inven", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_Parchment], "parchment", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_5076B4], "cornr_ll", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_5076B0], "cornr_lr", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_5076AC], "cornr_ul", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_5076A8], "cornr_ur", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_5076A4], "edge_btm", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_5076A0], "edge_lf", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_50769C], "edge_rt", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_507698], "edge_top", 2); + pIcons_LOD->ReloadTexture(pTexture_591428, "endcap", 2); + } + else + { + pTexture_RightFrame->Load("ib-r-A.pcx", 0); + pTexture_BottomFrame->Load("ib-b-A.pcx", 0); + pTexture_TopFrame->Load("ib-t-A.pcx", 0); + pTexture_LeftFrame->Load("ib-l-A.pcx", 0); + pTexture_StatusBar->Load("IB-Foot-a.pcx", 0); + uTextureID_right_panel = pIcons_LOD->LoadTexture("ib-mb-A", TEXTURE_16BIT_PALETTE); + dword_5079D8 = pIcons_LOD->LoadTexture("ib-autmask-a", TEXTURE_16BIT_PALETTE); + dword_5079B4 = pIcons_LOD->LoadTexture("IB-COMP-A", TEXTURE_16BIT_PALETTE); + dword_5079D0 = pIcons_LOD->LoadTexture("IB-InitG-a", TEXTURE_16BIT_PALETTE); + dword_5079C8 = pIcons_LOD->LoadTexture("IB-InitY-a", TEXTURE_16BIT_PALETTE); + dword_5079CC = pIcons_LOD->LoadTexture("IB-InitR-a", TEXTURE_16BIT_PALETTE); + uTextureID_507990 = pIcons_LOD->LoadTexture("IB-NPCLD-A", TEXTURE_16BIT_PALETTE); + uTextureID_50798C = pIcons_LOD->LoadTexture("IB-NPCRD-A", TEXTURE_16BIT_PALETTE); + dword_50C98C = pIcons_LOD->LoadTexture("IB-selec-A", TEXTURE_16BIT_PALETTE); + uTextureID_50797C = pIcons_LOD->LoadTexture("ib-m1d-a", TEXTURE_16BIT_PALETTE); + uTextureID_507978 = pIcons_LOD->LoadTexture("ib-m2d-a", TEXTURE_16BIT_PALETTE); + dword_507974 = pIcons_LOD->LoadTexture("ib-m3d-a", TEXTURE_16BIT_PALETTE); + uTextureID_507970 = pIcons_LOD->LoadTexture("ib-m4d-a", TEXTURE_16BIT_PALETTE); + uTextureID_507980 = pIcons_LOD->LoadTexture("ib-autout-a", TEXTURE_16BIT_PALETTE); + uTextureID_507984 = pIcons_LOD->LoadTexture("ib-autin-a", TEXTURE_16BIT_PALETTE); + uTextureID_506438 = pIcons_LOD->LoadTexture("ib-bcu-a", TEXTURE_16BIT_PALETTE); + dword_50796C = pIcons_LOD->LoadTexture("isg-01-a", TEXTURE_16BIT_PALETTE); + dword_507968 = pIcons_LOD->LoadTexture("isg-02-a", TEXTURE_16BIT_PALETTE); + dword_507964 = pIcons_LOD->LoadTexture("isg-03-a", TEXTURE_16BIT_PALETTE); + dword_507960 = pIcons_LOD->LoadTexture("isg-04-a", TEXTURE_16BIT_PALETTE); + uTextureID_50795C = pIcons_LOD->LoadTexture("evtnpc", TEXTURE_16BIT_PALETTE); + uTextureID_507958 = pIcons_LOD->LoadTexture("fr_inven", TEXTURE_16BIT_PALETTE); + pUIAnim_WizardEye->uIconID = pIconsFrameTable->FindIcon("wizeyeA"); + pIconsFrameTable->InitializeAnimation((signed __int16)pUIAnim_WizardEye->uIconID); + pUIAnum_Torchlight->uIconID = pIconsFrameTable->FindIcon("torchA"); + pIconsFrameTable->InitializeAnimation((signed __int16)pUIAnum_Torchlight->uIconID); + uTextureID_Parchment = pIcons_LOD->LoadTexture("parchment", TEXTURE_16BIT_PALETTE); + uTextureID_5076B4 = pIcons_LOD->LoadTexture("cornr_ll", TEXTURE_16BIT_PALETTE); + uTextureID_5076B0 = pIcons_LOD->LoadTexture("cornr_lr", TEXTURE_16BIT_PALETTE); + uTextureID_5076AC = pIcons_LOD->LoadTexture("cornr_ul", TEXTURE_16BIT_PALETTE); + uTextureID_5076A8 = pIcons_LOD->LoadTexture("cornr_ur", TEXTURE_16BIT_PALETTE); + uTextureID_5076A4 = pIcons_LOD->LoadTexture("edge_btm", TEXTURE_16BIT_PALETTE); + uTextureID_5076A0 = pIcons_LOD->LoadTexture("edge_lf", TEXTURE_16BIT_PALETTE); + uTextureID_50769C = pIcons_LOD->LoadTexture("edge_rt", TEXTURE_16BIT_PALETTE); + uTextureID_507698 = pIcons_LOD->LoadTexture("edge_top", TEXTURE_16BIT_PALETTE); + pTexture_591428 = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture("endcap", TEXTURE_16BIT_PALETTE)]; + + } + v3 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xAu, 0, 0); + v4 = 214; + v5 = 230; + v6 = 193; + } + } + else + { + if ( bReplace ) + { + pTexture_RightFrame->Reload("ib-r-B.pcx"); + pTexture_BottomFrame->Reload("ib-b-B.pcx"); + pTexture_TopFrame->Reload("ib-t-B.pcx"); + pTexture_LeftFrame->Reload("ib-l-B.pcx"); + pTexture_StatusBar->Reload("IB-Foot-b.pcx"); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_right_panel], "ib-mb-B", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_5079D8], "ib-autmask-b", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_5079B4], "IB-COMP-B", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_5079D0], "IB-InitG-b", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_5079C8], "IB-InitY-b", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_5079CC], "IB-InitR-b", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_507990], "IB-NPCLD-B", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_50798C], "IB-NPCRD-B", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_507980], "ib-autout-B", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_507984], "ib-autin-B", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_50C98C], "IB-selec-B", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_50797C], "ib-m1d-b", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_507978], "ib-m2d-b", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_507974], "ib-m3d-b", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_507970], "ib-m4d-b", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_50796C], "isg-01-b", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_507968], "isg-02-b", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_507964], "isg-03-b", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[dword_507960], "isg-04-b", 2); + pUIAnim_WizardEye->uIconID = pIconsFrameTable->FindIcon("wizeyeB"); + pIconsFrameTable->InitializeAnimation((signed __int16)pUIAnim_WizardEye->uIconID); + pUIAnum_Torchlight->uIconID = pIconsFrameTable->FindIcon("torchB"); + pIconsFrameTable->InitializeAnimation((signed __int16)pUIAnum_Torchlight->uIconID); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_506438], "ib-bcu-b", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_50795C], "evtnpc-b", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_507958], "fr_inven-b", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_Parchment], "parchment", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_5076B4], "cornr_ll-b", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_5076B0], "cornr_lr-b", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_5076AC], "cornr_ul-b", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_5076A8], "cornr_ur-b", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_5076A4], "edge_btm-b", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_5076A0], "edge_lf-b", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_50769C], "edge_rt-b", 2); + pIcons_LOD->ReloadTexture(&pIcons_LOD->pTextures[uTextureID_507698], "edge_top-b", 2); + pIcons_LOD->ReloadTexture(pTexture_591428, "endcap-b", 2); + } + v3 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0, 0, 0xC8u); + v5 = 255; + v4 = 225; + v6 = 255; + } + uGameUIFontMain = v3; + uGameUIFontShadow = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(v5, v4, v6); +} + + + +//----- (00423AEE) -------------------------------------------------------- +void __cdecl reset_some_strus_flt_2Cs() +{ + float *v0; // eax@1 + signed int v1; // ecx@1 + signed int v2; // edx@1 + float *v3; // eax@3 + signed int v4; // edx@3 + float *v5; // eax@5 + signed int v6; // edx@5 + float *v7; // eax@7 + signed int v8; // edx@7 + float *v9; // eax@9 + + v0 = &array_50AC10[0].flt_2C; + v1 = 50; + v2 = 50; + do + { + *v0 = 0.0; + v0 += 12; + --v2; + } + while ( v2 ); + v3 = &array_50A2B0[0].flt_2C; + v4 = 50; + do + { + *v3 = 0.0; + v3 += 12; + --v4; + } + while ( v4 ); + v5 = &array_509950[0].flt_2C; + v6 = 50; + do + { + *v5 = 0.0; + v5 += 12; + --v6; + } + while ( v6 ); + v7 = &array_508FF0[0].flt_2C; + v8 = 50; + do + { + *v7 = 0.0; + v7 += 12; + --v8; + } + while ( v8 ); + v9 = &array_508690[0].flt_2C; + do + { + *v9 = 0.0; + v9 += 12; + --v1; + } + while ( v1 ); +} + +//----- (00423B4A) -------------------------------------------------------- +void __cdecl sub_423B4A() +{ + float *v0; // eax@1 + signed int v1; // ecx@1 + + v0 = &array_507D30[0].flt_2C; + v1 = 50; + do + { + *v0 = 0.0; + v0 += 12; + --v1; + } + while ( v1 ); +} + +//----- (00423B5D) -------------------------------------------------------- +int __fastcall sub_423B5D(unsigned int uFaceID) +{ + BLVFace *v1; // ebx@1 + Vec3_short_ *v2; // esi@1 + int v3; // ST28_4@1 + __int16 v4; // ST2C_2@1 + signed int v5; // esi@1 + Vec3_short_ *v6; // eax@4 + signed int v7; // edi@5 + signed int v8; // eax@5 + signed int i_; // ecx@10 + int v10; // eax@10 + int v11; // edx@11 + int v12; // ST28_4@12 + signed int v13; // edx@12 + signed __int64 v14; // qtt@12 + int *v15; // ebx@12 + int v16; // ST28_4@14 + signed int v17; // eax@14 + signed __int64 v18; // qtt@14 + signed int v19; // edx@15 + signed int v20; // edx@17 + signed int v21; // ebx@19 + signed int v22; // esi@20 + int v23; // edi@21 + int v24; // eax@21 + int v25; // eax@22 + signed int v26; // ST30_4@24 + signed __int64 v27; // qtt@24 + int v28; // ST18_4@25 + int v29; // eax@26 + int v30; // eax@27 + signed int v31; // ST30_4@29 + signed __int64 v32; // qtt@29 + int v33; // ST30_4@30 + signed int v34; // edi@31 + unsigned int v35; // eax@31 + bool v36; // edx@31 + int v37; // ecx@31 + int v38; // ecx@32 + int v39; // esi@32 + int v40; // eax@34 + signed int v41; // ebx@41 + unsigned int v42; // eax@41 + signed int v43; // ecx@42 + int v44; // esi@42 + int v45; // eax@44 + signed int v46; // edi@51 + unsigned int v47; // eax@51 + bool v48; // edx@51 + int v49; // ecx@51 + int v50; // ecx@52 + signed int v51; // esi@52 + int v52; // eax@54 + int v53; // ebx@61 + unsigned int v54; // eax@61 + signed int v55; // ecx@62 + int v56; // esi@62 + int v57; // eax@64 + char v59; // zf@72 + signed int v60; // edx@75 + int v61; // ecx@76 + int v62; // esi@76 + int v63; // ecx@83 + signed int v64; // [sp+14h] [bp-14h]@3 + int v65; // [sp+14h] [bp-14h]@34 + int v66; // [sp+14h] [bp-14h]@44 + int v67; // [sp+14h] [bp-14h]@54 + int v68; // [sp+14h] [bp-14h]@64 + signed int v69; // [sp+14h] [bp-14h]@75 + IndoorCameraD3D *_this; // [sp+18h] [bp-10h]@1 + bool thisa; // [sp+18h] [bp-10h]@9 + int thisb; // [sp+18h] [bp-10h]@12 + int thisc; // [sp+18h] [bp-10h]@20 + bool thisd; // [sp+18h] [bp-10h]@41 + bool thise; // [sp+18h] [bp-10h]@61 + int thisf; // [sp+18h] [bp-10h]@74 + signed int v77; // [sp+1Ch] [bp-Ch]@9 + int v78; // [sp+1Ch] [bp-Ch]@76 + bool v79; // [sp+20h] [bp-8h]@10 + bool v80; // [sp+20h] [bp-8h]@32 + bool v81; // [sp+20h] [bp-8h]@42 + bool v82; // [sp+20h] [bp-8h]@52 + bool v83; // [sp+20h] [bp-8h]@62 + signed int i; // [sp+24h] [bp-4h]@9 + signed int ia; // [sp+24h] [bp-4h]@19 + signed int ib; // [sp+24h] [bp-4h]@31 + signed int ic; // [sp+24h] [bp-4h]@41 + signed int id; // [sp+24h] [bp-4h]@51 + signed int ie; // [sp+24h] [bp-4h]@61 + + v1 = &pIndoor->pFaces[uFaceID]; + _this = pGame->pIndoorCameraD3D; + v2 = &pIndoor->pVertices[*v1->pVertexIDs]; + v3 = *(int *)&v2->x; + v4 = v2->z; + v5 = 0; + if ( v1->pFacePlane_old.vNormal.x * ((signed __int16)v3 - pBLVRenderParams->vPartyPos.x) + + v1->pFacePlane_old.vNormal.y * (SHIWORD(v3) - pBLVRenderParams->vPartyPos.y) + + v1->pFacePlane_old.vNormal.z * (v4 - pBLVRenderParams->vPartyPos.z) < 0 ) + { + dword_50B700 = 1; + } + else + { + dword_50B700 = 0; + if ( !(v1->uAttributes & 1) ) + return 0; + } + v64 = v1->uNumVertices; + if ( (signed int)v1->uNumVertices > 0 ) + { + do + { + v6 = &pIndoor->pVertices[v1->pVertexIDs[v5]]; + _this->ApplyViewTransform_TrueIfStillVisible( + v6->x, + v6->y, + v6->z, + &_50B924_view_transformed_xs[v5], + &_50B834_view_transformed_zs[v5], + &_50B744_view_transformed_ys[v5], + 0); + ++v5; + } + while ( v5 < v64 ); + } + v7 = v64; + v8 = 0; + if ( v64 <= 0 ) + return 0; + do + { + if ( _50B924_view_transformed_xs[v8] >= 524288 ) + break; + ++v8; + } + while ( v8 < v64 ); + if ( v8 >= v64 ) + return 0; + v77 = 0; + _50B924_view_transformed_xs[v64] = _50B924_view_transformed_xs[0]; + _50B834_view_transformed_zs[v64] = _50B834_view_transformed_zs[0]; + _50B744_view_transformed_ys[v64] = _50B744_view_transformed_ys[0]; + thisa = _50B924_view_transformed_xs[0] >= 524288; + i = 1; + if ( v64 >= 1 ) + { + do + { + i_ = i; + v10 = _50B924_view_transformed_xs[i]; + v79 = v10 >= 524288; + if ( thisa ^ v79 ) + { + v11 = _50B924_view_transformed_xs_minus1[i_]; + if ( v10 >= 524288 ) + { + v12 = v10 - v11; + v13 = 524288 - v11; + LODWORD(v14) = v13 << 16; + HIDWORD(v14) = v13 >> 16; + v15 = &_50B744_view_transformed_ys_minus1[i_]; + dword_50B828[v77] = ((unsigned __int64)((_50B834_view_transformed_zs[i_] - _50B834_view_transformed_zs_minus1[i_]) + * v14 + / v12) >> 16) + + _50B834_view_transformed_zs_minus1[i_]; + thisb = (unsigned __int64)((_50B744_view_transformed_ys[i_] - _50B744_view_transformed_ys_minus1[i_]) * v14 / v12) >> 16; + } + else + { + v16 = v11 - v10; + v17 = 524288 - v10; + LODWORD(v18) = v17 << 16; + HIDWORD(v18) = v17 >> 16; + v15 = &_50B744_view_transformed_ys[i_]; + dword_50B828[v77] = ((unsigned __int64)((_50B834_view_transformed_zs_minus1[i_] - _50B834_view_transformed_zs[i_]) + * v18 + / v16) >> 16) + + _50B834_view_transformed_zs[i_]; + thisb = (unsigned __int64)((_50B744_view_transformed_ys_minus1[i_] - _50B744_view_transformed_ys[i_]) * v18 / v16) >> 16; + } + v19 = v77++; + v7 = v64; + dword_50B738[v19] = thisb + *v15; + dword_50B918[v19] = 524288; + } + if ( v79 ) + { + v20 = v77++; + dword_50B918[v20] = _50B924_view_transformed_xs[i_]; + dword_50B828[v20] = _50B834_view_transformed_zs[i_]; + dword_50B738[v20] = _50B744_view_transformed_ys[i_]; + } + ++i; + thisa = v79; + } + while ( i <= v7 ); + } + ia = 0; + v21 = v77; + dword_50B918[v77] = dword_50B918[0]; + dword_50B828[v77] = dword_50B828[0]; + for ( dword_50B738[v77] = dword_50B738[0]; ia < v77; dword_50BA08[v22] = pBLVRenderParams->uViewportCenterY - v33 ) + { + v22 = ia; + thisc = abs(dword_50B918[ia]); + if ( abs(dword_50B828[ia]) >> 13 <= thisc ) + { + v26 = dword_50B828[v22]; + LODWORD(v27) = v26 << 16; + HIDWORD(v27) = v26 >> 16; + v25 = v27 / dword_50B918[v22]; + v23 = 0; + } + else + { + v23 = 0; + v24 = 0; + if ( dword_50B828[v22] >= 0 ) + { + LOBYTE(v24) = dword_50B918[v22] >= 0; + v25 = ((v24 - 1) & 0xFF800000) + 0x400000; + } + else + { + LOBYTE(v24) = dword_50B918[v22] >= 0; + v25 = ((unsigned int)&array_77EC08[1975].pEdgeList1[1] & (v24 - 1)) - 4194304; + } + } + v28 = dword_50B738[v22]; + dword_50BAF8_xs[v22] = v25; + if ( abs(v28) >> 13 <= thisc ) + { + v31 = dword_50B738[v22]; + LODWORD(v32) = v31 << 16; + HIDWORD(v32) = v31 >> 16; + v30 = v32 / dword_50B918[v22]; + } + else + { + v29 = 0; + if ( dword_50B738[v22] >= v23 ) + { + LOBYTE(v29) = dword_50B918[v22] >= v23; + v30 = ((v29 - 1) & 0xFF800000) + 4194304; + } + else + { + LOBYTE(v29) = dword_50B918[v22] >= v23; + v30 = ((unsigned int)&array_77EC08[1975].pEdgeList1[1] & (v29 - 1)) - 4194304; + } + } + dword_50BA08[v22] = v30; + dword_50BAF8_xs[v22] = (unsigned __int64)(SHIWORD(pBLVRenderParams->field_40) * (signed __int64)dword_50BAF8_xs[v22]) >> 16; + v33 = (unsigned __int64)(SHIWORD(pBLVRenderParams->field_40) * (signed __int64)dword_50BA08[v22]) >> 16; + dword_50BAF8_xs[v22] = pBLVRenderParams->uViewportCenterX - dword_50BAF8_xs[v22]; + ++ia; + } + v34 = 0; + dword_50BAF8_xs[v21] = dword_50BAF8_xs[0]; + dword_50BA08[v21] = dword_50BA08[0]; + v35 = pBLVRenderParams->uViewportX; + v36 = dword_50BAF8_xs[0] < (signed int)pBLVRenderParams->uViewportX; + LOBYTE(v36) = dword_50BAF8_xs[0] >= (signed int)pBLVRenderParams->uViewportX; + v37 = 1; + ib = 1; + if ( v77 < 1 ) + return 0; + do + { + v38 = v37; + v39 = dword_50BAF8_xs[v38]; + v80 = v39 >= (signed int)v35; + if ( v36 ^ v80 ) + { + if ( v39 >= (signed int)v35 ) + { + v65 = (signed int)(v35 - dword_50BAF4[v38]) + * (signed __int64)(dword_50BA08[v38] - dword_50B9F8[v38 + 3]) + / (v39 - dword_50BAF4[v38]); + v40 = dword_50B9F8[v38 + 3]; + } + else + { + v65 = (signed int)(v35 - v39) + * (signed __int64)(dword_50B9F8[v38 + 3] - dword_50BA08[v38]) + / (dword_50BAF4[v38] - v39); + v40 = dword_50BA08[v38]; + } + ++v34; + dword_50B9F8[v34] = v65 + v40; + v35 = pBLVRenderParams->uViewportX; + dword_50BAE8[v34] = pBLVRenderParams->uViewportX; + } + v36 = v80; + if ( v80 ) + { + dword_50BAEC_xs[v34] = dword_50BAF8_xs[v38]; + dword_50B9F8[v34++ + 1] = dword_50BA08[v38]; + } + v37 = ib++ + 1; + } + while ( ib <= v77 ); + if ( !v34 + || (v41 = 0, + dword_50BAEC_xs[v34] = dword_50BAEC_xs[0], + dword_50B9F8[v34 + 1] = dword_50B9F8[1], + v42 = pBLVRenderParams->uViewportZ, + thisd = dword_50BAEC_xs[0] <= (signed int)pBLVRenderParams->uViewportZ, + ic = 1, + v34 < 1) ) + return 0; + do + { + v43 = ic; + v44 = dword_50BAEC_xs[ic]; + v81 = v44 <= (signed int)v42; + if ( thisd ^ v81 ) + { + if ( v44 <= (signed int)v42 ) + { + v66 = (signed int)(v42 - dword_50BAE8[v43]) + * (signed __int64)(dword_50B9F8[v43 + 1] - dword_50B9F8[v43]) + / (v44 - dword_50BAE8[v43]); + v45 = dword_50B9F8[v43]; + } + else + { + v66 = (signed int)(v42 - v44) + * (signed __int64)(dword_50B9F8[v43] - dword_50B9F8[v43 + 1]) + / (dword_50BAE8[v43] - v44); + v45 = dword_50B9F8[v43 + 1]; + } + ++v41; + dword_50B9EC[v41] = v66 + v45; + v42 = pBLVRenderParams->uViewportZ; + dword_50BADC_xs[v41] = pBLVRenderParams->uViewportZ; + } + if ( v81 ) + { + dword_50BAE0[v41] = dword_50BAEC_xs[v43]; + dword_50B9F0[v41++] = dword_50B9F8[v43 + 1]; + } + ++ic; + thisd = v81; + } + while ( ic <= v34 ); + if ( !v41 + || (v46 = 0, + dword_50BAE0[v41] = dword_50BAE0[0], + dword_50B9F0[v41] = dword_50B9F0[0], + v47 = pBLVRenderParams->uViewportY, + v48 = dword_50B9F0[0] < (signed int)pBLVRenderParams->uViewportY, + LOBYTE(v48) = dword_50B9F0[0] >= (signed int)pBLVRenderParams->uViewportY, + v49 = 1, + id = 1, + v41 < 1) ) + return 0; + do + { + v50 = v49; + v51 = dword_50B9F0[v50]; + v82 = v51 >= (signed int)v47; + if ( v48 ^ v82 ) + { + if ( v51 >= (signed int)v47 ) + { + v67 = (signed int)(v47 - dword_50B9EC[v50]) + * (signed __int64)(dword_50BAE0[v50] - dword_50BADC_xs[v50]) + / (v51 - dword_50B9EC[v50]); + v52 = dword_50BADC_xs[v50]; + } + else + { + v67 = (signed int)(v47 - v51) + * (signed __int64)(dword_50BADC_xs[v50] - dword_50BAE0[v50]) + / (dword_50B9EC[v50] - v51); + v52 = dword_50BAE0[v50]; + } + ++v46; + dword_50BAD0[v46] = v67 + v52; + v47 = pBLVRenderParams->uViewportY; + dword_50B9E0_ys[v46] = pBLVRenderParams->uViewportY; + } + v48 = v82; + if ( v82 ) + { + dword_50BAD4[v46] = dword_50BAE0[v50]; + dword_50B9E0_ys[v46++ + 1] = dword_50B9F0[v50]; + } + v49 = id++ + 1; + } + while ( id <= v41 ); + if ( !v46 + || (v53 = 0, + dword_50BAD4[v46] = dword_50BAD4[0], + dword_50B9E0_ys[v46 + 1] = dword_50B9E0_ys[1], + v54 = pBLVRenderParams->uViewportW, + thise = dword_50B9E0_ys[1] <= (signed int)pBLVRenderParams->uViewportW, + ie = 1, + v46 < 1) ) + return 0; + do + { + v55 = ie; + v56 = dword_50B9E0_ys[ie + 1]; + v83 = v56 <= (signed int)v54; + if ( thise ^ v83 ) + { + if ( v56 <= (signed int)v54 ) + { + v68 = (signed int)(v54 - dword_50B9E0_ys[v55]) + * (signed __int64)(dword_50BAD4[v55] - dword_50BAD0[v55]) + / (v56 - dword_50B9E0_ys[v55]); + v57 = dword_50BAD0[v55]; + } + else + { + v68 = (signed int)(v54 - v56) + * (signed __int64)(dword_50BAD0[v55] - dword_50BAD4[v55]) + / (dword_50B9E0_ys[v55] - v56); + v57 = dword_50BAD4[v55]; + } + ++v53; + dword_50BAC4[v53] = v68 + v57; + v54 = pBLVRenderParams->uViewportW; + unk_50B9D4[v53] = pBLVRenderParams->uViewportW; + } + if ( v83 ) + { + dword_50BAC8[v53] = dword_50BAD4[v55]; + dword_50B9D8_ys[v53++] = dword_50B9E0_ys[v55 + 1]; + } + ++ie; + thise = v83; + } + while ( ie <= v46 ); + if ( !v53 ) + return 0; + v59 = pRenderer->pRenderD3D == 0; + dword_50BAC8[v53] = dword_50BAC8[0]; + dword_50B9D8_ys[v53] = dword_50B9D8_ys[0]; + if ( v59 && v53 > 3 ) + { + dword_50BAC8[v53 + 1] = dword_50BAC8[1]; + dword_50B9D8_ys[v53 + 1] = dword_50B9D8_ys[1]; + thisf = 2 * (dword_50B700 != 0) - 1; + if ( v53 > 0 ) + { + v60 = 1; + v69 = 1; + do + { + v61 = v60 - 1; + v62 = v60 + 1; + v78 = v60 + 1; + if ( v60 - 1 >= v53 ) + v61 -= v53; + if ( v60 >= v53 ) + v60 -= v53; + if ( v62 >= v53 ) + v62 -= v53; + if ( thisf + * ((dword_50B9D8_ys[v62] - dword_50B9D8_ys[v61]) * (dword_50BAC8[v60] - dword_50BAC8[v61]) + - (dword_50B9D8_ys[v60] - dword_50B9D8_ys[v61]) * (dword_50BAC8[v62] - dword_50BAC8[v61])) < 0 ) + { + v60 = v78; + v69 = v78; + } + else + { + v60 = v69; + v63 = v69; + if ( v69 < v53 || (v63 = v69 - v53, v69 - v53 < v53) ) + { + memcpy(&dword_50B9D8_ys[v63], &dword_50B9D8_ys[v63 + 1], 4 * ((unsigned int)(4 * (v53 - v63)) >> 2)); + memcpy(&dword_50BAC8[v63], &dword_50BAC8[v63 + 1], 4 * ((unsigned int)(4 * (v53 - v63)) >> 2)); + } + --v53; + } + } + while ( v60 - 1 < v53 ); + } + dword_50BAC8[v53] = dword_50BAC8[0]; + dword_50B9D8_ys[v53] = dword_50B9D8_ys[0]; + } + return v53; +} + + +//----- (00424579) -------------------------------------------------------- +int __fastcall sub_424579(int uFaceID, stru320 *a2) +{ + __debugbreak(); + return 0; + /*BLVFace *v2; // eax@1 + Vec3_short_ *v3; // ebx@1 + Vec3_short_ *v4; // esi@1 + unsigned int v5; // esi@3 + int v7; // ST1C_4@5 + int v8; // ST1C_4@5 + int v9; // ST1C_4@5 + int v10; // ST1C_4@5 + int v11; // esi@5 + int v12; // ST1C_4@5 + unsigned int v15; // ecx@8 + unsigned int v19; // ecx@13 + signed int v20; // ecx@16 + signed int result; // eax@20 + signed int v24; // edx@22 + unsigned int v25; // [sp+Ch] [bp-1Ch]@3 + float v26; // [sp+14h] [bp-14h]@3 + float v27; // [sp+1Ch] [bp-Ch]@3 + float v28; // [sp+20h] [bp-8h]@3 + signed int v29; // [sp+24h] [bp-4h]@3 + + v2 = &pIndoor->pFaces[uFaceID]; + v3 = pIndoor->pVertices; + v4 = &pIndoor->pVertices[*v2->pVertexIDs]; + if ( v2->pFacePlane_old.vNormal.x * ((signed __int16)*(int *)&v4->x - pBLVRenderParams->vPartyPos.x) + + v2->pFacePlane_old.vNormal.y * ((signed __int16)(*(int *)&v4->x >> 16) - pBLVRenderParams->vPartyPos.y) + + v2->pFacePlane_old.vNormal.z * (v4->z - pBLVRenderParams->vPartyPos.z) < 0 ) + { + dword_50B700 = 1; + } + else + { + dword_50B700 = 0; + if ( !(v2->uAttributes & 1) ) + return 0; + } + v29 = 0; + v5 = v2->uNumVertices; + __asm { fld pBLVRenderParams->fCosineY } + v28 = pBLVRenderParams->fSineY; + v26 = pBLVRenderParams->fCosineNegX; + v27 = pBLVRenderParams->fSineNegX; + v25 = v5; + if ( (signed int)v5 > 0 ) + { + _ECX = (char *)&array_50AC10[0].vWorldPosition.z; + do + { + v7 = v3[v2->pVertexIDs[v29]].x; + __asm + { + fild [ebp+var_10] + fstp dword ptr [ecx-8] + } + v8 = v3[v2->pVertexIDs[v29]].y; + __asm + { + fild [ebp+var_10] + fstp dword ptr [ecx-4] + } + v9 = v3[v2->pVertexIDs[v29]].z; + __asm + { + fild [ebp+var_10] + fstp dword ptr [ecx] + } + _ECX += 48; + v10 = a2->pDeltaUV[0] + v2->pVertexUIDs[v29]; + __asm + { + fild [ebp+var_10] + fstp dword ptr [ecx-14h] + } + v11 = a2->pDeltaUV[1] + v2->pVertexVIDs[v29++]; + v12 = v11; + v5 = v25; + __asm + { + fild [ebp+var_10] + fstp dword ptr [ecx-10h] + } + } + while ( v29 < (signed int)v25 ); + } + _EDX = (char *)&array_50AC10[0].vWorldViewPosition; + if ( pBLVRenderParams->sPartyRotX ) + { + if ( (signed int)v5 > 0 ) + { + __asm + { + fild pBLVRenderParams->vPartyPos.x + fild pBLVRenderParams->vPartyPos.y + fild pBLVRenderParams->vPartyPos.z + } + _EAX = (char *)&array_50AC10[0].vWorldPosition.z; + v15 = v5; + do + { + __asm + { + fld dword ptr [eax-8] + fsub st, st(3) + fld dword ptr [eax-4] + fsub st, st(3) + fld st(1) + fmul st, st(6) + fld st(1) + fmul [ebp+var_8] + fsubp st(1), st + fstp [ebp+var_4] + fld dword ptr [eax] + fsub st, st(3) + } + _EAX += 48; + --v15; + __asm + { + fstp [ebp+var_10] + fld [ebp+var_4] + fmul [ebp+var_14] + fld [ebp+var_10] + fmul [ebp+var_C] + fsubp st(1), st + fstp dword ptr [eax-2Ch] + fld st(1) + fmul [ebp+var_8] + fld st(1) + fmul st, st(7) + faddp st(1), st + fstp dword ptr [eax-28h] + fstp st + fstp st + fld [ebp+var_4] + fmul [ebp+var_C] + fld [ebp+var_10] + fmul [ebp+var_14] + faddp st(1), st + fstp dword ptr [eax-24h] + } + } + while ( v15 ); +LABEL_15: + __asm + { + fstp st + fstp st + fstp st + } + goto LABEL_16; + } + } + else + { + if ( (signed int)v5 > 0 ) + { + __asm + { + fild pBLVRenderParams->vPartyPos.x + fild pBLVRenderParams->vPartyPos.y + fild pBLVRenderParams->vPartyPos.z + } + _EAX = (char *)&array_50AC10[0].vWorldViewPosition; + v19 = v5; + do + { + __asm + { + fld dword ptr [eax-0Ch] + fsub st, st(3) + fld dword ptr [eax-8] + fsub st, st(3) + fld st(1) + fmul st, st(6) + fld st(1) + fmul [ebp+var_8] + fsubp st(1), st + fstp dword ptr [eax] + fld st(1) + fmul [ebp+var_8] + fld st(1) + fmul st, st(7) + } + _EAX += 48; + --v19; + __asm + { + faddp st(1), st + fstp dword ptr [eax-2Ch] + fstp st + fstp st + fld dword ptr [eax-34h] + fsub st, st(1) + fstp dword ptr [eax-28h] + } + } + while ( v19 ); + goto LABEL_15; + } + } +LABEL_16: + v20 = 0; + __asm { fstp st } + if ( (signed int)v5 <= 0 ) + return 0; + do + { + __asm + { + fld dword ptr [edx] + fcomp ds:flt_4D8524 + fnstsw ax + } + if ( !(HIBYTE(_AX) & 1) ) + break; + ++v20; + _EDX += 48; + } + while ( v20 < (signed int)v5 ); + if ( v20 >= (signed int)v5 ) + return 0; + result = sr_424CD7(v5); + if ( result > 0 ) + { + __asm { fild pBLVRenderParams->field_40 } + _ECX = (char *)&array_507D30[0].vWorldViewPosition; + v24 = result; + __asm + { + fmul ds:flt_4D84A4 + fild pBLVRenderParams->uViewportCenterX + fild pBLVRenderParams->uViewportCenterY + } + do + { + __asm + { + fld1 + fdiv dword ptr [ecx] + } + _ECX += 48; + --v24; + __asm + { + fld st + fmul dword ptr [ecx-2Ch] + fmul st, st(4) + fsubr st, st(3) + fstp dword ptr [ecx-24h] + fmul dword ptr [ecx-28h] + fmul st, st(3) + fsubr st, st(1) + fstp dword ptr [ecx-20h] + } + } + while ( v24 ); + __asm + { + fstp st + fstp st + fstp st + } + } + memcpy(&array_507D30[result], array_507D30, sizeof(array_507D30[result])); + return result;*/ +} + + +//----- (00424829) -------------------------------------------------------- +bool __fastcall sub_424829(int a1, stru170_stru2 *a2, stru170_stru2 *a3, int a4) +{ + int v4; // edi@1 + stru170_stru2 *v5; // ebx@1 + int v6; // eax@3 + int v7; // esi@5 + int v8; // edx@5 + int v9; // ecx@6 + int v10; // eax@12 + int v11; // edi@13 + int v12; // edx@18 + int v13; // eax@22 + int v14; // edi@28 + int v15; // ecx@29 + int v16; // edi@30 + int v17; // edx@35 + int v18; // eax@39 + int v19; // eax@44 + int v20; // ecx@44 + int v21; // edi@45 + int v22; // edi@46 + __int16 *v23; // ecx@47 + int v24; // edx@48 + int v25; // eax@50 + int v26; // eax@55 + signed int v27; // edi@55 + int v28; // edx@56 + int v29; // edx@57 + int v30; // eax@59 + int v31; // eax@64 + signed int v32; // edi@64 + int v33; // edx@65 + __int16 *v34; // eax@66 + __int16 v35; // dx@66 + __int16 v36; // dx@67 + __int16 v37; // di@67 + __int16 v38; // dx@67 + stru170_stru2 *v39; // ecx@69 + int v40; // edx@69 + int v41; // edi@70 + __int16 *v42; // eax@76 + __int16 *v43; // eax@81 + __int16 *v45; // eax@87 + int v46; // edx@87 + __int16 v47; // cx@88 + int v48; // eax@93 + int v49; // esi@93 + __int16 *v50; // ecx@94 + int v51; // eax@95 + int v52; // eax@97 + int v53; // [sp+Ch] [bp-34h]@44 + int v54; // [sp+10h] [bp-30h]@0 + int v55; // [sp+14h] [bp-2Ch]@12 + __int16 *v56; // [sp+14h] [bp-2Ch]@47 + __int16 *v57; // [sp+14h] [bp-2Ch]@76 + __int16 *v58; // [sp+14h] [bp-2Ch]@81 + __int16 *v59; // [sp+14h] [bp-2Ch]@87 + stru170_stru2 *v60; // [sp+18h] [bp-28h]@1 + int v61; // [sp+1Ch] [bp-24h]@29 + int v62; // [sp+20h] [bp-20h]@0 + signed int v63; // [sp+24h] [bp-1Ch]@3 + signed int v64; // [sp+28h] [bp-18h]@3 + int v65; // [sp+2Ch] [bp-14h]@5 + int v66; // [sp+2Ch] [bp-14h]@39 + int v67; // [sp+30h] [bp-10h]@22 + int v68; // [sp+34h] [bp-Ch]@12 + int v69; // [sp+34h] [bp-Ch]@29 + int v70; // [sp+34h] [bp-Ch]@46 + int v71; // [sp+34h] [bp-Ch]@75 + int v72; // [sp+34h] [bp-Ch]@80 + int v73; // [sp+38h] [bp-8h]@11 + int v74; // [sp+3Ch] [bp-4h]@1 + int a3a; // [sp+48h] [bp+8h]@76 + int a3b; // [sp+48h] [bp+8h]@87 + + v4 = a1; + v5 = a2; + v74 = a1; + v60 = a2; + if ( !a1 + || (!dword_50B700 ? (v64 = -1, v6 = 1, v63 = 1) : (v6 = 1, v63 = -1, v64 = 1), + v7 = dword_50B9D8_ys[0], + v65 = 0, + v8 = dword_50B9D8_ys[0], + a1 <= v6) ) + return 0; + do + { + v9 = dword_50B9D8_ys[v6]; + if ( v9 >= v7 ) + { + if ( v9 > v8 ) + v8 = dword_50B9D8_ys[v6]; + } + else + { + v65 = v6; + v7 = dword_50B9D8_ys[v6]; + } + ++v6; + } + while ( v6 < v4 ); + v73 = v8; + if ( v8 == v7 ) + return 0; + v10 = v65; + v68 = 0; + v5->_viewport_space_y = v7; + v5->field_4 = v8; + v55 = v65; + if ( v4 > 0 ) + { + v11 = v65; + do + { + v10 += v64; + if ( v10 < v74 ) + { + if ( v10 < 0 ) + v10 += v74; + } + else + { + v10 -= v74; + } + v12 = dword_50B9D8_ys[v10]; + if ( v12 <= dword_50B9D8_ys[v11] ) + { + v55 = v10; + v11 = v10; + } + if ( v12 == v73 ) + break; + ++v68; + } + while ( v68 < v74 ); + } + v13 = v55 + v64; + v67 = v55 + v64; + if ( v55 + v64 < v74 ) + { + if ( v13 >= 0 ) + goto LABEL_27; + v13 += v74; + } + else + { + v13 -= v74; + } + v67 = v13; +LABEL_27: + if ( dword_50B9D8_ys[v13] != dword_50B9D8_ys[v55] ) + { + v14 = dword_50BAC8[v55]; + v62 = v14 << 16; + v54 = ((dword_50BAC8[v13] - v14) << 16) / (dword_50B9D8_ys[v13] - dword_50B9D8_ys[v55]); + v5->array_18[v7] = LOWORD(dword_50BAC8[v55]); + } + v15 = v65; + v69 = 0; + v61 = v65; + if ( v74 > 0 ) + { + v16 = v65; + do + { + v15 += v63; + if ( v15 < v74 ) + { + if ( v15 < 0 ) + v15 += v74; + } + else + { + v15 -= v74; + } + v17 = dword_50B9D8_ys[v15]; + if ( v17 <= dword_50B9D8_ys[v16] ) + { + v61 = v15; + v16 = v15; + } + if ( v17 == v73 ) + break; + ++v69; + } + while ( v69 < v74 ); + } + v18 = v63 + v61; + v66 = v63 + v61; + if ( v63 + v61 < v74 ) + { + if ( v18 >= 0 ) + goto LABEL_44; + v18 += v74; + } + else + { + v18 -= v74; + } + v66 = v18; +LABEL_44: + v19 = v18; + v20 = v61; + v53 = dword_50B9D8_ys[v19] - dword_50B9D8_ys[v61]; + if ( dword_50B9D8_ys[v19] != dword_50B9D8_ys[v61] ) + { + v21 = dword_50BAC8[v20]; + v5 = v60; + v61 = v21 << 16; + v53 = ((dword_50BAC8[v19] - v21) << 16) / v53; + v60->array_3D8[v73] = LOWORD(dword_50BAC8[v20]); + } + v22 = v7; + v70 = v7; + if ( v7 <= v73 ) + { + v56 = &v5->array_3D8[v7]; + v23 = &v5->array_18[v7]; + do + { + v24 = v67; + if ( v22 < dword_50B9D8_ys[v67] || v22 == v73 ) + goto LABEL_57; + v25 = v64 + v67; + v67 = v25; + if ( v25 < v74 ) + { + if ( v25 >= 0 ) + goto LABEL_55; + v25 += v74; + } + else + { + v25 -= v74; + } + v67 = v25; +LABEL_55: + v26 = v25; + v27 = dword_50B9D8_ys[v26] - dword_50B9D8_ys[v24]; + if ( dword_50B9D8_ys[v26] - dword_50B9D8_ys[v24] > 0 ) + { + v28 = dword_50BAC8[v24]; + v54 = ((dword_50BAC8[v26] - v28) << 16) / v27; + v62 = v28 << 16; + } +LABEL_57: + v29 = v66; + if ( v70 >= dword_50B9D8_ys[v66] && v70 != v73 ) + { + v30 = v63 + v66; + v66 += v63; + if ( v66 >= v74 ) + { + v30 -= v74; + goto LABEL_63; + } + if ( v30 < 0 ) + { + v30 += v74; +LABEL_63: + v66 = v30; + } + v31 = v30; + v32 = dword_50B9D8_ys[v31] - dword_50B9D8_ys[v29]; + if ( dword_50B9D8_ys[v31] - dword_50B9D8_ys[v29] > 0 ) + { + v33 = dword_50BAC8[v29]; + v53 = ((dword_50BAC8[v31] - v33) << 16) / v32; + v61 = v33 << 16; + } + } + *(__int16 *)((char *)v56 + (int)(char *)v5->array_18 - (char *)v5->array_3D8) = HIWORD(v62); + *v56 = HIWORD(v61); + v34 = v23 + 480; + v35 = v23[480]; + if ( *v23 > v35 ) + { + v36 = *v23 ^ v35; + v37 = *v34; + *v23 = v36; + v38 = v37 ^ v36; + *v23 ^= v38; + *v34 = v38; + } + ++v56; + v62 += v54; + v22 = v70 + 1; + v61 += v53; + ++v23; + ++v70; + } + while ( v70 <= v73 ); + } + v39 = a3; + v40 = v73; + if ( v73 < a3->_viewport_space_y || (v41 = a3->field_4, v7 > v41) ) + return 0; + if ( v7 < a3->_viewport_space_y ) + v7 = a3->_viewport_space_y; + if ( v73 > v41 ) + { + v40 = a3->field_4; + v73 = a3->field_4; + } + v71 = v7; + if ( v7 <= v40 ) + { + a3a = (char *)v5 - (char *)a3; + v57 = &v5->array_18[v7]; + v42 = &v39->array_3D8[v7]; + do + { + if ( *(__int16 *)((char *)v42 + a3a) >= *(v42 - 480) && *v57 <= *v42 ) + break; + ++v57; + ++v7; + ++v71; + ++v42; + } + while ( v71 <= v40 ); + } + v72 = v40; + if ( v40 < v7 ) + return 0; + v58 = &v5->array_18[v40]; + v43 = &v39->array_3D8[v40]; + do + { + if ( *(__int16 *)((char *)v43 + (int)(char *)v5 - (char *)v39) >= *(v43 - 480) && *v58 <= *v43 ) + break; + --v58; + --v40; + --v72; + --v43; + v73 = v40; + } + while ( v72 >= v7 ); + if ( v7 >= v40 ) + return 0; + a3b = (char *)v39 - (char *)v5; + v59 = &v39->array_3D8[v7]; + v45 = &v5->array_18[v7]; + v46 = v73 - v7 + 1; + do + { + v47 = *(__int16 *)((char *)v45 + a3b); + if ( *v45 < v47 ) + *v45 = v47; + if ( v45[480] > *v59 ) + v45[480] = *v59; + ++v59; + ++v45; + --v46; + } + while ( v46 ); + v5->_viewport_space_y = v7; + v5->field_4 = v73; + v5->field_8 = v5->array_18[v7]; + v48 = v5->array_3D8[v7]; + v5->field_10 = v7; + v5->field_14 = v7; + v49 = v7 + 1; + v5->field_C = v48; + if ( v49 <= v73 ) + { + v50 = &v5->array_3D8[v49]; + do + { + v51 = *(v50 - 480); + if ( v51 < v5->field_8 ) + { + v5->field_8 = v51; + v5->field_10 = v49; + } + v52 = *v50; + if ( v52 > v5->field_C ) + { + v5->field_C = v52; + v5->field_14 = v49; + } + ++v49; + ++v50; + } + while ( v49 <= v73 ); + } + return 1; +} +// 50B700: using guessed type int dword_50B700; + +//----- (00424CD7) -------------------------------------------------------- +signed int __fastcall sr_424CD7(unsigned int uVertexID) +{ + unsigned int v1; // edx@1 + signed int v2; // edi@1 + char *v3; // esi@4 + char *v4; // ecx@4 + unsigned int v5; // eax@4 + char *v6; // edx@4 + double v7; // st6@10 + double v8; // st5@10 + double v9; // st6@11 + unsigned __int8 v10; // c2@15 + unsigned __int8 v11; // c3@15 + RenderVertexSoft *v12; // edi@22 + char *v13; // eax@22 + double v14; // st6@22 + signed int result; // eax@24 + unsigned int v16; // [sp+8h] [bp-28h]@4 + bool v17; // [sp+Ch] [bp-24h]@6 + char *v18; // [sp+10h] [bp-20h]@4 + char *v19; // [sp+14h] [bp-1Ch]@4 + signed int v20; // [sp+18h] [bp-18h]@1 + RenderVertexSoft *v21; // [sp+1Ch] [bp-14h]@4 + char *v22; // [sp+20h] [bp-10h]@4 + char *v23; // [sp+24h] [bp-Ch]@4 + char *v24; // [sp+28h] [bp-8h]@4 + char *v25; // [sp+2Ch] [bp-4h]@4 + + v1 = uVertexID; + memcpy(&array_50AC10[uVertexID], array_50AC10, sizeof(array_50AC10[uVertexID])); + v2 = 0; + v20 = 0; + if ( array_50AC10[0].vWorldViewPosition.x >= 8.0 ) + v2 = 1; + if ( (signed int)(uVertexID + 1) <= 1 ) + return 0; + v3 = (char *)&array_507D30[0].vWorldViewPosition.z; + v4 = (char *)&array_507D30[0].vWorldViewPosition.y; + v5 = v1; + v23 = (char *)&array_507D30[0].flt_20; + v21 = array_507D30; + v18 = (char *)&array_507D30[0].vWorldViewPosition.z; + v19 = (char *)&array_507D30[0].vWorldViewPosition.y; + v22 = (char *)&array_507D30[0].vWorldViewPosition; + v24 = (char *)&array_507D30[0].v; + v25 = (char *)&array_507D30[0].u; + v6 = (char *)&array_50AC10[0].v; + v16 = v5; + do + { + v17 = *((float *)v6 + 5) >= 8.0; + if ( v2 != v17 ) + { + if ( v17 ) + { + v7 = (8.0 - *((float *)v6 - 7)) / (*((float *)v6 + 5) - *((float *)v6 - 7)); + *(float *)v4 = (*((float *)v6 + 6) - *((float *)v6 - 6)) * v7 + *((float *)v6 - 6); + *(float *)v3 = (*((float *)v6 + 7) - *((float *)v6 - 5)) * v7 + *((float *)v6 - 5); + *(float *)v25 = (*((float *)v6 + 11) - *((float *)v6 - 1)) * v7 + *((float *)v6 - 1); + v8 = (*((float *)v6 + 12) - *(float *)v6) * v7 + *(float *)v6; + } + else + { + v9 = (8.0 - *((float *)v6 + 5)) / (*((float *)v6 - 7) - *((float *)v6 + 5)); + *(float *)v4 = (*((float *)v6 - 6) - *((float *)v6 + 6)) * v9 + *((float *)v6 + 6); + *(float *)v3 = (*((float *)v6 - 5) - *((float *)v6 + 7)) * v9 + *((float *)v6 + 7); + *(float *)v25 = (*((float *)v6 - 1) - *((float *)v6 + 11)) * v9 + *((float *)v6 + 11); + v8 = (*(float *)v6 - *((float *)v6 + 12)) * v9 + *((float *)v6 + 12); + } + *(float *)v24 = v8; + *(float *)v22 = 8.0; + *(int *)v23 = 0x3E000000u; + if ( v2 ) + { + if ( 8.0 == *((float *)v6 - 7) && *(float *)v4 == *((float *)v6 - 6) ) + { + v10 = 0; + v11 = *(float *)v3 == *((float *)v6 - 5); + goto LABEL_19; + } + } + else + { + if ( 8.0 == *((float *)v6 + 5) && *(float *)v4 == *((float *)v6 + 6) ) + { + v10 = 0; + v11 = *(float *)v3 == *((float *)v6 + 7); +LABEL_19: + if ( v11 | v10 ) + goto LABEL_21; + goto LABEL_20; + } + } +LABEL_20: + ++v21; + v22 += 48; + v24 += 48; + v25 += 48; + v4 += 48; + v3 += 48; + ++v20; + v23 += 48; + v19 = v4; + v18 = v3; + } +LABEL_21: + if ( v17 ) + { + v12 = v21; + v13 = v23; + v19 += 48; + v18 += 48; + v14 = 1.0 / (*((float *)v6 + 5) + 0.0000001); + ++v20; + v25 += 48; + v24 += 48; + v22 += 48; + ++v21; + v23 += 48; + memcpy(v12, v6 + 8, 0x30u); + v4 = v19; + v3 = v18; + *(float *)v13 = v14; + } + v2 = v17; + v6 += 48; + --v16; + } + while ( v16 ); + result = v20; + if ( v20 < 3 ) + return 0; + return result; +}