Mercurial > mm7
view mm7_5.cpp @ 600:db4a23580e6c
Chest item view fixed, gold can be taken
author | Gloval |
---|---|
date | Thu, 07 Mar 2013 00:35:10 +0400 |
parents | b5240254cbbd |
children | 628694cd5744 |
line wrap: on
line source
#include <assert.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 "SpriteObject.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 "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 "texts.h" #include "Log.h" #include "mm7_data.h" static char static_sub_417BB5_out_string[1200]; // static to a file, not sub actually //----- (004304E7) -------------------------------------------------------- void __cdecl GameUI_MsgProc() { signed int v0; // edi@6 char *v1; // esi@6 unsigned int v2; // edx@7 Actor *pActor; // ecx@13 int v4; // ecx@18 //NPCData *pNPCData0; // eax@18 //int v6; // edx@20 //int v7; // ecx@29 unsigned int v8; // edx@59 unsigned int v9; // ecx@60 unsigned int v10; // ecx@73 //unsigned int v11; // eax@75 unsigned __int8 v12; // sf@75 unsigned __int8 v13; // of@75 int v14; // eax@98 unsigned int v15; // eax@102 unsigned __int8 v16; // al@104 unsigned __int8 v17; // al@105 int v18; // eax@106 float v19; // ST64_4@121 unsigned int v20; // ecx@121 float v21; // ST64_4@126 float v22; // ST64_4@127 unsigned int v23; // ecx@135 unsigned int v24; // ecx@149 unsigned int v25; // ecx@165 GUIWindow *pWindow; // eax@204 unsigned int v27; // edx@204 unsigned int v28; // ecx@204 GUIWindow *pWindow2; // ecx@248 int v30; // edx@258 const char *v31; // ecx@262 signed int v32; // eax@269 unsigned int v33; // eax@277 unsigned __int8 v34; // al@279 unsigned __int8 v35; // al@280 GUIWindow *pWindow3; // ecx@332 int v37; // eax@341 int v38; // eax@358 SHORT v39; // ax@365 signed int v40; // eax@365 char *v41; // eax@380 int v42; // eax@396 POINT *pPoint; // eax@397 signed int v44; // eax@398 int v45; // edx@398 signed int v46; // ecx@398 char v47; // zf@399 char v48; // zf@405 BLVFace *pBLVFace; // ecx@410 ODMFace *pODMFace; // ecx@412 void *v51; // ecx@415 void *v52; // eax@424 __int16 v53; // ax@431 int v54; // eax@432 int v55; // ecx@432 int v56; // edx@432 int v57; // eax@432 Player *pPlayer; // edx@442 unsigned int v59; // eax@445 signed int v60; // ST64_4@459 NPCData *pNPCData2; // eax@467 unsigned __int64 v62; // kr00_8@467 __int16 v63; // dx@479 unsigned int v64; // eax@486 int v65; // ecx@486 int v66; // eax@488 char *v67; // eax@489 __int16 v68; // dx@498 char *v69; // eax@512 int v70; // eax@525 int v71; // edi@527 NPCData *pNPCData3; // esi@527 char *v73; // ecx@533 signed int v74; // edi@535 int v75; // eax@535 int v76; // esi@535 int v77; // eax@537 Player *pPlayer2; // ecx@549 int v79; // ecx@550 unsigned int v80; // edx@550 signed int v81; // eax@552 POINT *pPoint2; // eax@553 signed int v83; // ecx@554 signed int v84; // ecx@554 GUIButton *pButton; // eax@578 unsigned int v86; // eax@583 const char *v87; // ecx@595 const char *v88; // ecx@596 unsigned int v89; // eax@598 unsigned int v90; // eax@602 int v91; // edx@605 int v92; // eax@605 int v93; // edx@605 int pPlayerNum; // edx@611 int v95; // eax@611 const char *v96; // ecx@621 unsigned int v97; // eax@624 int v98; // eax@636 unsigned __int8 v99; // al@643 Player *pPlayer3; // eax@648 int v101; // ecx@648 int v102; // edx@652 int v103; // eax@671 Player *pPlayer4; // ecx@718 int v105; // eax@718 Player *pPlayer5; // ST78_4@758 unsigned int v107; // eax@758 unsigned int v108; // eax@758 char *v109; // ST64_4@759 Player *v110; // ST78_4@759 int v111; // ST60_4@759 int v112; // ST5C_4@759 char *v113; // ST58_4@759 signed int v114; // eax@759 unsigned int v115; // eax@764 int v116; // eax@776 POINT *pPoint3; // eax@777 unsigned int v118; // eax@785 unsigned int v119; // ecx@786 unsigned int v120; // [sp-28h] [bp-624h]@86 unsigned int v121; // [sp-28h] [bp-624h]@711 unsigned int v122; // [sp-24h] [bp-620h]@86 unsigned int v123; // [sp-24h] [bp-620h]@711 unsigned int v124; // [sp-20h] [bp-61Ch]@86 unsigned int v125; // [sp-20h] [bp-61Ch]@711 unsigned int v126; // [sp-1Ch] [bp-618h]@86 int v127; // [sp-1Ch] [bp-618h]@107 unsigned int v128; // [sp-1Ch] [bp-618h]@711 int v129; // [sp-18h] [bp-614h]@86 signed int v130; // [sp-18h] [bp-614h]@107 int v131; // [sp-14h] [bp-610h]@86 unsigned int v132; // [sp-14h] [bp-610h]@107 unsigned int v133; // [sp-10h] [bp-60Ch]@60 unsigned int v134; // [sp-10h] [bp-60Ch]@86 signed int v135; // [sp-10h] [bp-60Ch]@107 unsigned int v136; // [sp-10h] [bp-60Ch]@121 unsigned int v137; // [sp-Ch] [bp-608h]@60 unsigned int v138; // [sp-Ch] [bp-608h]@86 signed int v139; // [sp-Ch] [bp-608h]@107 unsigned int v140; // [sp-Ch] [bp-608h]@121 enum WindowType pWindowType; // [sp-8h] [bp-604h]@56 enum WindowType pWindowType1; // [sp-8h] [bp-604h]@60 unsigned __int8 v143; // [sp-8h] [bp-604h]@86 int v144; // [sp-8h] [bp-604h]@107 enum WindowType pWindowType2; // [sp-8h] [bp-604h]@121 const char *v146; // [sp-8h] [bp-604h]@449 unsigned int v147; // [sp-8h] [bp-604h]@550 int v148; // [sp-4h] [bp-600h]@56 GUIButton *pButton2; // [sp-4h] [bp-600h]@59 const char *v150; // [sp-4h] [bp-600h]@86 unsigned int v151; // [sp-4h] [bp-600h]@107 int v152; // [sp-4h] [bp-600h]@121 int v153; // [sp-4h] [bp-600h]@135 int v154; // [sp-4h] [bp-600h]@149 int v155; // [sp-4h] [bp-600h]@165 int v156; // [sp-4h] [bp-600h]@204 const char *v157; // [sp-4h] [bp-600h]@444 unsigned int v158; // [sp-4h] [bp-600h]@449 __int16 v159; // [sp-4h] [bp-600h]@550 int v160; // [sp-4h] [bp-600h]@599 const char *v161; // [sp-4h] [bp-600h]@637 int v162; // [sp+0h] [bp-5FCh]@56 int v163; // [sp+0h] [bp-5FCh]@59 Texture *pTexture; // [sp+0h] [bp-5FCh]@86 int v165; // [sp+0h] [bp-5FCh]@107 int v166; // [sp+0h] [bp-5FCh]@121 int v167; // [sp+0h] [bp-5FCh]@135 int v168; // [sp+0h] [bp-5FCh]@149 int v169; // [sp+0h] [bp-5FCh]@165 int v170; // [sp+0h] [bp-5FCh]@204 signed int v171; // [sp+0h] [bp-5FCh]@259 KeyToggleType pKeyToggleType; // [sp+0h] [bp-5FCh]@287 char *v173; // [sp+0h] [bp-5FCh]@444 char *v174; // [sp+0h] [bp-5FCh]@449 int v175; // [sp+0h] [bp-5FCh]@550 int v176; // [sp+0h] [bp-5FCh]@599 const char *v177; // [sp+0h] [bp-5FCh]@629 char *v178; // [sp+0h] [bp-5FCh]@637 int v179; // [sp+4h] [bp-5F8h]@0 //signed int _this; // [sp+14h] [bp-5E8h]@22 signed int thisa; // [sp+14h] [bp-5E8h]@251 signed int thisb; // [sp+14h] [bp-5E8h]@272 Player *pPlayer7; // [sp+14h] [bp-5E8h]@373 Player *pPlayer8; // [sp+14h] [bp-5E8h]@377 char *thise; // [sp+14h] [bp-5E8h]@445 Player *pPlayer9; // [sp+14h] [bp-5E8h]@455 int thisg; // [sp+14h] [bp-5E8h]@467 int thish; // [sp+14h] [bp-5E8h]@528 signed int thisi; // [sp+14h] [bp-5E8h]@535 MapInfo *pMapInfo; // [sp+14h] [bp-5E8h]@604 Player *pPlayer10; // [sp+14h] [bp-5E8h]@641 int thisl; // [sp+14h] [bp-5E8h]@648 int uMessageParam; // [sp+18h] [bp-5E4h]@7 int uAction; // [sp+1Ch] [bp-5E0h]@18 NPCData *pNPCData4; // [sp+20h] [bp-5DCh]@23 unsigned int uNumSeconds; // [sp+24h] [bp-5D8h]@18 char v197; // [sp+2Bh] [bp-5D1h]@101 enum UIMessageType uMessage; // [sp+2Ch] [bp-5D0h]@7 unsigned int v199; // [sp+30h] [bp-5CCh]@7 char *v200; // [sp+34h] [bp-5C8h]@518 POINT v201; // [sp+38h] [bp-5C4h]@553 POINT v202; // [sp+40h] [bp-5BCh]@141 POINT a2; // [sp+48h] [bp-5B4h]@127 POINT v204; // [sp+50h] [bp-5ACh]@777 POINT v205; // [sp+58h] [bp-5A4h]@171 POINT v206; // [sp+60h] [bp-59Ch]@553 POINT v207; // [sp+68h] [bp-594h]@155 POINT v208; // [sp+70h] [bp-58Ch]@397 POINT v209; // [sp+78h] [bp-584h]@777 POINT v210; // [sp+80h] [bp-57Ch]@397 POINT v211; // [sp+88h] [bp-574h]@704 __int64 v212; // [sp+90h] [bp-56Ch]@467 char v213; // [sp+98h] [bp-564h]@385 char pLevelName; // [sp+9Ch] [bp-560h]@380 char pOut; // [sp+BCh] [bp-540h]@370 FrameTableTxtLine v216; // [sp+DCh] [bp-520h]@524 int v217[9]; // [sp+158h] [bp-4A4h]@652 FrameTableTxtLine v218; // [sp+17Ch] [bp-480h]@524 char a1[64]; // [sp+1F8h] [bp-404h]@467 char Str2[128]; // [sp+238h] [bp-3C4h]@527 Actor actor; // [sp+2B8h] [bp-344h]@4 dword_50CDC8 = 0; if ( !pEventTimer->bPaused ) { pParty->sEyelevel = pParty->uDefaultEyelevel; pParty->uPartyHeight = pParty->uDefaultPartyHeight; } if ( bDialogueUI_InitializeActor_NPC_ID ) { //Actor::Actor(&actor); memset(&actor, 0, 0x344u); dword_5B65D0_dialogue_actor_npc_id = bDialogueUI_InitializeActor_NPC_ID; actor.uNPC_ID = bDialogueUI_InitializeActor_NPC_ID; actor.InitializeDialogue(0); bDialogueUI_InitializeActor_NPC_ID = 0; } if ( pMessageQueue_50CBD0->uNumMessages ) { v0 = 1; v1 = ""; while ( 2 ) { if ( !pMessageQueue_50CBD0->uNumMessages ) break; pMessageQueue_50CBD0->PopMessage(&uMessage, &uMessageParam, (int *)&v199); switch ( uMessage ) { case UIMSG_ChangeGameState: uGameState = v0; continue; case UIMSG_PlayArcomage: pVideoPlayer->_4BF5B2(); pArcomageGame->bGameInProgress = 1; PrepareArcomage(); continue; case UIMSG_StartNPCDialogue: if ( !uActiveCharacter ) continue; viewparams->field_48 = v0; if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; dword_5B65D0_dialogue_actor_npc_id = pActors[uMessageParam].uNPC_ID; pActor = &pActors[uMessageParam]; //goto _actor_init_dlg; pActor->InitializeDialogue(v0); continue; case UIMSG_StartHireling1Dialogue: case UIMSG_StartHireling2Dialogue: { if (bNoNPCHiring || pCurrentScreen) continue; if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; uAction = 0; int hireling_idx = uMessage - UIMSG_StartHireling1Dialogue; v4 = 0; for (uint i = 0; i < 2; ++i) //pNPCData0 = pParty->pHirelings; //do { if (pParty->pHirelings[i].pName) //{ //v6 = uAction++; pTmpBuf[uAction++] = i; //} //++pNPCData0; //++v4; } //while ( (signed int)pNPCData0 < (signed int)&pParty->pPickedItem ); //_this = 0; for (uint i = 0; i < pNPCStats->uNumNewNPCs; ++i) { auto npc = pNPCStats->pNewNPCData + i; //do //{ if (npc->Hired() && (!pParty->pHirelings[0].pName || strcmp(npc->pName, pParty->pHirelings[0].pName)) && (!pParty->pHirelings[1].pName || strcmp(npc->pName, pParty->pHirelings[1].pName)) ) { //v7 =; pTmpBuf[uAction++] = i + 2; } //++_this; //++pNPCData4; //} //while ( _this < (signed int)pNPCStats->uNumNewNPCs ); } if ( (signed int)(hireling_idx + (unsigned __int8)pParty->field_709) < uAction ) { //Actor::Actor(&actor); memset(&actor, 0, 0x344u); actor.uNPC_ID += -1 - (unsigned __int8)pParty->field_709 - hireling_idx; pActor = &actor; pActor->InitializeDialogue(v0); } } continue; case UIMSG_51: sub_4BDB56_buy_skill____(); continue; case UIMSG_ClickNPCTopic: ClickNPCTopic(uMessageParam); continue; case UIMSG_ClickLearnSkillDialog: DrawLearnSkillDialog(uMessageParam); continue; case UIMSG_SelectDialogueOption: OnSelectDialogueOption((DIALOGUE_TYPE)uMessageParam); continue; case UIMSG_19A: _4B4224_UpdateNPCTopics(uMessageParam); continue; case UIMSG_StartNewGame: if ( dword_6BE138 == 124 || uMessageParam ) { pIcons_LOD->_40F9C5(); pIcons_LOD->_4114F2(); if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; pGUIWindow_CurrentMenu->Release(); uGameState = 4; pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; } else { ShowStatusBarString(pGlobalTXT_LocalizationStrings[201], 2u);// "Are you sure? Click again to start a New Game" pAudioPlayer->PlaySound(SOUND_20001, 0, 0, -1, 0, 0, 0, 0); dword_6BE138 = 124; } stru_506E40.Release(); continue; case UIMSG_Game_OpenLoadGameDialog: pIcons_LOD->_40F9C5(); pIcons_LOD->_4114F2(); if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; pGUIWindow_CurrentMenu->Release(); pCurrentScreen = SCREEN_LOADGAME; GameUI_DrawLoadMenu(v0); continue; case UIMSG_Quit: if ( dword_6BE138 == 132 || uMessageParam ) { pIcons_LOD->_40F9C5(); pIcons_LOD->_4114F2(); if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; pGUIWindow_CurrentMenu->Release(); pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; if ( !uMessageParam ) pAudioPlayer->PlaySound((SoundID)(SOUND_EnteringAHouse|0x1), 0, 0, -1, 0, 0, 0, 0); uGameState = 7; } else { ShowStatusBarString(pGlobalTXT_LocalizationStrings[82], 2);// "Are you sure? Click again to quit" pAudioPlayer->PlaySound(SOUND_20001, 0, 0, -1, 0, 0, 0, 0); dword_6BE138 = 132; } stru_506E40.Release(); continue; case UIMSG_80: pIcons_LOD->_40F9C5(); pIcons_LOD->_4114F2(); pGUIWindow_CurrentMenu->Release(); pCurrentScreen = SCREEN_OPTIONS; pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, (WindowType)8, 0, 0); continue; case UIMSG_ArrowUp: --pSaveListPosition; if ( pSaveListPosition < 0 ) pSaveListPosition = 0; GUIWindow::Create(215, 199, 17, 17, (WindowType)90, (int)pBtnArrowUp, 0); continue; case UIMSG_DownArrow: ++pSaveListPosition; if ( pSaveListPosition >= uMessageParam ) pSaveListPosition = uMessageParam - 1; GUIWindow::Create(215, 323, 17, 17, (WindowType)90, (int)pBtnDownArrow, 0); continue; case UIMSG_Cancel: GUIWindow::Create(350, 302, 106, 42, (WindowType)96, (int)pBtnCancel, 0); continue; case UIMSG_LoadSlot: GUIWindow::Create(241, 302, 106, 42, (WindowType)94, (int)pBtnLoadSlot, 0); continue; case UIMSG_SelectLoadSlot: if ( pGUIWindow_CurrentMenu->field_40 == v0 ) pKeyActionMap->_459ED1(0); if ( pCurrentScreen != SCREEN_SAVEGAME || uLoadGameUI_SelectedSlot != pSaveListPosition + uMessageParam ) { v10 = pSaveListPosition + uMessageParam; if ( dword_6BE138 == pSaveListPosition + uMessageParam ) { pMessageQueue_50CBD0->AddMessage(UIMSG_LoadSlot, 0, 0); pMessageQueue_50CBD0->AddMessage(UIMSG_LoadGame, 0, 0); /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = UIMSG_LoadSlot; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; //v11 = pMessageQueue_50CBD0->uNumMessages + 1; //v13 = pMessageQueue_50CBD0->uNumMessages + 1 > 40; //v12 = (signed int)pMessageQueue_50CBD0->uNumMessages - 39 < 0; ++pMessageQueue_50CBD0->uNumMessages; if ( v12 ^ v13 ) { pMessageQueue_50CBD0->pMessages[v11].eType = UIMSG_LoadGame; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; } }*/ } uLoadGameUI_SelectedSlot = v10; dword_6BE138 = v10; } else { pKeyActionMap->EnterText(0, 19, pGUIWindow_CurrentMenu); if ( strcmp((const char *)&pSavegameHeader[uLoadGameUI_SelectedSlot], pGlobalTXT_LocalizationStrings[72]) )// "Empty" strcpy((char *)pKeyActionMap->pPressedKeysBuffer, (const char *)&pSavegameHeader[uLoadGameUI_SelectedSlot]); pKeyActionMap->uNumKeysPressed = strlen((const char *)pKeyActionMap->pPressedKeysBuffer); } continue; case UIMSG_LoadGame: if ( pSavegameUsedSlots[uLoadGameUI_SelectedSlot] ) { LoadGame(uLoadGameUI_SelectedSlot); uGameState = 3; } stru_506E40.Release(); continue; case UIMSG_SaveGame: if ( pGUIWindow_CurrentMenu->field_40 == v0 ) { pKeyActionMap->_459ED1(0); strcpy((char *)&pSavegameHeader + 100 * uLoadGameUI_SelectedSlot, (const char *)pKeyActionMap->pPressedKeysBuffer); } DoSavegame(uLoadGameUI_SelectedSlot); stru_506E40.Release(); continue; case UIMSG_Game_OpenSaveGameDialog: pGUIWindow_CurrentMenu->Release(); pCurrentScreen = SCREEN_SAVEGAME; GameUI_DrawSaveMenu(); continue; case UIMSG_Game_OpenOptionsDialog://Open if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; pGUIWindow_CurrentMenu->Release(); viewparams->field_48 = v0; pCurrentScreen = SCREEN_OPTIONS; uTextureID_ControlBG[0] = pIcons_LOD->LoadTexture("ControlBG", TEXTURE_16BIT_PALETTE); uTextureID_ControlBG[3] = pIcons_LOD->LoadTexture("con_16x", TEXTURE_16BIT_PALETTE); uTextureID_ControlBG[2] = pIcons_LOD->LoadTexture("con_32x", TEXTURE_16BIT_PALETTE); uTextureID_ControlBG[4] = pIcons_LOD->LoadTexture("con_ArrL", TEXTURE_16BIT_PALETTE); uTextureID_ControlBG[5] = pIcons_LOD->LoadTexture("con_ArrR", TEXTURE_16BIT_PALETTE); uTextureID_ControlBG[1] = pIcons_LOD->LoadTexture("con_Smoo", TEXTURE_16BIT_PALETTE); uTextureID_ControlBG[19] = pIcons_LOD->LoadTexture("convol00", TEXTURE_16BIT_PALETTE); uTextureID_ControlBG[10] = pIcons_LOD->LoadTexture("convol10", TEXTURE_16BIT_PALETTE); uTextureID_ControlBG[11] = pIcons_LOD->LoadTexture("convol20", TEXTURE_16BIT_PALETTE); uTextureID_ControlBG[12] = pIcons_LOD->LoadTexture("convol30", TEXTURE_16BIT_PALETTE); uTextureID_ControlBG[13] = pIcons_LOD->LoadTexture("convol40", TEXTURE_16BIT_PALETTE); uTextureID_ControlBG[14] = pIcons_LOD->LoadTexture("convol50", TEXTURE_16BIT_PALETTE); uTextureID_ControlBG[15] = pIcons_LOD->LoadTexture("convol60", TEXTURE_16BIT_PALETTE); uTextureID_ControlBG[16] = pIcons_LOD->LoadTexture("convol70", TEXTURE_16BIT_PALETTE); uTextureID_ControlBG[17] = pIcons_LOD->LoadTexture("convol80", TEXTURE_16BIT_PALETTE); uTextureID_ControlBG[18] = pIcons_LOD->LoadTexture("convol90", TEXTURE_16BIT_PALETTE); uTextureID_ControlBG[9] = pIcons_LOD->LoadTexture("option04", TEXTURE_16BIT_PALETTE); uTextureID_ControlBG[20] = pIcons_LOD->LoadTexture("option03", TEXTURE_16BIT_PALETTE); uTextureID_ControlBG[22] = pIcons_LOD->LoadTexture("option02", TEXTURE_16BIT_PALETTE); uTextureID_ControlBG[21] = pIcons_LOD->LoadTexture("option01", TEXTURE_16BIT_PALETTE); pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, WINDOW_Options, 0, 0); pGUIWindow_CurrentMenu->CreateButton(0x16u, 0x10Eu, (uTextureID_ControlBG[3] != -1 ? pIcons_LOD->pTextures[uTextureID_ControlBG[3]].uTextureWidth : 24), (uTextureID_ControlBG[3] != -1 ? pIcons_LOD->pTextures[uTextureID_ControlBG[3]].uTextureHeight : 26), v0, 0, 0xB8u, 0x80u, 0, v1, 0); pGUIWindow_CurrentMenu->CreateButton(0x5Du, 0x10Eu, (uTextureID_ControlBG[2] != -1 ? pIcons_LOD->pTextures[uTextureID_ControlBG[2]].uTextureWidth : 24), (uTextureID_ControlBG[2] != -1 ? pIcons_LOD->pTextures[uTextureID_ControlBG[2]].uTextureHeight : 26), v0, 0, 0xB8u, 0x40u, 0, v1, 0); pGUIWindow_CurrentMenu->CreateButton(0xA4u, 0x10Eu, (uTextureID_ControlBG[1] != -1 ? pIcons_LOD->pTextures[uTextureID_ControlBG[1]].uTextureWidth : 24), (uTextureID_ControlBG[1] != -1 ? pIcons_LOD->pTextures[uTextureID_ControlBG[1]].uTextureHeight : 26), v0, 0, 0xB8u, 0, 0, v1, 0); pGUIWindow_CurrentMenu->CreateButton(0x14u, 0x12Fu, (uTextureID_ControlBG[21] != -1 ? pIcons_LOD->pTextures[uTextureID_ControlBG[21]].uTextureWidth : 24), (uTextureID_ControlBG[21] != -1 ? pIcons_LOD->pTextures[uTextureID_ControlBG[21]].uTextureHeight : 26), v0, 0, 0xB9u, 0, 0, v1, 0); pGUIWindow_CurrentMenu->CreateButton(0x80u, 0x12Fu, (uTextureID_ControlBG[22] != -1 ? pIcons_LOD->pTextures[uTextureID_ControlBG[22]].uTextureWidth : 24), (uTextureID_ControlBG[22] != -1 ? pIcons_LOD->pTextures[uTextureID_ControlBG[22]].uTextureHeight : 26), v0, 0, 0xBBu, 0, 0, v1, 0); pGUIWindow_CurrentMenu->CreateButton(0x14u, 0x145u, (uTextureID_ControlBG[20] != -1 ? pIcons_LOD->pTextures[uTextureID_ControlBG[20]].uTextureWidth : 24), (uTextureID_ControlBG[20] != -1 ? pIcons_LOD->pTextures[uTextureID_ControlBG[20]].uTextureHeight : 26), v0, 0, 0xE1u, 0, 0, v1, 0); pGUIWindow_CurrentMenu->CreateButton(0x80u, 0x145u, (uTextureID_ControlBG[9] != -1 ? pIcons_LOD->pTextures[uTextureID_ControlBG[9]].uTextureWidth : 24), (uTextureID_ControlBG[9] != -1 ? pIcons_LOD->pTextures[uTextureID_ControlBG[9]].uTextureHeight : 26), v0, 0, 0xE2u, 0, 0, v1, 0); pBtn_SliderLeft = pGUIWindow_CurrentMenu->CreateButton(243, 162, 16, 16, v0, 0, 111, 4, 0, v1, &pIcons_LOD->pTextures[uTextureID_ControlBG[4]], 0); pBtn_SliderRight = pGUIWindow_CurrentMenu->CreateButton(0x1B3u, 0xA2u, 0x10u, 0x10u, v0, 0, 0x6Fu, 5, 0, v1, &pIcons_LOD->pTextures[uTextureID_ControlBG[5]], 0); pGUIWindow_CurrentMenu->CreateButton(0x107u, 0xA2u, 0xACu, 0x11u, v0, 0, 0x6Fu, 0, 0, v1, 0); pBtn_SliderLeft = pGUIWindow_CurrentMenu->CreateButton(0xF3u, 0xD8u, 0x10u, 0x10u, v0, 0, 0x70u, 4, 0, v1, &pIcons_LOD->pTextures[uTextureID_ControlBG[4]], 0); pBtn_SliderRight = pGUIWindow_CurrentMenu->CreateButton(0x1B3u, 0xD8u, 0x10u, 0x10u, v0, 0, 0x70u, 5, 0, v1, &pIcons_LOD->pTextures[uTextureID_ControlBG[5]], 0); pGUIWindow_CurrentMenu->CreateButton(0x107u, 0xD8u, 0xACu, 0x11u, v0, 0, 0x70u, 0, 0, v1, 0); pBtn_SliderLeft = pGUIWindow_CurrentMenu->CreateButton(0xF3u, 0x10Eu, 0x10u, 0x10u, v0, 0, 0xBAu, 4, 0, v1, &pIcons_LOD->pTextures[uTextureID_ControlBG[4]], 0); pBtn_SliderRight = pGUIWindow_CurrentMenu->CreateButton(0x1B3u, 0x10Eu, 0x10u, 0x10u, v0, 0, 0xBAu, 5u, 0, v1, &pIcons_LOD->pTextures[uTextureID_ControlBG[5]], 0); pGUIWindow_CurrentMenu->CreateButton(0x107u, 0x10Eu, 0xACu, 0x11u, v0, 0, 0xBAu, 0, 0, v1, 0); pGUIWindow_CurrentMenu->CreateButton(0xF1u, 0x12Eu, 0xD6u, 0x28u, v0, 0, 0x71u, 0, 0, pGlobalTXT_LocalizationStrings[619],// "Return to Game" 0); pGUIWindow_CurrentMenu->CreateButton(0x13u, 0x8Cu, 0xD6u, 0x28u, v0, 0, 0x19Fu, 0, 0x4Bu, v1, 0); pGUIWindow_CurrentMenu->CreateButton(19, 194, 214, 40, v0, 0, 421, 0, 86, v1, 0); continue; case UIMSG_OpenKeyMappingOptions://Open if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; pGUIWindow_CurrentMenu->Release(); viewparams->field_48 = 1; pCurrentScreen = SCREEN_KEYBOARD_OPTIONS; uTextureID_Optkb[0] = pIcons_LOD->LoadTexture("optkb", TEXTURE_16BIT_PALETTE); uTextureID_Optkb[1] = pIcons_LOD->LoadTexture("optkb_h", TEXTURE_16BIT_PALETTE); uTextureID_Optkb[2] = pIcons_LOD->LoadTexture("resume1", TEXTURE_16BIT_PALETTE); uTextureID_Optkb[3] = pIcons_LOD->LoadTexture("optkb_1", TEXTURE_16BIT_PALETTE); uTextureID_Optkb[4] = pIcons_LOD->LoadTexture("optkb_2", TEXTURE_16BIT_PALETTE); pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, WINDOW_KeyMappingOptions, 0, 0); pGUIWindow_CurrentMenu->CreateButton(0xF1u, 0x12Eu, 0xD6u, 0x28u, 1, 0, 0x71u, 0, 0, "", 0); pGUIWindow_CurrentMenu->CreateButton(19u, 0x12Eu, 0x6Cu, 0x14u, 1, 0, 0x1A0u, 0, 0, "", 0); pGUIWindow_CurrentMenu->CreateButton(127u, 0x12Eu, 0x6Cu, 0x14u, 1, 0, 0x1A1u, 0, 0, "", 0); pGUIWindow_CurrentMenu->CreateButton(127u, 0x144u, 0x6Cu, 0x14u, 1, 0, 0x1A2u, 0, 0, "", 0); pGUIWindow_CurrentMenu->CreateButton(19u, 0x144u, 0x6Cu, 0x14u, 1, 0, 0x7Fu, 0, 0, "", 0); pGUIWindow_CurrentMenu->CreateButton(129u, 0x94u, 0x46u, 0x13u, 1, 0, 0x1A3u, 0, 0, "", 0); pGUIWindow_CurrentMenu->CreateButton(129u, 0xA7u, 0x46u, 0x13u, 1, 0, 0x1A3u, 1u, 0, "", 0); pGUIWindow_CurrentMenu->CreateButton(129u, 0xBAu, 0x46u, 0x13u, 1, 0, 0x1A3u, 2u, 0, "", 0); pGUIWindow_CurrentMenu->CreateButton(129u, 0xCDu, 0x46u, 0x13u, 1, 0, 0x1A3u, 3u, 0, "", 0); pGUIWindow_CurrentMenu->CreateButton(129u, 224u, 70u, 19u, 1, 0, 0x1A3u, 4u, 0, "", 0); pGUIWindow_CurrentMenu->CreateButton(129u, 243u, 70u, 0x13u, 1, 0, 0x1A3u, 5u, 0, "", 0); pGUIWindow_CurrentMenu->CreateButton(129u, 262u, 70u, 0x13u, 1, 0, 0x1A3u, 6u, 0, "", 0); pGUIWindow_CurrentMenu->CreateButton(350u, 148u, 70u, 0x13u, 1, 0, 0x1A3u, 7u, 0, "", 0); pGUIWindow_CurrentMenu->CreateButton(350u, 167u, 70u, 0x13u, 1, 0, 0x1A3u, 8u, 0, "", 0); pGUIWindow_CurrentMenu->CreateButton(350u, 186u, 70u, 0x13u, 1, 0, 0x1A3u, 9u, 0, "", 0); pGUIWindow_CurrentMenu->CreateButton(350u, 205u, 70u, 0x13u, 1, 0, 0x1A3u, 0xAu, 0, "", 0); pGUIWindow_CurrentMenu->CreateButton(350u, 224u, 70u, 0x13u, 1, 0, 0x1A3u, 0xBu, 0, "", 0); pGUIWindow_CurrentMenu->CreateButton(350u, 243u, 70u, 0x13u, 1, 0, 0x1A3u, 0xCu, 0, "", 0); pGUIWindow_CurrentMenu->CreateButton(350u, 262u, 70u, 0x13u, 1, 0, 0x1A3u, 0xDu, 0, "", 0); dword_506E68 = -1; KeyboardPageNum = 1; memset(KeyButtonFlagChangesArray, 0, sizeof(KeyButtonFlagChangesArray)); //*(_WORD *)KeyButtonArray[28] = 0; memcpy(pPrevVirtualCidesMapping, pKeyActionMap->pVirtualKeyCodesMapping, 0x78u); v1 = ""; v0 = 1; continue; case UIMSG_ChangeKeyButton: if ( dword_506E68 != -1 ) { pAudioPlayer->PlaySound((SoundID)27, 0, 0, -1, 0, 0, 0, 0); continue; } v14 = uMessageParam; if ( KeyboardPageNum != v0 ) v14 = uMessageParam + 14; dword_506E68 = v14; pKeyActionMap->EnterText(0, v0, pGUIWindow_CurrentMenu); continue; case UIMSG_ResetKeyMapping: v197 = 1; pKeyActionMap->SetDefaultMapping(); uAction = 0; do { v15 = pKeyActionMap->GetActionVKey((enum InputAction)uAction); if ( v15 != pPrevVirtualCidesMapping[uAction] ) { if ( v197 ) { v16 = pKeyActionMap->GetActionVKey((enum InputAction)uAction); GUI_ReplaceHotkey(LOBYTE(pPrevVirtualCidesMapping[uAction]), v16, v0); v197 = 0; } else { v17 = pKeyActionMap->GetActionVKey((enum InputAction)uAction); GUI_ReplaceHotkey(LOBYTE(pPrevVirtualCidesMapping[uAction]), v17, 0); } } pPrevVirtualCidesMapping[uAction] = pKeyActionMap->GetActionVKey((enum InputAction)uAction); v18 = uAction++; v13 = uAction > 28; v12 = uAction - 28 < 0; KeyButtonFlagChangesArray[v18] = 0; } while ( v12 ^ v13 ); pAudioPlayer->PlaySound((SoundID)219, 0, 0, -1, 0, 0, 0, 0); continue; case UIMSG_SelectKeyPage1: KeyboardPageNum = v0; continue; case UIMSG_SelectKeyPage2: KeyboardPageNum = 2; continue; case UIMSG_OpenVideoOptions: if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; pGUIWindow_CurrentMenu->Release(); viewparams->field_48 = v0; pCurrentScreen = SCREEN_VIDEO_OPTIONS; uTextureID_507C10 = pIcons_LOD->LoadTexture("optvid", TEXTURE_16BIT_PALETTE); uTextureID_507C14 = pIcons_LOD->LoadTexture("opvdH-bs", TEXTURE_16BIT_PALETTE); uTextureID_507C18 = pIcons_LOD->LoadTexture("opvdH-cl", TEXTURE_16BIT_PALETTE); uTextureID_507C1C = pIcons_LOD->LoadTexture("opvdH-tn", TEXTURE_16BIT_PALETTE); uTextureID_507C20 = pIcons_LOD->LoadTexture("con_ArrL", TEXTURE_16BIT_PALETTE); uTextureID_507C24 = pIcons_LOD->LoadTexture("con_ArrR", TEXTURE_16BIT_PALETTE); pTextureIDs_GammaPositions[0] = pIcons_LOD->LoadTexture("convol10", TEXTURE_16BIT_PALETTE); pTextureIDs_GammaPositions[1] = pIcons_LOD->LoadTexture("convol20", TEXTURE_16BIT_PALETTE); pTextureIDs_GammaPositions[2] = pIcons_LOD->LoadTexture("convol30", TEXTURE_16BIT_PALETTE); pTextureIDs_GammaPositions[3] = pIcons_LOD->LoadTexture("convol40", TEXTURE_16BIT_PALETTE); pTextureIDs_GammaPositions[4] = pIcons_LOD->LoadTexture("convol50", TEXTURE_16BIT_PALETTE); pTextureIDs_GammaPositions[5] = pIcons_LOD->LoadTexture("convol60", TEXTURE_16BIT_PALETTE); pTextureIDs_GammaPositions[6] = pIcons_LOD->LoadTexture("convol70", TEXTURE_16BIT_PALETTE); pTextureIDs_GammaPositions[7] = pIcons_LOD->LoadTexture("convol80", TEXTURE_16BIT_PALETTE); pTextureIDs_GammaPositions[8] = pIcons_LOD->LoadTexture("convol90", TEXTURE_16BIT_PALETTE); pTextureIDs_GammaPositions[9] = pIcons_LOD->LoadTexture("convol00", TEXTURE_16BIT_PALETTE); uTextureID_507C50 = pIcons_LOD->LoadTexture("opvdG-bs", TEXTURE_16BIT_PALETTE); uTextureID_507C54 = pIcons_LOD->LoadTexture("opvdG-cl", TEXTURE_16BIT_PALETTE); uTextureID_507C58 = pIcons_LOD->LoadTexture("opvdG-tn", TEXTURE_16BIT_PALETTE); pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, WINDOW_VideoOptions, 0, 0); pGUIWindow_CurrentMenu->CreateButton(0xF1u, 0x12Eu, 0xD6u, 0x28u, v0, 0, 0x71u, 0, 0, v1, 0); if ( pRenderer->pRenderD3D ) { pGUIWindow_CurrentMenu->CreateButton(0x13u, 0x118u, 0xD6u, 0x12u, v0, 0, 0x1A6u, 0, 0, v1, 0); pGUIWindow_CurrentMenu->CreateButton(0x13u, 0x12Eu, 0xD6u, 0x12u, v0, 0, 0x1A7u, 0, 0, v1, 0); pGUIWindow_CurrentMenu->CreateButton(0x13u, 0x144u, 0xD6u, 0x12u, v0, 0, 0x1A8u, 0, 0, v1, 0); } if ( !pRenderer->bWindowMode ) { v0 = 1; if ( GammaController::IsGammaSupported() ) { pBtn_SliderLeft = pGUIWindow_CurrentMenu->CreateButton(0x15u, 0xA1u, 0x10u, 0x10u, 1, 0, 0x1A9u, 4u, 0, v1, &pIcons_LOD->pTextures[uTextureID_507C20], 0); pBtn_SliderRight = pGUIWindow_CurrentMenu->CreateButton(0xD5u, 0xA1u, 0x10u, 0x10u, 1, 0, 0x1A9u, 5u, 0, v1, &pIcons_LOD->pTextures[uTextureID_507C24], 0); pGUIWindow_CurrentMenu->CreateButton(42, 162, 170, 18, 1, 0, 425, 0, 0, v1, 0); } } continue; case UIMSG_1A9: if ( uMessageParam == 4 ) { //--uGammaPos; if ( (uGammaPos -- -1) < 0 ) { uGammaPos = 0; pAudioPlayer->PlaySound((SoundID)21, 0, 0, -1, 0, 0, 0, 0); continue; } v19 = (double)(signed int)uGammaPos * 0.1 + 0.6; pGame->pGammaController->Initialize(v19); GUIWindow::Create(21, 161, 0, 0, (WindowType)90, (int)pBtn_SliderLeft, v0); pAudioPlayer->PlaySound((SoundID)21, 0, 0, -1, 0, 0, 0, 0); continue; } if ( uMessageParam == 5 ) { ++uGammaPos; if ( (signed int)uGammaPos <= 9 ) { v21 = (double)(signed int)uGammaPos * 0.1 + 0.6; pGame->pGammaController->Initialize(v21); GUIWindow::Create(213, 161, 0, 0, (WindowType)90, (int)pBtn_SliderRight, v0); pAudioPlayer->PlaySound((SoundID)21, 0, 0, -1, 0, 0, 0, 0); continue; } uGammaPos = 9; } else { uGammaPos = (pMouse->GetCursorPos(&a2)->x - 42) / 17; v22 = (double)(signed int)uGammaPos * 0.1 + 0.6; pGame->pGammaController->Initialize(v22); } pAudioPlayer->PlaySound((SoundID)21, 0, 0, -1, 0, 0, 0, 0); continue; case UIMSG_ToggleBloodsplats: pGame->ToggleFlags2(0x20u); continue; case UIMSG_ToggleColoredLights: pRenderer->bUseColoredLights = pRenderer->bUseColoredLights == 0; continue; case UIMSG_ToggleTint: pRenderer->bTinting = pRenderer->bTinting == 0; continue; case UIMSG_ChangeMusicVolume: if ( uMessageParam == 4 ) { --uMusicVolimeMultiplier; if ( (char)uMusicVolimeMultiplier < 1 ) uMusicVolimeMultiplier = 0; GUIWindow::Create(243, 0xD8u, 0, 0, (enum WindowType)90, (int)pBtn_SliderLeft, v0); if ( uMusicVolimeMultiplier ) pAudioPlayer->PlaySound(SOUND_Bell, -1, 0, -1, 0, 0, pSoundVolumeLevels[(char)uMusicVolimeMultiplier] * 64.0f, 0); pAudioPlayer->SetMusicVolume(pSoundVolumeLevels[(char)uMusicVolimeMultiplier] * 64.0f); continue; } if ( uMessageParam == 5 ) { ++uMusicVolimeMultiplier; if ( (char)uMusicVolimeMultiplier > 9 ) uMusicVolimeMultiplier = 9; GUIWindow::Create(435, 0xD8u, 0, 0, (enum WindowType)90, (int)pBtn_SliderRight, v0); if ( uMusicVolimeMultiplier ) pAudioPlayer->PlaySound(SOUND_Bell, -1, 0, -1, 0, 0, pSoundVolumeLevels[(char)uMusicVolimeMultiplier] * 64.0f, 0); pAudioPlayer->SetMusicVolume(pSoundVolumeLevels[(char)uMusicVolimeMultiplier] * 64.0f); continue; } uMusicVolimeMultiplier = (pMouse->GetCursorPos(&v202)->x - 263) / 17; if ( (char)uMusicVolimeMultiplier > 9 ) uMusicVolimeMultiplier = 9; if ( uMusicVolimeMultiplier ) pAudioPlayer->PlaySound(SOUND_Bell, -1, 0, -1, 0, 0, pSoundVolumeLevels[uMusicVolimeMultiplier] * 64.0f, 0); pAudioPlayer->SetMusicVolume(pSoundVolumeLevels[uMusicVolimeMultiplier] * 64.0f); continue; case UIMSG_ChangeSoundVolume: if ( uMessageParam == 4 )//reduce sound level button left { --uSoundVolumeMultiplier; if ( (char)uSoundVolumeMultiplier < 1 ) uSoundVolumeMultiplier = 0; GUIWindow::Create(243, 162, 0, 0, (enum WindowType)90, (int)pBtn_SliderLeft, v0); pAudioPlayer->SetMasterVolume(pSoundVolumeLevels[uSoundVolumeMultiplier] * 128.0f); pAudioPlayer->PlaySound((SoundID)218, -1, 0, -1, 0, 0, 0, 0); continue; } if ( uMessageParam == 5 )//Increase sound level button right { ++uSoundVolumeMultiplier; if ( (char)uSoundVolumeMultiplier > 8 ) uSoundVolumeMultiplier = 9; v168 = v0; v24 = 435; v154 = (int)pBtn_SliderRight; GUIWindow::Create(v24, 0xA2u, 0, 0, (enum WindowType)90, v154, v168); pAudioPlayer->SetMasterVolume(pSoundVolumeLevels[uSoundVolumeMultiplier] * 128.0f); pAudioPlayer->PlaySound((SoundID)218, -1, 0, -1, 0, 0, 0, 0); continue; } uSoundVolumeMultiplier = (pMouse->GetCursorPos(&v207)->x - 263) / 17; if ( (char)uSoundVolumeMultiplier > 8 ) uSoundVolumeMultiplier = 9; pAudioPlayer->SetMasterVolume(pSoundVolumeLevels[uSoundVolumeMultiplier] * 128.0f); pAudioPlayer->PlaySound((SoundID)218, -1, 0, -1, 0, 0, 0, 0); continue; case UIMSG_ToggleFlipOnExit: bFlipOnExit = bFlipOnExit == 0; continue; case UIMSG_ToggleAlwaysRun: bAlwaysRun = bAlwaysRun == 0; continue; case UIMSG_ToggleWalkSound: bWalkSound = bWalkSound == 0; continue; case UIMSG_ToggleShowDamage: bShowDamage = bShowDamage == 0; continue; case UIMSG_ChangeVoiceVolume: if ( uMessageParam == 4 ) { --uVoicesVolumeMultiplier; if ( (char)uVoicesVolumeMultiplier < 1 ) uVoicesVolumeMultiplier = 0; GUIWindow::Create(243, 270, 0, 0, (enum WindowType)90, (int)pBtn_SliderLeft, v0); if ( !uVoicesVolumeMultiplier ) continue; pAudioPlayer->PlaySound((SoundID)5788, -1, 0, -1, 0, 0, pSoundVolumeLevels[uVoicesVolumeMultiplier] * 128.0f, 0); continue; } if ( uMessageParam == 5 ) { ++uVoicesVolumeMultiplier; if ( (char)uVoicesVolumeMultiplier > 8 ) uVoicesVolumeMultiplier = 9; GUIWindow::Create(435, 270, 0, 0, (enum WindowType)90, (int)pBtn_SliderRight, v0); if ( !uVoicesVolumeMultiplier ) continue; pAudioPlayer->PlaySound((SoundID)5788, -1, 0, -1, 0, 0, pSoundVolumeLevels[uVoicesVolumeMultiplier] * 128.0f, 0); continue; } uVoicesVolumeMultiplier = (pMouse->GetCursorPos(&v205)->x - 263) / 17; if ( (char)uVoicesVolumeMultiplier > 8 ) uVoicesVolumeMultiplier = 9; if ( !uVoicesVolumeMultiplier ) continue; pAudioPlayer->PlaySound((SoundID)5788, -1, 0, -1, 0, 0, pSoundVolumeLevels[uVoicesVolumeMultiplier] * 128.0f, 0); continue; case UIMSG_SetTurnSpeed: if ( uMessageParam ) pParty->sRotationY = uMessageParam * pParty->sRotationY / uMessageParam; uTurnSpeed = uMessageParam; continue; case UIMSG_SetGraphicsMode: if ( !bUseLoResSprites ) { byte_6BE388_graphicsmode = uMessageParam; MM7Initialization(); continue; } if ( uMessageParam ) { if ( uMessageParam == 1 ) { byte_6BE388_graphicsmode = 0; } else { if ( uMessageParam != 2 ) continue; byte_6BE388_graphicsmode = 1; } MM7Initialization(); continue; } ModalWindow(pNPCTopics[453].pText, 0); continue; case UIMSG_GameMenu_ReturnToGame: pGUIWindow_CurrentMenu->Release(); pEventTimer->Resume(); pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; stru_506E40.Release(); continue; case UIMSG_OpenQuestBook: if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; if ( pCurrentScreen ) pGUIWindow_CurrentMenu->Release(); pEventTimer->Pause(); pAudioPlayer->StopChannels(-1, -1); pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640u, 480u, WINDOW_Book, uMessage, 0); pBooksWindow = GUIWindow::Create(493u, 355u, 0, 0, (enum WindowType)99, (int)pBtn_Quests, 0); bFlashQuestBook = 0; continue; case UIMSG_OpenAutonotes: if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; if ( pCurrentScreen ) pGUIWindow_CurrentMenu->Release(); pEventTimer->Pause(); pAudioPlayer->StopChannels(-1, -1); pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640u, 480u, WINDOW_Book, uMessage, 0); pBooksWindow = GUIWindow::Create(527u, 353u, 0, 0, (enum WindowType)99, (int)pBtn_Autonotes, 0); bFlashAutonotesBook = 0; continue; case UIMSG_OpenMapBook: if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; if ( pCurrentScreen ) pGUIWindow_CurrentMenu->Release(); pEventTimer->Pause(); viewparams->sPartyPosX = pParty->vPosition.x; viewparams->sPartyPosZ = pParty->vPosition.y; pAudioPlayer->StopChannels(-1, -1); pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640u, 480u, WINDOW_Book, uMessage, 0); pBooksWindow = GUIWindow::Create(546, 353, 0, 0, (enum WindowType)99, (int)pBtn_Maps, 0); continue; case UIMSG_OpenCalendar: if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; if ( pCurrentScreen ) pGUIWindow_CurrentMenu->Release(); pEventTimer->Pause(); pAudioPlayer->StopChannels(-1, -1); pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, WINDOW_Book, uMessage, 0); pBooksWindow = GUIWindow::Create(570, 354, 0, 0, (enum WindowType)99, (int)pBtn_Calendar, 0); continue; case UIMSG_OpenHistoryBook: if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; if ( pCurrentScreen ) pGUIWindow_CurrentMenu->Release(); pEventTimer->Pause(); pAudioPlayer->StopChannels(-1, -1); pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, WINDOW_Book, uMessage, 0); pBooksWindow = GUIWindow::Create(0x258u, 0x169u, 0, 0, (enum WindowType)99, (int)pBtn_History, 0); bFlashHistoryBook = 0; continue; case UIMSG_Escape:// íàæàòèå Escape and return to game back_to_game(); if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; if ( pCurrentScreen > SCREEN_F ) { if ( pCurrentScreen >= SCREEN_CHANGE_LOCATION && (pCurrentScreen <= SCREEN_INPUT_BLV || pCurrentScreen == SCREEN_QUICK_REFERENCE) ) { if ( dword_50CDC8 ) goto LABEL_232; CloseWindowBackground(); uMessageParam = v0; goto LABEL_232; } } else { if ( pCurrentScreen >= SCREEN_E || pCurrentScreen == SCREEN_NPC_DIALOGUE || pCurrentScreen == SCREEN_CHEST ) { if ( dword_50CDC8 ) goto LABEL_232; CloseWindowBackground(); uMessageParam = v0; goto LABEL_232; } if ( pCurrentScreen == SCREEN_HOUSE && !dword_50CDC8 && !dword_5C35C8 ) { CloseWindowBackground(); dword_5C35C8 = 0; uMessageParam = v0; } } LABEL_232: if ( !ptr_507BDC ) { pRenderer->ClearZBuffer(0, 479); viewparams->bRedrawGameUI = v0; viewparams->field_48 = v0; if ( pCurrentScreen ) { if ( pCurrentScreen > SCREEN_67 ) { if ( pCurrentScreen == SCREEN_QUICK_REFERENCE ) goto LABEL_321; } else { if ( pCurrentScreen < SCREEN_64 ) { switch ( pCurrentScreen ) { case SCREEN_CASTING: pIcons_LOD->_4114F2(); if ( some_active_character ) { uActiveCharacter = some_active_character; uActiveCharacter = pParty->GetNextActiveCharacter(); some_active_character = 0; if ( pParty->bTurnBasedModeOn ) pTurnEngine->_40471C(); dword_50C9D0 = 0; dword_50C9D4 = 0; dword_50C9D8 = 0; } if ( ptr_50C9A4 && ptr_50C9A4->uItemID ) { LOBYTE(ptr_50C9A4->uAttributes) &= 0xFu; dword_50C9A8 = 0; ptr_50C9A4 = 0; } if ( pGUIWindow_Settings ) { if ( pCurrentScreen == SCREEN_CHARACTERS ) { pMouse->SetCursorBitmap("MICON2"); } else { pGUIWindow_Settings->Release(); pGUIWindow_Settings = 0; pMouse->SetCursorBitmap("MICON1"); GameUI_StatusBar_TimedStringTimeLeft = 0; unk_50C9A0 = 0; back_to_game(); } } if ( (signed int)uActiveCharacter < v0 || (signed int)uActiveCharacter > 4 ) uActiveCharacter = pParty->GetNextActiveCharacter(); pGUIWindow_CurrentMenu->Release(); if ( pGUIWindow_CurrentMenu == window_SpeakInHouse ) window_SpeakInHouse = 0; pGUIWindow_CurrentMenu = 0; pEventTimer->Resume(); pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; pIcons_LOD->_4355F7(); continue; case SCREEN_BOOKS: pBooksWindow->Release(); //crt_deconstruct_ptr_6A0118(); pBooksWindow = 0; pEventTimer->Resume(); if ( pGUIWindow_Settings ) { if ( pCurrentScreen == SCREEN_CHARACTERS ) { pMouse->SetCursorBitmap("MICON2"); } else { pGUIWindow_Settings->Release(); pGUIWindow_Settings = 0; pMouse->SetCursorBitmap("MICON1"); GameUI_StatusBar_TimedStringTimeLeft = 0; unk_50C9A0 = 0; back_to_game(); } } if ( (signed int)uActiveCharacter < v0 || (signed int)uActiveCharacter > 4 ) uActiveCharacter = pParty->GetNextActiveCharacter(); pGUIWindow_CurrentMenu->Release(); if ( pGUIWindow_CurrentMenu == window_SpeakInHouse ) window_SpeakInHouse = 0; pGUIWindow_CurrentMenu = 0; pEventTimer->Resume(); pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; pIcons_LOD->_4355F7(); continue; case SCREEN_SAVEGAME: case SCREEN_LOADGAME: pIcons_LOD->_4114F2(); //crt_deconstruct_ptr_6A0118(); stru_506E40.Release(); break; case SCREEN_F: pCurrentScreen = SCREEN_CHEST; continue; case SCREEN_CHEST: pWindow2 = pChestWindow; pWindow2->Release(); pIcons_LOD->_4114F2(); pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; pEventTimer->Resume(); continue; case SCREEN_19: pWindow2 = ptr_507BC8; pWindow2->Release(); pIcons_LOD->_4114F2(); pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; pEventTimer->Resume(); continue; case SCREEN_OPTIONS://Close thisa = (signed int)&uTextureID_ControlBG; do { if ( *(int *)thisa ) pIcons_LOD->pTextures[*(int *)thisa].Release(); thisa += 4; } while ( thisa < (signed int)&dword_507CBC ); memset(&uTextureID_ControlBG, 0, 0x5Cu); pIcons_LOD->_40F9C5(); WriteWindowsRegistryInt("soundflag", (char)uSoundVolumeMultiplier); WriteWindowsRegistryInt("musicflag", (char)uMusicVolimeMultiplier); WriteWindowsRegistryInt("CharVoices", (char)uVoicesVolumeMultiplier); WriteWindowsRegistryInt("WalkSound", bWalkSound); WriteWindowsRegistryInt("ShowDamage", bShowDamage); WriteWindowsRegistryInt("graphicsmode", (unsigned __int8)byte_6BE388_graphicsmode); WriteWindowsRegistryInt("valAlwaysRun", bAlwaysRun); WriteWindowsRegistryInt("FlipOnExit", bFlipOnExit); if ( !uTurnSpeed ) { v171 = 3; v30 = v171; v31 = "TurnDelta"; WriteWindowsRegistryInt(v31, v30); stru_506E40.Release(); break; } if ( uTurnSpeed == 64 ) { v171 = 2; v30 = v171; v31 = "TurnDelta"; WriteWindowsRegistryInt(v31, v30); stru_506E40.Release(); break; } if ( uTurnSpeed != 128 ) { stru_506E40.Release(); break; } v30 = v0; v31 = "TurnDelta"; WriteWindowsRegistryInt(v31, v30); stru_506E40.Release(); break; case SCREEN_MENU: pIcons_LOD->_40F9C5(); pIcons_LOD->_4114F2(); pIcons_LOD->_40F9C5(); pIcons_LOD->_4114F2(); stru_506E40.Release(); break; case SCREEN_VIDEO_OPTIONS: if ( pRenderer->pRenderD3D ) { WriteWindowsRegistryInt("Colored Lights", pRenderer->bUseColoredLights); WriteWindowsRegistryInt("Tinting", pRenderer->bTinting); WriteWindowsRegistryInt("Bloodsplats", (LOBYTE(pGame->uFlags2) >> 5) & 1); } if ( pRenderer->bWindowMode ) { stru_506E40.Release(); break; } v30 = uGammaPos; v31 = "GammaPos"; WriteWindowsRegistryInt(v31, v30); stru_506E40.Release(); break; case SCREEN_KEYBOARD_OPTIONS://Return to game v197 = 1; v32 = 0; while ( KeyButtonFlagChangesArray[v32] != 1 ) { ++v32; if ( v32 >= 28 ) { thisb = (signed int)&uTextureID_Optkb; do { if ( *(int *)thisb ) pIcons_LOD->pTextures[*(int *)thisb].Release(); thisb += 4; } while ( thisb < (signed int)&dword_507C08 ); memset(&uTextureID_Optkb, 0, 0x14u); pIcons_LOD->_40F9C5(); uAction = 0; do { v33 = pKeyActionMap->GetActionVKey((enum InputAction)uAction); if ( v33 != pPrevVirtualCidesMapping[uAction] ) { if ( v197 ) { v34 = pKeyActionMap->GetActionVKey((enum InputAction)uAction); GUI_ReplaceHotkey(v34, LOBYTE(pPrevVirtualCidesMapping[uAction]), v0); v197 = 0; } else { v35 = pKeyActionMap->GetActionVKey((enum InputAction)uAction); GUI_ReplaceHotkey(v35, LOBYTE(pPrevVirtualCidesMapping[uAction]), 0); } } if ( uAction && uAction != 2 && uAction != 3 && uAction != v0 && uAction != 25 && uAction != 26 ) pKeyToggleType = (KeyToggleType)v0; else pKeyToggleType = (KeyToggleType)0; pKeyActionMap->SetKeyMapping(uAction, pPrevVirtualCidesMapping[uAction], pKeyToggleType); ++uAction; } while ( uAction < 28 ); pKeyActionMap->StoreMappings(); stru_506E40.Release(); break; } } break; case SCREEN_REST: if ( dword_506F14 ) { Rest(_506F18_num_hours_to_sleep); pParty->pPlayers[3].pConditions[2] = 0i64; pParty->pPlayers[2].pConditions[2] = 0i64; pParty->pPlayers[1].pConditions[2] = 0i64; pParty->pPlayers[0].pConditions[2] = 0i64; } pTexture_RestUI_CurrentSkyFrame->Release(); pTexture_RestUI_CurrentHourglassFrame->Release(); pTexture_RestUI_CurrentHourglassFrame = 0; pTexture_RestUI_CurrentSkyFrame = 0; pIcons_LOD->_40F9C5(); pIcons_LOD->_4114F2(); _506F18_num_hours_to_sleep = 0; dword_506F14 = 0; dword_507B94 = v0; if ( pGUIWindow_Settings ) { if ( pCurrentScreen == SCREEN_CHARACTERS ) { pMouse->SetCursorBitmap("MICON2"); } else { pGUIWindow_Settings->Release(); pGUIWindow_Settings = 0; pMouse->SetCursorBitmap("MICON1"); GameUI_StatusBar_TimedStringTimeLeft = 0; unk_50C9A0 = 0; back_to_game(); } } if ( (signed int)uActiveCharacter < v0 || (signed int)uActiveCharacter > 4 ) uActiveCharacter = pParty->GetNextActiveCharacter(); pGUIWindow_CurrentMenu->Release(); if ( pGUIWindow_CurrentMenu == window_SpeakInHouse ) window_SpeakInHouse = 0; pGUIWindow_CurrentMenu = 0; pEventTimer->Resume(); pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; pIcons_LOD->_4355F7(); continue; case SCREEN_E: pGUIWindow_CurrentMenu->Release(); pCurrentScreen = SCREEN_HOUSE; pIcons_LOD->_4114F2(); continue; case SCREEN_HOUSE: if ( uDialogueType ) uDialogueType = 0; if ( uGameState == 2 ) { while ( sub_4BD8B5() ) ; } else { if ( sub_4BD8B5() ) continue; } sub_4B1D27(); pAudioPlayer->PlaySound((SoundID)(SOUND_EnteringAHouse|0x1), 814, 0, -1, 0, 0, 0, 0); pVideoPlayer->Unload(); pGUIWindow_CurrentMenu = window_SpeakInHouse; if ( pGUIWindow_Settings ) { if ( pCurrentScreen == SCREEN_CHARACTERS ) { pMouse->SetCursorBitmap("MICON2"); } else { pGUIWindow_Settings->Release(); pGUIWindow_Settings = 0; pMouse->SetCursorBitmap("MICON1"); GameUI_StatusBar_TimedStringTimeLeft = 0; unk_50C9A0 = 0; back_to_game(); } } if ( (signed int)uActiveCharacter < v0 || (signed int)uActiveCharacter > 4 ) uActiveCharacter = pParty->GetNextActiveCharacter(); pGUIWindow_CurrentMenu->Release(); if ( pGUIWindow_CurrentMenu == window_SpeakInHouse ) window_SpeakInHouse = 0; pGUIWindow_CurrentMenu = 0; pEventTimer->Resume(); pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; pIcons_LOD->_4355F7(); continue; case SCREEN_INPUT_BLV: if ( uCurrentHouse_Animation == 153 ) HousePlaySomeSound(0x99u, 3); pVideoPlayer->Unload(); if ( dword_5B65CC ) { pParty->field_709 = 0; LOBYTE(pNPCStats->pNewNPCData[dword_5B65CC].uFlags) &= 0x7Fu; sub_44A56A(); viewparams->bRedrawGameUI = v0; dword_5B65CC = 0; } goto LABEL_317; case SCREEN_NPC_DIALOGUE: if ( dword_5B65CC ) { pParty->field_709 = 0; LOBYTE(pNPCStats->pNewNPCData[dword_5B65CC].uFlags) &= 0x7Fu; sub_44A56A(); viewparams->bRedrawGameUI = v0; dword_5B65CC = 0; } goto LABEL_317; case SCREEN_BRANCHLESS_NPC_DIALOG: memset(GameUI_StatusBar_TimedString, 0, 0xC8u); sub_4452BB(); goto LABEL_317; case SCREEN_CHANGE_LOCATION: if ( pParty->vPosition.x < -22528 ) pParty->vPosition.x = -22528; if ( pParty->vPosition.x > 22528 ) pParty->vPosition.x = 22528; if ( pParty->vPosition.y < -22528 ) pParty->vPosition.y = -22528; if ( pParty->vPosition.y > 22528 ) pParty->vPosition.y = 22528; goto LABEL_317; case SCREEN_VIDEO: pVideoPlayer->Unload(); continue; case SCREEN_CHARACTERS: goto LABEL_319; default: if ( pGUIWindow_Settings ) { if ( pCurrentScreen == SCREEN_CHARACTERS ) { pMouse->SetCursorBitmap("MICON2"); } else { pGUIWindow_Settings->Release(); pGUIWindow_Settings = 0; pMouse->SetCursorBitmap("MICON1"); GameUI_StatusBar_TimedStringTimeLeft = 0; unk_50C9A0 = 0; back_to_game(); } } if ( (signed int)uActiveCharacter < v0 || (signed int)uActiveCharacter > 4 ) uActiveCharacter = pParty->GetNextActiveCharacter(); pGUIWindow_CurrentMenu->Release(); if ( pGUIWindow_CurrentMenu == window_SpeakInHouse ) window_SpeakInHouse = 0; pGUIWindow_CurrentMenu = 0; pEventTimer->Resume(); pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; pIcons_LOD->_4355F7(); continue; } if ( pGUIWindow_Settings ) { if ( pCurrentScreen == SCREEN_CHARACTERS ) { pMouse->SetCursorBitmap("MICON2"); } else { pGUIWindow_Settings->Release(); pGUIWindow_Settings = 0; pMouse->SetCursorBitmap("MICON1"); GameUI_StatusBar_TimedStringTimeLeft = 0; unk_50C9A0 = 0; back_to_game(); } } if ( (signed int)uActiveCharacter < v0 || (signed int)uActiveCharacter > 4 ) uActiveCharacter = pParty->GetNextActiveCharacter(); pGUIWindow_CurrentMenu->Release(); if ( pGUIWindow_CurrentMenu == window_SpeakInHouse ) window_SpeakInHouse = 0; pGUIWindow_CurrentMenu = 0; pEventTimer->Resume(); pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; pIcons_LOD->_4355F7(); continue; } LABEL_319: sub_4196A0(); sub_419379(); LABEL_321: pIcons_LOD->_4114F2(); } if ( pGUIWindow_Settings ) { if ( pCurrentScreen == SCREEN_CHARACTERS ) { pMouse->SetCursorBitmap("MICON2"); } else { pGUIWindow_Settings->Release(); pGUIWindow_Settings = 0; pMouse->SetCursorBitmap("MICON1"); GameUI_StatusBar_TimedStringTimeLeft = 0; unk_50C9A0 = 0; back_to_game(); } } if ( (signed int)uActiveCharacter < v0 || (signed int)uActiveCharacter > 4 ) uActiveCharacter = pParty->GetNextActiveCharacter(); pGUIWindow_CurrentMenu->Release(); if ( pGUIWindow_CurrentMenu == window_SpeakInHouse ) window_SpeakInHouse = 0; pGUIWindow_CurrentMenu = 0; pEventTimer->Resume(); pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; pIcons_LOD->_4355F7(); continue; } pWindow3 = pGUIWindow_Settings; if ( !pGUIWindow_Settings )//Draw Menu { dword_6BE138 = -1; GUIWindow::Create(0x25Au, 0x1C2u, 0, 0, (enum WindowType)90, (int)pBtn_GameSettings, v0); pEventTimer->Pause(); pAudioPlayer->StopChannels(-1, -1); ++pIcons_LOD->uTexturePacksCount; pCurrentScreen = v0; if ( !pIcons_LOD->uNumPrevLoadedFiles ) pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles; pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, (enum WindowType)3, 0, 0); uTextureID_Options = pIcons_LOD->LoadTexture("options", TEXTURE_16BIT_PALETTE); uTextureID_New1 = pIcons_LOD->LoadTexture("new1", TEXTURE_16BIT_PALETTE); uTextureID_Load1 = pIcons_LOD->LoadTexture("load1", TEXTURE_16BIT_PALETTE); uTextureID_Save1 = pIcons_LOD->LoadTexture("save1", TEXTURE_16BIT_PALETTE); uTextureID_Controls1 = pIcons_LOD->LoadTexture("controls1", TEXTURE_16BIT_PALETTE); uTextureID_Resume1 = pIcons_LOD->LoadTexture("resume1", TEXTURE_16BIT_PALETTE); uTextureID_Quit1 = pIcons_LOD->LoadTexture("quit1", TEXTURE_16BIT_PALETTE); pBtn_NewGame = pGUIWindow_CurrentMenu->CreateButton(0x13u, 0x9Bu, 0xD6u, 0x28u, v0, 0, 0x7Cu, 0, 0x4Eu, pGlobalTXT_LocalizationStrings[614],// "New Game" (Texture *)(uTextureID_New1 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_New1] : 0), 0); pBtn_SaveGame = pGUIWindow_CurrentMenu->CreateButton(0x13u, 0xD1u, 0xD6u, 0x28u, v0, 0, 0x7Eu, 0, 0x53u, pGlobalTXT_LocalizationStrings[615],// "Save Game" (Texture *)(uTextureID_Save1 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_Save1] : 0), 0); pBtn_LoadGame = pGUIWindow_CurrentMenu->CreateButton(19, 263, 0xD6u, 0x28u, v0, 0, 0x7Du, 0, 0x4Cu, pGlobalTXT_LocalizationStrings[616],// "Load Game" (Texture *)(uTextureID_Load1 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_Load1] : 0), 0); pBtn_GameControls = pGUIWindow_CurrentMenu->CreateButton(241, 155, 214, 40, v0, 0, 0x7Fu, 0, 0x43u, pGlobalTXT_LocalizationStrings[617],// ""Sound, Keyboard, Game Options:"" (Texture *)(uTextureID_Controls1 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_Controls1] : 0), 0); pBtn_QuitGame = pGUIWindow_CurrentMenu->CreateButton(241, 209, 214, 40, v0, 0, 0x84u, 0, 0x51u, pGlobalTXT_LocalizationStrings[618],// "Quit" (Texture *)(uTextureID_Quit1 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_Quit1] : 0), 0); pBtn_Resume = pGUIWindow_CurrentMenu->CreateButton(241, 263, 214, 40, v0, 0, 0x7Bu, 0, 0x52u, pGlobalTXT_LocalizationStrings[619],// "Return to Game" (Texture *)(uTextureID_Resume1 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_Resume1] : 0), 0); pGUIWindow_CurrentMenu->_41D08F(6, v0, 0, 0); viewparams->field_48 = v0; stru_506E40.Release(); uNumSeconds = (unsigned int)MakeScreenshot(155, 117); pRenderer->SavePCXImage("gamma.pcx", (char *)uNumSeconds, 155, 117); free((void *)uNumSeconds); stru_506E40._40E55E("gamma.pcx", 0); continue; } pWindow3->Release(); pGUIWindow_Settings = 0; pMouse->SetCursorBitmap("MICON1"); GameUI_StatusBar_TimedStringTimeLeft = 0; unk_50C9A0 = 0; back_to_game(); continue; } sub_41426F(); continue; case UIMSG_ScrollNPCPanel://Right and Left button for NPCPanel if ( uMessageParam ) { GUIWindow::Create(626, 179, 0, 0, (enum WindowType)90, (int)pBtn_NPCRight, 0); v37 = (pParty->pHirelings[0].pName != 0) + (pParty->pHirelings[1].pName != 0) + (unsigned __int8)pParty->field_70A - 2; if ( (unsigned __int8)pParty->field_709 < v37 ) { ++pParty->field_709;//??? maybe number of the first cell??? if ( (unsigned __int8)pParty->field_709 >= v37 ) pParty->field_709 = (pParty->pHirelings[0].pName != 0) + (pParty->pHirelings[1].pName != 0) + pParty->field_70A - 2; } } else { GUIWindow::Create(469, 179, 0, 0, (enum WindowType)90, (int)pBtn_NPCLeft, 0); if ( pParty->field_709 ) { --pParty->field_709; if ( pParty->field_709 < 1 ) pParty->field_709 = 0; } } DrawHiredNPCs(); continue; case UIMSG_TransitionUI_Confirm: if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; dword_50CDC8 = v0; sub_42FBDD(); HousePlaySomeSound(uCurrentHouse_Animation, 2); pVideoPlayer->Unload(); sub_44603D(); viewparams->bRedrawGameUI = v0; if ( dword_59117C_teleportx | dword_591178_teleporty | dword_591174_teleportz | dword_591170_teleport_directiony | dword_59116C_teleport_directionx | dword_591168_teleport_speedz ) { if ( dword_59117C_teleportx ) { pParty->vPosition.x = dword_59117C_teleportx; _5B65A8_npcdata_uflags_or_other = dword_59117C_teleportx; } if ( dword_591178_teleporty ) { pParty->vPosition.y = dword_591178_teleporty; _5B65AC_npcdata_fame_or_other = dword_591178_teleporty; } if ( dword_591174_teleportz ) { pParty->vPosition.z = dword_591174_teleportz; _5B65B0_npcdata_rep_or_other = dword_591174_teleportz; pParty->uFallStartY = dword_591174_teleportz; } if ( dword_591170_teleport_directiony ) { pParty->sRotationY = dword_591170_teleport_directiony; _5B65B4_npcdata_loword_house_or_other = dword_591170_teleport_directiony; } if ( dword_59116C_teleport_directionx ) { pParty->sRotationX = dword_59116C_teleport_directionx; _5B65B8_npcdata_hiword_house_or_other = dword_59116C_teleport_directionx; v38 = dword_591168_teleport_speedz; pParty->uFallSpeed = dword_591168_teleport_speedz; dword_5B65BC = dword_591168_teleport_speedz; } else { v38 = dword_5B65BC; } if ( *dword_591164_teleport_map_name != 48 ) { pGameLoadingUI_ProgressBar->uType = (GUIProgressBar::Type)2; dword_5B65C0 = _5B65A8_npcdata_uflags_or_other | _5B65AC_npcdata_fame_or_other | _5B65B0_npcdata_rep_or_other | _5B65B4_npcdata_loword_house_or_other | _5B65B8_npcdata_hiword_house_or_other | v38; OnMapLeave(); sub_44987B(dword_591164_teleport_map_name, 0); } } else { start_event_seq_number = dword_5C341C; EventProcessor(dword_5C3418, 0, v0); } start_event_seq_number = 0; if ( !_strcmpi(byte_6BE3B0, "d05.blv") ) pParty->uTimePlayed += 1474560i64; continue; case UIMSG_19C: CloseWindowBackground(); pVideoPlayer->Unload(); sub_44603D(); start_event_seq_number = 0; goto LABEL_422; case UIMSG_CycleCharacters: v39 = GetAsyncKeyState(VK_SHIFT); v40 = CycleCharacter(v39); goto LABEL_421; case UIMSG_5A: if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; dword_50CDC8 = v0; sub_42FBDD(); pNPCData4 = (NPCData *)GetTravelTime(); strcpy(pOutdoor->pLevelFilename, pCurrentMapName); if ( bUnderwater != 1 && pParty->bFlying || pOutdoor->GetTravelDestination(pParty->vPosition.x, pParty->vPosition.y, &pOut, 20) != v0 ) { viewparams->bRedrawGameUI = v0; LABEL_387: CloseWindowBackground(); if ( pParty->vPosition.x < -22528 ) pParty->vPosition.x = -22528; if ( pParty->vPosition.x > 22528 ) pParty->vPosition.x = 22528; if ( pParty->vPosition.y < -22528 ) pParty->vPosition.y = -22528; if ( pParty->vPosition.y > 22528 ) pParty->vPosition.y = 22528; LABEL_317: sub_44603D(); pCurrentScreen = SCREEN_GAME; } else { pParty->field_6E4 = 0; pParty->field_6E0 = 0; pStru277->_427D48(v0); sub_44603D(); pEventTimer->Pause(); pGameLoadingUI_ProgressBar->Initialize(GUIProgressBar::TYPE_Box); ++pGameLoadingUI_ProgressBar->uProgressMax; SaveGame(v0, 0); pGameLoadingUI_ProgressBar->Progress(); RestAndHeal(1440 * (signed int)pNPCData4); if ( pParty->uNumFoodRations ) { pParty->RestAndHeal(); if ( ((pParty->uNumFoodRations - (signed int)pNPCData4) & 0x80000000u) != 0 ) { pPlayer7 = pParty->pPlayers; do { pPlayer7->SetCondition(v0, 0); ++pPlayer7; } while ( (signed int)pPlayer7 < (signed int)pParty->pHirelings ); ++pParty->field_764; } Party::TakeFood((unsigned int)pNPCData4); } else { pPlayer8 = pParty->pPlayers; do { pPlayer8->SetCondition(v0, 0); ++pPlayer8; } while ( (signed int)pPlayer8 < (signed int)pParty->pHirelings ); ++pParty->field_764; } pPaletteManager->ResetNonLocked(); pSpriteFrameTable->ResetSomeSpriteFlags(); strcpy(pCurrentMapName, &pOut); strcpy(&pLevelName, pCurrentMapName); v41 = strtok(&pLevelName, "."); strcpy(&pLevelName, v41); Level_LoadEvtAndStr(&pLevelName); pDecalBuilder->Reset( 0); LoadLevel_InitializeLevelEvt(); uLevelMapStatsID = pMapStats->GetMapInfo(pCurrentMapName); bUnderwater = 0; bNoNPCHiring = 0; pGame->uFlags2 &= 0xFFFFFFF7u; if ( Is_out15odm_underwater() ) { bUnderwater = 1; pGame->uFlags2 |= 8u; } if ( !_strcmpi(pCurrentMapName, "out15.odm") || !_strcmpi(pCurrentMapName, "d47.blv") ) bNoNPCHiring = 1; v0 = 1; PrepareToLoadODM(1u, (OutdoorCamera *)1); pAudioPlayer->SetMapEAX(); bDialogueUI_InitializeActor_NPC_ID = 0; OnMapLoad(); pOutdoor->SetFog(); TeleportToStartingPoint(uLevel_StartingPointType); pParty->vPosition.z = GetTerrainHeightsAroundParty2(pParty->vPosition.x, pParty->vPosition.y, (int *)&v213, 0); pParty->uFallStartY = pParty->vPosition.z; sub_461103(); pEventTimer->Resume(); viewparams->bRedrawGameUI = 1; pCurrentScreen = SCREEN_GAME; pGameLoadingUI_ProgressBar->Release(); } goto LABEL_422; case UIMSG_5B: goto LABEL_387; case UIMSG_BE: if ( pRenderer->pRenderD3D ) { LOWORD(v42) = pGame->pVisInstance->get_picked_object_zbuf_val(); } else { uNumSeconds = (unsigned int)pMouse->GetCursorPos(&v210); pPoint = pMouse->GetCursorPos(&v208); v42 = pRenderer->pActiveZBuffer[*(int *)uNumSeconds + pSRZBufferLineOffsets[pPoint->y]]; } v44 = (unsigned __int16)v42; v45 = v44 & 7; uNumSeconds = v44; v46 = v44 >> 3; if ( v45 == 3 ) { v47 = pActors[v46].uAIState == Dead; //goto LABEL_400; if ( !v47 ) continue; //goto LABEL_415; v51 = pGUIWindow_Settings->ptr_1C; *((char *)v51 + 8) &= 0xBFu; *((short *)v51 + 2) = uMessageParam; *((int *)v51 + 3) = v44; pParty->pPlayers[*((short *)v51 + 1)].SetRecoveryTime(300); pWindow3 = pGUIWindow_Settings; pWindow3->Release(); pGUIWindow_Settings = 0; pMouse->SetCursorBitmap("MICON1"); GameUI_StatusBar_TimedStringTimeLeft = 0; unk_50C9A0 = 0; back_to_game(); continue; } if ( v45 == 2 ) { v47 = (pObjectList->pObjects[pSpriteObjects[v46].uObjectDescID].uFlags & 0x10) == 0; //LABEL_400: if ( !v47 ) continue; //goto LABEL_415; v51 = pGUIWindow_Settings->ptr_1C; *((char *)v51 + 8) &= 0xBFu; *((short *)v51 + 2) = uMessageParam; *((int *)v51 + 3) = v44; pParty->pPlayers[*((short *)v51 + 1)].SetRecoveryTime(300); pWindow3 = pGUIWindow_Settings; pWindow3->Release(); pGUIWindow_Settings = 0; pMouse->SetCursorBitmap("MICON1"); GameUI_StatusBar_TimedStringTimeLeft = 0; unk_50C9A0 = 0; back_to_game(); continue; } if ( v45 == 5 ) { v48 = pLevelDecorations[v46].field_16_event_id == 0; } else { if ( v45 != 6 ) continue; if ( uCurrentlyLoadedLevelType != v0 ) { pODMFace = &pOutdoor->pBModels[v44 >> 9].pFaces[v46 & 0x3F]; if ( !(pODMFace->uAttributes & 0x02000000) || !pODMFace->sCogTriggeredID ) continue; v44 = uNumSeconds; //goto LABEL_415; v51 = pGUIWindow_Settings->ptr_1C; *((char *)v51 + 8) &= 0xBFu; *((short *)v51 + 2) = uMessageParam; *((int *)v51 + 3) = v44; pParty->pPlayers[*((short *)v51 + 1)].SetRecoveryTime(300); pWindow3 = pGUIWindow_Settings; pWindow3->Release(); pGUIWindow_Settings = 0; pMouse->SetCursorBitmap("MICON1"); GameUI_StatusBar_TimedStringTimeLeft = 0; unk_50C9A0 = 0; back_to_game(); continue; } pBLVFace = &pIndoor->pFaces[v46]; if ( !(BYTE3(pBLVFace->uAttributes) & 2) ) continue; v48 = pIndoor->pFaceExtras[pBLVFace->uFaceExtraID].uEventID == 0; } if ( v48 ) continue; //LABEL_415: v51 = pGUIWindow_Settings->ptr_1C; *((char *)v51 + 8) &= 0xBFu; //LABEL_416: *((short *)v51 + 2) = uMessageParam; *((int *)v51 + 3) = v44; pParty->pPlayers[*((short *)v51 + 1)].SetRecoveryTime(300); pWindow3 = pGUIWindow_Settings; //LABEL_333: pWindow3->Release(); pGUIWindow_Settings = 0; pMouse->SetCursorBitmap("MICON1"); GameUI_StatusBar_TimedStringTimeLeft = 0; unk_50C9A0 = 0; back_to_game(); continue; case UIMSG_45: case UIMSG_8D: case UIMSG_8F: if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; if ( unk_50C9A0 ) { v40 = uMessageParam; LABEL_421: uActiveCharacter = v40; LABEL_422: viewparams->bRedrawGameUI = v0; } else { if ( pGUIWindow_Settings ) { v52 = pGUIWindow_Settings->ptr_1C; switch ( uMessage ) { case 69: *((char *)v52 + 8) &= 0xFDu; break; case 141: *((char *)v52 + 9) &= 0xFEu; break; case 143: *((char *)v52 + 9) &= 0xFDu; break; } *((short *)v52 + 2) = uMessageParam; pParty->pPlayers[*((short *)v52 + 1)].SetRecoveryTime(300); pGUIWindow_Settings->Release(); pGUIWindow_Settings = 0; pEventTimer->Resume(); pMouse->SetCursorBitmap("MICON1"); GameUI_StatusBar_TimedStringTimeLeft = 0; unk_50C9A0 = 0; } } continue; case UIMSG_BF: dword_50CDC8 = v0; sub_42FBDD(); SaveGame(v0, 0); strcpy(pCurrentMapName, pMapStats->pInfos[uHouse_ExitPic].pFilename); dword_6BE364_game_settings_1 |= v0; uGameState = 2; //v53 = p2DEvents_minus1_::30[26 * (unsigned int)ptr_507BC0->ptr_1C]; v53 = p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1]._quest_related; if ( v53 < 0 ) { v54 = abs(v53) - 1; _5B65B8_npcdata_hiword_house_or_other = 0; dword_5B65BC = 0; v55 = dword_4E4560[v54]; _5B65AC_npcdata_fame_or_other = dword_4E4578[v54]; v56 = dword_4E4590[v54]; v57 = dword_4E45A8[v54]; _5B65A8_npcdata_uflags_or_other = v55; _5B65B4_npcdata_loword_house_or_other = v57; _5B65B0_npcdata_rep_or_other = v56; dword_5B65C0 = v55 | _5B65AC_npcdata_fame_or_other | v56 | v57; } sub_4BD8B5(); //goto LABEL_434; /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; }*/ pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, v0, 0); continue; case UIMSG_C3: pAudioPlayer->StopChannels(-1, -1); v162 = uMessageParam; v148 = 195; //goto LABEL_438; pWindowType = (WindowType)9; pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, pWindowType, v148, v162); continue; case UIMSG_B1: pAudioPlayer->StopChannels(-1, -1); v162 = 0; v148 = 177; //LABEL_438: pWindowType = (WindowType)9; //LABEL_439: pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, pWindowType, v148, v162); continue; case UIMSG_B2: v165 = 0; v151 = 0; v144 = 0; v139 = 0; bRecallingBeacon = uMessageParam; v135 = -1; v132 = 0; v130 = 0; v127 = uMessageParam + 204; goto _play_sound_and_continue; case UIMSG_B4: if ( !pGUIWindow_CurrentMenu ) continue; pPlayer = pPlayers[_506348_current_lloyd_playerid + 1]; uNumSeconds = (unsigned int)&pPlayer->pInstalledBeacons[uMessageParam]; if ( bRecallingBeacon ) { if ( !*((int *)&pSavegameThumbnails->pPixels + 10 * uMessageParam) ) continue; v173 = pMapStats->pInfos[sub_410D99_get_map_index(HIWORD(pPlayer->pInstalledBeacons[uMessageParam].field_18))].pName; v157 = pGlobalTXT_LocalizationStrings[474];// "Recall to %s" goto _sprintex_2args_draw_status_and_continue; } v59 = pMapStats->GetMapInfo(pCurrentMapName); thise = "Not in Map Stats"; if ( v59 ) thise = pMapStats->pInfos[v59].pName; if ( !*((int *)&pSavegameThumbnails->pPixels + 10 * uMessageParam) || !v59 ) { v173 = thise; v157 = pGlobalTXT_LocalizationStrings[476];// "Set to %s" goto _sprintex_2args_draw_status_and_continue; } v174 = pMapStats->pInfos[sub_410D99_get_map_index(*(short *)(uNumSeconds + 26))].pName; v158 = (unsigned int)thise; v146 = pGlobalTXT_LocalizationStrings[475];// "Set %s over %s" //_sprintex_draw_status_and_continue: sprintf(pTmpBuf, v146, v158, v174); sub_41C0B8_set_status_string(pTmpBuf); continue; case UIMSG_B5: dword_50CDC8 = v0; //goto LABEL_453; pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) continue; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages;*/ continue; case UIMSG_B3: pPlayer9 = pPlayers[_506348_current_lloyd_playerid + 1]; pNPCData4 = (NPCData *)&pPlayer9->pInstalledBeacons[uMessageParam]; if ( !*(_QWORD *)&pNPCData4->pName && bRecallingBeacon ) continue; byte_506360 = 1; pPlayer9->CanCastSpell(uRequiredMana); if ( pParty->bTurnBasedModeOn ) { v60 = sRecoveryTime; pParty->pTurnBasedPlayerRecoveryTimes[_506348_current_lloyd_playerid] = sRecoveryTime; pPlayer9->SetRecoveryTime(v60); pTurnEngine->_40471C(); } else { pPlayer9->SetRecoveryTime((signed __int64)(flt_6BE3A4_debug_recmod1 * (double)sRecoveryTime * 2.133333333333333)); } pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[dword_506338], 0, 0, -1, 0, dword_50633C, 0, 0); if ( bRecallingBeacon ) { if ( _strcmpi(pCurrentMapName, (const char *)&pGames_LOD->pSubIndices[HIWORD(pNPCData4->uProfession)]) ) { SaveGame(v0, 0); OnMapLeave(); strcpy(pCurrentMapName, (const char *)&pGames_LOD->pSubIndices[HIWORD(pNPCData4->uProfession)]); dword_6BE364_game_settings_1 |= v0; uGameState = 2; _5B65A8_npcdata_uflags_or_other = pNPCData4->uFlags; _5B65AC_npcdata_fame_or_other = pNPCData4->fame; _5B65B0_npcdata_rep_or_other = pNPCData4->rep; _5B65B4_npcdata_loword_house_or_other = LOWORD(pNPCData4->Location2D); _5B65B8_npcdata_hiword_house_or_other = HIWORD(pNPCData4->Location2D); dword_5B65C0 = v0; } else { pParty->vPosition.x = pNPCData4->uFlags; pParty->vPosition.y = pNPCData4->fame; pParty->vPosition.z = pNPCData4->rep; pParty->uFallStartY = pParty->vPosition.z; pParty->sRotationY = LOWORD(pNPCData4->Location2D); pParty->sRotationX = HIWORD(pNPCData4->Location2D); } pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, v0, 0); /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = UIMSG_Escape; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; }*/ //crt_deconstruct_ptr_6A0118(); pBooksWindow->Release(); pGUIWindow_CurrentMenu->Release(); pBooksWindow = 0; pGUIWindow_CurrentMenu = 0; } else { sprintf(a1, "data\\lloyd%d%d.pcx", _506348_current_lloyd_playerid + 1, uMessageParam + 1); SaveScreenshot(a1); LoadThumbnailLloydTexture(uMessageParam, _506348_current_lloyd_playerid + 1); v212 = qword_506350 << 7; pNPCData2 = pNPCData4; thisg = 0; v62 = pParty->uTimePlayed + (signed __int64)((double)(qword_506350 << 7) * 0.033333335); pNPCData4->pName = (char *)v62; pNPCData2->uPortraitID = HIDWORD(v62); pNPCData2->uFlags = pParty->vPosition.x; pNPCData2->fame = pParty->vPosition.y; pNPCData2->rep = pParty->vPosition.z; LOWORD(pNPCData2->Location2D) = LOWORD(pParty->sRotationY); HIWORD(pNPCData2->Location2D) = LOWORD(pParty->sRotationX); if ( (signed int)pGames_LOD->uNumSubIndices / 2 <= 0 ) continue; uAction = 0; while ( _strcmpi((const char *)pGames_LOD->pSubIndices + uAction, pCurrentMapName) ) { ++thisg; uAction += 32; if ( thisg >= (signed int)pGames_LOD->uNumSubIndices / 2 ) continue; } HIWORD(pNPCData4->uProfession) = thisg; } continue; case UIMSG_B7: if ( uMessageParam ) { switch ( uMessageParam ) { case 1: v63 = 208; break; case 2: v63 = 207; break; case 3: v63 = 211; break; case 4: v63 = 209; break; default: if ( uMessageParam != 5 ) { LABEL_486: SaveGame(v0, 0); v64 = pMapStats->GetMapInfo(pCurrentMapName); v65 = uMessageParam; if ( v64 == stru_4ECBB8[uMessageParam].uMapInfoID ) { pParty->vPosition.x = stru_4ECBB8[v65].pos.x; pParty->vPosition.y = stru_4ECBB8[v65].pos.y; pParty->vPosition.z = stru_4ECBB8[v65].pos.z; pParty->uFallStartY = pParty->vPosition.z; pParty->sRotationY = stru_4ECBB8[v65].rot_y; pParty->sRotationX = stru_4ECBB8[v65].rot_x; } else { SaveGame(v0, 0); OnMapLeave(); dword_6BE364_game_settings_1 |= v0; uGameState = 2; strcpy(pCurrentMapName, pMapStats->pInfos[stru_4ECBB8[uMessageParam].uMapInfoID].pFilename); dword_5B65C0 = v0; _5B65A8_npcdata_uflags_or_other = stru_4ECBB8[uMessageParam].pos.x; _5B65AC_npcdata_fame_or_other = stru_4ECBB8[uMessageParam].pos.y; _5B65B0_npcdata_rep_or_other = stru_4ECBB8[uMessageParam].pos.z; v66 = stru_4ECBB8[uMessageParam].rot_x; _5B65B4_npcdata_loword_house_or_other = stru_4ECBB8[uMessageParam].rot_y; _5B65B8_npcdata_hiword_house_or_other = v66; InitializeActors(); } v67 = pGUIWindow_CurrentMenu->Hint; if ( v67 ) *((int *)v67 + 17) = v0; else pParty->pPlayers[(unsigned __int8)byte_50C0C0].CanCastSpell(0x14u); //LABEL_434: /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v0; //LABEL_771: *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; }*/ pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, v0, 0); continue; } v63 = 210; break; } } else { v63 = 206; } if ( !(unsigned __int16)_449B57_test_bit(pParty->_quest_bits, v63) ) return; goto LABEL_486; case UIMSG_B6: if ( uMessageParam ) { switch ( uMessageParam ) { case 1: v68 = 208; break; case 2: v68 = 207; break; case 3: v68 = 211; break; case 4: v68 = 209; break; default: if ( uMessageParam != 5 ) //goto LABEL_506; { if ( uMessageParam ) { switch ( uMessageParam ) { case 1: v69 = pMapStats->pInfos[4].pName; break; case 2: v69 = pMapStats->pInfos[3].pName; break; case 3: v69 = pMapStats->pInfos[10].pName; break; case 4: v69 = pMapStats->pInfos[7].pName; break; default: if ( uMessageParam != 5 ) { v173 = v200; v157 = pGlobalTXT_LocalizationStrings[35]; goto _sprintex_2args_draw_status_and_continue; } v69 = pMapStats->pInfos[8].pName; break; } } else { v69 = pMapStats->pInfos[21].pName; } v200 = v69; v173 = v200; v157 = pGlobalTXT_LocalizationStrings[35]; goto _sprintex_2args_draw_status_and_continue; } v68 = 210; break; } } else { v68 = 206; } if ( !(unsigned __int16)_449B57_test_bit(pParty->_quest_bits, v68) ) { pRenderer->DrawTextureRGB(0, 0x160u, pTexture_StatusBar); continue; } //LABEL_506: if ( uMessageParam ) { switch ( uMessageParam ) { case 1: v69 = pMapStats->pInfos[4].pName; break; case 2: v69 = pMapStats->pInfos[3].pName; break; case 3: v69 = pMapStats->pInfos[10].pName; break; case 4: v69 = pMapStats->pInfos[7].pName; break; default: if ( uMessageParam != 5 ) //goto LABEL_519; { v173 = v200; v157 = pGlobalTXT_LocalizationStrings[35]; goto _sprintex_2args_draw_status_and_continue; } v69 = pMapStats->pInfos[8].pName; break; } } else { v69 = pMapStats->pInfos[21].pName; } v200 = v69; //LABEL_519: v173 = v200; v157 = pGlobalTXT_LocalizationStrings[35]; goto _sprintex_2args_draw_status_and_continue; case UIMSG_ShowFinalWindow: sprintf(pFinalMessage, "%s\n \n%s\n \n%s", pGlobalTXT_LocalizationStrings[151],// "Congratulations Adventurer." pGlobalTXT_LocalizationStrings[118],// "We hope that you've enjoyed playing Might and Magic VII as much as we did making it. We have saved this screen as MM7_WIN.PCX in your MM7 directory. You can print it out as proof of your accomplishment." pGlobalTXT_LocalizationStrings[167]);// "- The Might and Magic VII Development Team." ModalWindow(pFinalMessage, 196); uGameState = GAME_STATE_FINAL_WINDOW; continue; case UIMSG_C4: uGameState = 0; strcpy((char *)pKeyActionMap->pPressedKeysBuffer, "2"); goto LABEL_524; case UIMSG_DD: LABEL_524: sprintf(pTmpBuf, "%s", pKeyActionMap->pPressedKeysBuffer); memcpy(&v216, texture_frame_table_txt_parser((const char *)pKeyActionMap->pPressedKeysBuffer, &v218), sizeof(v216)); if ( v216.field_0 == 1 ) { pNPCData4 = (NPCData *)((signed int)pGames_LOD->uNumSubIndices / 2); v70 = atoi(v216.pProperties[0]); if ( v70 <= 0 || v70 >= 77 ) { //LABEL_90: v1 = ""; //LABEL_91: v0 = 1; continue; } v71 = v70; strcpy(Str2, pMapStats->pInfos[v70].pFilename); pNPCData3 = 0; if ( (signed int)pNPCData4 > 0 ) { thish = 0; do { if ( !_strcmpi((const char *)&pGames_LOD->pSubIndices[thish], Str2) ) break; ++thish; pNPCData3 = (NPCData *)((char *)pNPCData3 + 1); } while ( (signed int)pNPCData3 < (signed int)pNPCData4 ); if ( (signed int)pNPCData3 < (signed int)pNPCData4 ) { strcpy(pCurrentMapName, (const char *)&pGames_LOD->pSubIndices[(int)pNPCData3]); dword_6BE364_game_settings_1 |= 1u; uGameState = 2; OnMapLeave(); //goto LABEL_90; v1 = ""; v0 = 1; continue; } } sprintf(Str2, "No map found for %s", pMapStats->pInfos[v71].pName); v73 = Str2; } else { if ( v216.field_0 != 3 ) //goto LABEL_90; { v1 = ""; v0 = 1; continue; } v74 = atoi(v216.pProperties[0]); thisi = atoi(v216.pProperties[1]); v75 = atoi(v216.pProperties[2]); v76 = v75; if ( uCurrentlyLoadedLevelType == LEVEL_Indoor) { if ( pIndoor->GetSector(v74, thisi, v75) ) { v77 = thisi; //LABEL_544: pParty->vPosition.x = v74; pParty->vPosition.y = v77; pParty->vPosition.z = v76; pParty->uFallStartY = v76; //goto LABEL_90; v1 = ""; v0 = 1; continue; } } else { if ( v74 > -32768 ) { if ( v74 < 32768 ) { v77 = thisi; if ( thisi > -32768 ) { if ( thisi < 32768 && v76 >= 0 && v76 < 10000 ) //goto LABEL_544; { pParty->vPosition.x = v74; pParty->vPosition.y = v77; pParty->vPosition.z = v76; pParty->uFallStartY = v76; //goto LABEL_90; v1 = ""; v0 = 1; continue; } } } } } pAudioPlayer->PlaySound(SOUND_27, 0, 0, -1, 0, 0, 0, 0); v73 = "Can't jump to that location!"; } ShowStatusBarString(v73, 6u); //goto LABEL_90; v1 = ""; v0 = 1; continue; case UIMSG_19: if ( bUnderwater == 1 ) { ShowStatusBarString(pGlobalTXT_LocalizationStrings[652], 2);// "You can not do that while you are underwater!" pAudioPlayer->PlaySound((SoundID)27, 0, 0, -1, 0, 0, 0, 0); continue; } if ( !uActiveCharacter || (pPlayer2 = pPlayers[uActiveCharacter], pPlayer2->uTimeToRecovery) ) //goto LABEL_90; { v1 = ""; v0 = 1; continue; } _42777D_CastSpell_UseWand_ShootArrow(pPlayer2->uQuickSpell, uActiveCharacter - 1, 0, 0, uActiveCharacter); continue; case UIMSG_46: case UIMSG_8C: if ( pRenderer->pRenderD3D ) { v81 = pGame->pVisInstance->get_picked_object_zbuf_val(); } else { uNumSeconds = (unsigned int)pMouse->GetCursorPos(&v206); pPoint2 = pMouse->GetCursorPos(&v201); v81 = pRenderer->pActiveZBuffer[*(int *)uNumSeconds + pSRZBufferLineOffsets[pPoint2->y]]; } v83 = v81; v44 = (unsigned __int16)v81; v84 = v83 >> 16; if ( (v44 & 7) != 3 || v84 >= 5120 ) //goto LABEL_90; { v1 = ""; v0 = 1; continue; } v51 = pGUIWindow_Settings->ptr_1C; if ( uMessage == 70 ) { *((char *)v51 + 8) &= 0xF7u; } else { if ( uMessage == 140 ) *((char *)v51 + 9) &= 0xFEu; else *((char *)v51 + 9) &= 0xFDu; } //goto LABEL_416; *((short *)v51 + 2) = uMessageParam; *((int *)v51 + 3) = v44; pParty->pPlayers[*((short *)v51 + 1)].SetRecoveryTime(300); pWindow3 = pGUIWindow_Settings; pWindow3->Release(); pGUIWindow_Settings = 0; pMouse->SetCursorBitmap("MICON1"); GameUI_StatusBar_TimedStringTimeLeft = 0; unk_50C9A0 = 0; back_to_game(); continue; case UIMSG_1C: if ( !uActiveCharacter || pCurrentScreen ) //goto LABEL_90; { v1 = ""; v0 = 1; continue; } ptr_507BC8 = GUIWindow::Create(0, 0, 640, 480, (enum WindowType)104, uMessageParam, 0); pCurrentScreen = SCREEN_19; pEventTimer->Pause(); continue; case UIMSG_1B: if ( !uActiveCharacter ) //goto LABEL_90; { v1 = ""; v0 = 1; continue; } if ( pParty->bTurnBasedModeOn != v0 ) //goto LABEL_569; { if ( pActors[uMessageParam].uAIState == 5 ) stru_50C198.LootActor(&pActors[uMessageParam]); else Actor::StealFrom(uMessageParam); continue; } if ( pTurnEngine->field_4 == v0 || pTurnEngine->field_4 == 3 ) //goto LABEL_90; { v1 = ""; v0 = 1; continue; } if ( !(pTurnEngine->field_18 & 2) ) { //LABEL_569: if ( pActors[uMessageParam].uAIState == 5 ) stru_50C198.LootActor(&pActors[uMessageParam]); else Actor::StealFrom(uMessageParam); } continue; case UIMSG_Attack: if ( !uActiveCharacter ) //goto LABEL_90; { v1 = ""; v0 = 1; continue; } if ( pParty->bTurnBasedModeOn != v0 ) //goto LABEL_577; { _42ECB5_PlayerAttacksActor(); continue; } if ( pTurnEngine->field_4 == v0 || pTurnEngine->field_4 == 3 ) //goto LABEL_90; { v1 = ""; v0 = 1; continue; } if ( !(pTurnEngine->field_18 & 2) ) //LABEL_577: _42ECB5_PlayerAttacksActor(); continue; case UIMSG_ExitRest: v163 = (int)pGlobalTXT_LocalizationStrings[81];// "Exit Rest" pButton = pButton_RestUI_Exit; pButton2 = pButton_RestUI_Exit; pWindowType1 = (WindowType)96; //goto LABEL_731; v8 = pButton->uY; v9 = pButton->uX; //goto LABEL_732; v137 = 0; v133 = 0; GUIWindow::Create(v9, v8, v133, v137, pWindowType1, (int)pButton2, v163); continue; case UIMSG_Wait5Minutes: if ( dword_506F14 == 2 ) //goto LABEL_621; { v96 = pGlobalTXT_LocalizationStrings[477];// "You are already resting!" ShowStatusBarString(v96, 2); pAudioPlayer->PlaySound((SoundID)27, 0, 0, -1, 0, 0, 0, 0); continue; } GUIWindow::Create(pButton_RestUI_Wait5Minutes->uX, pButton_RestUI_Wait5Minutes->uY, 0, 0, (enum WindowType)90, (int)pButton_RestUI_Wait5Minutes, (int)pGlobalTXT_LocalizationStrings[238]);// "Wait 5 Minutes" dword_506F14 = v0; _506F18_num_hours_to_sleep = 5; continue; case UIMSG_Wait1Hour: if ( dword_506F14 == 2 ) //goto LABEL_621; { v96 = pGlobalTXT_LocalizationStrings[477];// "You are already resting!" ShowStatusBarString(v96, 2); pAudioPlayer->PlaySound((SoundID)27, 0, 0, -1, 0, 0, 0, 0); continue; } GUIWindow::Create(pButton_RestUI_Wait1Hour->uX, pButton_RestUI_Wait1Hour->uY, 0, 0, (enum WindowType)90, (int)pButton_RestUI_Wait1Hour, (int)pGlobalTXT_LocalizationStrings[239]);// "Wait 1 Hour" dword_506F14 = v0; _506F18_num_hours_to_sleep = 60; continue; case UIMSG_OpenRestUI: dword_506F14 = 2; RestUI_Initialize(); v86 = 60 * (sub_494820(pParty->uCurrentHour) + 1) - pParty->uCurrentMinute; _506F18_num_hours_to_sleep = v86; if ( uMessageParam == 111 || uMessageParam == 114 || uMessageParam == 116 ) _506F18_num_hours_to_sleep = v86 + 720; //goto LABEL_615; dword_506F14 = 2; pParty->RestAndHeal(); pParty->field_764 = 0; pParty->pPlayers[3].pConditions[2] = pParty->uTimePlayed; pParty->pPlayers[2].pConditions[2] = pParty->uTimePlayed; pParty->pPlayers[1].pConditions[2] = pParty->uTimePlayed; pParty->pPlayers[0].pConditions[2] = pParty->uTimePlayed; continue; case UIMSG_68: if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; if ( pCurrentScreen ) continue; if ( sub_42F4DA() ) //goto LABEL_594; { if ( pParty->bTurnBasedModeOn == v0 ) { v87 = pGlobalTXT_LocalizationStrings[478];// "You can't rest in turn-based mode!" ShowStatusBarString(v87, 2u); continue; } v88 = pGlobalTXT_LocalizationStrings[480];// "There are hostile enemies near!" if ( pParty->uFlags & 0x88 ) v88 = pGlobalTXT_LocalizationStrings[479];// "You can't rest here!" ShowStatusBarString(v88, 2u); v89 = uActiveCharacter; if ( !uActiveCharacter ) { v1 = ""; v0 = 1; continue; } v176 = 0; v160 = 13; goto LABEL_619; } if ( pParty->bTurnBasedModeOn == v0 ) //goto LABEL_595; { v87 = pGlobalTXT_LocalizationStrings[478];// "You can't rest in turn-based mode!" ShowStatusBarString(v87, 2u); continue; } if ( !(pParty->uFlags & 0x88) ) { RestUI_Initialize(); continue; } //LABEL_594: if ( pParty->bTurnBasedModeOn == v0 ) { //LABEL_595: v87 = pGlobalTXT_LocalizationStrings[478];// "You can't rest in turn-based mode!" //goto _draw_status_string_and_continue; ShowStatusBarString(v87, 2u); continue; } v88 = pGlobalTXT_LocalizationStrings[480];// "There are hostile enemies near!" if ( pParty->uFlags & 0x88 ) v88 = pGlobalTXT_LocalizationStrings[479];// "You can't rest here!" ShowStatusBarString(v88, 2u); v89 = uActiveCharacter; if ( !uActiveCharacter ) //goto LABEL_90; { v1 = ""; v0 = 1; continue; } v176 = 0; v160 = 13; goto LABEL_619; case UIMSG_61: if ( dword_506F14 ) //goto LABEL_621; { v96 = pGlobalTXT_LocalizationStrings[477];// "You are already resting!" ShowStatusBarString(v96, 2); pAudioPlayer->PlaySound((SoundID)27, 0, 0, -1, 0, 0, 0, 0); continue; } if ( pParty->uNumFoodRations < uRestUI_FoodRequiredToRest ) { ShowStatusBarString(pGlobalTXT_LocalizationStrings[482], 2u);// "You don't have enough food to rest" if ( uActiveCharacter && pPlayers[uActiveCharacter]->CanAct() ) { v89 = uActiveCharacter; v176 = 0; v160 = SPEECH_108; LABEL_619: pPlayers[v89]->PlaySound((PlayerSpeech)v160, v176); } } else { pParty->pPlayers[3].pConditions[2] = pParty->uTimePlayed; pParty->pPlayers[2].pConditions[2] = pParty->uTimePlayed; pParty->pPlayers[1].pConditions[2] = pParty->uTimePlayed; pParty->pPlayers[0].pConditions[2] = pParty->uTimePlayed; v90 = pMapStats->GetMapInfo(pCurrentMapName); if ( !v90 ) v90 = rand() % (signed int)pMapStats->uNumMaps + 1; pMapInfo = &pMapStats->pInfos[v90]; if ( rand() % 100 + 1 <= pMapInfo->Encounter_percent ) { v91 = rand() % 100; v92 = pMapInfo->EncM1percent; v93 = v91 + 1; if ( v93 > v92 ) pNPCData4 = (NPCData *)((v93 > v92 + pMapInfo->EncM2percent) + 2); else pNPCData4 = (NPCData *)v0; if ( !sub_45063B(pMapInfo, (int)pNPCData4) ) pNPCData4 = 0; if ( pNPCData4 ) { pPlayerNum = rand() % 4; LODWORD(pParty->pPlayers[pPlayerNum].pConditions[2]) = 0; HIDWORD(pParty->pPlayers[pPlayerNum].pConditions[2]) = 0; v95 = rand(); Rest(v95 % 6 + 60); _506F18_num_hours_to_sleep = 0; dword_506F14 = 0; /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; }*/ pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); ShowStatusBarString(pGlobalTXT_LocalizationStrings[481], 2u);// "Encounter!" v165 = 0; v151 = 0; v144 = 0; v139 = 0; v135 = -1; v132 = 0; v130 = 0; v127 = 227; goto _play_sound_and_continue; } } Party::TakeFood(uRestUI_FoodRequiredToRest); _506F18_num_hours_to_sleep = 480; //LABEL_615: dword_506F14 = 2; pParty->RestAndHeal(); pParty->field_764 = 0; pParty->pPlayers[3].pConditions[2] = pParty->uTimePlayed; pParty->pPlayers[2].pConditions[2] = pParty->uTimePlayed; pParty->pPlayers[1].pConditions[2] = pParty->uTimePlayed; pParty->pPlayers[0].pConditions[2] = pParty->uTimePlayed; } continue; case UIMSG_AlreadyResting: if ( dword_506F14 == 2 ) { //LABEL_621: v96 = pGlobalTXT_LocalizationStrings[477];// "You are already resting!" ShowStatusBarString(v96, 2); pAudioPlayer->PlaySound((SoundID)27, 0, 0, -1, 0, 0, 0, 0); continue; } GUIWindow::Create(pButton_RestUI_WaitUntilDawn->uX, pButton_RestUI_WaitUntilDawn->uY, 0, 0, (enum WindowType)90, (int)pButton_RestUI_WaitUntilDawn, (int)pGlobalTXT_LocalizationStrings[237]);// "Wait until Dawn" v97 = sub_494820(pParty->uCurrentHour); dword_506F14 = v0; _506F18_num_hours_to_sleep = 60 * v97 - pParty->uCurrentMinute; continue; case UIMSG_4E: if ( dword_50654C && byte_506550 ) { v173 = pSpellStats->pInfos[dword_50654C + 11 * pPlayers[uActiveCharacter]->lastOpenedSpellbookPage].pName; v157 = pGlobalTXT_LocalizationStrings[483]; _sprintex_2args_draw_status_and_continue: sprintf(pTmpBuf, v157, v173); } else { if ( pPlayers[uActiveCharacter]->uQuickSpell ) v177 = pGlobalTXT_LocalizationStrings[584];// "Click here to remove your Quick Spell" else v177 = pGlobalTXT_LocalizationStrings[484];// "Select a spell then click here to set a QuickSpell" strcpy(pTmpBuf, v177); } //_set_status_string_pTmpBuf_and_continue: sub_41C0B8_set_status_string(pTmpBuf); continue; case UIMSG_SPellbook_ShowHightlightedSpellInfo: if ( !uActiveCharacter || (uNumSeconds = (unsigned int)pPlayers[uActiveCharacter], !*(char *)(uNumSeconds + 11 * *(char *)(uNumSeconds + 6734) + uMessageParam + 402)) ) continue; if ( sub_4637E0_is_there_popup_onscreen() ) dword_507B00_spell_info_to_draw_in_popup = uMessageParam + 1; v98 = *(char *)(uNumSeconds + 6734); if ( dword_50654C - 1 == uMessageParam ) { v178 = pSpellStats->pInfos[uMessageParam + 11 * v98 + 1].pName; v161 = pGlobalTXT_LocalizationStrings[485]; } else { v178 = pSpellStats->pInfos[uMessageParam + 11 * v98 + 1].pName; v161 = pGlobalTXT_LocalizationStrings[486]; } sprintf(pTmpBuf, v161, v178); sub_41C0B8_set_status_string(pTmpBuf); //goto LABEL_91; v0 = 1; continue; case UIMSG_58: GUIWindow::Create(pBtn_InstallRemoveSpell->uX, pBtn_InstallRemoveSpell->uY, 0, 0, (enum WindowType)90, (int)pBtn_InstallRemoveSpell, 0); if ( !uActiveCharacter ) continue; pPlayer10 = pPlayers[uActiveCharacter]; if ( !byte_506550 || !dword_50654C ) { v165 = 0; v151 = 0; v144 = 0; v139 = 0; v135 = -1; v132 = 0; pPlayer10->uQuickSpell = 0; v130 = 0; dword_50654C = 0; v127 = 203; goto _play_sound_and_continue; } v99 = dword_50654C + 11 * pPlayers[uActiveCharacter]->lastOpenedSpellbookPage; pPlayers[uActiveCharacter]->uQuickSpell = v99; stru_A750F8[uActiveCharacter + 3]._494836(v99, uActiveCharacter); if ( uActiveCharacter ) pPlayer10->PlaySound(SPEECH_12, 0); byte_506550 = 0; continue; case UIMSG_33: if ( !uActiveCharacter ) continue; pPlayer3 = pPlayers[uActiveCharacter]; pNPCData4 = 0; uAction = 0; v101 = 0; thisl = (int)&pPlayer3->pActiveSkills[12]; do { if ( *(short *)thisl ) { if ( pPlayer3->lastOpenedSpellbookPage == v101 ) uAction = (int)pNPCData4; v102 = (int)pNPCData4; pNPCData4 = (NPCData *)((char *)pNPCData4 + 1); v217[v102] = v101; } thisl += 2; ++v101; } while ( v101 < 9 ); if ( !pNPCData4 ) { v165 = 0; v151 = 0; v144 = 0; v139 = 0; v135 = -1; v132 = 0; v130 = 0; v127 = rand() % 2 + 204; goto _play_sound_and_continue; } if ( GetAsyncKeyState(16) ) { --uAction; if ( uAction < 0 ) uAction = (int)((char *)pNPCData4 - 1); } else { ++uAction; if ( uAction >= (signed int)pNPCData4 ) uAction = 0; } sub_41140B(); pPlayers[uActiveCharacter]->lastOpenedSpellbookPage = LOBYTE(v217[uAction]); pGUIWindow_CurrentMenu->OpenSpellBook(); v165 = 0; v151 = 0; v144 = 0; v139 = 0; v135 = -1; v132 = 0; v130 = 0; v127 = rand() % 2 + 204; goto _play_sound_and_continue; case UIMSG_57: if ( pTurnEngine->field_4 == 3 || !uActiveCharacter || uMessageParam == pPlayers[uActiveCharacter]->lastOpenedSpellbookPage ) continue; sub_41140B(); pPlayers[uActiveCharacter]->lastOpenedSpellbookPage = uMessageParam; pGUIWindow_CurrentMenu->OpenSpellBook(); v165 = 0; v151 = 0; v144 = 0; v139 = 0; v135 = -1; v132 = 0; v130 = 0; v127 = rand() % 2 + 204; goto _play_sound_and_continue; case UIMSG_SelectSpell: { if (pTurnEngine->field_4 == 3) continue; if (!uActiveCharacter) continue; // uNumSeconds = (unsigned int)pPlayers[uActiveCharacter]; auto player = pPlayers[uActiveCharacter]; if (player->spellbook.pChapters[player->lastOpenedSpellbookPage].bIsSpellAvailable[uMessageParam]) //if ( *(char *)(uNumSeconds + 11 * *(char *)(uNumSeconds + &lastOpenedSpellbookPage) + uMessageParam + 402) ) { if ( dword_50654C - 1 == uMessageParam ) { pGUIWindow_CurrentMenu->Release(); pEventTimer->Resume(); viewparams->bRedrawGameUI = v0; pCurrentScreen = SCREEN_GAME; pIcons_LOD->_4114F2(); v103 = dword_50654C + 11 * player->lastOpenedSpellbookPage; if ( dword_50C9E8 < 40 ) { dword_50C9EC[3 * dword_50C9E8] = UIMSG_CastSpellFromBook; dword_50C9EC[3 * dword_50C9E8 + 1] = v103; dword_50C9EC[3 * dword_50C9E8 + 2] = uActiveCharacter - 1; ++dword_50C9E8; } } else { byte_506550 = 1; dword_50654C = uMessageParam + 1; } } } continue; case UIMSG_CastSpellFromBook: if ( pTurnEngine->field_4 != 3 ) _42777D_CastSpell_UseWand_ShootArrow(uMessageParam, v199, 0, 0, 0); continue; case UIMSG_92: if ( pTurnEngine->field_4 != 3 ) { v175 = 0; v159 = v0; v147 = 133; //LABEL_678: v80 = v199; v79 = uMessageParam; //LABEL_679: _42777D_CastSpell_UseWand_ShootArrow(v79, v80, v147, v159, v175); } continue; case UIMSG_69: if ( pTurnEngine->field_4 == 3 ) continue; if ( bUnderwater == 1 ) { ShowStatusBarString(pGlobalTXT_LocalizationStrings[652], 2);// "You can not do that while you are underwater!" v165 = 0; v151 = 0; v144 = 0; v139 = 0; v135 = -1; v132 = 0; v130 = 0; v127 = 27; _play_sound_and_continue: pAudioPlayer->PlaySound((SoundID)v127, v130, v132, v135, v139, v144, v151, v165); } else { if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; if ( uActiveCharacter && !pPlayers[uActiveCharacter]->uTimeToRecovery ) { if ( !pCurrentScreen ) //goto LABEL_693; { GUIWindow::Create(0x1DCu, 0x1C2u, 0, 0, (enum WindowType)90, (int)pBtn_CastSpell, 0); pCurrentScreen = SCREEN_SPELL_BOOK; pEventTimer->Pause(); pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, (enum WindowType)18, 0, 0); pAudioPlayer->PlaySound((SoundID)48, 0, 0, -1, 0, 0, 0, 0); viewparams->field_48 = v0; continue; } if ( pCurrentScreen != SCREEN_REST && pCurrentScreen != SCREEN_CHARACTERS && (pCurrentScreen <= SCREEN_63 || pCurrentScreen > SCREEN_67) ) { pGUIWindow_CurrentMenu->Release(); //LABEL_693: GUIWindow::Create(0x1DCu, 0x1C2u, 0, 0, (enum WindowType)90, (int)pBtn_CastSpell, 0); pCurrentScreen = SCREEN_SPELL_BOOK; pEventTimer->Pause(); pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, (enum WindowType)18, 0, 0); pAudioPlayer->PlaySound((SoundID)48, 0, 0, -1, 0, 0, 0, 0); viewparams->field_48 = v0; continue; } } } continue; case UIMSG_QuickReference: if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; if ( pCurrentScreen ) pGUIWindow_CurrentMenu->Release(); ++pIcons_LOD->uTexturePacksCount; if ( !pIcons_LOD->uNumPrevLoadedFiles ) pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles; GUIWindow::Create(0x230u, 0x1C2u, 0, 0, WINDOW_5A, (int)pBtn_QuickReference, 0); viewparams->bRedrawGameUI = v0; pEventTimer->Pause(); pAudioPlayer->StopChannels(-1, -1); pCurrentScreen = SCREEN_QUICK_REFERENCE; pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, (enum WindowType)12, 5, 0); papredoll_dbrds[2] = pIcons_LOD->LoadTexture("BUTTEXI1", TEXTURE_16BIT_PALETTE); pBtn_ExitCancel = pGUIWindow_CurrentMenu->CreateButton(0x187u, 0x13Cu, 0x4Bu, 0x21u, v0, 0, 0x71u, 0, 0, pGlobalTXT_LocalizationStrings[79],// "Exit" (Texture *)(uTextureID_BUTTDESC2 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_BUTTDESC2] : 0), 0); //, v179); continue; case UIMSG_GameMenuButton: if ( pCurrentScreen ) { pGUIWindow_CurrentMenu->Release(); pEventTimer->Resume(); pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v0; } stru_506E40.Release(); uNumSeconds = (unsigned int)MakeScreenshot(155, 117); pRenderer->SavePCXImage("gamma.pcx", (char *)uNumSeconds, 155, 117); free((void *)uNumSeconds); stru_506E40._40E55E("gamma.pcx", 0); GUIWindow::Create(0x25Au, 0x1C2u, 0, 0, WINDOW_VoiceSwitcherButton, (int)pBtn_GameSettings, 0); uNumVisibleWindows = uNumVisibleWindows - 1; //Ritor1: Insert //LABEL_453: /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) continue; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; //goto LABEL_770; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages;*/ pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); continue; case UIMSG_C0: dword_50651C = v0; if ( pMouse->GetCursorPos(&v211)->y > 178 ) dword_50651C = -1; continue; case UIMSG_A9: GUIWindow::Create(pBtn_Up->uX, pBtn_Up->uY, 0, 0, (WindowType)(WINDOW_HouseInterior|0x42), (int)pBtn_Up, 0); //LABEL_707: dword_506548 = v0; continue; case UIMSG_AA: GUIWindow::Create(pBtn_Down->uX, pBtn_Down->uY, 0, 0, (WindowType)(WINDOW_HouseInterior|0x42), (int)pBtn_Down, 0); //LABEL_709: dword_506544 = v0; continue; case UIMSG_55: bRingsShownInCharScreen ^= v0; GUIButton::_41D0D8(pCharacterScreen_DetalizBtn); GUIButton::_41D0D8(pCharacterScreen_DollBtn); if ( bRingsShownInCharScreen ) { v128 = (uTextureID_5118C8 != -1 ? pIcons_LOD->pTextures[uTextureID_5118C8].uTextureHeight : 26); v125 = (uTextureID_5118C8 != -1 ? pIcons_LOD->pTextures[uTextureID_5118C8].uTextureWidth : 24); v123 = 445; v121 = 470; } else { v128 = 30; v125 = 30; v123 = 300; v121 = 600; } pCharacterScreen_DetalizBtn = pGUIWindow_CurrentMenu->CreateButton(v121, v123, v125, v128, v0, 0, 0x55u, 0, 0, pGlobalTXT_LocalizationStrings[64],// "Detail Toggle" 0); pCharacterScreen_DollBtn = pGUIWindow_CurrentMenu->CreateButton(0x1DCu, 0, 0xA4u, 0x159u, v0, 0, 0x85u, 0, 0, v1, 0); goto LABEL_422; case UIMSG_85: OnPaperdollLeftClick(); continue; case UIMSG_73: pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 100; sub_4196A0(); sub_419379(); pButton = pCharacterScreen_StatsBtn; //goto LABEL_716; v163 = 0; pButton2 = pButton; pWindowType1 = (WindowType)91; v8 = pButton->uY; v9 = pButton->uX; //goto LABEL_732; v137 = 0; v133 = 0; GUIWindow::Create(v9, v8, v133, v137, pWindowType1, (int)pButton2, v163); continue; case UIMSG_72: pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 101; sub_4196A0(); sub_419379(); CharacterUI_SkillScreen_Draw(); pButton = pCharacterScreen_SkillsBtn; //goto LABEL_716; v163 = 0; pButton2 = pButton; pWindowType1 = (WindowType)91; v8 = pButton->uY; v9 = pButton->uX; //goto LABEL_732; v137 = 0; v133 = 0; GUIWindow::Create(v9, v8, v133, v137, pWindowType1, (int)pButton2, v163); continue; case UIMSG_SkillUp: pPlayer4 = pPlayers[uActiveCharacter]; v105 = (int)&pPlayer4->pActiveSkills[uMessageParam]; LOWORD(v2) = *(short *)v105; uNumSeconds = v2; if ( pPlayer4->uSkillPoints < (v2 & 0x3F) + 1 ) { v87 = pGlobalTXT_LocalizationStrings[488];// "You don't have enough skill points!" } else { if ( (uNumSeconds & 0x3F) < 0x3C ) { *(short *)v105 = uNumSeconds + 1; pPlayer4->uSkillPoints -= pPlayer4->pActiveSkills[uMessageParam] & 0x3F; pPlayer4->PlaySound(SPEECH_14, 0); v165 = 0; v151 = 0; v144 = 0; v139 = 0; v135 = -1; v132 = 0; v130 = 0; v127 = 20001; goto _play_sound_and_continue; } v87 = pGlobalTXT_LocalizationStrings[487];// "You have already mastered this skill!" } //_draw_status_string_and_continue: ShowStatusBarString(v87, 2u); continue; case UIMSG_74: pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 103; sub_419379(); sub_4196A0(); pButton = pCharacterScreen_InventoryBtn; //LABEL_716: v163 = 0; pButton2 = pButton; pWindowType1 = (WindowType)91; //goto LABEL_731; v8 = pButton->uY; v9 = pButton->uX; //goto LABEL_732; v137 = 0; v133 = 0; GUIWindow::Create(v9, v8, v133, v137, pWindowType1, (int)pButton2, v163); continue; case UIMSG_A8: pButton = pCharacterScreen_ExitBtn; v163 = 0; pButton2 = pCharacterScreen_ExitBtn; pWindowType1 = (WindowType)97; //goto LABEL_731; v8 = pButton->uY; v9 = pButton->uX; //goto LABEL_732; v137 = 0; v133 = 0; GUIWindow::Create(v9, v8, v133, v137, pWindowType1, (int)pButton2, v163); continue; case UIMSG_75: sub_419379(); sub_4196A0(); sub_419220(); pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 102; GUIWindow::Create(pCharacterScreen_AwardsBtn->uX, pCharacterScreen_AwardsBtn->uY, 0, 0, (WindowType)(WINDOW_HouseInterior|0x42), (int)pCharacterScreen_AwardsBtn, 0); FillAwardsData(); continue; case UIMSG_AutonotesBook: switch ( uMessageParam ) { default: continue; case 11: //goto LABEL_707; dword_506548 = v0; continue; case 10: //goto LABEL_709; dword_506544 = v0; continue; case 0: pButton = pBtn_Book_1; dword_506544 = v0; break; case 1: pButton = pBtn_Book_2; dword_506548 = v0; break; case 2: dword_506540 = v0; if ( dword_506364 ) continue; pButton = pBtn_Book_3; break; case 3: dword_50653C = v0; if ( dword_506364 ) continue; pButton = pBtn_Book_4; break; case 4: dword_506538 = v0; if ( dword_506364 ) continue; pButton = pBtn_Book_5; break; case 5: dword_506534 = v0; if ( dword_506364 ) continue; pButton = pBtn_Book_6; break; case 6: pButton = pBtn_Autonotes_Misc; dword_506530 = v0; break; case 7: pButton = pBtn_Autonotes_Instructors; dword_50652C = v0; break; } v163 = v0; pButton2 = pButton; pWindowType1 = (WindowType)92; //LABEL_731: v8 = pButton->uY; v9 = pButton->uX; //goto LABEL_732; v137 = 0; v133 = 0; GUIWindow::Create(v9, v8, v133, v137, pWindowType1, (int)pButton2, v163); continue; case UIMSG_SelectCharacter: if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; GameUI_OnPlayerPortraitLeftClick(uMessageParam); continue; case UIMSG_ShowStatus_Funds: v174 = (char *)pParty->uNumGoldInBank; v158 = pParty->uNumGold + pParty->uNumGoldInBank; v146 = pGlobalTXT_LocalizationStrings[489];// "You have %d total gold, %d in the Bank"" //goto _sprintex_draw_status_and_continue; sprintfex(pTmpBuf, v146, v158, v174); sub_41C0B8_set_status_string(pTmpBuf); continue; case UIMSG_ShowStatus_DateTime: pNPCData4 = (NPCData *)pParty->uCurrentHour; if ( (signed int)pParty->uCurrentHour <= 12 ) { if ( !pNPCData4 ) pNPCData4 = (NPCData *)12; } else { pNPCData4 = (NPCData *)((char *)pNPCData4 - 12); } if ( pParty->uCurrentHour < 0xC || (uNumSeconds = v0, pParty->uCurrentHour >= 0x18) ) uNumSeconds = 0; sprintf(pTmpBuf, "%d:%02d%s %s %d %s %d", pNPCData4, pParty->uCurrentMinute, aAMPMNames[uNumSeconds], aDayNames[pParty->uDaysPlayed % 7], 7 * pParty->uCurrentMonthWeek + pParty->uDaysPlayed % 7 + 1, aMonthNames[pParty->uCurrentMonth], pParty->uCurrentYear); sub_41C0B8_set_status_string(pTmpBuf); continue; case UIMSG_ShowStatus_Food: sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[501], pParty->uNumFoodRations); // "You have %lu food" sub_41C0B8_set_status_string(pTmpBuf); continue; case UIMSG_ShowStatus_Player: pPlayer5 = pPlayers[uMessageParam]; sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[429], pPlayer5->pName, pClassNames[pPlayer5->classType]);// "%s the %s" strcat(pTmpBuf, ": "); v107 = pPlayer5->GetMajorConditionIdx(); strcat(pTmpBuf, aCharacterConditionNames[v107]); sub_41C0B8_set_status_string(pTmpBuf); v108 = 8 * uMessageParam - 8; LOBYTE(v108) = v108 | 4; pMouse->uPointingObjectID = v108; continue; case UIMSG_ShowStatus_ManaHP: v109 = pGlobalTXT_LocalizationStrings[212];// "Spell Points" v110 = pPlayers[uMessageParam]; v111 = v110->GetMaxMana(); v112 = v110->sMana; v113 = pGlobalTXT_LocalizationStrings[108];// "Hit Points" v114 = v110->GetMaxHealth(); sprintf(pTmpBuf, "%d / %d %s %d / %d %s", v110->sHealth, v114, v113, v112, v111, v109); sub_41C0B8_set_status_string(pTmpBuf); continue; case UIMSG_C: if ( pCurrentScreen == SCREEN_F ) { sub_421EA6_OnInventoryLeftClick(); continue; } sub_420E01(); continue; case UIMSG_InventoryLeftClick: sub_421EA6_OnInventoryLeftClick(); continue; case UIMSG_A: if ( !pRenderer->pRenderD3D ) //goto LABEL_772; { if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; OnGameViewportClick(); continue; } v115 = pMessageQueue_50CBD0->uNumMessages; if ( !pMessageQueue_50CBD0->uNumMessages ) //goto LABEL_768; { pMessageQueue_50CBD0->AddMessage(UIMSG_E, 0, 0); /*if ( (signed int)v115 < 40 ) //goto LABEL_769; { pMessageQueue_50CBD0->pMessages[v115].eType = (UIMessageType)14; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; continue; }*/ continue; } if ( pMessageQueue_50CBD0->pMessages[0].field_8 ) { pMessageQueue_50CBD0->uNumMessages = v0; pMessageQueue_50CBD0->AddMessage(UIMSG_E, 0, 0); /*v115 = v0; pMessageQueue_50CBD0->uNumMessages = v0; pMessageQueue_50CBD0->pMessages[v115].eType = (UIMessageType)14; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; //goto LABEL_771; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages;*/ continue; } v115 = 0; pMessageQueue_50CBD0->uNumMessages = 0; pMessageQueue_50CBD0->AddMessage(UIMSG_E, 0, 0); /*if ( (signed int)v115 < 40 ) //goto LABEL_769; { pMessageQueue_50CBD0->pMessages[v115].eType = (UIMessageType)14; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; continue; }*/ continue; case UIMSG_E: if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; OnGameViewportClick(); continue; case UIMSG_F: if ( pRenderer->pRenderD3D ) { LOWORD(v116) = pGame->pVisInstance->get_picked_object_zbuf_val(); } else { uNumSeconds = (unsigned int)pMouse->GetCursorPos(&v209); pPoint3 = pMouse->GetCursorPos(&v204); v116 = pRenderer->pActiveZBuffer[*(int *)uNumSeconds + pSRZBufferLineOffsets[pPoint3->y]]; } pButton2 = (GUIButton *)(unsigned __int16)v116; GUIWindow::Create(0, 0, 0, 0, (WindowType)15, (int)pButton2, 0); continue; case UIMSG_54: pButton2 = (GUIButton *)uMessageParam; GUIWindow::Create(0, 0, 0, 0, (WindowType)22, (int)pButton2, 0); continue; case UIMSG_Game_Action: if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; OnPressSpace(); continue; case UIMSG_16F: if ( pCurrentScreen ) continue; pParty->uFlags |= 2u; GUIWindow::Create(0x207u, 0x88u, 0, 0, (enum WindowType)90, (int)pBtn_ZoomOut, 0); uNumSeconds = 131072; v118 = 2 * viewparams->uMinimapZoom; ++viewparams->field_28; viewparams->uMinimapZoom *= 2; if ( uCurrentlyLoadedLevelType != LEVEL_Outdoor) { if ( (signed int)v118 > 4096 ) { viewparams->uMinimapZoom = 4096; viewparams->field_28 = 12; } continue; } v119 = 2048; if ( (signed int)v118 <= 2048 ) goto LABEL_789; viewparams->field_28 = 11; goto LABEL_788; case UIMSG_170: if ( pCurrentScreen ) continue; pParty->uFlags |= 2u; GUIWindow::Create(0x23Eu, 0x88u, 0, 0, (enum WindowType)90, (int)pBtn_ZoomIn, 0); uNumSeconds = 32768; v118 = (unsigned __int64)((signed __int64)(signed int)viewparams->uMinimapZoom << 15) >> 16; --viewparams->field_28; viewparams->uMinimapZoom = (unsigned __int64)((signed __int64)(signed int)viewparams->uMinimapZoom << 15) >> 16; if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor) { v119 = 512; if ( (signed int)v118 < 512 ) { viewparams->field_28 = 9; LABEL_788: v118 = v119; viewparams->uMinimapZoom = v119; } LABEL_789: dword_576E2C = v118; dword_576E28 = viewparams->field_28; } else { if ( (signed int)v118 < 256 ) { viewparams->uMinimapZoom = 256; viewparams->field_28 = 8; } } default: continue; } } } pMessageQueue_50CBD0->uNumMessages = dword_50C9E8; memcpy(pMessageQueue_50CBD0->pMessages, dword_50C9EC, 12 * dword_50C9E8); dword_50C9E8 = 0; if ( dword_50C9DC ) { /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)dword_50C9DC; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = (int)ptr_50C9E0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; }*/ pMessageQueue_50CBD0->AddMessage((UIMessageType)dword_50C9DC, (int)ptr_50C9E0, 0); dword_50C9DC = 0; } else { if ( dword_50C9D0 > 0 ) { dword_50C9D8 -= pEventTimer->uTimeElapsed; if ( dword_50C9D8 <= 0 ) { /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)dword_50C9D0; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = dword_50C9D4; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; }*/ pMessageQueue_50CBD0->AddMessage((UIMessageType)dword_50C9D0, dword_50C9D4, 0); dword_50C9D0 = 0; dword_50C9D4 = 0; dword_50C9D8 = 0; } } } pStru277->_427E01_cast_spell(); } //----- (004356FF) -------------------------------------------------------- void __cdecl back_to_game() { dword_507BF0_is_there_popup_onscreen = 0; dword_4E455C = 1; dword_50CDCC = 0; if ( pGUIWindow_ScrollWindow ) free_book_subwindow(); if ( !pCurrentScreen && !pGUIWindow_Settings ) pEventTimer->Resume(); viewparams->bRedrawGameUI = 1; } //----- (00435748) -------------------------------------------------------- void __cdecl GUI_MainMenuMessageProc() { //AudioPlayer *v0; // ebp@2 //Player *pPlayer1; // ebx@2 unsigned int v2; // ecx@18 void *v3; // edi@21 signed int v4; // eax@29 int v5; // ecx@29 enum PLAYER_SKILL_TYPE v6; // edi@37 GUIWindow *pWindow; // eax@56 unsigned int v8; // edx@56 //Player *pCurrentPlayer; // edi@57 signed int v10; // eax@58 GUIButton *pButton; // eax@59 //unsigned __int8 v12; // sf@62 //signed int v13; // eax@64 unsigned int v14; // eax@66 int v15; // edi@70 char v16; // zf@73 int v17; // eax@73 int v19; // edi@116 char v20; // dl@116 unsigned int v21; // eax@116 Player *v22; // ecx@116 char *v23; // ebx@118 int v24; // eax@118 unsigned int v25; // eax@120 unsigned int v26; // ecx@127 unsigned int v27; // eax@129 unsigned __int8 v28; // of@129 SoundID pSoundID; // [sp-2Ch] [bp-3Ch]@36 signed int v30; // [sp-28h] [bp-38h]@36 unsigned int v31; // [sp-24h] [bp-34h]@36 signed int v32; // [sp-20h] [bp-30h]@36 signed int v34; // [sp-1Ch] [bp-2Ch]@36 int v36; // [sp-18h] [bp-28h]@36 unsigned int v38; // [sp-14h] [bp-24h]@36 int v39; // [sp-14h] [bp-24h]@56 signed int v40; // [sp-10h] [bp-20h]@15 signed int v41; // [sp-10h] [bp-20h]@29 int v42; // [sp-10h] [bp-20h]@36 int v43; // [sp-10h] [bp-20h]@56 int uNum; // [sp+4h] [bp-Ch]@3 UIMessageType pUIMessageType; // [sp+8h] [bp-8h]@3 //int pSex; // [sp+Ch] [bp-4h]@3 Player *pPlayer; if ( pMessageQueue_50CBD0->uNumMessages ) { //v0 = pAudioPlayer; //pPlayer1 = pParty->pPlayers; pPlayer = pParty->pPlayers; do { int param2; pMessageQueue_50CBD0->PopMessage(&pUIMessageType, &uNum, ¶m2); switch (pUIMessageType) // For buttons of window MainMenu { case UIMSG_MainMenu_ShowPartyCreationWnd: { GUIWindow::Create(495, 172, 0, 0, WINDOW_5A, (int)pMainMenu_BtnNew, 0); SetCurrentMenuID(MENU_NEWGAME); } continue; case UIMSG_MainMenu_ShowLoadWindow: { GUIWindow::Create(495, 227, 0, 0, WINDOW_5A, (int)pMainMenu_BtnLoad, 0); SetCurrentMenuID(MENU_SAVELOAD); } continue; case UIMSG_ShowCredits: { GUIWindow::Create(495, 282, 0, 0, WINDOW_5A, (int)pMainMenu_BtnCredits, 0); SetCurrentMenuID(MENU_CREDITS); } continue; case UIMSG_ExitToWindows: { GUIWindow::Create(495, 337, 0, 0, WINDOW_5A, (int)pMainMenu_BtnExit, 0); SetCurrentMenuID(MENU_FINISHED); } continue; } switch (pUIMessageType) // For buttons of Party Creation Window { case UIMSG_PlayerCreation_SelectAttribute: { pGUIWindow_CurrentMenu->pCurrentPosActiveItem = (pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem) % 7 + pGUIWindow_CurrentMenu->pStartingPosActiveItem + 7 * uNum; uPlayerCreationUI_SelectedCharacter = uNum; pAudioPlayer->PlaySound(SOUND_Button, 0, 0, -1, 0, 0, 0, 0); } continue; case UIMSG_PlayerCreation_VoicePrev: { auto player = &pParty->pPlayers[uNum]; auto sex = player->GetSexByVoice(); do { if (player->uVoiceID == 0) player->uVoiceID = 19; else --player->uVoiceID; } while (player->GetSexByVoice() != sex); pButton = pCreationUI_BtnPressLeft2[uNum]; GUIWindow::Create(pButton->uX, pButton->uY, 0, 0, WINDOW_VoiceSwitcherButton, (int)pButton, 1); pAudioPlayer->PlaySound(SOUND_Button, 0, 0, -1, 0, 0, 0, 0); player->PlaySound(SPEECH_PickMe, 0); } continue; case UIMSG_PlayerCreation_VoiceNext: { auto player = &pParty->pPlayers[uNum]; auto sex = player->GetSexByVoice(); do { player->uVoiceID = (player->uVoiceID + 1) % 20; } while (player->GetSexByVoice() != sex); pButton = pCreationUI_BtnPressRight2[uNum]; GUIWindow::Create(pButton->uX, pButton->uY, 0, 0, WINDOW_VoiceSwitcherButton, (int)pButton, 1); pAudioPlayer->PlaySound(SOUND_Button, 0, 0, -1, 0, 0, 0, 0); player->PlaySound(SPEECH_PickMe, 0); } continue; case UIMSG_PlayerCreation_FacePrev: { pPlayer = &pParty->pPlayers[uNum]; unsigned char v12 = (char)((int)pPlayer->uFace - 1) < 0; --pPlayer->uFace; if ( v12 ) pPlayer->uFace = 19; pPlayer->uVoiceID = pPlayer->uFace; pPlayer->SetInitialStats(); pPlayer->SetSexByVoice(); pPlayer->RandomizeName(); v25 = uNum; pGUIWindow_CurrentMenu->pCurrentPosActiveItem = (pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem) % 7 + pGUIWindow_CurrentMenu->pStartingPosActiveItem + 7 * uNum; uPlayerCreationUI_SelectedCharacter = v25; GUIWindow::Create(pCreationUI_BtnPressLeft[v25]->uX, pCreationUI_BtnPressLeft[v25]->uY, 0, 0, WINDOW_VoiceSwitcherButton, (int)pCreationUI_BtnPressLeft[v25], 1); //v0 = pAudioPlayer; pAudioPlayer->PlaySound(SOUND_Button, 0, 0, -1, 0, 0, 0.0, 0); pPlayer->PlaySound(SPEECH_PickMe, 0); //v1 = (char *)pParty->pPlayers; } continue; case UIMSG_PlayerCreation_FaceNext: { pPlayer = &pParty->pPlayers[uNum]; v20 = (char)((int)pPlayer->uFace + 1) % 20; pPlayer->uFace = v20; pPlayer->uVoiceID = v20; pPlayer->SetInitialStats(); pPlayer->SetSexByVoice(); pPlayer->RandomizeName(); v21 = uNum; pGUIWindow_CurrentMenu->pCurrentPosActiveItem = (pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem) % 7 + pGUIWindow_CurrentMenu->pStartingPosActiveItem + 7 * uNum; uPlayerCreationUI_SelectedCharacter = v21; GUIWindow::Create(pCreationUI_BtnPressRight[v21]->uX, pCreationUI_BtnPressRight[v21]->uY, 0, 0, WINDOW_VoiceSwitcherButton, (int)pCreationUI_BtnPressRight[v21], 1); //v0 = pAudioPlayer; pAudioPlayer->PlaySound(SOUND_Button, 0, 0, -1, 0, 0, 0, 0); pPlayer->PlaySound(SPEECH_PickMe, 0); //v1 = (char *)pParty->pPlayers; } continue; } switch (pUIMessageType) // For buttons of window LoadGame { case UIMSG_LoadGame: { if (!pSavegameUsedSlots[uLoadGameUI_SelectedSlot]) continue; SetCurrentMenuID(MENU_LOADINGPROC); continue; } case UIMSG_SelectLoadSlot: { //main menu save/load wnd clicking on savegame lines if (pGUIWindow_CurrentMenu->field_40 == 1) pKeyActionMap->_459ED1(0); if ( pCurrentScreen != SCREEN_SAVEGAME || uLoadGameUI_SelectedSlot != uNum + pSaveListPosition ) { //load clicked line v26 = uNum + pSaveListPosition; if ( dword_6BE138 == uNum + pSaveListPosition ) { pMessageQueue_50CBD0->AddMessage(UIMSG_LoadSlot, 0, 0); pMessageQueue_50CBD0->AddMessage(UIMSG_LoadGame, 0, 0); } uLoadGameUI_SelectedSlot = v26; dword_6BE138 = v26; } else { //typing in the line pKeyActionMap->EnterText(0, 19, pGUIWindow_CurrentMenu); strcpy((char *)pKeyActionMap->pPressedKeysBuffer, pSavegameHeader[uLoadGameUI_SelectedSlot].pName); pKeyActionMap->uNumKeysPressed = strlen((const char *)pKeyActionMap->pPressedKeysBuffer); } continue; } case UIMSG_LoadSlot: { GUIWindow::Create(pGUIWindow_CurrentMenu->uFrameX + 241, pGUIWindow_CurrentMenu->uFrameY + 302, 61, 28, WINDOW_5E, (int)pBtnLoadSlot, 0); continue; } case UIMSG_DownArrow: { ++pSaveListPosition; if ( pSaveListPosition >= uNum ) pSaveListPosition = uNum - 1; if ( pSaveListPosition < 1 ) pSaveListPosition = 0; pWindow = pGUIWindow_CurrentMenu; GUIWindow::Create(pWindow->uFrameX + 215, pGUIWindow_CurrentMenu->uFrameY + 323, 0, 0, (WindowType)90, (int)pBtnDownArrow, 0); continue; } case UIMSG_Cancel: { GUIWindow::Create(pGUIWindow_CurrentMenu->uFrameX + 350, pGUIWindow_CurrentMenu->uFrameY + 302, 61, 28, (WindowType)95, (int)pBtnCancel, 0); continue; } case UIMSG_ArrowUp: { --pSaveListPosition; if ( pSaveListPosition < 0 ) pSaveListPosition = 0; pWindow = pGUIWindow_CurrentMenu; GUIWindow::Create(pWindow->uFrameX + 215, pGUIWindow_CurrentMenu->uFrameY + 197, 0, 0, (WindowType)90, (int)pBtnArrowUp, 0); continue; } } if ( (signed int)pUIMessageType > UIMSG_PlayerCreationRemoveDownSkill )// For button of window PlayerCreation { if ( pUIMessageType > UIMSG_DownArrow ) { if ( pUIMessageType == UIMSG_AD )//unknow { __debugbreak(); GUIWindow::Create(pMainMenu_BtnNew->uX, pMainMenu_BtnNew->uY, 0, 0, (enum WindowType)90, (int)pMainMenu_BtnNew, 0); SetCurrentMenuID(MENU_LOADINGPROC); continue; } if ( pUIMessageType != UIMSG_AE )//unknow { __debugbreak(); continue; } GUIWindow::Create(pMainMenu_BtnExit->uX, pMainMenu_BtnExit->uY, 0, 0, (enum WindowType)90, (int)pMainMenu_BtnExit, 0); SetCurrentMenuID(MENU_10); continue; } if ( pUIMessageType == UIMSG_GameMenuButton )//unknow { __debugbreak(); if ( pCurrentScreen ) { pGUIWindow_CurrentMenu->Release(); pEventTimer->Resume(); pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = 1; } GUIWindow::Create(602, 450, 0, 0, WINDOW_VoiceSwitcherButton, (int)pBtn_GameSettings, 0); /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) continue; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = UIMSG_Escape; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages;*/ pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); continue; } if ( pUIMessageType == UIMSG_Escape ) { if ( ptr_507BDC ) { sub_41426F(); continue; } if ( !(BYTE1(dword_6BE364_game_settings_1) & 0x40) ) continue; v15 = 1; pVideoPlayer->bStopBeforeSchedule = 1; viewparams->bRedrawGameUI = 1; viewparams->field_48 = 1; if ( !GetCurrentMenuID() || GetCurrentMenuID() == MENU_CREATEPARTY || GetCurrentMenuID() == MENU_NAMEPANELESC ) { LABEL_83: if ( pCurrentScreen == SCREEN_VIDEO ) pVideoPlayer->FastForwardToFrame(pVideoPlayer->pResetflag); if (GetCurrentMenuID() == MENU_NAMEPANELESC) { SetCurrentMenuID(MENU_CREATEPARTY); continue; } if (GetCurrentMenuID() == MENU_CREDITSPROC) { SetCurrentMenuID(MENU_CREDITSCLOSE); continue; } /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)5; //LABEL_93: pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; continue; }*/ pMessageQueue_50CBD0->AddMessage(UIMSG_ChangeGameState, 0, 0); continue; } v16 = GetCurrentMenuID() == 8; if ( v16 && !pCurrentScreen ) goto LABEL_83; if ( pCurrentScreen == SCREEN_LOADGAME ) { pIcons_LOD->_4114F2(); //crt_deconstruct_ptr_6A0118(); pTexture_PCX.Release(); pTexture_PCX.Load("title.pcx", 0); SetCurrentMenuID(MENU_MAIN); v15 = 1; //LABEL_81: pGUIWindow_CurrentMenu->Release(); pGUIWindow2->Release(); pGUIWindow2 = 0; pEventTimer->Resume(); pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v15; continue; } if ( pCurrentScreen == SCREEN_VIDEO ) { pVideoPlayer->Unload(); } else { if ( pCurrentScreen != SCREEN_1B ) //goto LABEL_81; { pGUIWindow_CurrentMenu->Release(); pGUIWindow2->Release(); pGUIWindow2 = 0; pEventTimer->Resume(); pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = v15; continue; } //VideoPlayer::dtor(); } } } else { if ( pUIMessageType == UIMSG_PlayerCreationRemoveDownSkill ) { uPlayerCreationUI_SelectedCharacter = uNum; //v41 = 3; //v1 = (char *)pParty->pPlayers; pGUIWindow_CurrentMenu->pCurrentPosActiveItem = (pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem) % 7 + pGUIWindow_CurrentMenu->pStartingPosActiveItem + 7 * uNum; pParty->pPlayers[0].pActiveSkills[(&pPlayer[uPlayerCreationUI_SelectedCharacter])->GetSkillIdxByOrder(3) + 3486 * uPlayerCreationUI_SelectedCharacter] = 0; continue; } if ( (signed int)pUIMessageType > UIMSG_PlayerCreationChangeName ) { if ( pUIMessageType == UIMSG_PlayerCreationClickPlus ) { GUIWindow::Create(613, 393, 0, 0, (enum WindowType)90, (int)pPlayerCreationUI_BtnPlus, 1); (&pPlayer[uPlayerCreationUI_SelectedCharacter])->IncreaseAttribute( (pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem) % 7); pAudioPlayer->PlaySound((SoundID)20, 0, 0, -1, 0, 0, 0, 0); continue; } if ( pUIMessageType == UIMSG_PlayerCreationClickMinus ) { GUIWindow::Create(523, 393, 0, 0, (enum WindowType)90, (int)pPlayerCreationUI_BtnMinus, 1); (&pPlayer[uPlayerCreationUI_SelectedCharacter])->DecreaseAttribute( (pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem) % 7); pAudioPlayer->PlaySound((SoundID)23, 0, 0, -1, 0, 0, 0, 0); continue; } if ( pUIMessageType == UIMSG_PlayerCreationSelectActiveSkill ) { auto _t = &pPlayer[uPlayerCreationUI_SelectedCharacter]; v6 = _t->GetSkillIdxByOrder(uNum + 4); if ( _t->GetSkillIdxByOrder(3) == 37 ) pParty->pPlayers[0].pActiveSkills[v6 + 3486 * uPlayerCreationUI_SelectedCharacter] = 1; pAudioPlayer->PlaySound((SoundID)24, 0, 0, -1, 0, 0, 0, 0); continue; } if ( pUIMessageType == UIMSG_PlayerCreationSelectClass ) { pPlayer[uPlayerCreationUI_SelectedCharacter].Reset((PLAYER_CLASS_TYPE)uNum); pAudioPlayer->PlaySound(SOUND_Button, 0, 0, -1, 0, 0, 0, 0); continue; } if ( pUIMessageType == UIMSG_PlayerCreationClickOK ) { GUIWindow::Create(580, 431, 0, 0, (enum WindowType)90, (int)pPlayerCreationUI_BtnOK, 0); if ( PlayerCreation_ComputeAttributeBonus() || !PlayerCreation_Chose4Skills() ) GameUI_StatusBar_TimedStringTimeLeft = GetTickCount() + 4000; else uGameState = 6; continue; } if ( pUIMessageType == UIMSG_PlayerCreationClickReset ) { GUIWindow::Create(527, 431, 0, 0, (enum WindowType)90, (int)pPlayerCreationUI_BtnReset, 0); pParty->Reset(); } else { if ( pUIMessageType == UIMSG_PlayerCreationRemoveUpSkill ) { uPlayerCreationUI_SelectedCharacter = uNum; v4 = pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem; int pSex = pGUIWindow_CurrentMenu->pStartingPosActiveItem; v41 = 2; v5 = v4 % 7 + pSex + 7 * uNum; pGUIWindow_CurrentMenu->pCurrentPosActiveItem = v5; pParty->pPlayers[0].pActiveSkills[(&pPlayer[uPlayerCreationUI_SelectedCharacter])->GetSkillIdxByOrder(v41) + 3486 * uPlayerCreationUI_SelectedCharacter] = 0; continue; } } } else { switch ( pUIMessageType ) { case UIMSG_PlayerCreationChangeName: pAudioPlayer->PlaySound((SoundID)24, 0, 0, -1, 0, 0, 0, 0); v3 = (void *)uNum; uPlayerCreationUI_SelectedCharacter = uNum; pKeyActionMap->EnterText(0, 15, pGUIWindow_CurrentMenu); pGUIWindow_CurrentMenu->ptr_1C = v3; break; case UIMSG_ChangeGameState: uGameState = 1; break; case UIMSG_11://unknow __debugbreak(); pMouse->SetCursorBitmap("MICON2"); break; case UIMSG_3A://unknow __debugbreak(); SetCurrentMenuID(MENU_10); break; } } } } while ( pMessageQueue_50CBD0->uNumMessages ); } } //----- (00436427) -------------------------------------------------------- double __cdecl get_shading_dist_mist() { double result; // st7@2 if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor) result = (double)pOutdoorCamera->shading_dist_mist; else result = 16192.0; return result; } //----- (0043643E) -------------------------------------------------------- double __cdecl GetPickDepth() { double result; // st7@2 if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor) result = (double)pOutdoorCamera->uPickDepth; else result = 16192.0; return result; } //----- (0043648F) -------------------------------------------------------- void Vec3_short__to_RenderVertexSoft(RenderVertexSoft *_this, Vec3_short_ *a2) { _this->flt_2C = 0.0; _this->vWorldPosition.x = a2->x; _this->vWorldPosition.y = a2->y; _this->vWorldPosition.z = a2->z; } //----- (004369DB) -------------------------------------------------------- void Vec3_float_::Normalize() { Vec3_float_ *v1; // esi@1 double v2; // st7@1 auto a1 = this; v1 = a1; v2 = 1.0 / sqrt(a1->x * a1->x + a1->y * a1->y + a1->z * a1->z); v1->x = v2 * v1->x; v1->y = v2 * v1->y; v1->z = v2 * v1->z; } //----- (004382BC) -------------------------------------------------------- __int16 __thiscall sub_4382BC(int _this) { LOG_DECOMPILATION_WARNING(); return 0; /*__int16 result; // ax@4 __int16 v14; // sp@11 int v15; // [sp-4h] [bp-Ch]@0 signed __int16 v16; // [sp+4h] [bp-4h]@1 __int16 v17; // [sp+4h] [bp-4h]@8 __int16 v18; // [sp+4h] [bp-4h]@11 v16 = 1; __asm { pushf } if ( v15 == (v15 ^ 0x200000) ) v16 = 0; if ( v16 ) { result = sub_43847A(); } else { //UNDEF(_ZF); //UNDEF(_SF); //UNDEF(_OF); _CF = 0; if ( !_ZF ) _CF = 1; __asm { pushfw } bProcessorIsNotIntel = (BYTE2(v15) & 1 ^ 1) & 1; _CF = 0; _OF = 0; _ZF = 0; _SF = 1; __asm { pushfw } v17 = 2; if ( (HIWORD(v15) | 0xF000) & 0xF000 ) v17 = -1; __asm { popfw } result = v17; if ( v17 != 2 ) { _CF = 0; _OF = 0; _ZF = v14 == 0; _SF = v14 < 0; __asm { pushf } v18 = 3; if ( v15 != (v15 ^ 0x40000) ) v18 = -1; __asm { popf } result = v18; if ( v18 != 3 ) result = 4; } } if ( bProcessorIsNotIntel ) HIBYTE(result) |= 0x80u; return result;*/ } //----- (004383ED) -------------------------------------------------------- int __cdecl sub_4383ED() { LOG_DECOMPILATION_WARNING(); return 0; /*signed int v9; // eax@4 int v16; // [sp-4h] [bp-38h]@0 int v17[3]; // [sp+Ch] [bp-28h]@1 char v18; // [sp+18h] [bp-1Ch]@1 char v19; // [sp+19h] [bp-1Bh]@1 int v20[4]; // [sp+1Ch] [bp-18h]@1 int v21; // [sp+2Ch] [bp-8h]@1 int v22; // [sp+30h] [bp-4h]@1 v17[0] = *(int *)"------------"; v17[1] = *(int *)"--------"; v17[2] = *(int *)"----"; v18 = asc_4E4938[12]; v19 = 0; v22 = 0; v20[0] = *(int *)"GenuineIntel"; v20[1] = *(int *)"ineIntel"; v20[2] = *(int *)"ntel"; LOBYTE(v20[3]) = aGenuineintel[12]; _CF = 0; _OF = 0; _ZF = 0; _SF = 0; v21 = 1; __asm { pushf } if ( v16 == (v16 ^ 0x200000) ) v21 = 0; if ( (short)v21 ) { _EAX = 0; __asm { cpuid } v17[0] = _EBX; v17[1] = _EDX; v17[2] = _ECX; v9 = 0; do { if ( *((char *)v17 + v9) != *((char *)v20 + v9) ) bProcessorIsNotIntel = 1; ++v9; } while ( v9 < 12 ); if ( v9 >= 1 ) { _EAX = 1; __asm { cpuid } v22 = _EDX; } } return v22;*/ } //----- (0043847A) -------------------------------------------------------- __int16 __cdecl sub_43847A() { __debugbreak(); return 0; /*signed int v5; // eax@1 char v12[12]; // [sp+Ch] [bp-28h]@1 char v13; // [sp+18h] [bp-1Ch]@1 char v14; // [sp+19h] [bp-1Bh]@1 int v15[4]; // [sp+1Ch] [bp-18h]@1 int v16; // [sp+2Eh] [bp-6h]@1 char v17; // [sp+32h] [bp-2h]@6 char v18; // [sp+33h] [bp-1h]@1 *(int *)v12 = *(int *)"------------"; *(int *)&v12[4] = *(int *)"--------"; *(int *)&v12[8] = *(int *)"----"; v13 = asc_4E4938[12]; v14 = 0; v18 = 0; v15[0] = *(int *)"GenuineIntel"; v15[1] = *(int *)"ineIntel"; v15[2] = *(int *)"ntel"; v16 = 65535; LOBYTE(v15[3]) = aGenuineintel[12]; _EAX = 0; __asm { cpuid } *(int *)v12 = _EBX; *(int *)&v12[4] = _EDX; *(int *)&v12[8] = _ECX; v5 = 0; do { if ( v12[v5] != *((char *)v15 + v5) ) bProcessorIsNotIntel = 1; ++v5; } while ( v5 < 12 ); if ( v5 >= 1 ) { _EAX = 1; __asm { cpuid } v18 = _EAX & 0xF; LOBYTE(_EAX) = (unsigned __int8)(_EAX & 0xF0) >> 4; v17 = _EAX; LOWORD(v16) = ((_EAX & 0xF00u) >> 8) & 0xF; } return v16;*/ } //----- (004385B5) -------------------------------------------------------- void stru11::CheckCPU() { LOG_DECOMPILATION_WARNING(); /* int v5; // [sp-4h] [bp-10h]@0 signed int v6; // [sp+4h] [bp-8h]@1 signed int v7; // [sp+8h] [bp-4h]@1 _CF = 0; _OF = 0; _ZF = 1; _SF = 0; v7 = 0; __asm { pushf } v6 = 3; if ( v5 != (v5 ^ 0x40000) ) { __asm { popf } v6 = 4; __asm { pushf } if ( v5 != (v5 ^ 0x200000) ) { v7 = 1; v6 = 0; } } if ( v6 == 3 ) { this->field_AC = 1; } else { if ( v6 == 4 ) { this->field_AC = 2; } else { if ( v7 ) { this->field_AC = 2; RunCPUID(); } else { this->field_AC = 0; } } }*/ } //----- (00438659) -------------------------------------------------------- void stru11::RunCPUID() { __debugbreak(); /*stru11 *v6; // esi@1 unsigned int uNumOps; // edi@1 int uNumExtOps; // edi@16 char pCyrixString[16]; // [sp+Ch] [bp-60h]@1 char pCentaurString[16]; // [sp+1Ch] [bp-50h]@1 char pAMDString[16]; // [sp+2Ch] [bp-40h]@1 char pIntelString[16]; // [sp+3Ch] [bp-30h]@1 char pCPUString[16]; // [sp+4Ch] [bp-20h]@1 stru11 *thisa; // [sp+5Ch] [bp-10h]@1 char *v35; // [sp+60h] [bp-Ch]@1 int v36; // [sp+64h] [bp-8h]@1 int v37; // [sp+68h] [bp-4h]@1 thisa = this; *(int *)pIntelString = *(int *)"GenuineIntel"; *(int *)&pIntelString[4] = *(int *)"ineIntel"; *(int *)&pIntelString[8] = *(int *)"ntel"; pIntelString[12] = aGenuineintel[12]; *(int *)pAMDString = *(int *)"AuthenticAMD"; *(int *)&pAMDString[4] = *(int *)"enticAMD"; *(int *)&pAMDString[8] = *(int *)"cAMD"; pAMDString[12] = aAuthenticamd[12]; *(int *)pCyrixString = *(int *)"CyrixInstead"; *(int *)&pCyrixString[4] = *(int *)"xInstead"; *(int *)&pCyrixString[8] = *(int *)"tead"; pCyrixString[12] = aCyrixinstead[12]; *(int *)pCentaurString = *(int *)"CentaurHauls"; *(int *)&pCentaurString[4] = *(int *)"aurHauls"; *(int *)&pCentaurString[8] = *(int *)"auls"; v37 = 0; v36 = 0; pCentaurString[12] = aCentaurhauls[12]; v35 = pCPUString; pCPUString[12] = 0; _EAX = 0; __asm { cpuid } v37 = _EAX; *(int *)pCPUString = _EBX; *(int *)&pCPUString[4] = _EDX; *(int *)&pCPUString[8] = _ECX; v6 = thisa; uNumOps = _EAX; thisa->cpuid_00000000_ebx_vendorstr1 = _EBX; v6->cpuid_00000000_edx_vendorstr2 = *(int *)&pCPUString[4]; v6->cpuid_00000000_ecx_vendorstr3 = *(int *)&pCPUString[8]; v6->cpuid_00000000_eax_numops = _EAX; strcpy(v6->pCPUString, pCPUString); if ( strcmp(pIntelString, pCPUString) ) { if ( strcmp(pAMDString, pCPUString) ) { if ( strcmp(pCyrixString, pCPUString) ) { if ( strcmp(pCentaurString, pCPUString) ) v6->uProcessorManufacturer = 0; else v6->uProcessorManufacturer = 4; } else { v6->uProcessorManufacturer = 3; } } else { v6->uProcessorManufacturer = 2; } } else { v6->uProcessorManufacturer = 1; } if ( uNumOps >= 1 ) RunCPUID_op1(); if ( uNumOps >= 2 ) RunCPUID_op2(); _EAX = 0x80000000u; __asm { cpuid } if ( !(_EAX & 0x80000000) ) _EAX = 0x80000000u; v36 = _EAX; v6->cpuid_80000000_edx = _EAX; uNumExtOps = _EAX ^ 0x80000000; if ( (_EAX ^ 0x80000000u) >= 1 ) { _EAX = 0x80000001u; __asm { cpuid } thisa = (stru11 *)_EAX; v35 = (char *)_EDX; v6->cpuid_80000001_eax = _EAX; v6->cpuid_80000001_edx = (int)v35; } if ( (unsigned int)uNumExtOps >= 4 ) RunCPUID_ext2_3_4(); if ( (unsigned int)uNumExtOps >= 5 ) { _EAX = 0x80000005u; __asm { cpuid } thisa = (stru11 *)_EBX; v35 = (char *)_ECX; v36 = _EDX; v6->cpuid_80000005_ebx = _EBX; v6->cpuid_80000005_ecx = (int)v35; v6->cpuid_80000005_edx = v36; } if ( (unsigned int)uNumExtOps >= 6 ) { _EAX = 0x80000006u; __asm { cpuid } v6->cpuid_80000006_ecx = _ECX; }*/ } //----- (00438821) -------------------------------------------------------- void stru11::RunCPUID_op1() { __debugbreak(); /*stru11 *v1; // esi@1 unsigned int v7; // ecx@1 int v8; // eax@3 int v9; // eax@10 signed int v10; // eax@11 int v11; // ecx@11 int v12; // eax@15 signed int v13; // eax@19 int v14; // ecx@19 signed int v15; // eax@25 int v16; // ecx@25 signed int v17; // eax@34 int v18; // ecx@34 v1 = this; _EAX = 1; __asm { cpuid } v7 = _EAX; v1->cpuid_00000001_edx = _EDX; v1->cpuid_00000001_eax = _EAX; if ( (_EAX & 0x3000) == 8192 ) { LOBYTE(v1->cpuid_80000002_registers2[0]) = 1; v7 = 0; } v8 = (v7 >> 8) & 0xF; switch ( v8 ) { case 4: v1->field_AC = 2; break; case 5: v1->field_AC = 15; break; case 6: v1->field_AC = 36; break; default: v1->field_AC = 49; break; } v9 = v1->uProcessorManufacturer; if ( v9 == 1 ) { v10 = 0; v11 = v7 & 0x3FF0; while ( v11 != dword_4E4948[2 * v10] ) { ++v10; if ( v10 >= 17 ) return; } v12 = dword_4E494C[2 * v10]; goto LABEL_39; } if ( v9 == 2 ) { if ( (v7 & 0xF00) == dword_4E49D0[0] ) { v12 = dword_4E49D4[0]; } else { v13 = 1; v14 = v7 & 0x3FF0; while ( v14 != dword_4E49D0[2 * v13] ) { ++v13; if ( v13 >= 9 ) return; } v12 = dword_4E49D4[2 * v13]; } goto LABEL_39; } if ( v9 != 3 ) { if ( v9 != 4 ) return; v17 = 0; v18 = v7 & 0x3FF0; while ( v18 != dword_4E4A40[2 * v17] ) { ++v17; if ( v17 >= 2 ) return; } v12 = dword_4E4A44[2 * v17]; goto LABEL_39; } v15 = 1; v16 = v7 & 0x3FF0; while ( v16 != dword_4E4A18[2 * v15] ) { ++v15; if ( v15 >= 5 ) goto LABEL_30; } v1->field_AC = dword_4E4A1C[2 * v15]; LABEL_30: v12 = 24; if ( v1->field_AC == 24 ) { if ( _EDX != 1 ) v12 = (((_EDX != 261) - 1) & 0xA) + 15; LABEL_39: v1->field_AC = v12; }*/ } //----- (00438992) -------------------------------------------------------- void stru11::RunCPUID_op2() { __debugbreak(); /* stru11 *v1; // edi@1 int v7; // eax@1 signed int v8; // ecx@2 unsigned __int8 v9; // al@3 signed int v10; // ecx@14 unsigned __int8 v11; // al@15 int v12; // [sp+Ch] [bp-14h]@1 int v13; // [sp+10h] [bp-10h]@1 int v14; // [sp+14h] [bp-Ch]@1 int v15; // [sp+18h] [bp-8h]@1 int *v16; // [sp+1Ch] [bp-4h]@1 v1 = this; v16 = &v12; _EAX = 2; __asm { cpuid } v12 = _EAX; v13 = _EBX; v14 = _ECX; v15 = _EDX; v1->cpuid_00000002_eax = _EAX; v1->cpuid_00000002_ebx = v13; v1->cpuid_00000002_ecx = v14; v1->cpuid_00000002_edx = v15; v7 = v1->field_AC; if ( v7 == 40 ) { v8 = 0; while ( 1 ) { v9 = *((char *)&v12 + v8); if ( v9 == 64 ) { v1->field_AC = 43; return; } if ( v9 >= 0x41u && v9 <= 0x43u ) { v1->field_AC = 41; return; } if ( v9 >= 0x44u && v9 <= 0x45u ) break; ++v8; if ( v8 >= 16 ) return; } v1->field_AC = 42; } else { if ( v7 == 45 ) { v10 = 0; while ( 1 ) { v11 = *((char *)&v12 + v10); if ( v11 >= 0x40u && v11 <= 0x43u ) { v1->field_AC = 46; return; } if ( v11 >= 0x44u && v11 <= 0x45u ) break; ++v10; if ( v10 >= 16 ) return; } v1->field_AC = 47; } }*/ } //----- (00438A67) -------------------------------------------------------- void stru11::RunCPUID_ext2_3_4() { __debugbreak(); /*stru11 *v1; // edi@1 stru11 *v17; // eax@1 int v18[3][4]; // [sp+Ch] [bp-38h]@1 stru11 *v19; // [sp+3Ch] [bp-8h]@1 v1 = this; v19 = this; _EAX = 0x80000002u; __asm { cpuid } v18[0][0] = _EAX; *(_QWORD *)&v18[0][1] = __PAIR__(_ECX, _EBX); v18[0][3] = _EDX; _EAX = 0x80000003u; __asm { cpuid } v18[1][0] = _EAX; *(_QWORD *)&v18[1][1] = __PAIR__(_ECX, _EBX); v18[1][3] = _EDX; _EAX = 0x80000004u; __asm { cpuid } v18[2][0] = _EAX; *(_QWORD *)&v18[2][1] = __PAIR__(_ECX, _EBX); v18[2][3] = _EDX; v17 = v19; memcpy(v1->cpuid_80000002_registers, v18, 0x30u); memcpy((char *)&v17->cpuid_80000002_registers2[0] + 1, v18, 0x30u);*/ } //----- (00438BDF) -------------------------------------------------------- bool MonsterStats::BelongsToSupertype(unsigned int uMonsterInfoID, enum MONSTER_SUPERTYPE eSupertype) { unsigned __int8 v2; // zf@15 char v3; // sf@15 unsigned __int8 v4; // of@15 bool result; // eax@33 switch ( eSupertype ) { case MONSTER_SUPERTYPE_UNDEAD: if ( (signed int)uMonsterInfoID >= MONSTER_GHOST_1 && (signed int)uMonsterInfoID <= MONSTER_GHOST_3 || (signed int)uMonsterInfoID >= MONSTER_LICH_1 && (signed int)uMonsterInfoID <= MONSTER_LICH_3 || (signed int)uMonsterInfoID >= MONSTER_SKELETON_1 && (signed int)uMonsterInfoID <= MONSTER_SKELETON_3 || (signed int)uMonsterInfoID >= MONSTER_VAMPIRE_1 && (signed int)uMonsterInfoID <= MONSTER_VAMPIRE_3 || (signed int)uMonsterInfoID >= MONSTER_WIGHT_1 && (signed int)uMonsterInfoID <= MONSTER_WIGHT_3 || (signed int)uMonsterInfoID >= MONSTER_ZOMBIE_1 && (signed int)uMonsterInfoID <= MONSTER_ZOMBIE_3 ) goto ret_true; if ( (signed int)uMonsterInfoID < MONSTER_GHOUL_1 ) goto ret_false; v4 = __OFSUB__(uMonsterInfoID, (int)MONSTER_GHOUL_3); v2 = uMonsterInfoID == MONSTER_GHOUL_3; v3 = ((uMonsterInfoID - MONSTER_GHOUL_3) & 0x80000000u) != 0; goto false_if_outside; case MONSTER_SUPERTYPE_KREEGAN: if ( (signed int)uMonsterInfoID < MONSTER_DEVIL_1 ) goto ret_false; v4 = __OFSUB__(uMonsterInfoID, (int)MONSTER_DEVIL_3); v2 = uMonsterInfoID == MONSTER_DEVIL_3; v3 = ((uMonsterInfoID - MONSTER_DEVIL_3) & 0x80000000u) != 0; goto false_if_outside; case MONSTER_SUPERTYPE_ELF: if ( (signed int)uMonsterInfoID >= MONSTER_PEASANT_ELF_FEMALE_1_1 && (signed int)uMonsterInfoID <= MONSTER_PEASANT_ELF_MALE_3_3 || (signed int)uMonsterInfoID >= MONSTER_ELF_ARCHER_1 && (signed int)uMonsterInfoID <= MONSTER_ELF_ARCHER_3 ) goto ret_true; if ( (signed int)uMonsterInfoID < MONSTER_ELF_SPEARMAN_1 ) goto ret_false; v4 = __OFSUB__(uMonsterInfoID, (int)MONSTER_ELF_SPEARMAN_3); v2 = uMonsterInfoID == MONSTER_ELF_SPEARMAN_3; v3 = ((uMonsterInfoID - MONSTER_ELF_SPEARMAN_3) & 0x80000000u) != 0; goto false_if_outside; case MONSTER_SUPERTYPE_DRAGON: if ( (signed int)uMonsterInfoID < MONSTER_DRAGON_1 ) goto ret_false; v4 = __OFSUB__(uMonsterInfoID, (int)MONSTER_DRAGON_3); v2 = uMonsterInfoID == MONSTER_DRAGON_3; v3 = ((uMonsterInfoID - MONSTER_DRAGON_3) & 0x80000000u) != 0; goto false_if_outside; case MONSTER_SUPERTYPE_WATER_ELEMENTAL: if ( (signed int)uMonsterInfoID < MONSTER_ELEMENTAL_WATER_1 ) goto ret_false; v4 = __OFSUB__(uMonsterInfoID, (int)MONSTER_ELEMENTAL_WATER_3); v2 = uMonsterInfoID == MONSTER_ELEMENTAL_WATER_3; v3 = ((uMonsterInfoID - MONSTER_ELEMENTAL_WATER_3) & 0x80000000u) != 0; goto false_if_outside; case MONSTER_SUPERTYPE_TREANT: if ( (signed int)uMonsterInfoID < MONSTER_TREANT_1 ) goto ret_false; v4 = __OFSUB__(uMonsterInfoID, (int)MONSTER_TREANT_3); v2 = uMonsterInfoID == MONSTER_TREANT_3; v3 = ((uMonsterInfoID - MONSTER_TREANT_3) & 0x80000000u) != 0; goto false_if_outside; case MONSTER_SUPERTYPE_TITAN: if ( (signed int)uMonsterInfoID < MONSTER_TITAN_1 ) goto ret_false; v4 = __OFSUB__(uMonsterInfoID, (int)MONSTER_TITAN_3); v2 = uMonsterInfoID == MONSTER_TITAN_3; v3 = ((uMonsterInfoID - MONSTER_TITAN_3) & 0x80000000u) != 0; false_if_outside: if ( !((unsigned __int8)(v3 ^ v4) | v2) ) goto ret_false; ret_true: result = 1; break; default: ret_false: result = 0; break; } return result; } //----- (00438F8F) -------------------------------------------------------- void __cdecl _438F8F_area_of_effect__damage_evaluate() { int v0; // edx@1 char *v1; // esi@2 int v2; // ecx@3 signed int v3; // eax@3 SpriteObject *v4; // eax@4 signed int v5; // eax@4 signed int v6; // eax@6 unsigned int v7; // edi@6 int v8; // eax@6 __int16 v9; // bx@8 int v10; // edi@8 Vec3_int_ v11; // ST04_12@9 int v12; // ST0C_4@10 Actor *v13; // edi@11 int v14; // edx@15 int v15; // edx@15 int v16; // ebx@15 signed int v17; // eax@15 int v18; // edi@15 int v19; // edi@15 Vec3_int_ v20; // ST04_12@16 Vec3_int_ *v21; // eax@17 unsigned int v22; // edx@17 int v23; // edx@18 int v24; // eax@18 Vec3_int_ v25; // ST04_12@19 unsigned int v26; // ebx@20 Player *v27; // edi@20 Actor *v28; // edi@27 int v29; // ebx@29 int v30; // eax@29 int v31; // edx@29 int v32; // eax@29 int v33; // ST24_4@29 Vec3_int_ v34; // ST04_12@30 Vec3_int_ *v35; // eax@31 SpriteObject *v36; // [sp+0h] [bp-28h]@0 signed int v37; // [sp+4h] [bp-24h]@5 int v38; // [sp+4h] [bp-24h]@15 signed int v39; // [sp+8h] [bp-20h]@3 int v40; // [sp+8h] [bp-20h]@15 int v41; // [sp+Ch] [bp-1Ch]@5 int v42; // [sp+Ch] [bp-1Ch]@15 int v43; // [sp+10h] [bp-18h]@1 int v44; // [sp+14h] [bp-14h]@15 unsigned int uActorID; // [sp+18h] [bp-10h]@6 Vec3_int_ *pVelocity; // [sp+1Ch] [bp-Ch]@2 int a1; // [sp+20h] [bp-8h]@8 int v48; // [sp+24h] [bp-4h]@8 v0 = 0; v43 = 0; if ( stru_50FE08.count > 0 ) { pVelocity = &stru_50FE08.vec_4B4; v1 = (char *)stru_50FE08.pZs; do { v2 = *((short *)v1 - 300) & 7; v3 = (signed int)*((short *)v1 - 300) >> 3; v39 = (signed int)*((short *)v1 - 300) >> 3; if ( v2 == 2 ) { v4 = &pSpriteObjects[v3]; v36 = v4; v5 = v4->field_58_pid; v2 = v5 & 7; v3 = v5 >> 3; } v41 = v2; v37 = v3; if ( stru_50FE08.field_3EC[v0] & 1 ) { v6 = ai_near_actors_targets_pid[v3]; v7 = v6 >> 3; v8 = (v6 & 7) - 3; uActorID = v7; if ( v8 ) { if ( v8 == 1 ) { v9 = *(short *)v1; v10 = pParty->vPosition.y - *((short *)v1 - 100); a1 = pParty->vPosition.x - *((short *)v1 - 200); v48 = v10; if ( a1 * a1 + v10 * v10 + ((signed int)(pParty->vPosition.z + pParty->uPartyHeight) >> (1 - v9)) * ((signed int)(pParty->vPosition.z + pParty->uPartyHeight) >> (1 - v9)) < (unsigned int)((*((short *)v1 + 100) + 32) * (*((short *)v1 + 100) + 32)) ) { v11.z = *(short *)v1; v11.y = *((short *)v1 - 100); v11.x = *((short *)v1 - 200); if ( sub_407A1C(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z + pParty->sEyelevel, v11) ) { v12 = stru_50C198.which_player_would_attack(&pActors[v39]); DamagePlayerFromMonster(*((short *)v1 - 300), stru_50FE08.field_450[v43], pVelocity, v12); } } } } else { v13 = &pActors[v7]; if ( SHIDWORD(v13->pActorBuffs[6].uExpireTime) > 0 || SHIDWORD(v13->pActorBuffs[6].uExpireTime) >= 0 && LODWORD(v13->pActorBuffs[6].uExpireTime) || v13->CanAct() ) { v14 = v13->vPosition.y; v40 = v13->vPosition.x; v38 = v14; v15 = v14 - *((short *)v1 - 100); v16 = *(short *)v1; v42 = v13->vPosition.z; a1 = v40 - *((short *)v1 - 200); v17 = v13->uActorHeight; v18 = v13->uActorRadius; v44 = v42; v19 = *((short *)v1 + 100) + v18; v48 = v15; if ( a1 * a1 + v15 * v15 + (v42 + (v17 >> 1) - v16) * (v42 + (v17 >> 1) - v16) < (unsigned int)(v19 * v19) ) { v20.z = *(short *)v1; v20.y = *((short *)v1 - 100); v20.x = *((short *)v1 - 200); if ( sub_407A1C(v40, v38, v42 + 50, v20) ) { Vec3_int_::Normalize(&a1, &v48, &v44); v21 = pVelocity; v22 = uActorID; pVelocity->x = a1; v21->y = v48; v21->z = v44; sub_43B1B0(*((short *)v1 - 300), v22, v21, stru_50FE08.field_450[v43]); } } } } } else { v23 = pParty->vPosition.y - *((short *)v1 - 100); v24 = ((signed int)pParty->uPartyHeight >> 1) - *(short *)v1; a1 = pParty->vPosition.x - *((short *)v1 - 200); v48 = v23; if ( a1 * a1 + v23 * v23 + (pParty->vPosition.z + v24) * (pParty->vPosition.z + v24) < (unsigned int)((*((short *)v1 + 100) + 32) * (*((short *)v1 + 100) + 32)) ) { v25.z = *(short *)v1; v25.y = *((short *)v1 - 100); v25.x = *((short *)v1 - 200); if ( sub_407A1C(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z + pParty->sEyelevel, v25) ) { v26 = 0; v27 = pParty->pPlayers;//[0].pConditions[15]; do { if ( !(HIDWORD(v27->pConditions[14]) | LODWORD(v27->pConditions[14])) && !v27->pConditions[15] && !v27->pConditions[16] ) DamagePlayerFromMonster(*((short *)v1 - 300), stru_50FE08.field_450[v43], pVelocity, v26); ++v27; ++v26; } while ( v27 <= &pParty->pPlayers[3] ); } } uActorID = 0; if ( (signed int)uNumActors > 0 ) { v28 = pActors;//[0].vPosition.z; do { if ( v28->CanAct() ) { v29 = *(short *)v1; v30 = v28->vPosition.y - *((short *)v1 - 100); a1 = v28->vPosition.x - *((short *)v1 - 200); v31 = v28->vPosition.z; v48 = v30; v44 = v31; v32 = (v28->uActorHeight >> 1) - v29; v33 = v28->uActorRadius + *((short *)v1 + 100); if ( a1 * a1 + v48 * v48 + (v31 + v32) * (v31 + v32) < (unsigned int)(v33 * v33) ) { v34.z = *(short *)v1; v34.y = *((short *)v1 - 100); v34.x = *((short *)v1 - 200); if ( sub_407A1C(v28->vPosition.x, v28->vPosition.y, v28->vPosition.z + 50, v34) ) { Vec3_int_::Normalize(&a1, &v48, &v44); v35 = pVelocity; pVelocity->x = a1; v35->y = v48; v35->z = v44; switch ( v41 ) { case OBJECT_Player: DamageMonsterFromParty(*((short *)v1 - 300), uActorID, v35); break; case OBJECT_Actor: if ( v36 && pActors[v37].GetActorsRelation(v28) ) sub_43B1B0(*((short *)v1 - 300), uActorID, pVelocity, v36->field_61); break; case OBJECT_Item: sub_43B057(*((short *)v1 - 300), uActorID, v35); break; } } } } ++uActorID; ++v28; } while ( (signed int)uActorID < (signed int)uNumActors ); } } ++pVelocity; v0 = v43 + 1; v1 += 2; ++v43; } while ( v43 < stru_50FE08.count ); } stru_50FE08.count = 0; } // 50FE08: using guessed type stru298 stru_50FE08; //----- (00439474) -------------------------------------------------------- void DamageMonsterFromParty(signed int a1, unsigned int uActorID_Monster, Vec3_int_ *pVelocity) { //signed int v3; // eax@1 SpriteObject *v4; // ebx@1 //int v5; // edx@3 //bool uPlayerID; // eax@3 //Player *pPlayer; // edi@4 Actor *pMonster; // esi@7 SpriteObject *v9; // ebx@12 int v10; // eax@12 int v11; // ebx@12 unsigned int v12; // ecx@12 int v13; // edx@15 int v14; // edx@17 int v15; // eax@24 unsigned __int16 v16; // cx@25 int v17; // eax@29 int v18; // eax@38 unsigned __int8 v19; // zf@38 unsigned __int8 v20; // sf@38 int v21; // edx@44 int v22; // eax@44 unsigned __int8 v23; // zf@44 unsigned __int8 v24; // sf@44 int v25; // edx@51 int v26; // ecx@51 //signed int v27; // eax@51 //int v28; // eax@53 signed int v29; // eax@76 signed int v30; // eax@84 signed int v31; // eax@92 int v32; // eax@94 int v33; // eax@100 int v34; // eax@104 signed int v35; // eax@104 double v36; // st7@104 float v37; // ST08_4@104 float v38; // ST04_4@104 float v39; // ST00_4@104 int v40; // ebx@107 unsigned int v41; // ebx@109 signed __int64 v42; // qax@125 unsigned __int16 v43; // ax@132 char v44; // bl@132 unsigned __int16 v45; // ax@132 unsigned __int64 v46; // [sp+Ch] [bp-60h]@6 const char *v47; // [sp+14h] [bp-58h]@104 char *pPlayerName; // [sp+18h] [bp-54h]@12 char *pMonsterName; // [sp+1Ch] [bp-50h]@6 int v50; // [sp+20h] [bp-4Ch]@6 //unsigned __int64 *v51; // [sp+30h] [bp-3Ch]@6 int v52; // [sp+34h] [bp-38h]@12 //int v53; // [sp+38h] [bp-34h]@10 //int v54; // [sp+3Ch] [bp-30h]@1 //int v55; // [sp+40h] [bp-2Ch]@12 signed int a4; // [sp+44h] [bp-28h]@1 PlayerEquipment *v57; // [sp+48h] [bp-24h]@10 //int v58; // [sp+4Ch] [bp-20h]@10 int v59; // [sp+50h] [bp-1Ch]@1 unsigned int uActorID_Monster_; // [sp+54h] [bp-18h]@1 int v61; // [sp+58h] [bp-14h]@1 bool v62; // [sp+5Ch] [bp-10h]@1 int uDamageAmount; // [sp+60h] [bp-Ch]@1 int a2; // [sp+64h] [bp-8h]@27 int a3; // [sp+6Bh] [bp-1h]@6 //v3 = a1; v4 = 0; uActorID_Monster_ = uActorID_Monster; //v54 = a1; uDamageAmount = 0; a4 = 0; v61 = 0; v59 = 0; v62 = 0; if ( (a1 & 7) == OBJECT_Item) { v4 = &pSpriteObjects[a1 >> 3]; //uDamageAmount = (int)v4; v61 = v4->field_60_distance_related_prolly_lod; a1 = v4->field_58_pid; //v54 = v4->field_58_pid; } //v5 = a1 & 7; //uPlayerID = a1 >> 3; if ((a1 & 7) != OBJECT_Player) return; assert(abs(a1 >> 3) < 4); auto player = &pParty->pPlayers[a1 >> 3]; pMonster = &pActors[uActorID_Monster_]; //uPlayerID = pMonster->IsAlive(); if (pMonster->IsNotAlive()) return; BYTE1(pMonster->uAttributes) |= 0xC0u; if ( pMonster->uAIState == Fleeing ) pMonster->uAttributes |= 0x20000u; //v57 = 0; //v53 = 0; //v58 = 0; bool hit_will_stun = false, hit_will_paralyze = false; if ( !v4 ) { //v51 = (unsigned __int64 *)player->pEquipment.uMainHand; int main_hand_idx = player->pEquipment.uMainHand; v59 = 1; if ( player->HasItemEquipped(EQUIP_TWO_HANDED) ) { auto main_hand_skill = pItemsTable->pItems[player->pInventoryItems[main_hand_idx - 1].uItemID].uSkillType; //v55 = pItemsTable->pItems[player->pInventoryItems[main_hand_idx - 1].uItemID].uSkillType; //v28 = SkillToMastery(player->pActiveSkills[v55]); auto main_hand_mastery = SkillToMastery(player->pActiveSkills[main_hand_skill]); //uDamageAmount = v28; switch (main_hand_skill) { case PLAYER_SKILL_STAFF: if (main_hand_mastery >= 3) { if (rand() % 100 < player->GetActualSkillLevel(PLAYER_SKILL_STAFF) & 0x3F) // stun chance when mastery >= 3 hit_will_stun = true; } break; case PLAYER_SKILL_MACE: if (main_hand_mastery >= 3) { if (rand() % 100 < player->GetActualSkillLevel(PLAYER_SKILL_MACE) & 0x3F) hit_will_stun = true; } if (main_hand_mastery >= 4) { if (rand() % 100 < player->GetActualSkillLevel(PLAYER_SKILL_MACE) & 0x3F) hit_will_paralyze = true; } break; } } v50 = pMonster->pMonsterInfo.uID; a2 = 4; //v27 = player->CalculateMeleeDamageTo(0, 0, v50); uDamageAmount = player->CalculateMeleeDamageTo(0, 0, v50); //if ( !v57 ) goto LABEL_67; //goto LABEL_69; } v19 = v4->field_48 == 99; v61 = v4->field_60_distance_related_prolly_lod; if ( !v19 ) { v9 = (SpriteObject *)uDamageAmount; v50 = pParty->vPosition.x - *(int *)(uDamageAmount + 4); //v55 = abs(v50); pMonsterName = (char *)(pParty->vPosition.y - v9->vPosition.y); //v51 = (unsigned __int64 *)abs((int)pMonsterName); pPlayerName = (char *)(pParty->vPosition.z - v9->vPosition.z); v52 = abs((int)pPlayerName); v61 = abs(v50); v10 = abs(v50); v11 = (int)abs((int)pMonsterName); v12 = v52; if ( v10 < v11) { v10 = (int)v11; v11 = v10; } if ( v10 < v52 ) { v13 = v10; v10 = v52; v12 = v13; } if ( v11 < (signed int)v12 ) { v14 = v12; v12 = v11; v11 = v14; } //uPlayerID = ((unsigned int)(11 * v11) >> 5) + (v12 >> 2) + v10; v61 = ((unsigned int)(11 * v11) >> 5) + (v12 >> 2) + v10; if ( v61 >= 2560 ) { if ( v61 >= 5120 && !(BYTE1(pMonster->uAttributes) & 4) ) return; v61 = 2; } else { v61 = 1; } v4 = (SpriteObject *)uDamageAmount; } v15 = v4->field_48; if ( v15 == 102 ) { v16 = player->pActiveSkills[7]; v61 = 1; if ( (signed int)SkillToMastery(v16) >= 3 ) a4 = player->pActiveSkills[7] & 0x3F; a2 = 4; uDamageAmount = player->CalculateMeleeDamageTo(1, 1, 0); goto LABEL_67; } if ( v15 != 100 ) { if ( v15 == 101 ) { a2 = 0; v18 = player->CalculateRangedDamageTo(0); v19 = HIDWORD(pMonster->pActorBuffs[15].uExpireTime) == 0; v20 = SHIDWORD(pMonster->pActorBuffs[15].uExpireTime) < 0; uDamageAmount = v18; if ( !v20 && (!(v20 | v19) || LODWORD(pMonster->pActorBuffs[15].uExpireTime)) ) uDamageAmount >>= 1; v59 = 1; goto LABEL_67; } if ( v15 == 39 ) { a4 = 5 * v4->field_4C; a2 = player->GetSpellSchool(0x27u); v21 = v4->field_4C; v50 = pMonster->sCurrentHP; pMonsterName = (char *)v4->field_50; v22 = _43AFE3_calc_spell_damage(39, v21, (signed int)pMonsterName, v50); v23 = HIDWORD(pMonster->pActorBuffs[15].uExpireTime) == 0; v24 = SHIDWORD(pMonster->pActorBuffs[15].uExpireTime) < 0; uDamageAmount = v22; if ( !v24 && (!(v24 | v23) || LODWORD(pMonster->pActorBuffs[15].uExpireTime)) ) uDamageAmount >>= 1; v59 = 0; LABEL_67: if ( !stru_50C198.PlayerHitOrMiss(player, pMonster, v61, a4) ) { //LABEL_68: player->PlaySound(SPEECH_52, 0); return; } goto LABEL_69; } if ( v15 == 34 ) { uDamageAmount = 0; a2 = 4; hit_will_stun = 1; goto LABEL_67; } v50 = v4->field_48; a2 = player->GetSpellSchool(v50); v25 = v4->field_4C; v26 = v4->field_48; v50 = pMonster->sCurrentHP; pMonsterName = (char *)v4->field_50; //v27 = _43AFE3_calc_spell_damage(v26, v25, (signed int)pMonsterName, v50); v59 = 0; //v57 = (PlayerEquipment *)1; //LABEL_65: uDamageAmount = _43AFE3_calc_spell_damage(v26, v25, (signed int)pMonsterName, v50); //if ( !v57 ) // goto LABEL_67; goto LABEL_69; } v50 = pMonster->word_000086_some_monster_id; a2 = 4; v17 = player->CalculateRangedDamageTo(v50); v19 = v4->stru_24.uItemID == 0; uDamageAmount = v17; v57 = 0; if ( !v19 && v4->stru_24.uSpecEnchantmentType == 3 ) { a2 = 0; v57 = (PlayerEquipment *)1; } if ( SHIDWORD(pMonster->pActorBuffs[15].uExpireTime) >= 0 && (SHIDWORD(pMonster->pActorBuffs[15].uExpireTime) > 0 || LODWORD(pMonster->pActorBuffs[15].uExpireTime)) ) uDamageAmount >>= 1; v59 = 1; //LABEL_66: if ( !v57 ) goto LABEL_67; LABEL_69: if (player->Weak()) uDamageAmount /= 1; if ( (signed __int64)pMonster->pActorBuffs[5].uExpireTime > 0 ) uDamageAmount = 0; v61 = stru_50C198.CalcMagicalDamageToActor(pMonster, a2, uDamageAmount); if ( !v4 && player->IsUnarmed() && (signed __int64)player->pPlayerBuffs[6].uExpireTime > 0 ) { v50 = player->pPlayerBuffs[6].uPower; v29 = stru_50C198.CalcMagicalDamageToActor(pMonster, 8, v50); v61 += v29; } uDamageAmount = v61; if ( v59 ) { if ( v4 ) { a4 = v4->stru_24._439DF3_get_additional_damage(&a2, &v62); if ( v62 && pMonster->sCurrentHP > 0 ) { player->sHealth += v61 / 5; if ( player->sHealth > player->GetMaxHealth() ) player->sHealth = player->GetMaxHealth(); v62 = 0; } v30 = stru_50C198.CalcMagicalDamageToActor(pMonster, a2, a4); uDamageAmount = v61 + v30; } else { v59 = 0; v57 = &player->pEquipment; do { if ( player->HasItemEquipped((ITEM_EQUIP_TYPE)v59) ) { auto _s = (ItemGen *)&player->pInventoryItems[v57->uOffHand-1]; a4 = _s->_439DF3_get_additional_damage(&a2, &v62); if ( v62 && pMonster->sCurrentHP > 0 ) { player->sHealth += v61 / 5; if ( player->sHealth > player->GetMaxHealth() ) player->sHealth = player->GetMaxHealth(); v62 = 0; } v31 = stru_50C198.CalcMagicalDamageToActor(pMonster, a2, a4); uDamageAmount += v31; } ++v59; v57 = (PlayerEquipment *)((char *)v57 + 4); } while ( v59 <= 1 ); } } v32 = uDamageAmount; pMonster->sCurrentHP -= uDamageAmount; if ( !v32 && !hit_will_stun ) { player->PlaySound(SPEECH_52, 0); return; } if ( pMonster->sCurrentHP > 0 ) { Actor::_4030AD(uActorID_Monster_, a1, 0); Actor::AggroSurroundingPeasants(uActorID_Monster_, 1); if ( bShowDamage ) { v50 = uDamageAmount; pMonsterName = (char *)pMonster; pPlayerName = player->pName; if ( v4 ) v47 = pGlobalTXT_LocalizationStrings[189];// "%s shoots %s for %lu points" else v47 = pGlobalTXT_LocalizationStrings[164];// "%s hits %s for %lu damage" sprintfex(pTmpBuf, v47, pPlayerName, pMonsterName, v50); ShowStatusBarString(pTmpBuf, 2u); } v41 = 0; } else { if ( pMonsterStats->pInfos[pMonster->pMonsterInfo.uID].bQuestMonster & 1 ) { v33 = byte_4D864C && BYTE2(pGame->uFlags) & 8 ? 10 * pMonster->uActorRadius : pMonster->uActorRadius; //v55 = v33; if ( pRenderer->pRenderD3D ) { if ( pGame->uFlags2 & GAME_FLAGS_2_DRAW_BLOODSPLATS ) { v50 = 0; pMonsterName = 0; v34 = pMonster->vPosition.z; *(float *)&pPlayerName = (double)v33; //v51 = (unsigned __int64 *)v34; *(float *)&v47 = 0.0; v35 = pMonster->vPosition.y; *((float *)&v46 + 1) = 0.0; *(float *)&v46 = 1.0; v36 = (double)(signed int)pMonster->vPosition.z; //v51 = (unsigned __int64 *)v35; v37 = v36; //v51 = (unsigned __int64 *)pMonster->vPosition.x; v38 = (double)v35; v39 = (double)(signed int)pMonster->vPosition.x; pDecalBuilder->AddBloodsplat(v39, v38, v37, 1.0, 0.0, 0.0, *(float *)&pPlayerName, 0, 0); } } } Actor::Die(uActorID_Monster_); Actor::ApplyFineForKillingPeasant(uActorID_Monster_); Actor::AggroSurroundingPeasants(uActorID_Monster_, 1); if ( pMonster->pMonsterInfo.uExp ) sub_4269A2_GivePartyExp(pMonsterStats->pInfos[pMonster->pMonsterInfo.uID].uExp); v40 = SPEECH_51; if ( rand() % 100 < 20 ) v40 = ((signed int)pMonster->pMonsterInfo.uHP >= 100) + 1; player->PlaySound((PlayerSpeech)v40, 0); v41 = 0; if ( bShowDamage ) { v50 = (int)pMonster; pMonsterName = (char *)uDamageAmount; pPlayerName = player->pName; // "%s inflicts %lu points killing %s" sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[175], player->pName, uDamageAmount, pMonster); ShowStatusBarString(pTmpBuf, 2u); } } if ( SHIDWORD(pMonster->pActorBuffs[20].uExpireTime) >= (signed int)v41 && (SHIDWORD(pMonster->pActorBuffs[20].uExpireTime) > (signed int)v41 || LODWORD(pMonster->pActorBuffs[20].uExpireTime) > v41) && uDamageAmount != v41 ) player->ReceiveDamage(uDamageAmount, a2); v50 = 24; v59 = 20 * v61 / (signed int)pMonster->pMonsterInfo.uHP; if ( (player->_48EA46_calc_special_bonus_by_items(24) || hit_will_stun != v41) && stru_50C198.GetMagicalResistance(pMonster, 3u) ) { LODWORD(v42) = 20; v59 = 10; if ( pParty->bTurnBasedModeOn == v41 ) v42 = (signed __int64)(flt_6BE3A8_debug_recmod2 * 42.66666666666666); pMonster->pMonsterInfo.uRecoveryTime += v42; if ( bShowDamage != v41 ) { v50 = (int)pMonster; pMonsterName = player->pName; // "%s stuns %s" sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[635], player->pName, pMonster); ShowStatusBarString(pTmpBuf, 2u); } } if ( hit_will_paralyze != v41 ) { if ( pMonster->CanAct() ) { if ( stru_50C198.GetMagicalResistance(pMonster, 3) ) { LOBYTE(v43) = player->GetActualSkillLevel(PLAYER_SKILL_MACE); v44 = v43; v45 = SkillToMastery(v43); //v51 = (unsigned __int64 *)(7680 * (v44 & 0x3F)); v46 = pParty->uTimePlayed + (signed int)(signed __int64)((double)(signed int)(7680 * (v44 & 0x3F)) * 0.033333335); pMonster->pActorBuffs[6].Apply(v46, v45, 0, 0, 0); if ( bShowDamage ) { v50 = (int)pMonster; pMonsterName = player->pName; // "%s paralyzes %s" sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[636], player->pName, pMonster); ShowStatusBarString(pTmpBuf, 2u); } } } } if ( v59 > 10 ) v59 = 10; if ( !MonsterStats::BelongsToSupertype(pMonster->pMonsterInfo.uID, MONSTER_SUPERTYPE_TREANT) ) { pVelocity->x = (unsigned __int64)(v59 * (signed __int64)pVelocity->x) >> 16; pVelocity->y = (unsigned __int64)(v59 * (signed __int64)pVelocity->y) >> 16; pVelocity->z = (unsigned __int64)(v59 * (signed __int64)pVelocity->z) >> 16; pMonster->vVelocity.x = 50 * LOWORD(pVelocity->x); pMonster->vVelocity.y = 50 * LOWORD(pVelocity->y); pMonster->vVelocity.z = 50 * LOWORD(pVelocity->z); } Actor::AddBloodsplatOnDamageOverlay(uActorID_Monster_, 1, v61); } // 4D864C: using guessed type char byte_4D864C; //----- (00439FCB) -------------------------------------------------------- void __fastcall DamagePlayerFromMonster(unsigned int uObjID, int a2, Vec3_int_ *pPos, unsigned int a4) { signed int v4; // esi@1 unsigned int v5; // ecx@1 Player *v6; // ebx@3 Actor *v7; // esi@3 unsigned int v8; // eax@4 char *v9; // eax@5 signed int v10; // eax@6 int v11; // edx@8 int v12; // edx@9 int v13; // edx@10 int v14; // edx@16 int v15; // edx@17 int v16; // edx@18 enum SoundID v17; // eax@24 int v18; // eax@26 unsigned __int8 v19; // zf@26 unsigned __int8 v20; // sf@26 unsigned __int16 v21; // ax@29 signed int v22; // edi@36 int v23; // eax@38 signed int v24; // eax@44 unsigned __int16 v25; // cx@47 signed int v26; // eax@49 int v27; // eax@54 float v28; // ST18_4@58 double v29; // st7@58 float v30; // ST08_4@58 double v31; // st7@58 float v32; // ST04_4@58 float v33; // ST00_4@58 int v34; // edi@61 int v35; // eax@70 double v36; // st7@70 SpriteObject *v37; // ebx@77 int v38; // edi@77 int v39; // esi@77 int v40; // eax@77 int v41; // eax@77 int v42; // eax@78 Player *v43; // eax@81 Actor *v44; // esi@82 Player *v45; // edi@84 unsigned __int16 v46; // ax@84 int v47; // ebx@105 int v48; // eax@107 unsigned __int16 v49; // ax@116 int v50; // ebx@123 unsigned __int16 v51; // ax@124 char v52; // bl@124 int v53; // eax@128 signed int v54; // eax@134 unsigned __int16 v55; // cx@137 signed int v56; // eax@139 int v57; // eax@144 float v58; // ST18_4@148 double v59; // st7@148 float v60; // ST08_4@148 double v61; // st7@148 float v62; // ST04_4@148 float v63; // ST00_4@148 int v64; // ebx@151 int v65; // eax@161 double v66; // st7@161 signed int v67; // ecx@164 signed int v68; // eax@170 int v69; // ecx@170 int v70; // eax@171 enum SoundID v71; // [sp+20h] [bp-34h]@12 int v72; // [sp+30h] [bp-24h]@164 double v73; // [sp+40h] [bp-14h]@72 signed int v74; // [sp+44h] [bp-10h]@1 unsigned int v75; // [sp+48h] [bp-Ch]@3 unsigned int uActorID; // [sp+4Ch] [bp-8h]@1 int v77; // [sp+50h] [bp-4h]@26 signed int a4a; // [sp+60h] [bp+Ch]@162 Player *a4b; // [sp+60h] [bp+Ch]@168 v4 = (signed int)uObjID >> 3; v5 = (uObjID & 7) - 2; v74 = a2; uActorID = v4; if ( v5 ) { if ( v5 != 1 || (v6 = &pParty->pPlayers[a4], v7 = &pActors[v4], v75 = v6->sHealth, !stru_50C198.ActorHitOrMiss(v7, v6)) ) return; v8 = v6->pEquipment.uBody; if ( !v8 || (v9 = (char *)v6 + 36 * v8, v9[516] & 2) || (v10 = pItemsTable->pItems[*((int *)v9 + 124)].uSkillType, v10 < 10) || v10 > 11 ) { v14 = rand() % 4; if ( !v14 ) { v71 = (SoundID)108; goto LABEL_24; } v15 = v14 - 1; if ( !v15 ) { v71 = (SoundID)109; goto LABEL_24; } v16 = v15 - 1; if ( !v16 ) { v71 = (SoundID)110; goto LABEL_24; } if ( v16 == 1 ) { v71 = (SoundID)44; goto LABEL_24; } } else { v11 = rand() % 4; if ( !v11 ) { v71 = (SoundID)105; goto LABEL_24; } v12 = v11 - 1; if ( !v12 ) { v71 = (SoundID)106; goto LABEL_24; } v13 = v12 - 1; if ( !v13 ) { v71 = (SoundID)107; goto LABEL_24; } if ( v13 == 1 ) { v71 = (SoundID)45; LABEL_24: v17 = v71; goto LABEL_26; } } v17 = (SoundID)a4; LABEL_26: pAudioPlayer->PlaySound(v17, (8 * a4 + 80) | 4, 0, -1, 0, 0, 0, 0); v18 = Actor::_43B3E0_CalcDamage(v7, v74); v19 = HIDWORD(v7->pActorBuffs[3].uExpireTime) == 0; v20 = SHIDWORD(v7->pActorBuffs[3].uExpireTime) < 0; v77 = v18; if ( !v20 && (!(v20 | v19) || LODWORD(v7->pActorBuffs[3].uExpireTime) > 0) ) { v21 = v7->pActorBuffs[3].uPower; if ( v21 ) v77 /= (signed int)v21; } if ( v74 ) { if ( v74 == 1 ) { v22 = v7->pMonsterInfo.uAttack2Type; } else { if ( v74 == 2 ) { v23 = v7->pMonsterInfo.uSpell1ID; } else { if ( v74 != 3 ) { if ( v74 == 4 ) v22 = v7->pMonsterInfo.field_3C_some_special_attack; else v22 = 4; goto LABEL_43; } v23 = v7->pMonsterInfo.uSpell2ID; } v22 = LOBYTE(pSpellStats->pInfos[v23].uSchool); } } else { v22 = v7->pMonsterInfo.uAttack1Type; } LABEL_43: if ( !(dword_6BE368_debug_settings_2 & 0x10) ) { v24 = v6->ReceiveDamage(v77, v22); if ( SHIDWORD(v6->pPlayerBuffs[10].uExpireTime) >= 0 && (SHIDWORD(v6->pPlayerBuffs[10].uExpireTime) > 0 || LODWORD(v6->pPlayerBuffs[10].uExpireTime)) ) { v25 = v7->uAIState; if ( v25 != 5 ) { if ( v25 != 4 ) { v26 = stru_50C198.CalcMagicalDamageToActor(v7, v22, v24); v7->sCurrentHP -= v26; if ( v26 ) { if ( v7->sCurrentHP >= 1 ) { Actor::_4030AD(uActorID, 8 * a4 | OBJECT_Player, 0); Actor::AggroSurroundingPeasants(uActorID, 1); } else { if ( pMonsterStats->pInfos[v7->pMonsterInfo.uID].bQuestMonster & 1 ) { v27 = byte_4D864C && BYTE2(pGame->uFlags) & 8 ? 10 * v7->uActorRadius : v7->uActorRadius; v74 = v27; if ( pRenderer->pRenderD3D ) { if ( pGame->uFlags2 & GAME_FLAGS_2_DRAW_BLOODSPLATS ) { v28 = (double)v74; v74 = v7->vPosition.z; v29 = (double)v74; v74 = v7->vPosition.y; v30 = v29; v31 = (double)v74; v74 = v7->vPosition.x; v32 = v31; v33 = (double)v74; pDecalBuilder->AddBloodsplat(v33, v32, v30, 1.0, 0.0, 0.0, v28, 0, 0); } } } Actor::Die(uActorID); Actor::ApplyFineForKillingPeasant(uActorID); Actor::AggroSurroundingPeasants(uActorID, 1); if ( v7->pMonsterInfo.uExp ) sub_4269A2_GivePartyExp(pMonsterStats->pInfos[v7->pMonsterInfo.uID].uExp); v34 = SPEECH_51; if ( rand() % 100 < 20 ) v34 = ((signed int)v7->pMonsterInfo.uHP >= 100) + 1; v6->PlaySound((PlayerSpeech)v34, 0); } } } } } if ( !(dword_6BE368_debug_settings_2 & 0x10) && v7->pMonsterInfo.uSpecialAttack && rand() % 100 < v7->pMonsterInfo.uLevel * v7->pMonsterInfo.uSpecialAttackType ) v6->_48DCF6(v7->pMonsterInfo.uSpecialAttack, v7); } if ( !pParty->bTurnBasedModeOn ) { v35 = v6->GetActualEndurance(); v36 = (double)(20 - v6->_48EA1B_get_static_effect(v35)) * flt_6BE3A4_debug_recmod1 * 2.133333333333333; v6->SetRecoveryTime((signed __int64)v36); } if ( v77 ) { v73 = (double)(signed int)v75; if ( (double)v6->GetMaxHealth() * 0.25 < v73 ) { if ( v6->sHealth > 0 ) { if ( (double)v6->GetMaxHealth() * 0.25 >= (double)v6->sHealth ) v6->PlaySound(SPEECH_48, 0); } } } viewparams->bRedrawGameUI = 1; return; } v37 = &pSpriteObjects[uActorID]; v38 = v37->field_58_pid & 7; v39 = v37->field_58_pid >> 3; v40 = v37->field_58_pid & 7; uActorID = v37->field_58_pid >> 3; v41 = v40 - 2; if ( !v41 ) goto LABEL_80; v42 = v41 - 1; if ( !v42 ) { v44 = &pActors[v39]; if ( a4 == -1 ) a4 = stru_50C198.which_player_would_attack(v44); v45 = &pParty->pPlayers[a4]; v77 = Actor::_43B3E0_CalcDamage(v44, v74); v46 = v37->uType; if ( v37->uType == 545 ) { LOBYTE(v51) = v45->GetActualSkillLevel(PLAYER_SKILL_UNARMED); v52 = v51; if ( (signed int)SkillToMastery(v51) >= 4 && rand() % 100 < (v52 & 0x3F) ) { sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[637], v45->pName); ShowStatusBarString(pTmpBuf, 2u); v45->PlaySound(SPEECH_6, 0); return; } } else { if ( v46 != 555 && v46 != 510 && v46 != 500 && v46 != 515 && v46 != 505 && v46 != 530 && v46 != 525 && v46 != 520 && v46 != 535 && v46 != 540 ) goto LABEL_115; } if ( !stru_50C198.ActorHitOrMiss(v44, v45) ) return; if ( (signed __int64)v45->pPlayerBuffs[13].uExpireTime > 0 ) v77 >>= 1; if ( v45->HasEnchantedItemEquipped(36) ) v77 >>= 1; if ( v45->HasEnchantedItemEquipped(69) ) v77 >>= 1; if ( v45->HasItemEquipped(EQUIP_ARMOUR) && *(_DWORD *)&v45->pInventoryItems[v45->pEquipment.uBody-1] == 504 ) v77 >>= 1; v75 = 0; v47 = (int)&v45->pEquipment; do { if ( v45->HasItemEquipped((ITEM_EQUIP_TYPE)v75) ) { v48 = *(int *)&v45[36 * *(int *)v47 + 496]; if ( v48 == 520 ) v77 >>= 1; if ( v48 == 531 ) v77 >>= 1; if ( v45->GetEquippedItemEquipType(v75) == 4 && SkillToMastery(v45->pActiveSkills[8]) == 4 ) v77 >>= 1; } ++v75; v47 += 4; } while ( (signed int)v75 <= 1 ); LABEL_115: if ( (signed __int64)v44->pActorBuffs[3].uExpireTime > 0 ) { v49 = v44->pActorBuffs[3].uPower; if ( v49 ) v77 /= (signed int)v49; } if ( !v74 ) { v50 = v44->pMonsterInfo.uAttack1Type; goto LABEL_133; } if ( v74 == 1 ) { v50 = v44->pMonsterInfo.uAttack2Type; goto LABEL_133; } if ( v74 == 2 ) { v53 = v44->pMonsterInfo.uSpell1ID; } else { if ( v74 != 3 ) { if ( v74 == 4 ) v50 = v44->pMonsterInfo.field_3C_some_special_attack; else v50 = 4; LABEL_133: if ( !(dword_6BE368_debug_settings_2 & 0x10) ) { v54 = v45->ReceiveDamage(v77, v50); if ( SHIDWORD(v45->pPlayerBuffs[10].uExpireTime) >= 0 ) { if ( SHIDWORD(v45->pPlayerBuffs[10].uExpireTime) > 0 || LODWORD(v45->pPlayerBuffs[10].uExpireTime) ) { v55 = v44->uAIState; if ( v55 != 5 ) { if ( v55 != 4 ) { v56 = stru_50C198.CalcMagicalDamageToActor(v44, v50, v54); v44->sCurrentHP -= v56; if ( v56 ) { if ( v44->sCurrentHP >= 1 ) { Actor::_4030AD(uActorID, 8 * a4 | OBJECT_Player, 0); Actor::AggroSurroundingPeasants(uActorID, 1); } else { if ( pMonsterStats->pInfos[v44->pMonsterInfo.uID].bQuestMonster & 1 ) { v57 = byte_4D864C && BYTE2(pGame->uFlags) & 8 ? 10 * v44->uActorRadius : v44->uActorRadius; v75 = v57; if ( pRenderer->pRenderD3D ) { if ( pGame->uFlags2 & GAME_FLAGS_2_DRAW_BLOODSPLATS ) { v58 = (double)(signed int)v75; v75 = v44->vPosition.z; v59 = (double)(signed int)v75; v75 = v44->vPosition.y; v60 = v59; v61 = (double)(signed int)v75; v75 = v44->vPosition.x; v62 = v61; v63 = (double)(signed int)v75; pDecalBuilder->AddBloodsplat(v63, v62, v60, 1.0, 0.0, 0.0, v58, 0, 0); } } } Actor::Die(uActorID); Actor::ApplyFineForKillingPeasant(uActorID); Actor::AggroSurroundingPeasants(uActorID, 1); if ( v44->pMonsterInfo.uExp ) sub_4269A2_GivePartyExp(pMonsterStats->pInfos[v44->pMonsterInfo.uID].uExp); v64 = SPEECH_51; if ( rand() % 100 < 20 ) v64 = ((signed int)v44->pMonsterInfo.uHP >= 100) + 1; v45->PlaySound((PlayerSpeech)v64, 0); } } } } } } } if ( !v74 && !(dword_6BE368_debug_settings_2 & 0x10) && v44->pMonsterInfo.uSpecialAttack && rand() % 100 < v44->pMonsterInfo.uLevel * v44->pMonsterInfo.uSpecialAttackType ) v45->_48DCF6(v44->pMonsterInfo.uSpecialAttack, v44); if ( !pParty->bTurnBasedModeOn ) { v65 = v45->GetActualEndurance(); v66 = (double)(20 - v45->_48EA1B_get_static_effect(v65)) * flt_6BE3A4_debug_recmod1 * 2.133333333333333; v45->SetRecoveryTime((signed __int64)v66); } return; } v53 = v44->pMonsterInfo.uSpell2ID; } v50 = LOBYTE(pSpellStats->pInfos[v53].uSchool); goto LABEL_133; } if ( v42 != 1 ) return; LABEL_80: if ( a4 != -1 ) { v43 = &pParty->pPlayers[a4]; LABEL_168: a4b = v43; if ( v38 != OBJECT_Player || v37->field_48 != 100 ) { v70 = v43->GetMaxHealth(); v68 = _43AFE3_calc_spell_damage(v37->field_48, v37->field_4C, v37->field_50, v70); v69 = LOBYTE(pSpellStats->pInfos[v37->field_48].uSchool); } else { v68 = pParty->pPlayers[uActorID].CalculateRangedDamageTo(0); v69 = 0; } a4b->ReceiveDamage(v68, v69); if ( v38 == OBJECT_Player && !qword_A750D8 ) { qword_A750D8 = 256i64; word_A750E0 = 44; word_A750E2 = uActorID + 1; } return; } v74 = 0; a4a = 1; do { if ( pPlayers[a4a]->CanAct() ) { v67 = v74++; *(&v72 + v67) = a4a; } ++a4a; } while ( a4a <= 4 ); if ( v74 ) { v43 = &pParty->pPlayers[*(&v72+rand()%v74)-1];//&stru_AA1058[3].pSounds[6972 * *(&v72 + rand() % v74) + 40552]; goto LABEL_168; } } //----- (0043A97E) -------------------------------------------------------- void __fastcall sub_43A97E(unsigned int uLayingItemID, signed int a2) { unsigned int v2; // esi@1 unsigned int v3; // ebx@1 int v4; // edi@1 int v5; // edx@1 unsigned int v6; // [sp+10h] [bp-4h]@1 v6 = uLayingItemID; v2 = uLayingItemID; v3 = a2 >> 3; v4 = pSpriteObjects[uLayingItemID].field_58_pid & 7; v5 = (a2 & 7) - 3; if ( v5 ) { if ( v5 == 1 ) { layingitem_vel_50FDFC.x = pSpriteObjects[v2].vVelocity.x; layingitem_vel_50FDFC.y = pSpriteObjects[v2].vVelocity.y; layingitem_vel_50FDFC.z = pSpriteObjects[v2].vVelocity.z; Vec3_int_::Normalize(&layingitem_vel_50FDFC.x, &layingitem_vel_50FDFC.y, &layingitem_vel_50FDFC.z); DamagePlayerFromMonster(8 * v6 | 2, pSpriteObjects[v2].field_61, &layingitem_vel_50FDFC, 0xFFFFFFFFu); } } else { layingitem_vel_50FDFC.x = pSpriteObjects[v2].vVelocity.x; layingitem_vel_50FDFC.y = pSpriteObjects[v2].vVelocity.y; layingitem_vel_50FDFC.z = pSpriteObjects[v2].vVelocity.z; Vec3_int_::Normalize(&layingitem_vel_50FDFC.x, &layingitem_vel_50FDFC.y, &layingitem_vel_50FDFC.z); switch ( v4 ) { case OBJECT_Actor: sub_43B1B0(8 * v6 | AI_OBJECT_LAYING_ITEM, v3, &layingitem_vel_50FDFC, pSpriteObjects[v2].field_61); break; case OBJECT_Player: DamageMonsterFromParty(8 * v6 | AI_OBJECT_LAYING_ITEM, v3, &layingitem_vel_50FDFC); break; case OBJECT_Item: sub_43B057(8 * v6 | AI_OBJECT_LAYING_ITEM, v3, &layingitem_vel_50FDFC); break; } } } //----- (0043AA99) -------------------------------------------------------- void __fastcall Vec3_int_::Rotate(int sDepth, int sRotY, int sRotX, Vec3_int_ v, int *outx, int *outy, int *outz) { /* int v7; // ebx@1 int v8; // ST14_4@1 int v9; // edi@1 int anglea; // [sp+20h] [bp+8h]@1 v7 = sRotX; v8 = sDepth; v9 = sRotY; anglea = (unsigned __int64)(stru_5C6E00->SinCos(sRotX) * (signed __int64)sDepth) >> 16; *outx = v.x + ((unsigned __int64)(stru_5C6E00->SinCos(v9) * (signed __int64)anglea) >> 16); *outy = v.y + ((unsigned __int64)(stru_5C6E00->SinCos(v9 - stru_5C6E00->uIntegerHalfPi) * (signed __int64)anglea) >> 16); *outz = v.z + ((unsigned __int64)(stru_5C6E00->SinCos(v7 - stru_5C6E00->uIntegerHalfPi) * (signed __int64)v8) >> 16);*/ float cosf_x = cosf(3.14159265f * sRotX / 1024.0f), cosf_y = cosf(3.14159265f * sRotY / 1024.0f), sinf_x = sinf(3.14159265f * sRotX / 1024.0f), sinf_y = sinf(3.14159265f * sRotY / 1024.0f); *outx = v.x + ((unsigned __int64)((double)sDepth * cosf_y * cosf_x) >> 16); *outy = v.y + ((unsigned __int64)((double)sDepth * sinf_y * cosf_x) >> 16); *outz = v.z + ((unsigned __int64)((double)sDepth * sinf_x) >> 16); } //----- (0043AB61) -------------------------------------------------------- void Vec3_int_::Normalize(int *x, int *y, int *z) { int *v3; // edi@1 int *v4; // esi@1 signed int v5; // eax@1 v3 = x; v4 = y; v5 = integer_sqrt(*y * *y + *z * *z + *x * *x); *v3 *= 65536 / (v5 | 1); *v4 *= 65536 / (v5 | 1); *z *= 65536 / (v5 | 1); } //----- (0043AE12) -------------------------------------------------------- double __fastcall sub_43AE12(signed int a1) { signed int v1; // ST00_4@1 signed int v2; // ecx@1 double v3; // st7@1 double result; // st7@6 v1 = a1; v2 = 0; v3 = (double)v1; do { if ( v3 < flt_4E4A80[v2 + 5] ) break; ++v2; } while ( v2 < 5 ); if ( v2 <= 0 || v2 >= 5 ) { if ( v2 ) result = flt_4E4A80[4]; else result = flt_4E4A80[0]; } else { result = (flt_4E4A80[v2] - *(float *)&aAuthenticamd[4 * v2 + 12]) * (v3 - flt_4E4A80[v2 + 4]) / (flt_4E4A80[v2 + 5] - flt_4E4A80[v2 + 4]) + flt_4E4A80[v2]; } return result; } //----- (0043AFE3) -------------------------------------------------------- int __fastcall _43AFE3_calc_spell_damage(int a1, int a2, signed int a3, int a4) { int result; // eax@1 unsigned int v5; // [sp-4h] [bp-8h]@9 result = 0; if ( a1 == 7 ) { if ( a3 <= 0 ) return result; if ( a3 <= 2 ) { v5 = 6; } else { if ( a3 == 3 ) { v5 = 8; } else { if ( a3 != 4 ) return result; v5 = 10; } } result = GetDiceResult(a2, v5); } else { if ( a1 == 44 ) result = a4 * (LOBYTE(pSpellDatas[40].field_10) + 2 * a2) / 100; else result = *((char *)&pSpellDatas[0].field_10 + 20 * a1) + GetDiceResult(a2, *((char *)&pSpellDatas[0].field_10 + 20 * a1 + 1)); } return result; } //----- (0043B057) -------------------------------------------------------- void __fastcall sub_43B057(unsigned int uObjID, unsigned int uActorID, Vec3_int_ *pVelocity) { Actor *pActor; // esi@1 SpriteObject *v4; // eax@3 int v5; // ecx@3 int v6; // eax@4 int v7; // edi@4 unsigned int uActorIDa; // [sp+8h] [bp-8h]@1 unsigned int a2; // [sp+Ch] [bp-4h]@1 int a2a; // [sp+Ch] [bp-4h]@8 uActorIDa = uActorID; pActor = &pActors[uActorID]; a2 = uObjID; if ( !pActors[uActorID].IsNotAlive() ) { if ( (a2 & 7) == OBJECT_Item) { v4 = &pSpriteObjects[(signed int)a2 >> 3]; v5 = v4->field_48; if ( v5 ) { v6 = _43AFE3_calc_spell_damage(v5, v4->field_4C, v4->field_50, pActor->sCurrentHP); v7 = stru_50C198.CalcMagicalDamageToActor(pActor, 0, v6); pActor->sCurrentHP -= v7; if ( v7 ) { if ( pActor->sCurrentHP > 0 ) Actor::_4030AD(uActorIDa, a2, 0); else Actor::Die(uActorIDa); a2a = 20 * v7 / (signed int)pActor->pMonsterInfo.uHP; if ( 20 * v7 / (signed int)pActor->pMonsterInfo.uHP > 10 ) a2a = 10; if ( !MonsterStats::BelongsToSupertype(pActor->pMonsterInfo.uID, MONSTER_SUPERTYPE_TREANT) ) { pVelocity->x = (unsigned __int64)(a2a * (signed __int64)pVelocity->x) >> 16; pVelocity->y = (unsigned __int64)(a2a * (signed __int64)pVelocity->y) >> 16; pVelocity->z = (unsigned __int64)(a2a * (signed __int64)pVelocity->z) >> 16; pActor->vVelocity.x = 50 * LOWORD(pVelocity->x); pActor->vVelocity.y = 50 * LOWORD(pVelocity->y); pActor->vVelocity.z = 50 * LOWORD(pVelocity->z); } Actor::AddBloodsplatOnDamageOverlay(uActorIDa, 1, v7); } else { Actor::_4030AD(uActorIDa, a2, 0); } } } } } //----- (0043B1B0) -------------------------------------------------------- void sub_43B1B0(signed int a1, unsigned int a2, Vec3_int_ *pVelocity, signed int a4) { int v4; // ebx@1 SpriteObject *v5; // eax@2 bool v6; // eax@3 Actor *v7; // esi@4 Actor *v8; // edi@4 char v9; // zf@5 __int64 v10; // qax@8 signed __int16 v11; // cx@9 signed int v12; // ecx@20 int v13; // ecx@22 int v14; // edi@30 unsigned int uActorID; // [sp+Ch] [bp-8h]@1 signed int v17; // [sp+10h] [bp-4h]@1 int v18; // [sp+20h] [bp+Ch]@34 v4 = 0; uActorID = a2; v17 = a1; if ( (a1 & 7) == OBJECT_Item) { v5 = &pSpriteObjects[a1 >> 3]; v4 = v5->field_60_distance_related_prolly_lod; v17 = v5->field_58_pid; } LOWORD(v6) = v17 & 7; if ( v6 == OBJECT_Actor) { v7 = &pActors[a2]; v8 = &pActors[v17 >> 3]; v6 = pActors[a2].IsNotAlive(); if ( !v6 ) { v9 = v7->uAIState == 7; v7->uLastCharacterIDToHit = v17; if ( v9 ) BYTE2(v7->uAttributes) |= 2u; v6 = stru_50C198._4273BB(v8, v7, v4, 0); if ( v6 ) { v10 = (unsigned int)Actor::_43B3E0_CalcDamage(v8, a4); if ( (signed __int64)v8->pActorBuffs[3].uExpireTime > 0 ) { v11 = v8->pActorBuffs[3].uPower; if ( v11 ) v10 = (signed int)v10 / (unsigned __int16)v11; } if ( SHIDWORD(v7->pActorBuffs[5].uExpireTime) >= SHIDWORD(v10) && (SHIDWORD(v7->pActorBuffs[5].uExpireTime) > SHIDWORD(v10) || LODWORD(v7->pActorBuffs[5].uExpireTime) > HIDWORD(v10)) ) LODWORD(v10) = 0; if ( a4 != HIDWORD(v10) ) { if ( a4 - HIDWORD(v10) == 1 ) { v12 = v8->pMonsterInfo.uAttack2Type; if ( SHIDWORD(v7->pActorBuffs[15].uExpireTime) >= SHIDWORD(v10) && (SHIDWORD(v7->pActorBuffs[15].uExpireTime) > SHIDWORD(v10) || LODWORD(v7->pActorBuffs[15].uExpireTime) > HIDWORD(v10)) ) LODWORD(v10) = (signed int)v10 >> 1; goto LABEL_30; } if ( a4 - HIDWORD(v10) == 2 ) { v13 = v7->pMonsterInfo.uSpell1ID; } else { if ( a4 - HIDWORD(v10) != 3 ) { if ( a4 - HIDWORD(v10) == 4 ) v12 = v8->pMonsterInfo.field_3C_some_special_attack; else v12 = 4; LABEL_30: v14 = stru_50C198.CalcMagicalDamageToActor(v7, v12, v10); v7->sCurrentHP -= v14; if ( v14 ) { if ( v7->sCurrentHP > 0 ) Actor::_4030AD(uActorID, v17, 0); else Actor::Die(uActorID); Actor::AggroSurroundingPeasants(uActorID, 0); v18 = 20 * v14 / (signed int)v7->pMonsterInfo.uHP; if ( 20 * v14 / (signed int)v7->pMonsterInfo.uHP > 10 ) v18 = 10; if ( !MonsterStats::BelongsToSupertype(v7->pMonsterInfo.uID, MONSTER_SUPERTYPE_TREANT) ) { pVelocity->x = (unsigned __int64)(v18 * (signed __int64)pVelocity->x) >> 16; pVelocity->y = (unsigned __int64)(v18 * (signed __int64)pVelocity->y) >> 16; pVelocity->z = (unsigned __int64)(v18 * (signed __int64)pVelocity->z) >> 16; v7->vVelocity.x = 50 * LOWORD(pVelocity->x); v7->vVelocity.y = 50 * LOWORD(pVelocity->y); v7->vVelocity.z = 50 * LOWORD(pVelocity->z); } Actor::AddBloodsplatOnDamageOverlay(uActorID, 1, v14); } else { Actor::_4030AD(uActorID, v17, 0); } return; } v13 = v7->pMonsterInfo.uSpell2ID; } v12 = LOBYTE(pSpellStats->pInfos[v13].uSchool); goto LABEL_30; } v12 = v8->pMonsterInfo.uAttack1Type; goto LABEL_30; } } } } //----- (0043BCA7) -------------------------------------------------------- void CharacterUI_LoadPaperdollTextures() { int v0; // edi@7 enum CHARACTER_RACE pRace; // ebx@7 signed int pSex; // eax@7 int v3; // ebx@10 Player *pPlayer; // edi@12 unsigned __int8 v5; // cl@12 int v6; // edi@16 unsigned int v7; // eax@16 Player *pPlayer2; // ebx@16 char *v9; // ebx@16 char v10; // al@16 signed int v11; // edi@21 Player *pPlayer3; // ebx@23 //Player *pPlayer4; // edi@29 //int v14; // ebp@29 //stru331 *v15; // edi@65 //signed int v16; // ebx@66 //unsigned int v17; // eax@67 //unsigned int *v18; // ecx@67 //unsigned int *v19; // ebx@68 //int v20; // edi@73 int v21; // ebp@73 unsigned int v22; // eax@76 int v23; // ecx@76 unsigned int v24; // eax@78 int v25; // ecx@78 int v26; // ebx@79 unsigned int v27; // eax@80 int v28; // ecx@80 //int result; // eax@83 int v30; // [sp+10h] [bp-28h]@5 //signed int v31; // [sp+10h] [bp-28h]@68 signed int v32; // [sp+10h] [bp-28h]@75 signed int v33; // [sp+10h] [bp-28h]@77 int v34; // [sp+10h] [bp-28h]@79 //char *v35; // [sp+14h] [bp-24h]@65 int v36; // [sp+14h] [bp-24h]@75 int v37; // [sp+14h] [bp-24h]@77 signed int v38; // [sp+14h] [bp-24h]@79 //unsigned int *v39; // [sp+18h] [bp-20h]@66 int *v40; // [sp+18h] [bp-20h]@73 //unsigned int *v41; // [sp+1Ch] [bp-1Ch]@73 int v42; // [sp+20h] [bp-18h]@6 int v43; // [sp+20h] [bp-18h]@73 char pContainer[128]; // [sp+24h] [bp-14h]@12 uTextureID_MAGNIF_B = pIcons_LOD->LoadTexture("MAGNIF-B", TEXTURE_16BIT_PALETTE); //if ( !pParty->uAlignment || pParty->uAlignment == 1 || pParty->uAlignment == 2 ) uTextureID_BACKDOLL = pIcons_LOD->LoadTexture("BACKDOLL", TEXTURE_16BIT_PALETTE); uTextureID_507B04 = uTextureID_right_panel; v30 = 0; uTextureID_BACKHAND = pIcons_LOD->LoadTexture("BACKHAND", TEXTURE_16BIT_PALETTE); uTextureID_5118C8 = uExitCancelTextureId; do { v42 = v30 + 1; if ( sub_43EE77_ProbablyIfUnderwaterSuitIsEquipped(v30 + 1) ) { v0 = v30; pRace = pPlayers[v30 + 1]->GetRace(); pSex = pPlayers[v30 + 1]->GetSexByVoice(); if ( pRace && pRace != 1 && pRace != 2 )//race == 3 v3 = (pSex != 0) + 3; else v3 = (pSex != 0) + 1; wsprintfA(pContainer, "pc23v%dBod", v3); papredoll_dbods[v0] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);//Body texture wsprintfA(pContainer, "pc23v%dlad", v3); papredoll_dlads[v0] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);// Left Hand wsprintfA(pContainer, "pc23v%dlau", v3); papredoll_dlaus[v0] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);// Left Hand2 wsprintfA(pContainer, "pc23v%drh", v3); papredoll_drhs[v0] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);// Right Hand wsprintfA(pContainer, "pc23v%dlh", v3); papredoll_dlhs[v0] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);// Left Fist wsprintfA(pContainer, "pc23v%dlhu", v3); papredoll_dlhus[v0] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); // Left Fist 2 pPlayer = pPlayers[v0 + 1]; v5 = pPlayer->uFace; if ( v5 == 12 || v5 == 13 ) papredoll_dbrds[(char)v5] = 0; papredoll_flying_feet[pPlayer->uFace] = 0; IsPlayerWearingWatersuit[v30 + 1] = 1; } else { v6 = v30; papredoll_dbods[v30] = pIcons_LOD->LoadTexture(dbod_texnames_by_face[pPlayers[v30 + 1]->uFace], TEXTURE_16BIT_PALETTE); papredoll_dlads[v30] = pIcons_LOD->LoadTexture(dlad_texnames_by_face[pPlayers[v30 + 1]->uFace], TEXTURE_16BIT_PALETTE); papredoll_dlaus[v30] = pIcons_LOD->LoadTexture(dlau_texnames_by_face[pPlayers[v30 + 1]->uFace], TEXTURE_16BIT_PALETTE); papredoll_drhs[v30] = pIcons_LOD->LoadTexture(drh_texnames_by_face[pPlayers[v30 + 1]->uFace], TEXTURE_16BIT_PALETTE); papredoll_dlhs[v30] = pIcons_LOD->LoadTexture(dlh_texnames_by_face[pPlayers[v30 + 1]->uFace], TEXTURE_16BIT_PALETTE); v7 = pIcons_LOD->LoadTexture(dlhu_texnames_by_face[pPlayers[v30 + 1]->uFace], TEXTURE_16BIT_PALETTE); pPlayer2 = pPlayers[v30 + 1]; papredoll_dlhus[v30] = v7; v9 = (char *)&pPlayer2->uFace; v10 = *v9; if ( *v9 == 12 || v10 == 13 ) { wsprintfA(pContainer, "pc%02dbrd", v10 + 1); v9 = (char *)&pPlayers[v6 + 1]->uFace; papredoll_dbrds[*v9] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); } wsprintfA(pContainer, "item281pc%02d", *v9 + 1); papredoll_flying_feet[pPlayers[v6 + 1]->uFace] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); IsPlayerWearingWatersuit[v30 + 1] = 0; } ++v30; } while ( v42 < 4 ); uTextureID_ar_up_up = pIcons_LOD->LoadTexture("ar_up_up", TEXTURE_16BIT_PALETTE); uTextureID_ar_up_dn = pIcons_LOD->LoadTexture("ar_up_dn", TEXTURE_16BIT_PALETTE); uTextureID_ar_dn_up = pIcons_LOD->LoadTexture("ar_dn_up", TEXTURE_16BIT_PALETTE); uTextureID_ar_dn_dn = pIcons_LOD->LoadTexture("ar_dn_dn", TEXTURE_16BIT_PALETTE); papredoll_dbrds[9] = pIcons_LOD->LoadTexture("ib-cd1-d", TEXTURE_16BIT_PALETTE); papredoll_dbrds[7] = pIcons_LOD->LoadTexture("ib-cd2-d", TEXTURE_16BIT_PALETTE); papredoll_dbrds[5] = pIcons_LOD->LoadTexture("ib-cd3-d", TEXTURE_16BIT_PALETTE); papredoll_dbrds[3] = pIcons_LOD->LoadTexture("ib-cd4-d", TEXTURE_16BIT_PALETTE); papredoll_dbrds[1] = pIcons_LOD->LoadTexture("ib-cd5-d", TEXTURE_16BIT_PALETTE); v11 = 0; do { byte_5111C0[v11] = 0; if ( pParty->pPickedItem.uItemID != v11 + 66 ) { pPlayer3 = pParty->pPlayers; while ( !sub_43EE15_player_has_item(v11 + 66, pPlayer3, 0) ) { ++pPlayer3; if ( (signed int)pPlayer3 >= (signed int)pParty->pHirelings ) goto LABEL_28; } } byte_5111C0[v11] = 1; LABEL_28: ++v11; } while ( v11 < 54 ); memset(byte_5111F6, 0, 16); for (uint i = 0; i < 4; ++i) { auto player = pParty->pPlayers + i; if (sub_43EE15_player_has_item(ITEM_ARTICACT_GOVERNONS_ARMOR, player, 1)) byte_5111F6[0] = 1; if (sub_43EE15_player_has_item(ITEM_ARTIFACT_YORUBA, player, 1)) byte_5111F6[1] = 1; if (sub_43EE15_player_has_item(ITEM_RELIC_HARECS_LEATHER, player, 1)) byte_5111F6[2] = 1; if (sub_43EE15_player_has_item(ITEM_ARTIFACT_LEAGUE_BOOTS, player, 1)) byte_5111F6[3] = 1; if (sub_43EE15_player_has_item(ITEM_RELIC_TALEDONS_HELM, player, 1)) byte_5111F6[4] = 1; if (sub_43EE15_player_has_item(ITEM_RELIC_SCHOLARS_CAP, player, 1)) byte_5111F6[5] = 1; if (sub_43EE15_player_has_item(ITEM_RELIC_PHYNAXIAN_CROWN, player, 1)) byte_5111F6[6] = 1; if (sub_43EE15_player_has_item(ITEM_ARTIFACT_MINDS_EYE, player, 1)) byte_5111F6[7] = 1; if (sub_43EE15_player_has_item(ITEM_RARE_SHADOWS_MASK, player, 1)) byte_5111F6[8] = 1; if (sub_43EE15_player_has_item(ITEM_RILIC_TITANS_BELT, player, 1)) byte_5111F6[9] = 1; if (sub_43EE15_player_has_item(ITEM_ARTIFAT_HEROS_BELT, player, 1)) byte_5111F6[10] = 1; if (sub_43EE15_player_has_item(ITEM_RELIC_TWILIGHT, player, 1)) byte_5111F6[11] = 1; if (sub_43EE15_player_has_item(ITEM_ARTIFACT_CLOAK_OF_THE_SHEEP, player, 1)) byte_5111F6[12] = 1; if (sub_43EE15_player_has_item(ITEM_RARE_SUN_CLOAK, player, 1)) byte_5111F6[13] = 1; if (sub_43EE15_player_has_item(ITEM_RARE_MOON_CLOAK, player, 1)) byte_5111F6[14] = 1; if (sub_43EE15_player_has_item(ITEM_RARE_VAMPIRES_CAPE, player, 1)) byte_5111F6[15] = 1; if (sub_43EE15_player_has_item(ITEM_ELVEN_CHAINMAIL, player, 1)) byte_5111F6[16] = 1; } //v14 = 1; //v15 = &stru_511698.field_2C; //v35 = (char *)&stru_511718.field_18; for (uint i = 0; i < 2; ++i) { //v16 = 0; //v39 = (unsigned int *)(v35 - 24); for (uint j = 0; j < 5; ++j) { _43C91D_FormItemTextureFilename(pContainer, j + 100, i + 1, 0); //v17 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); //++v16; //v18 = v39; //++v39; //*v18 = v17; stru_511718[i].texids[j] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); } //while ( v16 < 5 ); //*(int *)v35 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 535, i + 1, 0); stru_511718[i].texid2 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); //v31 = 0; //v19 = (unsigned int *)((char *)v15 - 44); for (uint j = 0; j < 11; ++j) { _43C91D_FormItemTextureFilename(pContainer, j + 89, i + 1, 0); //*v19 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); //++v19; stru_511698[i].texids[j] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); } //while ( v31 < 11 ); _43C91D_FormItemTextureFilename(pContainer, 521, i + 1, 0); stru_511698[i].texid1 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 522, i + 1, 0); stru_511698[i].texid2 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 523, i + 1, 0); stru_511698[i].texid3 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 532, i + 1, 0); stru_511698[i].texid4 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 544, i + 1, 0); stru_511698[i].texid5 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); if ( _43ED6F_check_party_races(true) ) papredoll_dbrds[11] = pIcons_LOD->LoadTexture("item092v3", TEXTURE_16BIT_PALETTE); //v35 += 28; //++v14; //++v15; } //while ( v14 - 1 < 2 ); v43 = 0; //v20 = 1; v40 = &dword_511638[0][5]; v21 = (int)paperdoll_array_511290[0][13]; //v41 = (unsigned int *)&stru_511718.texid1; for (uint i = 0; i < 4; ++i) { if ( sub_43EDB9_get_some_race_sex_relation_2(i) ) { _43C91D_FormItemTextureFilename(pContainer, 524, i + 1, 0); v32 = 66; stru_511718[i].texid1 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); v36 = v21 - 152; do { _43C91D_FormItemTextureFilename(pContainer, v32, i + 1, 0); *(int *)(v36 - 4) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, v32, i + 1, 1); *(int *)v36 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, v32, i + 1, 2); v22 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); v23 = v36; v36 += 12; ++v32; *(int *)(v23 + 4) = v22; } while ( v32 - 66 < 13 ); _43C91D_FormItemTextureFilename(pContainer, 516, i + 1, 0); *(int *)v21 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 516, i + 1, 1); *(int *)(v21 + 4) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 516, i + 1, 2); *(int *)(v21 + 8) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 505, i + 1, 0); *(int *)(v21 + 12) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 505, i + 1, 1); *(int *)(v21 + 16) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 505, i + 1, 2); *(int *)(v21 + 20) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 504, i + 1, 0); *(int *)(v21 + 24) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 504, i + 1, 1); *(int *)(v21 + 28) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 504, i + 1, 2); *(int *)(v21 + 32) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 533, i + 1, 0); *(int *)(v21 + 36) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 533, i + 1, 1); *(int *)(v21 + 40) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 533, i + 1, 2); *(int *)(v21 + 44) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); v33 = 0; v37 = (int)(v40 - 5); do { _43C91D_FormItemTextureFilename(pContainer, v33 + 115, i + 1, 0); v24 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); ++v33; v25 = v37; v37 += 4; *(int *)v25 = v24; } while ( v33 < 5 ); _43C91D_FormItemTextureFilename(pContainer, 512, i + 1, 0); v26 = v43; v38 = 105; v34 = v43; *v40 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); do { _43C91D_FormItemTextureFilename(pContainer, v38, i + 1, 0); *(int *)((char *)paperdoll_array_511828 + v34) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, v38, i + 1, 1); v27 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); v28 = v34; v34 += 4; ++v38; *(int *)((char *)dword_511788 + v28) = v27; } while ( v38 - 105 < 5 ); _43C91D_FormItemTextureFilename(pContainer, 525, i + 1, 0); *(int *)((char *)&paperdoll_array_511828[0][5] + v43) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 530, i + 1, 0); *(int *)((char *)&paperdoll_array_511828[0][6] + v43) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 547, i + 1, 0); *(int *)((char *)&paperdoll_array_511828[0][7] + v43) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 548, i + 1, 0); *(int *)((char *)&paperdoll_array_511828[0][8] + v43) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 550, i + 1, 0); *(int *)((char *)&paperdoll_array_511828[0][9] + v43) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 525, i + 1, 1); *(int *)((char *)&dword_51179C + v43) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 530, i + 1, 1); *(int *)((char *)&dword_5117A0 + v43) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 547, i + 1, 1); *(int *)((char *)&dword_5117A4 + v43) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 548, i + 1, 1); *(int *)((char *)&dword_5117A8 + v43) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); _43C91D_FormItemTextureFilename(pContainer, 550, i + 1, 1); *(int *)((char *)&dword_5117AC + v43) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); } else { v26 = v43; } //v41 += 7; v40 += 6; v21 += 204; //++v20; //result = v20 - 1; v43 = v26 + 40; } //while ( v20 - 1 < 4 ); //return result; } //----- (0043C91D) -------------------------------------------------------- int __fastcall _43C91D_FormItemTextureFilename(char *a1, signed int a2, int a3, int a4) { int result; // eax@2 char v5; // zf@3 const char *v6; // [sp-Ch] [bp-18h]@88 signed int v7; // [sp-8h] [bp-14h]@61 int v8; // [sp-4h] [bp-10h]@61 signed int v9; // [sp-4h] [bp-10h]@69 result = 0; //BUG fn is void if ( a2 <= 500 ) { //v5 = *((char *)&pBloodsplatContainer->std__vector_pBloodsplats[62].field_20 + a2 + 2) == 0; v5 = byte_5111C0[(a2 - 100) + 32 + 2] == 0; LABEL_21: if ( v5 ) return result; result = 516; if ( a2 < 66 || a2 > 78 ) { if ( a2 == 516 ) goto LABEL_79; if ( a2 != 504 && a2 != 505 && a2 != 533 ) { if ( (a2 < 100 || a2 > 104) && a2 != 524 && a2 != 535 ) { if ( a2 >= 115 && a2 <= 119 || a2 == 512 ) { if ( a2 == 512 ) a2 = 312; goto LABEL_87; } if ( (a2 < 89 || a2 > 99) && a2 != 521 && a2 != 522 && a2 != 523 && a2 != 532 && a2 != 544 ) { result = 525; if ( (a2 < 105 || a2 > 109) && a2 != 525 && a2 != 530 && a2 != 547 && a2 != 548 && a2 != 550 ) return result; switch ( a2 ) { case 525: a2 = 325; break; case 530: a2 = 330; break; case 547: a2 = 347; break; case 548: a2 = 348; break; case 550: a2 = 350; break; } v8 = a3; v7 = a2; if ( !a4 ) goto LABEL_88; LABEL_91: v6 = "item%3.3dv%da1"; return sprintf(a1, v6, v7, v8); } if ( a2 == 521 ) { a2 = 239; goto LABEL_87; } if ( a2 == 522 ) { a2 = 240; goto LABEL_87; } if ( a2 == 523 ) { a2 = 241; goto LABEL_87; } if ( a2 != 532 ) { if ( a2 == 544 ) a2 = 344; goto LABEL_87; } v9 = 93; goto LABEL_70; } if ( a2 == 524 ) { a2 = 324; goto LABEL_87; } if ( a2 == 535 ) { v9 = 104; LABEL_70: a2 = v9; } LABEL_87: v8 = a3; v7 = a2; LABEL_88: v6 = "item%3.3dv%d"; return sprintf(a1, v6, v7, v8); } } if ( a2 != 516 ) { switch ( a2 ) { case 504: a2 = 235; break; case 505: a2 = 236; break; case 533: a2 = 73; break; } LABEL_86: if ( a4 ) { if ( a4 != 1 ) { if ( a4 != 2 ) return result; v8 = a3; v7 = a2; v6 = "item%3.3dv%da2"; return sprintf(a1, v6, v7, v8); } v8 = a3; v7 = a2; goto LABEL_91; } goto LABEL_87; } LABEL_79: a2 = 234; goto LABEL_86; } result = a2 - 504; switch ( a2 ) { case 516: v5 = byte_5111F6[2] == 0; goto LABEL_21; case 505: v5 = byte_5111F6[1] == 0; goto LABEL_21; case 504: v5 = byte_5111F6[0] == 0; goto LABEL_21; case 533: v5 = byte_5111F6[16] == 0; goto LABEL_21; case 512: v5 = byte_5111F6[3] == 0; goto LABEL_21; case 521: v5 = byte_5111F6[4] == 0; goto LABEL_21; case 522: v5 = byte_5111F6[5] == 0; goto LABEL_21; case 523: v5 = byte_5111F6[6] == 0; goto LABEL_21; case 532: v5 = byte_5111F6[7] == 0; goto LABEL_21; case 544: v5 = byte_5111F6[8] == 0; goto LABEL_21; case 524: v5 = byte_5111F6[9] == 0; goto LABEL_21; case 535: v5 = byte_5111F6[10] == 0; goto LABEL_21; case 525: v5 = byte_5111F6[11] == 0; goto LABEL_21; case 530: v5 = byte_5111F6[12] == 0; goto LABEL_21; case 547: v5 = byte_5111F6[13] == 0; goto LABEL_21; case 548: v5 = byte_5111F6[14] == 0; goto LABEL_21; case 550: v5 = byte_5111F6[15] == 0; goto LABEL_21; default: return result; } return result; } //----- (0043CC7C) -------------------------------------------------------- void __fastcall CharacterUI_DrawPaperdoll(unsigned int uPlayerID) { //Player **ppPlayer; // esi@1 Player *pPlayer; // ebx@1 //enum CHARACTER_RACE pRace; // edi@1 signed int pSex; // eax@1 //int v5; // edi@4 unsigned int v6; // ecx@9 int v7; // ecx@10 unsigned int v8; // eax@14 int v9; // eax@15 int v10; // edx@15 int v11; // ecx@15 int v12; // eax@15 unsigned int v13; // edi@15 unsigned int v14; // ebx@18 int v15; // ecx@18 Texture *v16; // ebp@27 double v17; // st7@29 int v18; // edi@30 char *v19; // eax@30 Texture *v20; // edi@31 unsigned int v21; // eax@37 int v22; // edi@38 int v23; // eax@38 int v24; // ebx@38 int v25; // eax@38 LODFile_IconsBitmaps *v26; // ecx@42 Texture *v27; // edi@51 double v28; // st7@51 char v29; // zf@54 char *v30; // eax@54 unsigned int v31; // eax@59 int v32; // edx@60 int v33; // eax@65 int v34; // eax@74 int v35; // ebx@74 unsigned int v36; // ecx@74 int v37; // eax@74 LODFile_IconsBitmaps *v38; // ecx@78 Texture *v39; // edi@85 double v40; // st7@87 int v41; // edi@88 Texture *v42; // edi@89 unsigned int v43; // eax@93 int v44; // edx@94 int v45; // eax@98 int v46; // eax@106 int v47; // ecx@106 int v48; // ebx@106 int v49; // eax@106 LODFile_IconsBitmaps *v50; // ecx@110 Texture *v51; // edi@117 double v52; // st7@119 int v53; // edi@120 Texture *v54; // edi@121 char *v55; // eax@122 unsigned int v56; // eax@127 int v57; // edi@128 int v58; // ecx@128 int v59; // ebx@129 int v60; // ecx@132 int v61; // eax@134 int v62; // ecx@136 Texture *v63; // edi@145 double v64; // st7@147 int v65; // edi@148 char *v66; // eax@148 Texture *v67; // edi@149 //Player *v68; // ebx@155 unsigned int v69; // edx@155 int v70; // edx@156 unsigned int v71; // eax@160 int v72; // edi@161 int v73; // edx@163 int v74; // ecx@168 unsigned int v75; // ebx@170 int v76; // ecx@172 Texture *v77; // edi@181 double v78; // st7@183 int v79; // edi@184 char *v80; // eax@184 Texture *v81; // edi@185 unsigned int v82; // eax@192 int v83; // eax@193 int v84; // eax@197 int v85; // eax@197 int v86; // ecx@197 int v87; // eax@197 int v88; // eax@198 int v89; // eax@199 int v90; // edi@201 int v91; // edi@213 int v92; // ebx@213 int v93; // edi@214 int v94; // ebx@214 int v95; // eax@214 char *v96; // edi@226 double v97; // st7@228 int v98; // edi@229 char *v99; // eax@229 Render *v100; // ecx@229 Texture *v101; // edi@230 int v102; // edi@236 int v103; // eax@237 int v104; // ecx@237 int v105; // edx@237 int v106; // edx@238 int v107; // edx@239 int v108; // edx@240 int v109; // edi@250 char *v110; // edx@250 unsigned int v111; // eax@259 int v112; // eax@260 int v113; // eax@260 int v114; // eax@265 int v115; // eax@274 int v116; // ebx@274 unsigned int v117; // edi@274 double v118; // st7@286 int v119; // edi@287 char *v120; // eax@287 Texture *v121; // edi@288 unsigned int v122; // edi@295 int v123; // ebx@297 int v124; // edi@298 int v125; // ecx@303 int v126; // eax@312 unsigned int v127; // ebx@314 int v128; // ecx@316 Texture *v129; // edi@325 double v130; // st7@327 int v131; // edi@328 char *v132; // eax@328 Texture *v133; // edi@329 unsigned int v134; // eax@335 int v135; // eax@336 int v136; // edx@336 int v137; // eax@336 unsigned int v138; // ebx@339 int v139; // ecx@339 Texture *v140; // edi@348 double v141; // st7@350 int v142; // edi@351 char *v143; // eax@351 Texture *v144; // edi@352 unsigned int v145; // eax@358 int v146; // eax@359 int v147; // ecx@359 int v148; // eax@359 int v149; // edx@359 int v150; // ebx@362 int v151; // ecx@363 int v152; // ecx@364 unsigned int v153; // eax@370 unsigned int v154; // edi@370 int v155; // eax@370 LODFile_IconsBitmaps *v156; // ecx@374 Texture *v157; // ebp@381 double v158; // st7@383 Texture *v159; // edi@385 char *v160; // eax@386 unsigned int v161; // eax@393 int v162; // eax@394 unsigned int v163; // [sp-Ch] [bp-58h]@230 unsigned int v164; // [sp-Ch] [bp-58h]@233 signed int v165; // [sp-Ch] [bp-58h]@235 char *v166; // [sp-8h] [bp-54h]@16 const char *v167; // [sp-8h] [bp-54h]@23 const char *v168; // [sp-8h] [bp-54h]@43 const char *v169; // [sp-8h] [bp-54h]@79 const char *v170; // [sp-8h] [bp-54h]@111 const char *v171; // [sp-8h] [bp-54h]@141 const char *v172; // [sp-8h] [bp-54h]@177 const char *v173; // [sp-8h] [bp-54h]@222 int v174; // [sp-8h] [bp-54h]@228 unsigned int v175; // [sp-8h] [bp-54h]@230 unsigned int v176; // [sp-8h] [bp-54h]@233 signed int v177; // [sp-8h] [bp-54h]@235 const char *v178; // [sp-8h] [bp-54h]@242 const char *v179; // [sp-8h] [bp-54h]@280 const char *v180; // [sp-8h] [bp-54h]@321 char *v181; // [sp-8h] [bp-54h]@337 const char *v182; // [sp-8h] [bp-54h]@344 const char *v183; // [sp-8h] [bp-54h]@375 signed int v184; // [sp-4h] [bp-50h]@66 signed int v185; // [sp-4h] [bp-50h]@99 signed int v186; // [sp-4h] [bp-50h]@202 int v187; // [sp-4h] [bp-50h]@228 Texture *v188; // [sp-4h] [bp-50h]@230 Texture *v189; // [sp-4h] [bp-50h]@233 Texture *v190; // [sp-4h] [bp-50h]@235 signed int v191; // [sp-4h] [bp-50h]@266 signed int v192; // [sp-4h] [bp-50h]@304 unsigned int a3; // [sp+10h] [bp-3Ch]@7 int a3a; // [sp+10h] [bp-3Ch]@15 int a3b; // [sp+10h] [bp-3Ch]@38 unsigned int a3c; // [sp+10h] [bp-3Ch]@74 unsigned int a3d; // [sp+10h] [bp-3Ch]@106 int a3e; // [sp+10h] [bp-3Ch]@129 int a3f; // [sp+10h] [bp-3Ch]@168 unsigned int a3g; // [sp+10h] [bp-3Ch]@216 unsigned int a3h; // [sp+10h] [bp-3Ch]@274 int a3i; // [sp+10h] [bp-3Ch]@312 int a3j; // [sp+10h] [bp-3Ch]@336 int a3k; // [sp+10h] [bp-3Ch]@362 signed int a2; // [sp+14h] [bp-38h]@7 unsigned int a2a; // [sp+14h] [bp-38h]@15 Texture *a2b; // [sp+14h] [bp-38h]@49 int a2c; // [sp+14h] [bp-38h]@74 int a2d; // [sp+14h] [bp-38h]@106 int a2e; // [sp+14h] [bp-38h]@129 int a2f; // [sp+14h] [bp-38h]@168 int a2g; // [sp+14h] [bp-38h]@214 int a2h; // [sp+14h] [bp-38h]@274 Texture *a2i; // [sp+14h] [bp-38h]@284 int a2j; // [sp+14h] [bp-38h]@312 int a2k; // [sp+14h] [bp-38h]@336 //Player *v217; // [sp+18h] [bp-34h]@1 int v218; // [sp+1Ch] [bp-30h]@15 int v219; // [sp+1Ch] [bp-30h]@60 int v220; // [sp+1Ch] [bp-30h]@94 int v221; // [sp+1Ch] [bp-30h]@128 int v222; // [sp+1Ch] [bp-30h]@161 int v223; // [sp+1Ch] [bp-30h]@213 char v224; // [sp+1Ch] [bp-30h]@237 int v225; // [sp+1Ch] [bp-30h]@260 int v226; // [sp+1Ch] [bp-30h]@298 int v227; // [sp+1Ch] [bp-30h]@336 int v228; // [sp+1Ch] [bp-30h]@359 int v229; // [sp+20h] [bp-2Ch]@15 int v230; // [sp+20h] [bp-2Ch]@38 int v231; // [sp+20h] [bp-2Ch]@60 int v232; // [sp+20h] [bp-2Ch]@94 int v233; // [sp+20h] [bp-2Ch]@128 int v234; // [sp+20h] [bp-2Ch]@161 int v235; // [sp+20h] [bp-2Ch]@197 int v236; // [sp+20h] [bp-2Ch]@260 int v237; // [sp+20h] [bp-2Ch]@298 int v238; // [sp+20h] [bp-2Ch]@336 int pBodyComplection; // [sp+24h] [bp-28h]@6 int v240; // [sp+28h] [bp-24h]@7 unsigned int v241; // [sp+2Ch] [bp-20h]@38 int v242; // [sp+2Ch] [bp-20h]@197 unsigned int v243; // [sp+2Ch] [bp-20h]@370 int v244; // [sp+34h] [bp-18h]@6 signed int v245; // [sp+34h] [bp-18h]@361 unsigned int uPlayerID_; // [sp+38h] [bp-14h]@1 int uPlayerID_a; // [sp+38h] [bp-14h]@9 signed int IsDwarf; // [sp+40h] [bp-Ch]@4 int v249; // [sp+40h] [bp-Ch]@358 //signed int v250; // [sp+44h] [bp-8h]@1 pPlayer = pPlayers[uPlayerID]; uPlayerID_ = uPlayerID; pIcons_LOD->LoadTexture("sptext01", TEXTURE_16BIT_PALETTE); pSex = pPlayer->GetSexByVoice(); if ( pPlayer->GetRace() && pPlayer->GetRace() != 1 && pPlayer->GetRace() != 2 ) { IsDwarf = 1; pBodyComplection = (pSex != 0) + 2; } else { IsDwarf = 0; pBodyComplection = pSex != 0; } v244 = pPlayer->uFace; pRenderer->ResetClip(); pRenderer->DrawTextureIndexed(0x1D3u, 0, (Texture *)(uTextureID_BACKDOLL != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_BACKDOLL] : 0));//Ïîäëîæêà if ( !IsPlayerWearingWatersuit[uPlayerID_] ) { v21 = pPlayer->pEquipment.uBow; //ñíà÷àëà ðèñóåòñÿ ëóê if ( !v21 ) goto LABEL_59; v230 = pPlayer->pEquipment.uBow; v22 = (int)&pPlayer->pInventoryItems[v21-1]; v23 = *(int *)v22; v24 = pPaperdoll_BodyX + paperdoll_Weapon[pBodyComplection][2][0] - pItemsTable->pItems[v23].uEquipX; a3b = pPaperdoll_BodyY + paperdoll_Weapon[pBodyComplection][2][1] - pItemsTable->pItems[v23].uEquipY; v241 = pIcons_LOD->LoadTexture(pItemsTable->pItems[v23].pIconName, TEXTURE_16BIT_PALETTE); v25 = *(int *)(v22 + 20); if ( !(*(int *)(v22 + 20) & 0xF0) ) { if ( v25 & 2 ) { v27 = (Texture *)(v241 != -1 ? (int)&pIcons_LOD->pTextures[v241] : 0); pRenderer->DrawTransparentRedShade(v24, a3b, v27); } else { v29 = (v25 & 1) == 0; v30 = (char *)&pIcons_LOD->pTextures[v241]; if ( v29 ) { v27 = (Texture *)(v241 != -1 ? (int)v30 : 0); pRenderer->DrawTransparentGreenShade(v24, a3b, (Texture *)(v241 != -1 ? (int)v30 : 0)); } else { v27 = (Texture *)(v241 != -1 ? (int)v30 : 0); pRenderer->DrawTextureTransparent(v24, a3b, (Texture *)(v241 != -1 ? (int)v30 : 0)); } } LABEL_57: if ( !bRingsShownInCharScreen ) pRenderer->_4A612A(v24, a3b, v27, v230); LABEL_59: v31 = pPlayer->pEquipment.uCloak;// ïîòîì ïëàù if ( !v31 ) goto LABEL_93; v231 = pPlayer->pEquipment.uCloak; v32 = (int)&pPlayer->pInventoryItems[v31-1]; v219 = v32; if ( *(int *)v32 != 525 ) { switch ( *(int *)v32 ) { case 0x212: v184 = 6; break; case 0x223: v184 = 7; break; case 0x224: v184 = 8; break; default: if ( *(int *)v32 != 550 ) { v33 = *(int *)v32 - 105; LABEL_72: if ( v33 < 0 || v33 >= 10 ) goto LABEL_93; LABEL_74: v34 = v33 + 10 * pBodyComplection; v35 = paperdoll_array_511828[0][v34];//Texture_Cloak a2c = pPaperdoll_BodyX + paperdoll_Cloak[0][v34][0]; v36 = pPaperdoll_BodyY + paperdoll_Cloak[0][v34][1]; v37 = *(int *)(v32 + 20); a3c = v36; if ( !(v37 & 0xF0) ) { v41 = v35 + 1; if ( v37 & 2 ) { v42 = (Texture *)(v41 != 0 ? (int)&pIcons_LOD->pTextures[v35] : 0); pRenderer->DrawTransparentRedShade(a2c, v36, v42); } else { v42 = (Texture *)(v41 != 0 ? (int)&pIcons_LOD->pTextures[v35] : 0); pRenderer->DrawTextureTransparent(a2c, v36, v42); } if ( !bRingsShownInCharScreen ) pRenderer->_4A612A(a2c, a3c, v42, v231); LABEL_93: v240 = 4 * uPlayerID_ - 4; pRenderer->DrawTextureTransparent(pPaperdoll_BodyX, pPaperdoll_BodyY, (Texture *)(*(unsigned int *)((char *)papredoll_dbods + v240) != -1 ? (int)&pIcons_LOD->pTextures[*(unsigned int *)((char *)papredoll_dbods + v240)] : 0)); v43 = pPlayer->pEquipment.uBody;// ïîòîì òåëî if ( !v43 ) goto LABEL_127; v232 = pPlayer->pEquipment.uBody; v44 = (int)&pPlayer->pInventoryItems[v43-1]; v220 = v44; if ( *(int *)v44 != 504 ) { if ( *(int *)v44 == 505 ) { v185 = 14; } else { if ( *(int *)v44 == 516 ) { v185 = 13; } else { if ( *(int *)v44 != 533 ) { v45 = *(int *)v44 - 66; LABEL_104: if ( v45 < 0 || v45 >= 17 ) goto LABEL_127; LABEL_106: v46 = 17 * pBodyComplection + v45; a2d = pPaperdoll_BodyX + paperdoll_Armor[0][v46][0]; v47 = pPaperdoll_BodyY + paperdoll_Armor[0][v46][1]; v48 = paperdoll_array_511290[0][v46][0];//Texture_Armor v49 = *(int *)(v44 + 20); a3d = v47; if ( !(v49 & 0xF0) ) { v53 = v48 + 1; if ( v49 & 2 ) { v54 = (Texture *)(v53 != 0 ? (int)&pIcons_LOD->pTextures[v48] : 0); pRenderer->DrawTransparentRedShade(a2d, v47, v54); } else { v29 = (v49 & 1) == 0; v55 = (char *)&pIcons_LOD->pTextures[v48]; if ( v29 ) { v54 = (Texture *)(v53 != 0 ? (int)v55 : 0); pRenderer->DrawTransparentGreenShade(a2d, v47, v54); } else { v54 = (Texture *)(v53 != 0 ? (int)v55 : 0); pRenderer->DrawTextureTransparent(a2d, v47, v54); } } if ( !bRingsShownInCharScreen ) pRenderer->_4A612A(a2d, a3d, v54, v232); LABEL_127: v56 = pPlayer->pEquipment.field_20; if ( !v56 ) goto LABEL_155; v233 = pPlayer->pEquipment.field_20; v57 = (int)&pPlayer->pInventoryItems[v56-1]; v221 = v57; v58 = *(int *)v57; if ( *(int *)v57 == 529 ) { a3e = pPaperdoll_BodyY + paperdoll_Boot[pBodyComplection][5][1]; a2e = pPaperdoll_BodyX + paperdoll_Boot[pBodyComplection][5][0]; v59 = papredoll_flying_feet[v244]; } else { if ( v58 == 512 ) { a3e = pPaperdoll_BodyY + paperdoll_Boot[pBodyComplection][6][1]; a2e = pPaperdoll_BodyX + paperdoll_Boot[pBodyComplection][6][0]; v59 = dword_511638[pBodyComplection][5]; } else { v60 = v58 - 115; if ( v60 < 0 || v60 >= 5 ) { a2e = 0; a3e = 0; v59 = dword_511638[pBodyComplection][0]; } else { v61 = v60 + 7 * pBodyComplection; a3e = pPaperdoll_BodyY + paperdoll_Boot[0][v61][1]; a2e = pPaperdoll_BodyX + paperdoll_Boot[0][v61][0]; v59 = dword_511638[0][v60 + 6 * pBodyComplection]; } } } v62 = *(int *)(v57 + 20); if ( !(*(int *)(v57 + 20) & 0xF0) ) { v65 = v59 + 1; v66 = (char *)&pIcons_LOD->pTextures[v59]; if ( v62 & 2 ) { v67 = (Texture *)(v65 != 0 ? (int)v66 : 0); pRenderer->DrawTransparentRedShade(a2e, a3e, v67); } else { if ( v62 & 1 ) { v67 = (Texture *)(v65 != 0 ? (int)v66 : 0); pRenderer->DrawTextureTransparent(a2e, a3e, v67); } else { v67 = (Texture *)(v65 != 0 ? (int)v66 : 0); pRenderer->DrawTransparentGreenShade(a2e, a3e, v67); } } if ( !bRingsShownInCharScreen ) pRenderer->_4A612A(a2e, a3e, v67, v233); LABEL_155: v69 = pPlayer->pEquipment.uMainHand; uPlayerID_a = 2 * pBodyComplection; if ( !v69 || (v70 = *(int *)&pPlayer->pInventoryItems[v69-1], pItemsTable->pItems[v70].uEquipType != 1) && (pItemsTable->pItems[v70].uSkillType != 4 || pPlayer->pEquipment.uOffHand) ) pRenderer->DrawTextureTransparent(pPaperdoll_BodyX + pPaperdoll_LeftHand[pBodyComplection][0], pPaperdoll_BodyY + pPaperdoll_LeftHand[pBodyComplection][1], (Texture *)(*(unsigned int *)((char *)papredoll_dlads + v240) != -1 ? (int)&pIcons_LOD->pTextures[*(unsigned int *)((char *)papredoll_dlads + v240)] : 0)); v71 = pPlayer->pEquipment.uBelt; if ( v71 ) { v234 = pPlayer->pEquipment.uBelt; v72 = (int)&pPlayer->pInventoryItems[v71-1]; v222 = v72; if ( *(int *)v72 == 524 ) { v73 = 5; } else { if ( *(int *)v72 == 535 ) { v73 = 6; goto LABEL_168; } v73 = *(int *)v72 - 100; } if ( v73 >= 0 && v73 < 7 ) { LABEL_168: v74 = 7 * pBodyComplection + v73; a2f = pPaperdoll_BodyX + paperdoll_Belt[0][v74][0]; a3f = pPaperdoll_BodyY + paperdoll_Belt[0][v74][1]; if ( IsDwarf != 1 || v73 == 5 ) v75 = stru_511718[pBodyComplection].texids[v73]; else v75 = stru_511718[pBodyComplection - 2].texids[v73]; v76 = *(int *)&pPlayer->field_1F5[36 * v71 + 15]; if ( !(*(int *)&pPlayer->field_1F5[36 * v71 + 15] & 0xF0) ) { v79 = v75 + 1; v80 = (char *)&pIcons_LOD->pTextures[v75]; if ( v76 & 2 ) { v81 = (Texture *)(v79 != 0 ? (int)v80 : 0); pRenderer->DrawTransparentRedShade(a2f, a3f, v81); } else { if ( v76 & 1 ) { v81 = (Texture *)(v79 != 0 ? (int)v80 : 0); pRenderer->DrawTextureTransparent(a2f, a3f, v81); } else { v81 = (Texture *)(v79 != 0 ? (int)v80 : 0); pRenderer->DrawTransparentGreenShade(a2f, a3f, v81); } } if ( !bRingsShownInCharScreen ) pRenderer->_4A612A(a2f, a3f, v81, v234); goto LABEL_192; } if ( (*(int *)&pPlayer->field_1F5[36 * v71 + 15] & 0xF0) != 16 ) { if ( (*(int *)&pPlayer->field_1F5[36 * v71 + 15] & 0xF0) == 32 ) { v172 = "sp28a"; v77 = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v172, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v222 + 20) &= 0xFu; ptr_50C9A4 = 0; } v78 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2f, a3f, (Texture *)(v75 != -1 ? (int)&pIcons_LOD->pTextures[v75] : 0), v77, (signed __int64)v78, 0, 255); goto LABEL_192; } if ( (*(int *)&pPlayer->field_1F5[36 * v71 + 15] & 0xF0) == 64 ) { v172 = "sp30a"; v77 = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v172, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v222 + 20) &= 0xFu; ptr_50C9A4 = 0; } v78 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2f, a3f, (Texture *)(v75 != -1 ? (int)&pIcons_LOD->pTextures[v75] : 0), v77, (signed __int64)v78, 0, 255); goto LABEL_192; } if ( (*(int *)&pPlayer->field_1F5[36 * v71 + 15] & 0xF0) == 128 ) { v172 = "sp91a"; v77 = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v172, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v222 + 20) &= 0xFu; ptr_50C9A4 = 0; } v78 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2f, a3f, (Texture *)(v75 != -1 ? (int)&pIcons_LOD->pTextures[v75] : 0), v77, (signed __int64)v78, 0, 255); goto LABEL_192; } } v172 = "sptext01"; v77 = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v172, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v222 + 20) &= 0xFu; ptr_50C9A4 = 0; } v78 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2f, a3f, (Texture *)(v75 != -1 ? (int)&pIcons_LOD->pTextures[v75] : 0), v77, (signed __int64)v78, 0, 255); goto LABEL_192; } } LABEL_192: v82 = pPlayer->pEquipment.uMainHand; if ( v82 ) { v83 = *(int *)&pPlayer->pInventoryItems[v82-1]; if ( pItemsTable->pItems[v83].uEquipType == 1 || pItemsTable->pItems[v83].uSkillType == 4 && !pPlayer->pEquipment.uOffHand ) pRenderer->DrawTextureTransparent(pPaperdoll_BodyX + pPaperdoll_SecondLeftHand[0][uPlayerID_a], pPaperdoll_BodyY + pPaperdoll_SecondLeftHand[0][uPlayerID_a + 1], (Texture *)(*(unsigned int *)((char *)papredoll_dlaus + v240) != -1 ? (int)&pIcons_LOD->pTextures[*(unsigned int *)((char *)papredoll_dlaus + v240)] : 0)); } v84 = pPlayer->pEquipment.uBody; v235 = v84; v85 = (int)((char *)pPlayer + 36 * v84); v242 = v85; v86 = *(int *)(v85 + 496); v87 = *(int *)(v85 + 496) - 504; if ( v87 ) { v88 = v87 - 1; if ( v88 ) { v89 = v88 - 11; if ( v89 ) { if ( v89 != 17 ) { v90 = v86 - 66; LABEL_207: if ( v90 < 0 || v90 > 17 ) { LABEL_259: v111 = pPlayer->pEquipment.uCloak; if ( !v111 ) goto LABEL_293; v236 = pPlayer->pEquipment.uCloak; v112 = (int)&pPlayer->pInventoryItems[v111-1]; v225 = v112; v113 = *(int *)v112; if ( v113 != 525 ) { switch ( v113 ) { case 530: v191 = 6; break; case 547: v191 = 7; break; case 548: v191 = 8; break; default: if ( v113 != 550 ) { v114 = v113 - 105; LABEL_272: if ( v114 < 0 || v114 >= 10 ) goto LABEL_293; LABEL_274: v115 = v114 + 10 * pBodyComplection; v116 = dword_511788[v115]; v115 *= 8; v117 = pPaperdoll_BodyX + *(int *)((char *)&dword_4E56B0 + v115); a2h = pPaperdoll_BodyX + *(int *)((char *)&dword_4E56B0 + v115); a3h = pPaperdoll_BodyY + *(int *)((char *)&dword_4E56B4 + v115); if ( v116 == pIcons_LOD->FindTextureByName("pending") ) { LABEL_292: LABEL_293: if ( v244 == 12 || v244 == 13 ) { v122 = papredoll_dbrds[v244]; if ( v122 != pIcons_LOD->FindTextureByName("Pending") ) pRenderer->DrawTextureTransparent(pPaperdoll_BodyX + pPaperdoll_Beards[2 * v244 - 24], pPaperdoll_BodyY + pPaperdoll_Beards[2 * v244 - 23], (Texture *)(v122 != -1 ? (int)&pIcons_LOD->pTextures[v122] : 0)); } v123 = pPlayer->pEquipment.uHelm; if ( !v123 ) goto LABEL_335; v237 = v123; v124 = (int)&pPlayer->pInventoryItems[v123-1]; v226 = v124; if ( *(int *)v124 != 521 ) { switch ( *(int *)v124 ) { case 0x20A: v192 = 12; break; case 0x20B: v192 = 13; break; case 0x214: v192 = 14; break; default: if ( *(int *)v124 != 544 ) { v125 = *(int *)v124 - 89; if ( v125 < 0 || v125 >= 16 ) goto LABEL_335; goto LABEL_312; } v192 = 15; break; } v125 = v192; LABEL_312: v126 = 2 * (v125 + 16 * pBodyComplection); a2j = pPaperdoll_BodyX + dword_4E58D0[v126]; a3i = pPaperdoll_BodyY + dword_4E58D4[v126]; if ( IsDwarf != 1 || *(int *)v124 != 92 ) v127 = stru_511698[0].texids[v125 + 16 * pSex]; else v127 = papredoll_dbrds[11]; v128 = *(int *)(v124 + 20); if ( *(int *)(v124 + 20) & 0xF0 ) { if ( (*(int *)(v124 + 20) & 0xF0) != 16 ) { if ( (*(int *)(v124 + 20) & 0xF0) == 32 ) { v180 = "sp28a"; v129 = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v180, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v226 + 20) &= 0xFu; ptr_50C9A4 = 0; } v130 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2j, a3i, (Texture *)(v127 != -1 ? (int)&pIcons_LOD->pTextures[v127] : 0), v129, (signed __int64)v130, 0, 255); goto LABEL_335; } if ( (*(int *)(v124 + 20) & 0xF0) == 64 ) { v180 = "sp30a"; v129 = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v180, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v226 + 20) &= 0xFu; ptr_50C9A4 = 0; } v130 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2j, a3i, (Texture *)(v127 != -1 ? (int)&pIcons_LOD->pTextures[v127] : 0), v129, (signed __int64)v130, 0, 255); goto LABEL_335; } if ( (*(int *)(v124 + 20) & 0xF0) == 128 ) { v180 = "sp91a"; v129 = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v180, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v226 + 20) &= 0xFu; ptr_50C9A4 = 0; } v130 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2j, a3i, (Texture *)(v127 != -1 ? (int)&pIcons_LOD->pTextures[v127] : 0), v129, (signed __int64)v130, 0, 255); goto LABEL_335; } } v180 = "sptext01"; v129 = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v180, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v226 + 20) &= 0xFu; ptr_50C9A4 = 0; } v130 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2j, a3i, (Texture *)(v127 != -1 ? (int)&pIcons_LOD->pTextures[v127] : 0), v129, (signed __int64)v130, 0, 255); goto LABEL_335; } v131 = v127 + 1; v132 = (char *)&pIcons_LOD->pTextures[v127]; if ( v128 & 2 ) { v133 = (Texture *)(v131 != 0 ? (int)v132 : 0); pRenderer->DrawTransparentRedShade(a2j, a3i, v133); } else { if ( v128 & 1 ) { v133 = (Texture *)(v131 != 0 ? (int)v132 : 0); pRenderer->DrawTextureTransparent(a2j, a3i, v133); } else { v133 = (Texture *)(v131 != 0 ? (int)v132 : 0); pRenderer->DrawTransparentGreenShade(a2j, a3i, v133); } } if ( !bRingsShownInCharScreen ) pRenderer->_4A612A(a2j, a3i, v133, v237); LABEL_335: v134 = pPlayer->pEquipment.uMainHand; if ( !v134 ) goto LABEL_358; v238 = pPlayer->pEquipment.uMainHand; v135 = (int)&pPlayer->pInventoryItems[v134-1]; v227 = v135; v136 = *(int *)v135; v137 = *(int *)v135; a2k = pPaperdoll_BodyX + paperdoll_Weapon[pBodyComplection][1][0] - pItemsTable->pItems[v137].uEquipX; a3j = pPaperdoll_BodyY + paperdoll_Weapon[pBodyComplection][1][1] - pItemsTable->pItems[v137].uEquipY; if ( v136 == 64 ) v181 = "item64v1"; else v181 = pItemsTable->pItems[v137].pIconName; v138 = pIcons_LOD->LoadTexture(v181, TEXTURE_16BIT_PALETTE); v139 = *(int *)(v227 + 20); if ( !(*(int *)(v227 + 20) & 0xF0) ) { v142 = v138 + 1; v143 = (char *)&pIcons_LOD->pTextures[v138]; if ( v139 & 2 ) { v144 = (Texture *)(v142 != 0 ? (int)v143 : 0); pRenderer->DrawTransparentRedShade(a2k, a3j, v144); } else { if ( v139 & 1 ) { v144 = (Texture *)(v142 != 0 ? (int)v143 : 0); pRenderer->DrawTextureTransparent(a2k, a3j, v144); } else { v144 = (Texture *)(v142 != 0 ? (int)v143 : 0); pRenderer->DrawTransparentGreenShade(a2k, a3j, v144); } } if ( !bRingsShownInCharScreen ) pRenderer->_4A612A(a2k, a3j, v144, v238); LABEL_358: v145 = pPlayer->pEquipment.uOffHand; v249 = pPlayer->pEquipment.uOffHand; if ( !v145 ) goto LABEL_393; v146 = (int)&pPlayer->pInventoryItems[v145-1]; v228 = v146; v147 = *(int *)v146; v148 = *(int *)v146; v149 = pItemsTable->pItems[v148].uSkillType; if ( v149 != 2 && v149 != 1 ) { v245 = 0; v150 = pPaperdoll_BodyX + paperdoll_Weapon[pBodyComplection][0][0] - pItemsTable->pItems[v148].uEquipX; a3k = pPaperdoll_BodyY + paperdoll_Weapon[pBodyComplection][0][1] - pItemsTable->pItems[v148].uEquipY; goto LABEL_370; } v151 = v147 - 400; v245 = 1; if ( v151 ) { v152 = v151 - 3; if ( v152 ) { if ( v152 != 12 ) { v150 = pPaperdoll_BodyX + paperdoll_Weapon[pBodyComplection][0][0] - pItemsTable->pItems[v148].uEquipX; a3k = pPaperdoll_BodyY + paperdoll_Weapon[pBodyComplection][0][1] - pItemsTable->pItems[v148].uEquipY; goto LABEL_370; } v150 = 595; a3k = 33; LABEL_370: v153 = pIcons_LOD->LoadTexture(pItemsTable->pItems[v148].pIconName, TEXTURE_16BIT_PALETTE); v154 = v153; v243 = v153; v155 = *(int *)(v228 + 20); if ( !(*(int *)(v228 + 20) & 0xF0) ) { if ( v155 & 2 ) { v159 = (Texture *)(v243 != -1 ? (int)&pIcons_LOD->pTextures[v243] : 0); pRenderer->DrawTransparentRedShade(v150, a3k, v159); } else { v29 = (v155 & 1) == 0; v160 = (char *)&pIcons_LOD->pTextures[v243]; if ( v29 ) { v159 = (Texture *)(v243 != -1 ? (int)v160 : 0); pRenderer->DrawTransparentGreenShade(v150, a3k, (Texture *)(v243 != -1 ? (int)v160 : 0)); } else { v159 = (Texture *)(v243 != -1 ? (int)v160 : 0); pRenderer->DrawTextureTransparent(v150, a3k, (Texture *)(v243 != -1 ? (int)v160 : 0)); } } if ( !bRingsShownInCharScreen ) pRenderer->_4A612A(v150, a3k, v159, v249); if ( v245 ) pRenderer->DrawTextureTransparent(pPaperdoll_BodyX + pPaperdollLeftEmptyHand[uPlayerID_a], pPaperdoll_BodyY + pPaperdollLeftEmptyHand[uPlayerID_a + 1], (Texture *)(*(unsigned int *)((char *)papredoll_dlhs + v240) != -1 ? (int)&pIcons_LOD->pTextures[*(unsigned int *)((char *)papredoll_dlhs + v240)] : 0)); goto LABEL_393; } if ( (*(int *)(v228 + 20) & 0xF0) != 16 ) { if ( (*(int *)(v228 + 20) & 0xF0) == 32 ) { v183 = "sp28a"; } else { if ( (*(int *)(v228 + 20) & 0xF0) != 64 ) { v156 = pIcons_LOD; if ( (*(int *)(v228 + 20) & 0xF0) == 128 ) { v183 = "sp91a"; v157 = &pIcons_LOD->pTextures[v156->LoadTexture(v183, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v228 + 20) &= 0xFu; ptr_50C9A4 = 0; } v158 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(v150, a3k, (Texture *)(v154 != -1 ? (int)&pIcons_LOD->pTextures[v154] : 0), v157, (signed __int64)v158, 0, 255); if ( v245 ) pRenderer->DrawTextureTransparent(pPaperdoll_BodyX + pPaperdollLeftEmptyHand[uPlayerID_a], pPaperdoll_BodyY + pPaperdollLeftEmptyHand[uPlayerID_a + 1], (Texture *)(*(unsigned int *)((char *)papredoll_dlhs + v240) != -1 ? (int)&pIcons_LOD->pTextures[*(unsigned int *)((char *)papredoll_dlhs + v240)] : 0)); goto LABEL_393; } v183 = "sptext01"; v157 = &pIcons_LOD->pTextures[v156->LoadTexture(v183, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v228 + 20) &= 0xFu; ptr_50C9A4 = 0; } v158 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(v150, a3k, (Texture *)(v154 != -1 ? (int)&pIcons_LOD->pTextures[v154] : 0), v157, (signed __int64)v158, 0, 255); if ( v245 ) pRenderer->DrawTextureTransparent(pPaperdoll_BodyX + pPaperdollLeftEmptyHand[uPlayerID_a], pPaperdoll_BodyY + pPaperdollLeftEmptyHand[uPlayerID_a + 1], (Texture *)(*(unsigned int *)((char *)papredoll_dlhs + v240) != -1 ? (int)&pIcons_LOD->pTextures[*(unsigned int *)((char *)papredoll_dlhs + v240)] : 0)); goto LABEL_393; } v183 = "sp30a"; } v156 = pIcons_LOD; v157 = &pIcons_LOD->pTextures[v156->LoadTexture(v183, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v228 + 20) &= 0xFu; ptr_50C9A4 = 0; } v158 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(v150, a3k, (Texture *)(v154 != -1 ? (int)&pIcons_LOD->pTextures[v154] : 0), v157, (signed __int64)v158, 0, 255); if ( v245 ) pRenderer->DrawTextureTransparent(pPaperdoll_BodyX + pPaperdollLeftEmptyHand[uPlayerID_a], pPaperdoll_BodyY + pPaperdollLeftEmptyHand[uPlayerID_a + 1], (Texture *)(*(unsigned int *)((char *)papredoll_dlhs + v240) != -1 ? (int)&pIcons_LOD->pTextures[*(unsigned int *)((char *)papredoll_dlhs + v240)] : 0)); goto LABEL_393; } v156 = pIcons_LOD; v183 = "sptext01"; v157 = &pIcons_LOD->pTextures[v156->LoadTexture(v183, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v228 + 20) &= 0xFu; ptr_50C9A4 = 0; } v158 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(v150, a3k, (Texture *)(v154 != -1 ? (int)&pIcons_LOD->pTextures[v154] : 0), v157, (signed __int64)v158, 0, 255); if ( v245 ) pRenderer->DrawTextureTransparent(pPaperdoll_BodyX + pPaperdollLeftEmptyHand[uPlayerID_a], pPaperdoll_BodyY + pPaperdollLeftEmptyHand[uPlayerID_a + 1], (Texture *)(*(unsigned int *)((char *)papredoll_dlhs + v240) != -1 ? (int)&pIcons_LOD->pTextures[*(unsigned int *)((char *)papredoll_dlhs + v240)] : 0)); goto LABEL_393; } a3k = 28; } else { a3k = 86; } v150 = 596; goto LABEL_370; } if ( (*(int *)(v227 + 20) & 0xF0) != 16 ) { if ( (*(int *)(v227 + 20) & 0xF0) == 32 ) { v182 = "sp28a"; v140 = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v182, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v227 + 20) &= 0xFu; ptr_50C9A4 = 0; } v141 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2k, a3j, (Texture *)(v138 != -1 ? (int)&pIcons_LOD->pTextures[v138] : 0), v140, (signed __int64)v141, 0, 255); goto LABEL_358; } if ( (*(int *)(v227 + 20) & 0xF0) == 64 ) { v182 = "sp30a"; v140 = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v182, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v227 + 20) &= 0xFu; ptr_50C9A4 = 0; } v141 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2k, a3j, (Texture *)(v138 != -1 ? (int)&pIcons_LOD->pTextures[v138] : 0), v140, (signed __int64)v141, 0, 255); goto LABEL_358; } if ( (*(int *)(v227 + 20) & 0xF0) == 128 ) { v182 = "sp91a"; v140 = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v182, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v227 + 20) &= 0xFu; ptr_50C9A4 = 0; } v141 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2k, a3j, (Texture *)(v138 != -1 ? (int)&pIcons_LOD->pTextures[v138] : 0), v140, (signed __int64)v141, 0, 255); goto LABEL_358; } } v182 = "sptext01"; v140 = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v182, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v227 + 20) &= 0xFu; ptr_50C9A4 = 0; } v141 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2k, a3j, (Texture *)(v138 != -1 ? (int)&pIcons_LOD->pTextures[v138] : 0), v140, (signed __int64)v141, 0, 255); goto LABEL_358; } v125 = 11; if ( v125 < 0 || v125 >= 16 ) goto LABEL_335; goto LABEL_312; } if ( !(*(int *)(v225 + 20) & 0xF0) ) { v119 = v116 + 1; v120 = (char *)&pIcons_LOD->pTextures[v116]; if ( *(int *)(v225 + 20) & 2 ) { v121 = (Texture *)(v119 != 0 ? (int)v120 : 0); pRenderer->DrawTransparentRedShade(a2h, a3h, v121); } else { v121 = (Texture *)(v119 != 0 ? (int)v120 : 0); pRenderer->DrawTextureTransparent(a2h, a3h, v121); } if ( !bRingsShownInCharScreen ) pRenderer->_4A612A(a2h, a3h, v121, v236); goto LABEL_292; } if ( (*(int *)(v225 + 20) & 0xF0) != 16 ) { if ( (*(int *)(v225 + 20) & 0xF0) == 32 ) { v179 = "sp28a"; a2i = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v179, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v225 + 20) &= 0xFu; ptr_50C9A4 = 0; } v118 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(v117, a3h, (Texture *)(v116 != -1 ? (int)&pIcons_LOD->pTextures[v116] : 0), a2i, (signed __int64)v118, 0, 255); goto LABEL_292; } if ( (*(int *)(v225 + 20) & 0xF0) == 64 ) { v179 = "sp30a"; a2i = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v179, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v225 + 20) &= 0xFu; ptr_50C9A4 = 0; } v118 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(v117, a3h, (Texture *)(v116 != -1 ? (int)&pIcons_LOD->pTextures[v116] : 0), a2i, (signed __int64)v118, 0, 255); goto LABEL_292; } if ( (*(int *)(v225 + 20) & 0xF0) == 128 ) { v179 = "sp91a"; a2i = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v179, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v225 + 20) &= 0xFu; ptr_50C9A4 = 0; } v118 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(v117, a3h, (Texture *)(v116 != -1 ? (int)&pIcons_LOD->pTextures[v116] : 0), a2i, (signed __int64)v118, 0, 255); goto LABEL_292; } } v179 = "sptext01"; a2i = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v179, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v225 + 20) &= 0xFu; ptr_50C9A4 = 0; } v118 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(v117, a3h, (Texture *)(v116 != -1 ? (int)&pIcons_LOD->pTextures[v116] : 0), a2i, (signed __int64)v118, 0, 255); goto LABEL_292; } v191 = 9; break; } v114 = v191; goto LABEL_274; } v114 = 5; goto LABEL_272; } LABEL_209: if ( pPlayer->pEquipment.uMainHand && (pPlayer->GetEquippedItemEquipType(1u) == 1 || pPlayer->GetEquippedItemSkillType(EQUIP_TWO_HANDED) == 4 && !pPlayer->pEquipment.uOffHand) ) { v91 = 17 * pBodyComplection + v90; v92 = v91; v223 = paperdoll_array_511290[0][v91][2]; if ( v223 == pIcons_LOD->FindTextureByName("pending") ) { v93 = 2 * v91; v94 = paperdoll_array_511290[0][v92][1]; a2g = pPaperdoll_BodyX + paperdoll_shoulder[0][0][v93]; v95 = paperdoll_shoulder[0][0][v93 + 1]; } else { v94 = v223; a2g = pPaperdoll_BodyX + dword_4E5270[2 * v91]; v95 = dword_4E5270[2 * v91 + 1]; } a3g = pPaperdoll_BodyY + v95; if ( v94 == pIcons_LOD->FindTextureByName("pending") ) goto LABEL_259; if ( *(int *)(v242 + 516) & 0xF0 ) { if ( (*(int *)(v242 + 516) & 0xF0) != 16 ) { if ( (*(int *)(v242 + 516) & 0xF0) == 32 ) { v173 = "sp28a"; v96 = (char *)&pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v173, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v242 + 516) &= 0xFu; ptr_50C9A4 = 0; } v187 = 255; v174 = 0; v97 = (double)GetTickCount(); pRenderer->_4A63E6(a2g, a3g, (Texture *)(v94 != -1 ? (int)&pIcons_LOD->pTextures[v94] : 0), (Texture *)v96, (signed __int64)(v97 * 0.1), v174, v187); goto LABEL_259; } if ( (*(int *)(v242 + 516) & 0xF0) == 64 ) { v173 = "sp30a"; v96 = (char *)&pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v173, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v242 + 516) &= 0xFu; ptr_50C9A4 = 0; } v187 = 255; v174 = 0; v97 = (double)GetTickCount(); pRenderer->_4A63E6(a2g, a3g, (Texture *)(v94 != -1 ? (int)&pIcons_LOD->pTextures[v94] : 0), (Texture *)v96, (signed __int64)(v97 * 0.1), v174, v187); goto LABEL_259; } if ( (*(int *)(v242 + 516) & 0xF0) == 128 ) { v173 = "sp91a"; v96 = (char *)&pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v173, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v242 + 516) &= 0xFu; ptr_50C9A4 = 0; } v187 = 255; v174 = 0; v97 = (double)GetTickCount(); pRenderer->_4A63E6(a2g, a3g, (Texture *)(v94 != -1 ? (int)&pIcons_LOD->pTextures[v94] : 0), (Texture *)v96, (signed __int64)(v97 * 0.1), v174, v187); goto LABEL_259; } } v173 = "sptext01"; v96 = (char *)&pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v173, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v242 + 516) &= 0xFu; ptr_50C9A4 = 0; } v187 = 255; v174 = 0; v97 = (double)GetTickCount(); pRenderer->_4A63E6(a2g, a3g, (Texture *)(v94 != -1 ? (int)&pIcons_LOD->pTextures[v94] : 0), (Texture *)v96, (signed __int64)(v97 * 0.1), v174, v187); goto LABEL_259; } v98 = v94 + 1; v99 = (char *)&pIcons_LOD->pTextures[v94]; v100 = pRenderer; if ( *(int *)(v242 + 516) & 2 ) { v101 = (Texture *)(v98 != 0 ? (int)v99 : 0); v188 = v101; v175 = a3g; v163 = a2g; v100->DrawTransparentRedShade(v163, v175, v188); if ( !bRingsShownInCharScreen ) pRenderer->_4A612A(a2g, a3g, v101, v235); goto LABEL_259; } if ( *(char *)(v242 + 516) & 1 ) { v101 = (Texture *)(v98 != 0 ? (int)v99 : 0); v189 = v101; v176 = a3g; v164 = a2g; pRenderer->DrawTextureTransparent(v164, v176, v189); if ( !bRingsShownInCharScreen ) pRenderer->_4A612A(a2g, a3g, v101, v235); goto LABEL_259; } v101 = (Texture *)(v98 != 0 ? (int)v99 : 0); v190 = v101; v177 = a3g; v165 = a2g; pRenderer->DrawTransparentGreenShade(v165, v177, v190); if ( !bRingsShownInCharScreen ) pRenderer->_4A612A(a2g, a3g, v101, v235); goto LABEL_259; } v102 = 17 * pBodyComplection + v90; v94 = paperdoll_array_511290[0][v102][1]; if ( v94 == pIcons_LOD->FindTextureByName("pending") ) goto LABEL_259; v103 = pPaperdoll_BodyX + paperdoll_shoulder[0][v102][0]; v104 = pPaperdoll_BodyY + paperdoll_shoulder[0][v102][1]; v224 = *(int *)(v242 + 516); v105 = *(int *)(v242 + 516) & 0xF0; a2g = pPaperdoll_BodyX + paperdoll_shoulder[0][v102][0]; a3g = pPaperdoll_BodyY + paperdoll_shoulder[0][v102][1]; if ( !v105 ) { v109 = v94 + 1; v110 = (char *)&pIcons_LOD->pTextures[v94]; if ( v224 & 2 ) { v101 = (Texture *)(v109 != 0 ? (int)v110 : 0); v188 = v101; v175 = v104; v163 = v103; v100 = pRenderer; v100->DrawTransparentRedShade(v163, v175, v188); if ( !bRingsShownInCharScreen ) pRenderer->_4A612A(a2g, a3g, v101, v235); goto LABEL_259; } if ( v224 & 1 ) { v101 = (Texture *)(v109 != 0 ? (int)v110 : 0); v189 = v101; v176 = v104; v164 = v103; v100 = pRenderer; pRenderer->DrawTextureTransparent(v164, v176, v189); if ( !bRingsShownInCharScreen ) pRenderer->_4A612A(a2g, a3g, v101, v235); goto LABEL_259; } v101 = (Texture *)(v109 != 0 ? (int)v110 : 0); v190 = v101; v177 = v104; v165 = v103; v100 = pRenderer; pRenderer->DrawTransparentGreenShade(v165, v177, v190); if ( !bRingsShownInCharScreen ) pRenderer->_4A612A(a2g, a3g, v101, v235); goto LABEL_259; } v106 = v105 - 16; if ( v106 ) { v107 = v106 - 16; if ( !v107 ) { v178 = "sp28a"; v96 = (char *)&pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v178, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v242 + 516) &= 0xFu; ptr_50C9A4 = 0; } v187 = 255; v174 = 0; v97 = (double)GetTickCount(); pRenderer->_4A63E6(a2g, a3g, (Texture *)(v94 != -1 ? (int)&pIcons_LOD->pTextures[v94] : 0), (Texture *)v96, (signed __int64)(v97 * 0.1), v174, v187); goto LABEL_259; } v108 = v107 - 32; if ( !v108 ) { v178 = "sp30a"; v96 = (char *)&pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v178, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v242 + 516) &= 0xFu; ptr_50C9A4 = 0; } v187 = 255; v174 = 0; v97 = (double)GetTickCount(); pRenderer->_4A63E6(a2g, a3g, (Texture *)(v94 != -1 ? (int)&pIcons_LOD->pTextures[v94] : 0), (Texture *)v96, (signed __int64)(v97 * 0.1), v174, v187); goto LABEL_259; } if ( v108 == 64 ) { v178 = "sp91a"; v96 = (char *)&pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v178, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v242 + 516) &= 0xFu; ptr_50C9A4 = 0; } v187 = 255; v174 = 0; v97 = (double)GetTickCount(); pRenderer->_4A63E6(a2g, a3g, (Texture *)(v94 != -1 ? (int)&pIcons_LOD->pTextures[v94] : 0), (Texture *)v96, (signed __int64)(v97 * 0.1), v174, v187); goto LABEL_259; } } v178 = "sptext01"; v96 = (char *)&pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v178, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v242 + 516) &= 0xFu; ptr_50C9A4 = 0; } v187 = 255; v174 = 0; v97 = (double)GetTickCount(); pRenderer->_4A63E6(a2g, a3g, (Texture *)(v94 != -1 ? (int)&pIcons_LOD->pTextures[v94] : 0), (Texture *)v96, (signed __int64)(v97 * 0.1), v174, v187); goto LABEL_259; } v186 = 16; } else { v186 = 13; } } else { v186 = 14; } v90 = v186; goto LABEL_209; } v90 = 15; goto LABEL_207; } if ( (*(int *)(v57 + 20) & 0xF0) != 16 ) { if ( (*(int *)(v57 + 20) & 0xF0) == 32 ) { v171 = "sp28a"; v63 = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v171, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v221 + 20) &= 0xFu; ptr_50C9A4 = 0; } v64 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2e, a3e, (Texture *)(v59 != -1 ? (int)&pIcons_LOD->pTextures[v59] : 0), v63, (signed __int64)v64, 0, 255); goto LABEL_155; } if ( (*(int *)(v57 + 20) & 0xF0) == 64 ) { v171 = "sp30a"; v63 = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v171, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v221 + 20) &= 0xFu; ptr_50C9A4 = 0; } v64 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2e, a3e, (Texture *)(v59 != -1 ? (int)&pIcons_LOD->pTextures[v59] : 0), v63, (signed __int64)v64, 0, 255); goto LABEL_155; } if ( (*(int *)(v57 + 20) & 0xF0) == 128 ) { v171 = "sp91a"; v63 = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v171, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v221 + 20) &= 0xFu; ptr_50C9A4 = 0; } v64 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2e, a3e, (Texture *)(v59 != -1 ? (int)&pIcons_LOD->pTextures[v59] : 0), v63, (signed __int64)v64, 0, 255); goto LABEL_155; } } v171 = "sptext01"; v63 = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v171, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v221 + 20) &= 0xFu; ptr_50C9A4 = 0; } v64 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2e, a3e, (Texture *)(v59 != -1 ? (int)&pIcons_LOD->pTextures[v59] : 0), v63, (signed __int64)v64, 0, 255); goto LABEL_155; } if ( (*(int *)(v44 + 20) & 0xF0) != 16 ) { if ( (*(int *)(v44 + 20) & 0xF0) == 32 ) { v170 = "sp28a"; } else { if ( (*(int *)(v44 + 20) & 0xF0) != 64 ) { v50 = pIcons_LOD; if ( (*(int *)(v44 + 20) & 0xF0) == 128 ) { v170 = "sp91a"; v51 = &pIcons_LOD->pTextures[v50->LoadTexture(v170, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v220 + 20) &= 0xFu; ptr_50C9A4 = 0; } v52 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2d, a3d, (Texture *)(v48 != -1 ? (int)&pIcons_LOD->pTextures[v48] : 0), v51, (signed __int64)v52, 0, 255); goto LABEL_127; } v170 = "sptext01"; v51 = &pIcons_LOD->pTextures[v50->LoadTexture(v170, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v220 + 20) &= 0xFu; ptr_50C9A4 = 0; } v52 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2d, a3d, (Texture *)(v48 != -1 ? (int)&pIcons_LOD->pTextures[v48] : 0), v51, (signed __int64)v52, 0, 255); goto LABEL_127; } v170 = "sp30a"; } v50 = pIcons_LOD; v51 = &pIcons_LOD->pTextures[v50->LoadTexture(v170, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v220 + 20) &= 0xFu; ptr_50C9A4 = 0; } v52 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2d, a3d, (Texture *)(v48 != -1 ? (int)&pIcons_LOD->pTextures[v48] : 0), v51, (signed __int64)v52, 0, 255); goto LABEL_127; } v50 = pIcons_LOD; v170 = "sptext01"; v51 = &pIcons_LOD->pTextures[v50->LoadTexture(v170, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v220 + 20) &= 0xFu; ptr_50C9A4 = 0; } v52 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2d, a3d, (Texture *)(v48 != -1 ? (int)&pIcons_LOD->pTextures[v48] : 0), v51, (signed __int64)v52, 0, 255); goto LABEL_127; } v185 = 16; } } v45 = v185; goto LABEL_106; } v45 = 15; goto LABEL_104; } if ( (*(int *)(v32 + 20) & 0xF0) != 16 ) { if ( (*(int *)(v32 + 20) & 0xF0) == 32 ) { v169 = "sp28a"; } else { if ( (*(int *)(v32 + 20) & 0xF0) != 64 ) { v38 = pIcons_LOD; if ( (*(int *)(v32 + 20) & 0xF0) == 128 ) { v169 = "sp91a"; v39 = &pIcons_LOD->pTextures[v38->LoadTexture(v169, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v219 + 20) &= 0xFu; ptr_50C9A4 = 0; } v40 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2c, a3c, (Texture *)(v35 != -1 ? (int)&pIcons_LOD->pTextures[v35] : 0), v39, (signed __int64)v40, 0, 255); goto LABEL_93; } v169 = "sptext01"; v39 = &pIcons_LOD->pTextures[v38->LoadTexture(v169, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v219 + 20) &= 0xFu; ptr_50C9A4 = 0; } v40 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2c, a3c, (Texture *)(v35 != -1 ? (int)&pIcons_LOD->pTextures[v35] : 0), v39, (signed __int64)v40, 0, 255); goto LABEL_93; } v169 = "sp30a"; } v38 = pIcons_LOD; v39 = &pIcons_LOD->pTextures[v38->LoadTexture(v169, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v219 + 20) &= 0xFu; ptr_50C9A4 = 0; } v40 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2c, a3c, (Texture *)(v35 != -1 ? (int)&pIcons_LOD->pTextures[v35] : 0), v39, (signed __int64)v40, 0, 255); goto LABEL_93; } v38 = pIcons_LOD; v169 = "sptext01"; v39 = &pIcons_LOD->pTextures[v38->LoadTexture(v169, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v219 + 20) &= 0xFu; ptr_50C9A4 = 0; } v40 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2c, a3c, (Texture *)(v35 != -1 ? (int)&pIcons_LOD->pTextures[v35] : 0), v39, (signed __int64)v40, 0, 255); goto LABEL_93; } v184 = 9; break; } v33 = v184; goto LABEL_74; } v33 = 5; goto LABEL_72; } if ( (*(int *)(v22 + 20) & 0xF0) != 16 ) { if ( (*(int *)(v22 + 20) & 0xF0) == 32 ) { v168 = "sp28a"; } else { if ( (*(int *)(v22 + 20) & 0xF0) != 64 ) { v26 = pIcons_LOD; if ( (*(int *)(v22 + 20) & 0xF0) == 128 ) { v168 = "sp91a"; a2b = &pIcons_LOD->pTextures[v26->LoadTexture(v168, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v22 + 20) &= 0xFu; ptr_50C9A4 = 0; } v27 = (Texture *)(v241 != -1 ? (int)&pIcons_LOD->pTextures[v241] : 0); v28 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(v24, a3b, v27, a2b, (signed __int64)v28, 0, 255); goto LABEL_57; } v168 = "sptext01"; a2b = &pIcons_LOD->pTextures[v26->LoadTexture(v168, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v22 + 20) &= 0xFu; ptr_50C9A4 = 0; } v27 = (Texture *)(v241 != -1 ? (int)&pIcons_LOD->pTextures[v241] : 0); v28 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(v24, a3b, v27, a2b, (signed __int64)v28, 0, 255); goto LABEL_57; } v168 = "sp30a"; } v26 = pIcons_LOD; a2b = &pIcons_LOD->pTextures[v26->LoadTexture(v168, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v22 + 20) &= 0xFu; ptr_50C9A4 = 0; } v27 = (Texture *)(v241 != -1 ? (int)&pIcons_LOD->pTextures[v241] : 0); v28 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(v24, a3b, v27, a2b, (signed __int64)v28, 0, 255); goto LABEL_57; } v26 = pIcons_LOD; v168 = "sptext01"; a2b = &pIcons_LOD->pTextures[v26->LoadTexture(v168, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v22 + 20) &= 0xFu; ptr_50C9A4 = 0; } v27 = (Texture *)(v241 != -1 ? (int)&pIcons_LOD->pTextures[v241] : 0); v28 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(v24, a3b, v27, a2b, (signed __int64)v28, 0, 255); goto LABEL_57;; } a3 = pPaperdoll_BodyY; a2 = pPaperdoll_BodyX; v240 = 4 * uPlayerID_ - 4; pRenderer->DrawTextureTransparent(pPaperdoll_BodyX, pPaperdoll_BodyY, (Texture *)(*(unsigned int *)((char *)papredoll_dbods + v240) != -1 ? (int)&pIcons_LOD->pTextures[*(unsigned int *)((char *)papredoll_dbods + v240)] : 0)); if ( !bRingsShownInCharScreen ) pRenderer->_4A612A(a2, a3, (Texture *)(*(unsigned int *)((char *)papredoll_dbods + v240) != -1 ? (int)&pIcons_LOD->pTextures[*(unsigned int *)((char *)papredoll_dbods + v240)] : 0), pPlayer->pEquipment.uBody); uPlayerID_a = 2 * pBodyComplection; v6 = pPlayer->pEquipment.uMainHand; if ( !v6 || (v7 = *(int *)&pPlayer->pInventoryItems[v6-1], pItemsTable->pItems[v7].uEquipType != 1) && (pItemsTable->pItems[v7].uSkillType != 4 || pPlayer->pEquipment.uOffHand) ) pRenderer->DrawTextureTransparent(pPaperdoll_BodyX + pPaperdoll_LeftHand[pBodyComplection][0], pPaperdoll_BodyY + pPaperdoll_LeftHand[pBodyComplection][1], (Texture *)(*(unsigned int *)((char *)papredoll_dlads + v240) != -1 ? (int)&pIcons_LOD->pTextures[*(unsigned int *)((char *)papredoll_dlads + v240)] : 0)); v8 = pPlayer->pEquipment.uMainHand; if ( v8 ) { v229 = pPlayer->pEquipment.uMainHand; v9 = (int)&pPlayer->pInventoryItems[v8-1]; // v10 = pBodyComplection << 7; v218 = v9; v11 = *(int *)v9; v12 = *(int *)v9; v13 = pPaperdoll_BodyX + paperdoll_Weapon[pBodyComplection][1][0] - pItemsTable->pItems[v12].uEquipX; a2a = v13; a3a = pPaperdoll_BodyY + paperdoll_Weapon[pBodyComplection][1][1] - pItemsTable->pItems[v12].uEquipY; if ( v11 == 64 ) v166 = "item64v1"; else v166 = pItemsTable->pItems[v12].pIconName; v14 = pIcons_LOD->LoadTexture(v166, TEXTURE_16BIT_PALETTE); v15 = *(int *)(v218 + 20); if ( *(int *)(v218 + 20) & 0xF0 ) { if ( (*(int *)(v218 + 20) & 0xF0) != 16 ) { if ( (*(int *)(v218 + 20) & 0xF0) == 32 ) { v167 = "sp28a"; //v16 = (Texture *)(72 * pIcons_LOD->LoadTexture(v167, TEXTURE_16BIT_PALETTE) + 7145548); v16 = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v167, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v218 + 20) &= 0xFu; ptr_50C9A4 = 0; } v17 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(v13, a3a, (Texture *)(v14 != -1 ? (int)&pIcons_LOD->pTextures[v14] : 0), v16, (signed __int64)v17, 0, 255); goto LABEL_393;; } if ( (*(int *)(v218 + 20) & 0xF0) == 64 ) { v167 = "sp30a"; //v16 = (Texture *)(72 * pIcons_LOD->LoadTexture(v167, TEXTURE_16BIT_PALETTE) + 7145548); v16 = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v167, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v218 + 20) &= 0xFu; ptr_50C9A4 = 0; } v17 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(v13, a3a, (Texture *)(v14 != -1 ? (int)&pIcons_LOD->pTextures[v14] : 0), v16, (signed __int64)v17, 0, 255); goto LABEL_393; } if ( (*(int *)(v218 + 20) & 0xF0) == 128 ) { v167 = "sp91a"; //v16 = (Texture *)(72 * pIcons_LOD->LoadTexture(v167, TEXTURE_16BIT_PALETTE) + 7145548); v16 = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v167, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v218 + 20) &= 0xFu; ptr_50C9A4 = 0; } v17 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(v13, a3a, (Texture *)(v14 != -1 ? (int)&pIcons_LOD->pTextures[v14] : 0), v16, (signed __int64)v17, 0, 255); goto LABEL_393; } } v167 = "sptext01"; //v16 = (Texture *)(72 * pIcons_LOD->LoadTexture(v167, TEXTURE_16BIT_PALETTE) + 7145548); v16 = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(v167, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v218 + 20) &= 0xFu; ptr_50C9A4 = 0; } v17 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(v13, a3a, (Texture *)(v14 != -1 ? (int)&pIcons_LOD->pTextures[v14] : 0), v16, (signed __int64)v17, 0, 255); goto LABEL_393; } v18 = v14 + 1; v19 = (char *)&pIcons_LOD->pTextures[v14]; if ( v15 & 2 ) { v20 = (Texture *)(v18 != 0 ? (int)v19 : 0); pRenderer->DrawTransparentRedShade(a2a, a3a, v20); } else { if ( v15 & 1 ) { v20 = (Texture *)(v18 != 0 ? (int)v19 : 0); pRenderer->DrawTextureTransparent(a2a, a3a, v20); } else { v20 = (Texture *)(v18 != 0 ? (int)v19 : 0); pRenderer->DrawTransparentGreenShade(a2a, a3a, v20); } } if ( !bRingsShownInCharScreen ) pRenderer->_4A612A(a2a, a3a, v20, v229); } LABEL_393: pRenderer->DrawTextureTransparent(pPaperdoll_BodyX + pPaperdoll_RightHand[uPlayerID_a], pPaperdoll_BodyY + pPaperdoll_RightHand[uPlayerID_a + 1], (Texture *)(*(unsigned int *)((char *)papredoll_drhs + v240) != -1 ? (int)&pIcons_LOD->pTextures[*(unsigned int *)((char *)papredoll_drhs + v240)] : 0)); v161 = pPlayer->pEquipment.uMainHand; if ( v161 ) { v162 = *(int *)&pPlayer->pInventoryItems[v161-1]; if ( pItemsTable->pItems[v162].uEquipType == 1 || pItemsTable->pItems[v162].uSkillType == 4 && !pPlayer->pEquipment.uOffHand ) pRenderer->DrawTextureTransparent(pPaperdoll_BodyX + pPaperdoll_SecondLeftHand[0][uPlayerID_a], pPaperdoll_BodyY + pPaperdoll_SecondLeftHand[0][uPlayerID_a + 1], (Texture *)(*(unsigned int *)((char *)papredoll_dlhus + v240) != -1 ? (int)&pIcons_LOD->pTextures[*(unsigned int *)((char *)papredoll_dlhus + v240)] : 0)); } if ( !bRingsShownInCharScreen ) pRenderer->DrawTextureTransparent(0x25Bu, 0x12Bu, (Texture *)(uTextureID_MAGNIF_B != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_MAGNIF_B] : 0)); pRenderer->DrawTextureTransparent(0x1D4u, 0, (Texture *)(uTextureID_507B04 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_507B04] : 0)); } //----- (0043E825) -------------------------------------------------------- void __fastcall CharacterUI_DrawPaperdollWithRingOverlay(unsigned int uPlayerID) { unsigned int v1; // ebx@1 Player *pPlayer; // edi@1 int v3; // ecx@1 int *v4; // edi@3 unsigned int v5; // ebx@3 int v6; // eax@3 LODFile_IconsBitmaps *v7; // ecx@7 double v8; // st7@16 int v9; // edi@17 Texture *v10; // edi@18 unsigned __int8 v11; // zf@19 Texture *v12; // eax@19 char v13; // sf@24 unsigned __int8 v14; // of@24 unsigned int v15; // eax@25 unsigned int v16; // ebx@26 int v17; // eax@26 LODFile_IconsBitmaps *v18; // ecx@30 double v19; // st7@39 int v20; // edi@40 int v21; // eax@41 signed int v22; // ebx@41 Texture *v23; // edi@41 int v24; // eax@42 char *v25; // eax@42 unsigned int v26; // eax@46 int v27; // edi@47 unsigned int v28; // ebx@47 int v29; // eax@47 LODFile_IconsBitmaps *v30; // ecx@51 Texture *v31; // esi@58 double v32; // st7@60 int v33; // esi@61 int v34; // esi@62 Texture *v35; // eax@63 const char *v36; // [sp-8h] [bp-38h]@8 const char *v37; // [sp-8h] [bp-38h]@31 const char *v38; // [sp-8h] [bp-38h]@52 int v39; // [sp+10h] [bp-20h]@3 Texture *v40; // [sp+10h] [bp-20h]@14 int v41; // [sp+10h] [bp-20h]@26 Texture *v42; // [sp+10h] [bp-20h]@37 int v43; // [sp+10h] [bp-20h]@47 unsigned int a3; // [sp+14h] [bp-1Ch]@3 unsigned int a2; // [sp+18h] [bp-18h]@3 unsigned int *v46; // [sp+1Ch] [bp-14h]@1 Player *v47; // [sp+20h] [bp-10h]@1 int v48; // [sp+24h] [bp-Ch]@1 int v49; // [sp+24h] [bp-Ch]@26 v1 = uPlayerID; pPlayer = pPlayers[uPlayerID]; v47 = pPlayers[uPlayerID]; pIcons_LOD->LoadTexture("sptext01", TEXTURE_16BIT_PALETTE); CharacterUI_DrawPaperdoll(v1); pRenderer->DrawTextureTransparent(0x1D9u, 0, (Texture *)(uTextureID_BACKHAND != -1 ? &pIcons_LOD->pTextures[uTextureID_BACKHAND] : 0)); pRenderer->DrawTextureTransparent(0x1D4u, 0, (Texture *)(uTextureID_507B04 != -1 ? &pIcons_LOD->pTextures[uTextureID_507B04] : 0)); pRenderer->DrawTextureIndexed(pCharacterScreen_DetalizBtn->uX, pCharacterScreen_DetalizBtn->uY, (Texture *)(uTextureID_5118C8 != -1 ? &pIcons_LOD->pTextures[uTextureID_5118C8] : 0)); v3 = 0; v46 = &pPlayer->pEquipment.field_28; v48 = 0; do { if ( !*v46 ) goto LABEL_24; v39 = *v46; v4 = (int *)&pPlayer->pInventoryItems[*v46-1].uItemID; a3 = pPaperdollRingsY[v3]; a2 = pPaperdollRingsX[v3]; v5 = pIcons_LOD->LoadTexture(pItemsTable->pItems[*v4].pIconName, TEXTURE_16BIT_PALETTE); v6 = *(int *)(v4 + 20); if ( *(int *)(v4 + 20) & 0xF0 ) { if ( (*(int *)(v4 + 20) & 0xF0) != 16 ) { if ( (*(int *)(v4 + 20) & 0xF0) == 32 ) { v36 = "sp28a"; } else { if ( (*(int *)(v4 + 20) & 0xF0) != 64 ) { v7 = pIcons_LOD; if ( (*(int *)(v4 + 20) & 0xF0) == 128 ) { v36 = "sp91a"; LABEL_14: v40 = &pIcons_LOD->pTextures[v7->LoadTexture(v36, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v4 + 20) &= 0xFu; ptr_50C9A4 = 0; } v8 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(a2, a3, (Texture *)(v5 != -1 ? (int)&pIcons_LOD->pTextures[v5] : 0), v40, (signed __int64)v8, 0, 255); goto LABEL_23; } LABEL_13: v36 = "sptext01"; goto LABEL_14; } v36 = "sp30a"; } v7 = pIcons_LOD; goto LABEL_14; } v7 = pIcons_LOD; goto LABEL_13; } v9 = v5 + 1; if ( v6 & 2 ) { v10 = (Texture *)(v9 != 0 ? (int)&pIcons_LOD->pTextures[v5] : 0); pRenderer->DrawTransparentRedShade(a2, a3, v10); } else { v11 = (v6 & 1) == 0; v12 = &pIcons_LOD->pTextures[v5]; if ( v11 ) { v10 = (Texture *)(v9 != 0 ? (int)v12 : 0); pRenderer->DrawTransparentGreenShade(a2, a3, v10); } else { v10 = (Texture *)(v9 != 0 ? (int)v12 : 0); pRenderer->DrawTextureTransparent(a2, a3, v10); } } pRenderer->_4A601E(a2, a3, v10, v39); LABEL_23: pPlayer = v47; LABEL_24: v46 += 4; v3 = v48 + 4; v14 = __OFSUB__(v48 + 4, 20); v11 = v48 == 16; v13 = v48 - 16 < 0; v48 += 4; } while ( (unsigned __int8)(v13 ^ v14) | v11 ); v15 = pPlayer->pEquipment.field_24; if ( !v15 ) goto LABEL_46; v41 = pPlayer->pEquipment.field_24; v49 = (int)&pPlayer->pInventoryItems[v15-1]; v16 = pIcons_LOD->LoadTexture(pItemsTable->pItems[*(int *)v49].pIconName, TEXTURE_16BIT_PALETTE); v17 = *(int *)(v49 + 20); if ( !(*(int *)(v49 + 20) & 0xF0) ) { v20 = v16 + 1; if ( v17 & 2 ) { v21 = 9 * v16; v22 = 493; v23 = (Texture *)(v20 != 0 ? (int)&pIcons_LOD->pTextures[8 * v21 / 0x48u] : 0); pRenderer->DrawTransparentRedShade(0x1EDu, 0x5Bu, v23); } else { v11 = (v17 & 1) == 0; v24 = 9 * v16; v22 = 493; v25 = (char *)&pIcons_LOD->pTextures[8 * v24 / 0x48u]; if ( v11 ) { v23 = (Texture *)(v20 != 0 ? (int)v25 : 0); pRenderer->DrawTransparentGreenShade(493, 91, v23); } else { v23 = (Texture *)(v20 != 0 ? (int)v25 : 0); pRenderer->DrawTextureTransparent(0x1EDu, 0x5Bu, v23); } } pRenderer->_4A601E(v22, 91, v23, v41); pPlayer = v47; goto LABEL_46; } if ( (*(int *)(v49 + 20) & 0xF0) == 16 ) { v18 = pIcons_LOD; goto LABEL_36; } if ( (*(int *)(v49 + 20) & 0xF0) == 32 ) { v37 = "sp28a"; goto LABEL_34; } if ( (*(int *)(v49 + 20) & 0xF0) == 64 ) { v37 = "sp30a"; LABEL_34: v18 = pIcons_LOD; goto LABEL_37; } v18 = pIcons_LOD; if ( (*(int *)(v49 + 20) & 0xF0) == 128 ) { v37 = "sp91a"; goto LABEL_37; } LABEL_36: v37 = "sptext01"; LABEL_37: v42 = &pIcons_LOD->pTextures[v18->LoadTexture(v37, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v49 + 20) &= 0xFu; ptr_50C9A4 = 0; } v19 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6( 0x1EDu, 0x5Bu, (Texture *)(v16 != -1 ? (int)&pIcons_LOD->pTextures[v16] : 0), v42, (signed __int64)v19, 0, 255); LABEL_46: v26 = pPlayer->pEquipment.field_1C; if ( !v26 ) return; v43 = pPlayer->pEquipment.field_1C; v27 = (int)&pPlayer->pInventoryItems[v26-1]; v28 = pIcons_LOD->LoadTexture(pItemsTable->pItems[*(int *)v27].pIconName, TEXTURE_16BIT_PALETTE); v29 = *(int *)(v27 + 20); if ( !(*(int *)(v27 + 20) & 0xF0) ) { v33 = v28 + 1; if ( v29 & 2 ) { v34 = v33 != 0 ? (int)&pIcons_LOD->pTextures[v28] : 0; pRenderer->DrawTransparentRedShade(0x24Au, 0x58u, (Texture *)v34); } else { v11 = (v29 & 1) == 0; v35 = &pIcons_LOD->pTextures[v28]; if ( v11 ) { v34 = v33 != 0 ? (int)v35 : 0; pRenderer->DrawTransparentGreenShade(586, 88, (Texture *)v34); } else { v34 = v33 != 0 ? (int)v35 : 0; pRenderer->DrawTextureTransparent(0x24Au, 0x58u, (Texture *)v34); } } pRenderer->_4A601E(586, 88, (Texture *)v34, v43); return; } if ( (*(int *)(v27 + 20) & 0xF0) == 16 ) { v30 = pIcons_LOD; goto LABEL_57; } if ( (*(int *)(v27 + 20) & 0xF0) == 32 ) { v38 = "sp28a"; goto LABEL_55; } if ( (*(int *)(v27 + 20) & 0xF0) == 64 ) { v38 = "sp30a"; LABEL_55: v30 = pIcons_LOD; goto LABEL_58; } v30 = pIcons_LOD; if ( (*(int *)(v27 + 20) & 0xF0) == 128 ) { v38 = "sp91a"; goto LABEL_58; } LABEL_57: v38 = "sptext01"; LABEL_58: v31 = &pIcons_LOD->pTextures[v30->LoadTexture(v38, TEXTURE_16BIT_PALETTE)]; dword_50C9A8 -= pEventTimer->uTimeElapsed; if ( dword_50C9A8 <= 0 ) { dword_50C9A8 = 0; *(char *)(v27 + 20) &= 0xFu; ptr_50C9A4 = 0; } v32 = (double)GetTickCount() * 0.1; pRenderer->_4A63E6(0x24Au, 0x58u, (Texture *)(v28 != -1 ? (int)&pIcons_LOD->pTextures[v28] : 0), v31, (signed __int64)v32, 0, 255); } //----- (0043ED6F) -------------------------------------------------------- bool _43ED6F_check_party_races(bool a1) { bool v6; // zf@5 for (uint i = 0; i < 4; ++i) { auto player = pParty->pPlayers + i; auto race = player->GetRace(); if (race != CHARACTER_RACE_HUMAN && race != CHARACTER_RACE_ELF && race != CHARACTER_RACE_GOBLIN) v6 = a1 == 1; else v6 = !a1; if (v6) return true; } return false; } // A750D8: using guessed type __int64 qword_A750D8; //----- (0043EDB9) -------------------------------------------------------- bool __thiscall sub_43EDB9_get_some_race_sex_relation_2(unsigned int a1) { unsigned int pNum; // ebp@1 Player **pPlayer; // ebx@1 Player *pPlayer2; // esi@2 enum CHARACTER_RACE pRace; // edi@2 bool pSex; // eax@2 char v6; // zf@7 //pPlayer = &pPlayers[1]; /*pNum = a1; while ( 1 ) { pPlayer2 = *pPlayer; pRace = pPlayer2->GetRace(); pSex = pPlayer2->GetSexByVoice(); if ( !pRace ) break; if ( pRace == 1 || pRace == 2 ) break; if ( !pSex && pNum == 2 )// //goto LABEL_15; { pSex = 1; return pSex; } v6 = pNum == 3;// LABEL_11: if ( v6 ) //goto LABEL_15; { pSex = 1; return pSex; } ++pPlayer; if ( (signed int)pPlayer >= (signed int)&qword_A750D8 )// { pSex = 0; return pSex; } } if ( pSex || pNum ) { v6 = pNum == 1; goto LABEL_11; } //LABEL_15: pSex = 1; return pSex;*/ for (uint i = 1; i <= 4; pPlayers[i]) { pRace = pPlayers[i]->GetRace(); pSex = pPlayers[i]->GetSexByVoice(); if (pRace == 0 || pRace == 1 || pRace == 2 || pSex == 0 ) return 1; } return 0; } // A750D8: using guessed type __int64 qword_A750D8; //----- (0043EE15) -------------------------------------------------------- bool __fastcall sub_43EE15_player_has_item(unsigned int uItemID, Player *pPlayer, char a3) { bool result; // eax@0 signed int v4; // edi@3 int *v5; // esi@3 signed int v6; // edi@7 bool *v7; // esi@7 if ( !a3 || pParty->pPickedItem.uItemID != uItemID ) { v4 = 0; v5 = pPlayer->pInventoryIndices; while ( 1 ) { if ( *v5 ) { result = 9 * *v5; if ( *(int *)&pPlayer->pInventoryItems[*v5-1] == uItemID ) break; } ++v4; ++v5; if ( v4 >= 126 ) { v6 = 0; v7 = (bool *)&pPlayer->pEquipment; while ( 1 ) { result = *v7; if ( *v7 ) { result *= 9; if ( *(int *)&pPlayer->spellbook.pDarkSpellbook.bIsSpellAvailable[4 * result + 5] == uItemID ) break; } ++v6; ++v7; if ( v6 >= 16 ) { LOBYTE(result) = 0; return result; } } break; } } } LOBYTE(result) = 1; return result; } //----- (0043EE77) -------------------------------------------------------- bool __fastcall sub_43EE77_ProbablyIfUnderwaterSuitIsEquipped(signed int a1) { bool result; // eax@0 Player *v2; // edx@3 int v3; // ecx@3 Player **pPlayers; // esi@8 unsigned int v5; // ecx@8 Player *v6; // edx@9 if ( a1 < 1 || a1 > 4 ) { if ( !a1 ) { pPlayers = &::pPlayers[1]; v5 = 604; while ( 1 ) { result = sub_43EE15_player_has_item(v5, *pPlayers, 0); if ( !result ) break; result = v6->pEquipment.uBody; if ( !result ) break; result *= 9; if ( *(int *)&v6->spellbook.pDarkSpellbook.bIsSpellAvailable[4 * result + 5] != v5 ) break; ++pPlayers; if ( (signed int)pPlayers >= (signed int)&qword_A750D8 ) goto LABEL_13; } } goto LABEL_6; } result = sub_43EE15_player_has_item(604u, ::pPlayers[a1], 0); if ( !result || (result = v2->pEquipment.uBody) == 0 || (result *= 9, *(int *)&v2->spellbook.pDarkSpellbook.bIsSpellAvailable[4 * result + 5] != v3) ) { LABEL_6: LOBYTE(result) = 0; return result; } LABEL_13: LOBYTE(result) = 1; return result; } // A750D8: using guessed type __int64 qword_A750D8; //----- (0043EF2B) -------------------------------------------------------- void __fastcall WetsuitOn(unsigned int uPlayerID) { unsigned int v1; // ebx@1 Player **v2; // esi@2 enum CHARACTER_RACE v3; // edi@2 signed int v4; // eax@2 int v5; // ecx@5 unsigned __int8 v6; // al@7 char pContainer[20]; // [sp+4h] [bp-1Ch]@7 unsigned int v8; // [sp+18h] [bp-8h]@1 int v9; // [sp+1Ch] [bp-4h]@7 v1 = uPlayerID - 1; v8 = uPlayerID; if ( ((uPlayerID - 1) & 0x80000000u) == 0 ) { v2 = &pPlayers[uPlayerID]; v3 = (*v2)->GetRace(); v4 = (*v2)->GetSexByVoice(); if ( v3 && v3 != 1 && v3 != 2 ) v5 = (v4 != 0) + 3; else v5 = (v4 != 0) + 1; v9 = v5; wsprintfA(pContainer, "pc23v%dBod", v5); papredoll_dbods[v1] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); wsprintfA(pContainer, "pc23v%dlad", v9); papredoll_dlads[v1] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); wsprintfA(pContainer, "pc23v%dlau", v9); papredoll_dlaus[v1] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); wsprintfA(pContainer, "pc23v%drh", v9); papredoll_drhs[v1] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); wsprintfA(pContainer, "pc23v%dlh", v9); papredoll_dlhs[v1] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); wsprintfA(pContainer, "pc23v%dlhu", v9); papredoll_dlhus[v1] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); v6 = pPlayers[v1 + 1]->uFace; if ( v6 == 12 || v6 == 13 ) papredoll_dbrds[pPlayers[v8]->uFace] = 0; papredoll_flying_feet[pPlayers[v8]->uFace] = 0; IsPlayerWearingWatersuit[v8] = 1; } } //----- (0043F0BD) -------------------------------------------------------- unsigned int __fastcall WetsuitOff(unsigned int uPlayerID) { unsigned int result; // eax@1 Player **v2; // edi@2 unsigned int v3; // ebx@2 int v4; // ebx@2 char v5; // al@2 char pContainer[20]; // [sp+0h] [bp-18h]@4 unsigned int v7; // [sp+14h] [bp-4h]@1 result = uPlayerID - 1; v7 = uPlayerID; if ( ((uPlayerID - 1) & 0x80000000u) == 0 ) { v2 = &pPlayers[uPlayerID]; v3 = uPlayerID - 1; papredoll_dbods[v3] = pIcons_LOD->LoadTexture(dbod_texnames_by_face[(*v2)->uFace], TEXTURE_16BIT_PALETTE); papredoll_dlads[v3] = pIcons_LOD->LoadTexture(dlad_texnames_by_face[(*v2)->uFace], TEXTURE_16BIT_PALETTE); papredoll_dlaus[v3] = pIcons_LOD->LoadTexture(dlau_texnames_by_face[(*v2)->uFace], TEXTURE_16BIT_PALETTE); papredoll_drhs[v3] = pIcons_LOD->LoadTexture(drh_texnames_by_face[(*v2)->uFace], TEXTURE_16BIT_PALETTE); papredoll_dlhs[v3] = pIcons_LOD->LoadTexture(dlh_texnames_by_face[(*v2)->uFace], TEXTURE_16BIT_PALETTE); papredoll_dlhus[v3] = pIcons_LOD->LoadTexture(dlhu_texnames_by_face[(*v2)->uFace], TEXTURE_16BIT_PALETTE); v4 = (int)&(*v2)->uFace; v5 = *(char *)v4; if ( *(char *)v4 == 12 || v5 == 13 ) { wsprintfA(pContainer, "pc%02dbrd", v5 + 1); v4 = (int)&(*v2)->uFace; papredoll_dbrds[*(char *)v4] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); } wsprintfA(pContainer, "item281pc%02d", *(char *)v4 + 1); papredoll_flying_feet[(*v2)->uFace] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); result = v7; IsPlayerWearingWatersuit[v7] = 0; } return result; } //----- (0043F333) -------------------------------------------------------- void BspRenderer::MakeVisibleSectorList() { int v6; // ebx@3 uNumVisibleNotEmptySectors = 0; for (uint i = 0; i < std__vector_000FA8; ++i) { v6 = 0; if (!uNumVisibleNotEmptySectors) { //LABEL_7: pVisibleSectorIDs_toDrawDecorsActorsEtcFrom[uNumVisibleNotEmptySectors++] = field_FA8[i].uSectorID; } else { while (pVisibleSectorIDs_toDrawDecorsActorsEtcFrom[v6] != field_FA8[i].uSectorID ) { ++v6; if ( v6 >= uNumVisibleNotEmptySectors) { pVisibleSectorIDs_toDrawDecorsActorsEtcFrom[uNumVisibleNotEmptySectors++] = field_FA8[i].uSectorID; continue; } } } } } //----- (0043F515) -------------------------------------------------------- void MessWithBillboards_BLV() { for (uint i = 0; i < uNumBillboardsToDraw; ++i) { auto p = pBillboardRenderList + i; if (p->field_1E & 2 || uCurrentlyLoadedLevelType == LEVEL_Indoor && !p->uIndoorSectorID) p->uPaletteSubindex = 0; else p->uPaletteSubindex = _43F55F_get_billboard_light_level(p, -1); } } //----- (0043F55F) -------------------------------------------------------- int __fastcall _43F55F_get_billboard_light_level(RenderBillboard *a1, int uBaseLightLevel) { signed int v3; // ecx@2 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor ) { v3 = pIndoor->pSectors[a1->uIndoorSectorID].uMinAmbientLightLevel; } else { if ( uBaseLightLevel == -1 ) v3 = a1->uPaletteSubindex; else v3 = uBaseLightLevel; } return _43F5C8_get_point_light_level_with_respect_to_lights(v3, a1->uIndoorSectorID, a1->world_x, a1->world_y, a1->world_z); } //----- (0043F5C8) -------------------------------------------------------- int __fastcall _43F5C8_get_point_light_level_with_respect_to_lights(unsigned int uBaseLightLevel, int uSectorID, float x, float y, float z) { int v5; // esi@1 signed int v6; // edi@1 int v8; // eax@6 int v9; // ebx@6 unsigned int v10; // ecx@6 unsigned int v11; // edx@9 unsigned int v12; // edx@11 signed int v13; // ecx@12 BLVLightMM7 *v16; // esi@20 int v17; // ebx@21 int v18; // eax@24 int v19; // ebx@24 unsigned int v20; // ecx@24 int v21; // edx@25 unsigned int v22; // edx@27 unsigned int v23; // edx@29 signed int v24; // ecx@30 int v26; // ebx@35 int v27; // eax@38 int v28; // ebx@38 unsigned int v29; // ecx@38 int v30; // edx@39 unsigned int v31; // edx@41 unsigned int v32; // edx@43 signed int v33; // ecx@44 int v37; // [sp+Ch] [bp-18h]@37 int v38; // [sp+10h] [bp-14h]@5 int v39; // [sp+10h] [bp-14h]@23 int v40; // [sp+10h] [bp-14h]@36 int v42; // [sp+14h] [bp-10h]@22 unsigned int v43; // [sp+18h] [bp-Ch]@12 unsigned int v44; // [sp+18h] [bp-Ch]@30 unsigned int v45; // [sp+18h] [bp-Ch]@44 v6 = uBaseLightLevel; for (uint i = 0; i < pMobileLightsStack->uNumLightsActive; ++i) { auto p = pMobileLightsStack->pLights + i; auto distX = abs(p->vPosition.x - x); if ( distX <= p->uRadius) { auto distY = abs(p->vPosition.y - y); if ( distY <= p->uRadius) { auto distZ = abs(p->vPosition.z - z); if ( distZ <= p->uRadius) { v8 = distX; v9 = distY; v10 = distZ; if (distX < distY) { v8 = distY; v9 = distX; } if ( v8 < distZ ) { v11 = v8; v8 = distZ; v10 = v11; } if ( v9 < (signed int)v10 ) { v12 = v10; v10 = v9; v9 = v12; } v43 = ((unsigned int)(11 * v9) / 32) + (v10 / 4) + v8; v13 = p->uRadius; if ( (signed int)v43 < v13 ) v6 += ((unsigned __int64)(30i64 * (signed int)(v43 << 16) / v13) >> 16) - 30; } } } } if ( uCurrentlyLoadedLevelType == LEVEL_Indoor) { auto pSector = pIndoor->pSectors + uSectorID; for (uint i = 0; i < pSector->uNumLights; ++i) { v16 = pIndoor->pLights + pSector->pLights[i]; if (~v16->uAtributes & 8) { v17 = abs(v16->vPosition.x - x); if ( v17 <= v16->uRadius ) { v42 = abs(v16->vPosition.y - y); if ( v42 <= v16->uRadius ) { v39 = abs(v16->vPosition.z - z); if ( v39 <= v16->uRadius ) { v18 = v17; v19 = v42; v20 = v39; if ( v18 < v42 ) { v21 = v18; v18 = v42; v19 = v21; } if ( v18 < v39 ) { v22 = v18; v18 = v39; v20 = v22; } if ( v19 < (signed int)v20 ) { v23 = v20; v20 = v19; v19 = v23; } v44 = ((unsigned int)(11 * v19) >> 5) + (v20 >> 2) + v18; v24 = v16->uRadius; if ( (signed int)v44 < v24 ) v6 += ((unsigned __int64)(30i64 * (signed int)(v44 << 16) / v24) >> 16) - 30; } } } } } } for (uint i = 0; i < pStationaryLightsStack->uNumLightsActive; ++i) { auto p = pStationaryLightsStack->pLights + i; v26 = abs(p->vPosition.x - x); if ( v26 <= p->uRadius) { v40 = abs(p->vPosition.y - y); if ( v40 <= p->uRadius) { v37 = abs(p->vPosition.z - z); if ( v37 <= p->uRadius) { v27 = v26; v28 = v40; v29 = v37; if ( v27 < v40 ) { v30 = v27; v27 = v40; v28 = v30; } if ( v27 < v37 ) { v31 = v27; v27 = v37; v29 = v31; } if ( v28 < (signed int)v29 ) { v32 = v29; v29 = v28; v28 = v32; } v45 = ((unsigned int)(11 * v28) >> 5) + (v29 >> 2) + v27; v33 = p->uRadius; if ( (signed int)v45 < v33 ) v6 += ((unsigned __int64)(30i64 * (signed int)(v45 << 16) / v33) >> 16) - 30; } } } } if ( v6 <= 31 ) { if ( v6 < 0 ) v6 = 0; } else { v6 = 31; } return v6; } //----- (00406051) -------------------------------------------------------- __int16 stru262_TurnBased::StartTurn() { stru262_TurnBased *v1; // esi@1 int v2; // ecx@1 int v3; // ebx@1 char *v4; // edi@1 int v5; // eax@4 int v6; // eax@12 char *v7; // eax@15 TurnBased_QueueElem *v8; // edi@17 unsigned int v9; // edx@23 char *v10; // eax@26 int v11; // eax@30 int v12; // ebx@30 char *v13; // edi@31 int v15; // [sp+Ch] [bp-10h]@5 TurnBased_QueueElem *v16; // [sp+10h] [bp-Ch]@3 int v17; // [sp+14h] [bp-8h]@2 int v18; // [sp+14h] [bp-8h]@16 signed int v19; // [sp+18h] [bp-4h]@1 int v20; // [sp+18h] [bp-4h]@14 v1 = this; v2 = 0; v19 = 0; v3 = v1->uActorQueueSize; v1->field_1C = 0; v4 = (char *)&v1->pQueue[v3].field_4; do { v17 = v2; if ( v1->uActorQueueSize <= v2 ) goto LABEL_11; v16 = v1->pQueue; while ( 1 ) { v5 = v16->uPackedID; if ( (v16->uPackedID & 7) == OBJECT_Player) break; LABEL_8: ++v17; ++v16; if ( v17 >= v1->uActorQueueSize ) goto LABEL_11; } v15 = v5 >> 3; if ( !pPlayers[(v5 >> 3) + 1]->CanAct() || v19 != v15 ) { v2 = 0; goto LABEL_8; } v2 = 0; LABEL_11: if ( v17 == v1->uActorQueueSize ) { *(int *)v4 = 100; v6 = 8 * v19; LOBYTE(v6) = 8 * v19 | 4; *((int *)v4 + 2) = v2; *((int *)v4 - 1) = v6; *((int *)v4 + 1) = v2; ++v3; v4 += 16; } ++v19; } while ( v19 < 4 ); v1->uActorQueueSize = v3; v20 = v2; if ( ai_arrays_size > v2 ) { v7 = (char *)&v1->pQueue[v3].field_4; do { v18 = v2; if ( v1->uActorQueueSize > v2 ) { v8 = v1->pQueue; do { if ( (v8->uPackedID & 7) == OBJECT_Actor && ai_near_actors_ids[v20] == v8->uPackedID >> 3 ) break; ++v18; ++v8; } while ( v18 < v1->uActorQueueSize ); v2 = 0; } if ( v18 == v1->uActorQueueSize ) { v9 = ai_near_actors_ids[v20]; *(int *)v7 = 1; *((int *)v7 + 2) = v2; *((int *)v7 - 1) = 8 * v9 | 3; *((int *)v7 + 1) = v2; ++v3; v7 += 16; } ++v20; } while ( v20 < ai_arrays_size ); } ++v1->field_0; v1->uActorQueueSize = v3; v1->field_10 = 100; if ( v3 > 0 ) { v10 = (char *)&v1->pQueue[0].field_4; do { if ( *(int *)v10 <= 0 ) *(int *)v10 = 100; ++v2; v10 += 16; } while ( v2 < v1->uActorQueueSize ); } LOWORD(v11) = v1->_4063A1(); v12 = 0; if ( v1->uActorQueueSize > 0 ) { v13 = (char *)&v1->pQueue[0].field_4; do { v11 = *((int *)v13 - 1) & 7; if ( (char)v11 == 4 ) break; if ( *(int *)v13 > 0 ) break; LOWORD(v11) = v1->_40680F(v12++); v13 += 16; } while ( v12 < v1->uActorQueueSize ); } return v11; } // 4F75D8: using guessed type int ai_arrays_size; //----- (004061CA) -------------------------------------------------------- void stru262_TurnBased::NextTurn() { stru262_TurnBased *v1; // esi@1 TurnBased_QueueElem *v2; // ebp@1 int v3; // ebx@1 int v4; // edi@7 Actor *v5; // eax@9 int v6; // ecx@9 signed int v7; // ebx@17 int v8; // ebp@27 TurnBased_QueueElem *v9; // edi@28 int v10; // ecx@30 unsigned __int16 v11; // ax@30 signed int v12; // edx@35 signed int v13; // [sp+10h] [bp-4h]@7 v1 = this; _404544(); v2 = v1->pQueue; v3 = 0; if ( (v1->pQueue[0].uPackedID & 7) == OBJECT_Player) uActiveCharacter = (v1->pQueue[0].uPackedID >> 3) + 1; else uActiveCharacter = 0; viewparams->bRedrawGameUI = 1; if ( v1->field_1C ) { pTurnEngine->field_18 |= 2u; return; } pTurnEngine->field_18 &= 0xFFFFFFFDu; if ( v1->pQueue[0].field_4 <= 0 ) return; v4 = 0; v13 = 0; if ( v1->uActorQueueSize <= 0 ) goto LABEL_27; do { if ( (v2->uPackedID & 7) != OBJECT_Player) { v5 = &pActors[v2->uPackedID >> 3]; LOWORD(v6) = v5->uAIState; if ( (short)v6 == 4 || (short)v6 == 8 || (short)v6 == 2 || (short)v6 == 3 || (short)v6 == 12 || (short)v6 == 13 || (short)v6 == 18 || (short)v6 == 17 ) { v7 = v5->uCurrentActionLength; v5->uCurrentActionTime += pEventTimer->uTimeElapsed; if ( (signed int)v5->uCurrentActionTime < v7 ) { v13 = 1; LABEL_19: v3 = 0; goto LABEL_20; } v6 = (signed __int16)v6; if ( (signed __int16)v6 == 4 ) { v3 = 0; v5->uAIState = Dead; v5->uCurrentActionTime = 0; v5->uCurrentActionLength = 0; v5->UpdateAnimation(); } else { if ( v6 != 8 ) goto LABEL_19; v3 = 0; Actor::AI_StandOrBored(v2->uPackedID >> 3, ai_near_actors_targets_pid[v2->uPackedID >> 3], 32, 0); } } } LABEL_20: ++v4; ++v2; } while ( v4 < v1->uActorQueueSize ); if ( v13 != v3 ) { v1->field_18 |= 1u; return; } LABEL_27: v1->field_18 &= 0xFFFFFFFEu; v8 = 0; if ( v1->uActorQueueSize > v3 ) { v9 = v1->pQueue; do { if ( (v9->uPackedID & 7) != OBJECT_Player) { v10 = v9->uPackedID >> 3; v11 = pActors[v10].uAIState; if ( v11 != 5 ) { if ( v11 != 4 && v11 != 11 && v11 != 19 ) { if ( v11 != 17 ) { v12 = ai_near_actors_targets_pid[v10]; v9->uActionLength = v3; Actor::AI_StandOrBored(v10, v12, 32, (AIDirection *)v3); } } } } ++v8; ++v9; } while ( v8 < v1->uActorQueueSize ); } v1->field_4 = 3; pParty->uTimePlayed += __PAIR__(v3, 213); _494035_timed_effects__water_walking_damage__etc(); v1->uActionPointsLeft = 130; } //----- (004063A1) -------------------------------------------------------- int stru262_TurnBased::_4063A1() { stru262_TurnBased *v1; // esi@1 int v2; // ebp@1 signed int result; // eax@1 int v4; // edx@1 int v5; // edx@3 int v6; // edi@4 int v7; // ecx@5 Actor *v8; // ecx@11 unsigned __int16 v9; // dx@12 int v10; // edi@16 int v11; // edx@17 char v12; // zf@18 v1 = this; _404544(); v2 = (int)&v1->pQueue[0].field_4; result = 1; viewparams->bRedrawGameUI = 1; v4 = v1->pQueue[0].field_4; if ( v4 ) { if ( (v1->pQueue[0].uPackedID & 7) == OBJECT_Player) { v5 = v1->uActorQueueSize; while ( 1 ) { v6 = 0; if ( v5 > 0 ) { v7 = (int)&v1->pQueue[0].field_4; do { --*(int *)v7; v5 = v1->uActorQueueSize; ++v6; v7 += 16; } while ( v6 < v5 ); } --v1->field_10; if ( v1->field_10 <= 0 ) break; if ( !*(int *)v2 ) goto LABEL_9; } LABEL_24: result = 1; } else { v8 = &pActors[v1->pQueue[0].uPackedID >> 3]; if ( v4 > 0 ) { do { v9 = v8->uAIState; if ( v9 == 5 ) break; if ( v9 == 4 || v9 == 19 || v9 == 11 ) break; v10 = 0; if ( v1->uActorQueueSize > 0 ) { v11 = (int)&v1->pQueue[0].field_4; do { v12 = (*(int *)v11)-- == 1; if ( v12 ) *(int *)(v11 + 4) = 0; ++v10; v11 += 16; } while ( v10 < v1->uActorQueueSize ); } --v1->field_10; if ( v1->field_10 <= 0 ) goto LABEL_24; } while ( *(int *)v2 > 0 ); } LABEL_9: result = 0; } } return result; } //----- (00406457) -------------------------------------------------------- int stru262_TurnBased::_406457(int a2) { stru262_TurnBased *v2; // esi@1 signed int v3; // eax@1 signed int v4; // ecx@2 char *v5; // edx@2 signed int v6; // eax@2 int result; // eax@11 int v8; // edx@13 int v9; // ecx@14 char v10; // zf@15 v2 = this; v3 = *(&this->field_0 + 4 * (a2 + 2)); if ( (*((char *)&this->field_0 + 16 * (a2 + 2)) & 7) == OBJECT_Player) { v4 = v3 >> 3; v5 = (char *)&pParty->pTurnBasedPlayerRecoveryTimes[v3 >> 3]; v6 = *(int *)v5; if ( *(int *)v5 ) *(int *)v5 = 0; else v6 = pPlayers[v4 + 1]->GetAttackRecoveryTime(0); if ( v6 < 30 ) v6 = 30; } else { v6 = pMonsterStats->pInfos[pActors[v3 >> 3].pMonsterInfo.uID].uRecoveryTime; } v2->pQueue[a2].field_4 = v6; v2->_404544(); if ( (v2->pQueue[0].uPackedID & 7) == OBJECT_Player) uActiveCharacter = (v2->pQueue[0].uPackedID >> 3) + 1; else uActiveCharacter = 0; result = (int)&v2->pQueue[0].field_4; viewparams->bRedrawGameUI = 1; while ( *(int *)result > 0 ) { if ( v2->field_10 <= 0 ) break; v8 = 0; if ( v2->uActorQueueSize > 0 ) { v9 = (int)&v2->pQueue[0].field_4; do { v10 = (*(int *)v9)-- == 1; if ( v10 ) *(int *)(v9 + 4) = 0; ++v8; v9 += 16; } while ( v8 < v2->uActorQueueSize ); } --v2->field_10; if ( v2->field_10 <= 0 ) break; } return result; } //----- (0040652A) -------------------------------------------------------- void stru262_TurnBased::_40652A() { char *v1; // edx@2 Actor *v2; // eax@5 unsigned __int16 v3; // si@5 unsigned int v4; // esi@8 int v5; // [sp+Ch] [bp-4h]@1 v5 = 0; if ( this->uActorQueueSize > 0 ) { v1 = (char *)&this->pQueue[0].field_4; do { if ( !*(int *)v1 ) { if ( (*(v1 - 4) & 7) == OBJECT_Player) return; v2 = &pActors[*((int *)v1 - 1) >> 3]; v3 = v2->uAIState; if (v3 == Standing || v3 == Fleeing || v3 == Fidgeting) { v4 = pMonsterStats->pInfos[v2->pMonsterInfo.uID].uRecoveryTime; *(int *)v1 = v4; if ( (signed __int64)v2->pActorBuffs[7].uExpireTime > 0 ) *(int *)v1 = 2 * v4; } } ++v5; v1 += 16; } while ( v5 < this->uActorQueueSize ); } } //----- (004065B0) -------------------------------------------------------- void stru262_TurnBased::_4065B0() { stru262_TurnBased *v1; // esi@1 signed int v2; // eax@1 int v3; // ebx@6 int v4; // edi@7 unsigned int v5; // edi@14 v1 = this; LOWORD(v2) = _404544(); if ( v1->pQueue[0].field_4 <= 0 || ((_4063A1(), v2 = v1->pQueue[0].uPackedID, (v1->pQueue[0].uPackedID & 7) != OBJECT_Player) ? (uActiveCharacter = 0) : (v2 = (v2 >> 3) + 1, uActiveCharacter = v2), viewparams->bRedrawGameUI = 1, v1->pQueue[0].field_4 <= 0) ) { v3 = 0; if ( v1->uActorQueueSize > 0 ) { v4 = (int)v1->pQueue; do { v2 = *(int *)v4; if ( (*(char *)v4 & 7) == OBJECT_Player || *(int *)(v4 + 4) > 0 ) break; if ( *(int *)(v4 + 8) <= 0 ) { LOWORD(v2) = v2 & 3; if ( (char)v2 == 3 ) LOWORD(v2) = v1->_40680F(v3); } ++v3; v4 += 16; } while ( v3 < v1->uActorQueueSize ); } } v5 = 0; if ( v1->uActorQueueSize > 0 ) { do v1->_406648(v5++); while ( (signed int)v5 < v1->uActorQueueSize ); } } //----- (00406648) -------------------------------------------------------- void stru262_TurnBased::_406648(unsigned int a2) { TurnBased_QueueElem *v1; // ecx@1 int v3; // eax@1 unsigned int v4; // ebx@2 Actor *v5; // esi@2 signed int v6; // edi@5 int v7; // ecx@6 int v8; // eax@6 int v9; // eax@7 int v10; // eax@8 int v11; // eax@9 int v12; // eax@10 int v13; // eax@11 int v14; // eax@14 unsigned int v15; // ecx@14 unsigned int v16; // edx@14 int v17; // eax@17 int v18; // eax@20 char v19; // al@24 unsigned int v21; // [sp-8h] [bp-50h]@16 int v22; // [sp-8h] [bp-50h]@17 AIDirection *v23; // [sp-4h] [bp-4Ch]@14 unsigned int v24; // [sp-4h] [bp-4Ch]@17 char v25; // [sp-4h] [bp-4Ch]@20 AIDirection a3; // [sp+Ch] [bp-3Ch]@2 AIDirection a4; // [sp+28h] [bp-20h]@2 TurnBased_QueueElem *v28; // [sp+44h] [bp-4h]@1 unsigned int a2a; // [sp+50h] [bp+8h]@2 v1 = (TurnBased_QueueElem *)((char *)this + 16 * (a2 + 2)); v28 = v1; v3 = v1->uPackedID; if ( (v1->uPackedID & 7) != OBJECT_Player) { v4 = v3 >> 3; // turn based only stuff a2a = ai_near_actors_targets_pid[v3 >> 3]; memcpy(&a3, Actor::GetDirectionInfo(v1->uPackedID, ai_near_actors_targets_pid[v3 >> 3], &a3, 0), sizeof(a3)); memcpy(&a4, &a3, sizeof(a4)); v5 = &pActors[v3 >> 3]; LOWORD(v3) = v5->uAIState; if ( (short)v3 != Dead ) { if ( (short)v3 != Disabled ) { if ( (short)v3 != Removed ) { v6 = v5->uCurrentActionLength; v5->uCurrentActionTime += pEventTimer->uTimeElapsed; if ( (signed int)v5->uCurrentActionTime >= v6 ) { v7 = (signed __int16)v3; v8 = (signed __int16)v3 - 2; if ( !v8 ) { v19 = stru_50C198.special_ability_use_check(&pActors[v4], v4); stru_50FE08.Add( v28->uPackedID, 5120, v5->vPosition.x, v5->vPosition.y, v5->vPosition.z + ((signed int)v5->uActorHeight >> 1), v19, 1); goto LABEL_25; } v9 = v8 - 1; if ( v9 ) { v10 = v9 - 1; if ( !v10 ) goto LABEL_21; v11 = v10 - 4; if ( !v11 ) goto LABEL_25; v12 = v11 - 4; if ( v12 ) { v13 = v12 - 1; if ( v13 ) { if ( v13 != Dead ) { if ( v7 != 4 ) { v14 = rand(); v15 = v4; v23 = &a4; v16 = a2a; if ( !(v14 % 2) ) { Actor::AI_Bored(v4, a2a, &a4); return; } v21 = 64; LABEL_26: Actor::AI_Stand(v15, v16, v21, v23); return; } LABEL_21: v5->uCurrentActionTime = 0; v5->uCurrentActionLength = 0; v5->uAIState = Dead; pActors[v4].UpdateAnimation(); return; } v24 = v5->pMonsterInfo.uSpellSkillAndMastery2; v22 = 3; v17 = v5->pMonsterInfo.uSpell2ID; } else { v24 = v5->pMonsterInfo.uSpellSkillAndMastery1; v22 = 2; v17 = v5->pMonsterInfo.uSpell1ID; } Actor::_404AC7(v4, &a4, v17, v22, v24); LABEL_25: v16 = a2a; v23 = &a4; v21 = 0; v15 = v4; goto LABEL_26; } v18 = v5->pMonsterInfo.uMissleAttack2Type; v25 = 1; } else { v18 = v5->pMonsterInfo.uMissleAttack1Type; v25 = 0; } Actor::_404874(v4, &a4, v18, v25); goto LABEL_25; } } } } } } // 50FE08: using guessed type stru298 stru_50FE08; //----- (0040680F) -------------------------------------------------------- __int16 stru262_TurnBased::_40680F(int a2) { TurnBased_QueueElem *v2; // eax@1 TurnBased_QueueElem *v3; // eax@1 TurnBased_QueueElem *v4; // edi@2 Actor *v5; // ebx@2 unsigned int *v6; // esi@7 AIDirection *v7; // esi@10 int v8; // eax@10 unsigned int v9; // ecx@10 signed int v10; // eax@13 unsigned __int8 v11; // sf@19 unsigned __int8 v12; // of@19 int v13; // esi@29 bool v14; // eax@29 unsigned __int8 v15; // cl@33 AIDirection a3; // [sp+Ch] [bp-44h]@10 AIDirection v18; // [sp+28h] [bp-28h]@10 int a2a; // [sp+44h] [bp-Ch]@2 unsigned int v20; // [sp+48h] [bp-8h]@10 TurnBased_QueueElem *v21; // [sp+4Ch] [bp-4h]@1 signed int v22; // [sp+58h] [bp+8h]@10 v2 = (TurnBased_QueueElem *)((char *)this + 16 * (a2 + 2)); v21 = v2; v2->uActionLength = 0; v3 = (TurnBased_QueueElem *)v2->uPackedID; if ( (unsigned __int8)v3 & 3 ) { v3 = (TurnBased_QueueElem *)((signed int)v3 >> 3); v4 = v3; a2a = (int)v3; v5 = &pActors[(int)v3]; LOWORD(v3) = v5->uAIState; if ( (short)v3 != 5 ) { if ( (short)v3 != 4 && (short)v3 != 11 && (short)v3 != 19 && (short)v3 != 17 ) { v6 = (unsigned int *)&ai_near_actors_targets_pid[(int)v4]; Actor::_SelectTarget((unsigned int)v4, &ai_near_actors_targets_pid[(int)v4], true); if ( v5->pMonsterInfo.uHostilityType && !*v6 ) v5->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; v22 = *v6; v7 = Actor::GetDirectionInfo(8 * (int)v4 | 3, *v6, &a3, 0); v8 = v5->uActorRadius; memcpy(&a3, v7, sizeof(a3)); memcpy(&v18, &a3, sizeof(v18)); v9 = a3.uDistance - v8; v20 = a3.uDistance - v8; if ( ((a3.uDistance - v8) & 0x80000000u) != 0 ) { v9 = 0; v20 = 0; } if ( (v22 & 7) == OBJECT_Actor) v10 = (unsigned __int8)*(&byte_5C8D1A[89 * (pMonsterStats->pInfos[pActors[v22 >> 3].pMonsterInfo.uID].uID - 1) / 3] + (v5->pMonsterInfo.uID - 1) / 3); else v10 = 4; if ( v10 == 1 ) { if ( (double)(signed int)v20 < 307.2 ) goto LABEL_25; } else { if ( v10 == 2 ) { v12 = __OFSUB__(v9, 1024); v11 = ((v9 - 1024) & 0x80000000u) != 0; } else { if ( v10 == 3 ) { v12 = __OFSUB__(v9, 2560); v11 = ((v9 - 2560) & 0x80000000u) != 0; } else { if ( v10 != 4 ) goto LABEL_26; v12 = __OFSUB__(v9, 5120); v11 = ((v9 - 5120) & 0x80000000u) != 0; } } if ( v11 ^ v12 ) { LABEL_25: v5->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Long; goto LABEL_26; } } LABEL_26: if ( v5->pMonsterInfo.uHostilityType != 4 || !v22 || (signed int)v9 >= 5120 ) { v13 = a2a; goto LABEL_47; } v13 = a2a; v14 = stru_50C198.special_ability_use_check(v5, a2a); if ( v14 == 1 ) { if ( v5->pMonsterInfo.uMissleAttack2Type ) { Actor::_40368B(v13, v22, &v18); goto LABEL_43; } } else { if ( v14 > 1 && v14 <= 3 ) { if ( v14 == 2 ) v15 = v5->pMonsterInfo.uSpell1ID; else v15 = v5->pMonsterInfo.uSpell2ID; if ( v15 ) { if ( v14 == 2 ) Actor::_403854(v13, v22, &v18); else Actor::_403A60(v13, v22, &v18); goto LABEL_43; } goto LABEL_44; } if ( v5->pMonsterInfo.uMissleAttack1Type ) { Actor::_403476(v13, v22, &v18); LABEL_43: v3 = v21; v21->field_C = 1; LABEL_48: v3->uActionLength = v5->uCurrentActionLength; return (signed __int16)v3; } } LABEL_44: if ( (double)(signed int)v20 < 307.2 ) { Actor::_403C6C(v13, v22, &v18); v3 = v21; v21->field_C = 3; goto LABEL_48; } LABEL_47: Actor::AI_Stand(v13, v22, 0x40u, &v18); v3 = v21; v21->field_C = 0; goto LABEL_48; } } } return (signed __int16)v3; } //----- (00406A63) -------------------------------------------------------- void stru262_TurnBased::_406A63() { stru262_TurnBased *v1; // ebx@1 int v2; // esi@1 unsigned __int8 v3; // zf@1 unsigned __int8 v4; // sf@1 signed int v5; // ecx@4 AIDirection a3; // [sp+8h] [bp-44h]@5 AIDirection v7; // [sp+24h] [bp-28h]@5 unsigned int v8; // [sp+40h] [bp-Ch]@5 signed int a2; // [sp+44h] [bp-8h]@1 TurnBased_QueueElem *v10; // [sp+48h] [bp-4h]@2 v1 = this; v2 = 0; this->field_8 = 64; dword_50C994 = 0; uActiveCharacter = 0; v3 = this->uActorQueueSize == 0; v4 = this->uActorQueueSize < 0; a2 = 0; if ( !(v4 | v3) ) { v10 = this->pQueue; while ( 1 ) { v5 = v10->uPackedID; if ( (v10->uPackedID & 7) == OBJECT_Actor) { v8 = ai_near_actors_targets_pid[v5 >> 3]; memcpy(&v7, Actor::GetDirectionInfo(v5, v8, &a3, v2), sizeof(v7)); if ( !v1->_406D10(a2) ) Actor::AI_Stand(v10->uPackedID >> 3, v8, 0x20u, &v7); } ++a2; ++v10; if ( a2 >= v1->uActorQueueSize ) break; v2 = 0; } } } // 50C994: using guessed type int dword_50C994; //----- (00406AFE) -------------------------------------------------------- void stru262_TurnBased::_406AFE() { stru262_TurnBased *v1; // edi@1 TurnBased_QueueElem *v2; // ebx@2 int v3; // esi@4 int v4; // ecx@5 AIDirection a3; // [sp+4h] [bp-48h]@5 AIDirection v6; // [sp+20h] [bp-2Ch]@5 stru262_TurnBased *v7; // [sp+3Ch] [bp-10h]@1 unsigned int v8; // [sp+40h] [bp-Ch]@4 unsigned int v9; // [sp+44h] [bp-8h]@5 int v10; // [sp+48h] [bp-4h]@1 v10 = 0; v1 = this; v7 = this; if ( this->uActorQueueSize > 0 ) { v2 = this->pQueue; do { if ( (v2->uPackedID & 7) == OBJECT_Actor) { v3 = v2->uPackedID >> 3; v8 = v3; if ( pActors[v3].CanAct() ) { v4 = v2->uPackedID; v9 = ai_near_actors_targets_pid[v3]; memcpy(&v6, Actor::GetDirectionInfo(v4, v9, &a3, 0), sizeof(v6)); Actor::AI_Stand(v8, v9, 0x20u, &v6); v2->field_C = 0; v2->uActionLength = 0; v1 = v7; } } ++v10; ++v2; } while ( v10 < v1->uActorQueueSize ); } v1->field_4 = 2; v1->field_8 = 100; } //----- (00406B9F) -------------------------------------------------------- int stru262_TurnBased::_406B9F() { signed int result; // eax@1 unsigned __int8 v2; // zf@1 unsigned __int8 v3; // sf@1 int v4; // esi@4 unsigned int v5; // esi@5 Actor *v6; // ebx@5 unsigned __int16 v7; // cx@15 AIDirection a3; // [sp+0h] [bp-50h]@15 AIDirection v9; // [sp+1Ch] [bp-34h]@15 signed int a1; // [sp+38h] [bp-18h]@4 stru262_TurnBased *thisa; // [sp+3Ch] [bp-14h]@1 unsigned int v12; // [sp+40h] [bp-10h]@5 unsigned int v13; // [sp+44h] [bp-Ch]@8 TurnBased_QueueElem *v14; // [sp+48h] [bp-8h]@2 signed int a2; // [sp+4Ch] [bp-4h]@1 result = 0; thisa = this; v2 = this->uActorQueueSize == 0; v3 = this->uActorQueueSize < 0; a2 = 0; if ( !(v3 | v2) ) { v14 = this->pQueue; while ( 1 ) { v4 = v14->uPackedID; a1 = v14->uPackedID; if ( (a1 & 7) != OBJECT_Player) { v5 = v4 >> 3; v12 = v5; v6 = &pActors[v5]; if ( SHIDWORD(v6->pActorBuffs[5].uExpireTime) < result || SHIDWORD(v6->pActorBuffs[5].uExpireTime) <= result && LODWORD(v6->pActorBuffs[5].uExpireTime) <= result ) v13 = result; else v13 = 1; if ( SHIDWORD(v6->pActorBuffs[6].uExpireTime) >= result && (SHIDWORD(v6->pActorBuffs[6].uExpireTime) > result || LODWORD(v6->pActorBuffs[6].uExpireTime) > result) ) result = 1; if ( !(v13 | result | v6->uAIState == 5 | v6->uAIState == 11 | v6->uAIState == 19) ) { v13 = ai_near_actors_targets_pid[v5]; memcpy(&v9, Actor::GetDirectionInfo(a1, v13, &a3, 0), sizeof(v9)); v7 = v6->uAIState; if ( v7 == 6 || v7 == 1 ) { if ( (double)(signed int)v9.uDistance < 307.2 ) goto LABEL_26; } v6->uCurrentActionTime += pEventTimer->uTimeElapsed; if ( (signed int)v6->uCurrentActionTime > v6->uCurrentActionLength ) { if ( v7 == 4 ) { v6->uCurrentActionTime = 0; v6->uCurrentActionLength = 0; v6->uAIState = Dead; v6->UpdateAnimation(); } if ( !thisa->_406D10(a2) ) LABEL_26: Actor::AI_Stand(v12, v13, 0x20u, &v9); } } } ++a2; result = (signed int)thisa; ++v14; if ( a2 >= thisa->uActorQueueSize ) break; result = 0; } } return result; } //----- (00406D10) -------------------------------------------------------- bool stru262_TurnBased::_406D10(signed int a2) { int v2; // ecx@1 int v3; // ecx@2 Actor *v4; // ebx@2 unsigned __int16 v5; // dx@2 int *v6; // esi@7 TurnBased_QueueElem *v7; // edi@7 int v8; // eax@7 AIDirection *v9; // esi@10 int v10; // eax@10 unsigned int v11; // ecx@10 unsigned __int8 v12; // al@12 unsigned __int8 v13; // sf@16 unsigned __int8 v14; // of@16 unsigned int v15; // edx@22 unsigned int v16; // ecx@23 TurnBased_QueueElem *v17; // eax@25 double v18; // st7@33 double v19; // st6@33 int v21; // [sp-8h] [bp-5Ch]@23 int v22; // [sp-8h] [bp-5Ch]@26 AIDirection *v23; // [sp-4h] [bp-58h]@23 int v24; // [sp-4h] [bp-58h]@26 AIDirection a3; // [sp+Ch] [bp-48h]@10 AIDirection pDir; // [sp+28h] [bp-2Ch]@10 int v27; // [sp+44h] [bp-10h]@33 unsigned int v28; // [sp+48h] [bp-Ch]@10 TurnBased_QueueElem *v29; // [sp+4Ch] [bp-8h]@7 unsigned int uActorID; // [sp+50h] [bp-4h]@2 unsigned int a2a; // [sp+5Ch] [bp+8h]@7 v2 = *(&this->field_0 + 4 * (a2 + 2)); if ( (v2 & 7) == OBJECT_Player) return 0; v3 = v2 >> 3; uActorID = v3; v4 = &pActors[v3]; v5 = v4->uAIState; if ( v5 == 5 || v5 == 4 || v5 == 11 || v5 == 19 || v5 == 17 ) return 1; v6 = &ai_near_actors_targets_pid[v3]; v7 = &pTurnEngine->pQueue[a2]; v8 = *v6; v29 = &pTurnEngine->pQueue[a2]; a2a = v8; Actor::_SelectTarget(v3, &ai_near_actors_targets_pid[v3], true); if ( v4->pMonsterInfo.uHostilityType && !*v6 ) v4->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; v9 = Actor::GetDirectionInfo(v7->uPackedID, a2a, &a3, 0); v10 = v4->uActorRadius; memcpy(&a3, v9, sizeof(a3)); memcpy(&pDir, &a3, sizeof(pDir)); v11 = a3.uDistance - v10; v28 = a3.uDistance - v10; if ( ((a3.uDistance - v10) & 0x80000000u) != 0 ) { v11 = 0; v28 = 0; } v12 = v4->pMonsterInfo.uHostilityType; if ( v12 == 1 ) { if ( (double)(signed int)v28 >= 307.2 ) goto LABEL_21; LABEL_20: v4->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Long; goto LABEL_21; } if ( v12 == 2 ) { v14 = __OFSUB__(v11, 1024); v13 = ((v11 - 1024) & 0x80000000u) != 0; } else { if ( v12 != 3 ) goto LABEL_21; v14 = __OFSUB__(v11, 2560); v13 = ((v11 - 2560) & 0x80000000u) != 0; } if ( v13 ^ v14 ) goto LABEL_20; LABEL_21: if ( (signed __int64)v4->pActorBuffs[4].uExpireTime > 0 ) { v15 = a2a; if ( (signed int)v11 < 10240 ) { v23 = &pDir; v16 = uActorID; v21 = 0; goto LABEL_24; } v24 = 0; v22 = 1024; goto LABEL_58; } if ( v4->pMonsterInfo.uHostilityType != 4 ) goto LABEL_46; if ( !(v4->uAttributes & 0x020000) || v4->pMonsterInfo.uAIType == 1 ) { if ( v4->pMonsterInfo.uAIType == 1 ) goto LABEL_36; if ( v4->pMonsterInfo.uAIType == 2 ) { v27 = v4->sCurrentHP; v18 = (double)v27; v19 = (double)(signed int)v4->pMonsterInfo.uHP * 0.2; goto LABEL_34; } if ( v4->pMonsterInfo.uAIType == 3 ) { v27 = v4->sCurrentHP; v18 = (double)v27; v19 = (double)(signed int)v4->pMonsterInfo.uHP * 0.1; LABEL_34: if ( v19 > v18 && (signed int)v11 < 10240 ) { LABEL_36: v16 = uActorID; v15 = a2a; v23 = 0; v21 = 32; if ( v4->pMonsterInfo.uMovementType == 5 ) { Actor::AI_Stand(uActorID, a2a, 0x20u, 0); goto LABEL_25; } LABEL_24: Actor::_402968(v16, v15, v21, v23); LABEL_25: v17 = v29; v29->field_C = 4; LABEL_60: v17->uActionLength = v4->uCurrentActionLength; return 1; } goto LABEL_39; } } LABEL_39: if ( (double)(signed int)v28 < 307.2 ) return 0; if ( (signed int)v11 < 5120 ) { if ( v4->pMonsterInfo.uMissleAttack1Type && (signed int)v11 < 1024 ) Actor::_402AD7(uActorID, a2a, uActorID, 32, &pDir); else Actor::_40281C(uActorID, a2a, 32, &pDir, 307); goto LABEL_59; } LABEL_46: if ( !v4->pMonsterInfo.uMovementType ) { v24 = 32; v22 = 1024; goto LABEL_57; } if ( v4->pMonsterInfo.uMovementType == 1 ) { v24 = 32; v22 = 2560; goto LABEL_57; } if ( v4->pMonsterInfo.uMovementType == 2 ) { v24 = 32; v22 = 5120; LABEL_57: v15 = a2a; LABEL_58: Actor::_4032B2(uActorID, v15, v22, v24); LABEL_59: v17 = v29; v29->field_C = 2; goto LABEL_60; } if ( v4->pMonsterInfo.uMovementType == 4 ) { Actor::_4032B2(uActorID, a2a, 10240, 32); goto LABEL_53; } if ( v4->pMonsterInfo.uMovementType == 5 ) { Actor::AI_Stand(uActorID, a2a, 0x20u, 0); LABEL_53: v17 = v29; v29->field_C = 2; goto LABEL_60; } return 1; } //----- (00406FA8) -------------------------------------------------------- void stru262_TurnBased::_406FA8() { unsigned __int8 v1; // zf@1 unsigned __int8 v2; // sf@1 TurnBased_QueueElem *v3; // edi@2 int v4; // eax@4 Actor *v5; // ebx@4 unsigned __int16 v6; // cx@4 unsigned int *v7; // edx@8 unsigned int v8; // esi@8 unsigned __int8 v9; // of@13 AIDirection a3; // [sp+Ch] [bp-6Ch]@8 AIDirection v11; // [sp+28h] [bp-50h]@8 AIDirection a4; // [sp+44h] [bp-34h]@8 stru262_TurnBased *v13; // [sp+60h] [bp-18h]@1 TurnBased_QueueElem *v14; // [sp+64h] [bp-14h]@2 int uActorID; // [sp+68h] [bp-10h]@4 unsigned int a2; // [sp+6Ch] [bp-Ch]@8 int v17; // [sp+70h] [bp-8h]@1 unsigned int v18; // [sp+74h] [bp-4h]@2 v17 = 0; v1 = this->uActorQueueSize == 0; v2 = this->uActorQueueSize < 0; v13 = this; if ( !(v2 | v1) ) { v3 = this->pQueue; v18 = (char *)&pTurnEngine - (char *)this; v14 = this->pQueue; do { if ( (v3->uPackedID & 7) != OBJECT_Player) { v4 = v3->uPackedID >> 3; uActorID = v4; v5 = &pActors[v4]; v6 = v5->uAIState; if ( v6 != 5 ) { if ( v6 != 11 ) { if ( v6 != 19 ) { if ( v6 != 17 ) { v7 = (unsigned int *)&ai_near_actors_targets_pid[v4]; a2 = *v7; v8 = a2; Actor::_SelectTarget(v4, (int *)v7, true); memcpy(&v11, Actor::GetDirectionInfo(*(int *)((char *)&v3->uPackedID + v18), v8, &a3, 0), sizeof(v11)); memcpy(&a4, &v11, sizeof(a4)); v5->uCurrentActionTime += pMiscTimer->uTimeElapsed; if ( (signed int)v5->uCurrentActionTime >= v5->uCurrentActionLength ) { if (v5->uAIState == Dying) { v5->uCurrentActionTime = 0; v5->uCurrentActionLength = 0; v5->uAIState = Dead; v5->UpdateAnimation(); return; } if ( rand() % 2 ) Actor::AI_Stand(uActorID, a2, 0x40u, &a4); else Actor::AI_Bored(uActorID, a2, &a4); } } } } } } ++v17; v3 = v14 + 1; v9 = __OFSUB__(v17, v13->uActorQueueSize); v2 = v17 - v13->uActorQueueSize < 0; ++v14; } while ( v2 ^ v9 ); } } //----- (004070EF) -------------------------------------------------------- bool __fastcall sub_4070EF_prolly_collide_objects(unsigned int uObjID, unsigned int uObj2ID) { signed int v2; // eax@1 unsigned int v3; // ecx@1 signed int v4; // esi@1 int v5; // ecx@2 signed int v6; // eax@4 int v7; // eax@4 float v8; // ST24_4@5 double v9; // ST18_8@5 signed int v10; // eax@6 int v11; // ecx@6 signed int v12; // eax@7 int v13; // esi@7 int v14; // esi@8 int v15; // esi@9 signed int v16; // eax@11 int v17; // edi@11 int v18; // esi@11 int v19; // eax@13 float v20; // ST24_4@14 double v21; // ST18_8@14 signed int v22; // eax@15 int v23; // ebx@16 signed int v24; // ecx@16 int v25; // eax@18 int v26; // eax@28 BLVSector *v27; // edx@31 int v28; // ecx@31 BLVFace *v29; // ebx@32 Vec3_short_ *v30; // esi@32 int v31; // eax@32 int v32; // ST50_4@44 int v33; // ST54_4@44 int v34; // eax@44 char v35; // zf@44 int v36; // edi@44 int v37; // eax@45 signed int v38; // esi@45 int v39; // ST4C_4@49 signed __int64 v40; // qtt@50 __int16 v42; // bx@58 int v43; // [sp-8h] [bp-70h]@11 int v44; // [sp-4h] [bp-6Ch]@11 int v45; // [sp+Ch] [bp-5Ch]@32 __int16 v46; // [sp+10h] [bp-58h]@32 int v47; // [sp+18h] [bp-50h]@20 int v48; // [sp+1Ch] [bp-4Ch]@20 int v49; // [sp+20h] [bp-48h]@20 int v50; // [sp+24h] [bp-44h]@16 signed int v51; // [sp+24h] [bp-44h]@27 signed int v52; // [sp+28h] [bp-40h]@26 signed int v53; // [sp+2Ch] [bp-3Ch]@23 signed int v54; // [sp+30h] [bp-38h]@22 signed int v55; // [sp+34h] [bp-34h]@21 signed int v56; // [sp+38h] [bp-30h]@20 signed int v57; // [sp+3Ch] [bp-2Ch]@28 int v58; // [sp+44h] [bp-24h]@50 int v59; // [sp+48h] [bp-20h]@44 int v60; // [sp+50h] [bp-18h]@11 signed int v61; // [sp+50h] [bp-18h]@31 int v62; // [sp+54h] [bp-14h]@16 int v63; // [sp+58h] [bp-10h]@4 int v64; // [sp+5Ch] [bp-Ch]@4 int v65; // [sp+60h] [bp-8h]@4 int v66; // [sp+64h] [bp-4h]@7 v2 = (signed int)uObjID >> 3; v3 = (uObjID & 7) - 2; v4 = uObj2ID; if ( v3 ) { v5 = v3 - 1; if ( v5 ) { if ( v5 != 2 ) return 0; v6 = v2; v63 = pLevelDecorations[v6].vPosition.x; v64 = pLevelDecorations[v6].vPosition.y; v65 = pLevelDecorations[v6].vPosition.z; v7 = pIndoor->GetSector(v63, v64, v65); } else { v63 = pActors[v2].vPosition.x; v64 = pActors[v2].vPosition.y; v8 = (double)pActors[v2].uActorHeight * 0.69999999; v9 = v8 + 6.7553994e15; v65 = LODWORD(v9) + pActors[v2].vPosition.z; v7 = pActors[v2].uSectorID; } } else { v10 = v2; v63 = pSpriteObjects[v10].vPosition.x; v64 = pSpriteObjects[v10].vPosition.y; v11 = pSpriteObjects[v10].vPosition.z; v7 = pSpriteObjects[v10].uSectorID; v65 = v11; } v66 = v7; v12 = v4 >> 3; v13 = (v4 & 7) - 2; if ( v13 ) { v14 = v13 - 1; if ( v14 ) { v15 = v14 - 1; if ( v15 ) { if ( v15 != 1 ) return 0; v16 = v12; v17 = pLevelDecorations[v16].vPosition.z; v18 = pLevelDecorations[v16].vPosition.x; v44 = pLevelDecorations[v16].vPosition.z; v60 = pLevelDecorations[v16].vPosition.y; v43 = pLevelDecorations[v16].vPosition.y; } else { v18 = pParty->vPosition.x; v17 = pParty->sEyelevel + pParty->vPosition.z; v60 = pParty->vPosition.y; v44 = pParty->sEyelevel + pParty->vPosition.z; v43 = pParty->vPosition.y; } v19 = pIndoor->GetSector(v18, v43, v44); } else { v60 = pActors[v12].vPosition.y; v18 = pActors[v12].vPosition.x; v20 = (double)pActors[v12].uActorHeight * 0.69999999; v21 = v20 + 6.7553994e15; v17 = LODWORD(v21) + pActors[v12].vPosition.z; v19 = pActors[v12].uSectorID; } } else { v22 = v12; v18 = pSpriteObjects[v22].vPosition.x; v17 = pSpriteObjects[v22].vPosition.z; v60 = pSpriteObjects[v22].vPosition.y; v19 = pSpriteObjects[v22].uSectorID; } v62 = v19; v23 = v18 - v63; v50 = v17 - v65; v24 = integer_sqrt(v23 * v23 + (v60 - v64) * (v60 - v64) + v50 * v50); if ( v24 > 5120 ) return 0; if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor) return 1; v25 = 65536; if ( v24 ) v25 = 65536 / v24; v49 = v23 * v25; v47 = v50 * v25; v48 = (v60 - v64) * v25; v56 = v63; if ( v63 < v18 ) { v55 = v18; } else { v56 = v18; v55 = v63; } v54 = v64; if ( v64 < v60 ) { v53 = v60; } else { v54 = v60; v53 = v64; } v52 = v65; if ( v65 < v17 ) { v51 = v17; } else { v52 = v17; v51 = v65; } v57 = 0; v26 = v66; while ( 2 ) { if ( v26 == v62 ) return 1; if ( v57 >= 30 || (v27 = pIndoor->pSectors, v28 = v66, v61 = 0, pIndoor->pSectors[v66].uNumPortals <= 0) ) break; while ( 1 ) { v29 = &pIndoor->pFaces[v27[v28].pPortals[v61]]; v30 = &pIndoor->pVertices[*v29->pVertexIDs]; v45 = *(int *)&v30->x; v46 = v30->z; v31 = v29->pFacePlane_old.vNormal.z * (v46 - v65) + v29->pFacePlane_old.vNormal.y * (SHIWORD(v45) - v64) + v29->pFacePlane_old.vNormal.x * ((signed __int16)v45 - v63); if ( v66 != v29->uSectorID ) v31 = -v31; if ( v31 >= 0 && (signed __int16)v45 != v63 && SHIWORD(v45) != v64 && v46 != v65 || v56 > v29->pBounding.x2 || v55 < v29->pBounding.x1 || v54 > v29->pBounding.y2 || v53 < v29->pBounding.y1 || v52 > v29->pBounding.z2 || v51 < v29->pBounding.z1 ) goto LABEL_54; v32 = (unsigned __int64)(v49 * (signed __int64)v29->pFacePlane_old.vNormal.x) >> 16; v33 = (unsigned __int64)(v47 * (signed __int64)v29->pFacePlane_old.vNormal.z) >> 16; v34 = (unsigned __int64)(v48 * (signed __int64)v29->pFacePlane_old.vNormal.y) >> 16; v35 = v32 + v33 + v34 == 0; v36 = v32 + v33 + v34; v59 = v32 + v33 + v34; if ( v35 ) goto LABEL_53; v37 = v65 * v29->pFacePlane_old.vNormal.z; v38 = -(v29->pFacePlane_old.dist + v37 + v63 * v29->pFacePlane_old.vNormal.x + v64 * v29->pFacePlane_old.vNormal.y); if ( v36 <= 0 ) break; if ( v29->pFacePlane_old.dist + v37 + v63 * v29->pFacePlane_old.vNormal.x + v64 * v29->pFacePlane_old.vNormal.y <= 0 ) goto LABEL_49; LABEL_53: v27 = pIndoor->pSectors; LABEL_54: ++v61; if ( v61 >= v27[v28].uNumPortals ) goto LABEL_55; } if ( v29->pFacePlane_old.dist + v37 + v63 * v29->pFacePlane_old.vNormal.x + v64 * v29->pFacePlane_old.vNormal.y < 0 ) goto LABEL_53; LABEL_49: v39 = abs(-(v29->pFacePlane_old.dist + v37 + v63 * v29->pFacePlane_old.vNormal.x + v64 * v29->pFacePlane_old.vNormal.y)) >> 14; if ( v39 > abs(v36) || (LODWORD(v40) = v38 << 16, HIDWORD(v40) = v38 >> 16, v58 = v40 / v59, (signed int)(v40 / v59) < 0) || !sub_4075DB( v63 + ((signed int)(((unsigned __int64)(v58 * (signed __int64)v49) >> 16) + 32768) >> 16), v64 + ((signed int)(((unsigned __int64)(v58 * (signed __int64)v48) >> 16) + 32768) >> 16), v65 + ((signed int)(((unsigned __int64)(v58 * (signed __int64)v47) >> 16) + 32768) >> 16), v29) ) { v28 = v66; goto LABEL_53; } if ( v29->uSectorID == v66 ) v42 = v29->uBackSectorID; else v42 = v29->uSectorID; v26 = v42; if ( v42 != v66 ) { ++v57; v66 = v42; continue; } break; } LABEL_55: if ( v66 != v62 ) return 0; return 1; } //----- (004075DB) -------------------------------------------------------- bool __fastcall sub_4075DB(int a1, int a2, int a3, BLVFace *a4) { BLVFace *v4; // eax@1 unsigned int v5; // esi@1 signed int v6; // esi@2 char v7; // zf@2 int v8; // edi@2 Vec3_short_ *v9; // ecx@3 int v10; // edx@4 signed int v11; // esi@7 Vec3_short_ *v12; // ecx@8 int v13; // edx@9 signed int v14; // esi@11 Vec3_short_ *v15; // ecx@12 int v16; // edx@13 int v17; // eax@14 bool v18; // esi@14 int v19; // ecx@14 int v20; // ecx@16 int v21; // edx@16 int v22; // eax@17 signed int v23; // ebx@18 int v24; // esi@20 signed int v25; // eax@22 signed __int64 v26; // qtt@22 bool result; // eax@25 int v28; // [sp+8h] [bp-14h]@14 int v29; // [sp+10h] [bp-Ch]@14 signed int a3a; // [sp+24h] [bp+8h]@14 int a4a; // [sp+28h] [bp+Ch]@2 v4 = a4; v5 = a4->uAttributes; if ( v5 & 0x100 ) { v6 = 0; v7 = a4->uNumVertices == 0; a4a = a1; v8 = a2; if ( !v7 ) { v9 = pIndoor->pVertices; do { dword_4F5D98_xs[v6] = v9[v4->pVertexIDs[v6]].x; v10 = v4->pVertexIDs[v6++]; dword_4F5CC4_ys[v6] = v9[v10].y; } while ( v6 < v4->uNumVertices ); } } else { v8 = a3; if ( v5 & 0x200 ) { v11 = 0; v7 = a4->uNumVertices == 0; a4a = a1; if ( !v7 ) { v12 = pIndoor->pVertices; do { dword_4F5D98_xs[v11] = v12[v4->pVertexIDs[v11]].x; v13 = v4->pVertexIDs[v11++]; dword_4F5CC4_ys[v11] = v12[v13].z; } while ( v11 < v4->uNumVertices ); } } else { v14 = 0; v7 = a4->uNumVertices == 0; a4a = a2; if ( !v7 ) { v15 = pIndoor->pVertices; do { dword_4F5D98_xs[v14] = v15[v4->pVertexIDs[v14]].y; v16 = v4->pVertexIDs[v14++]; dword_4F5CC4_ys[v14] = v15[v16].z; } while ( v14 < v4->uNumVertices ); } } } v17 = v4->uNumVertices; a3a = 0; dword_4F5D98_xs[v17] = dword_4F5D98_xs[0]; dword_4F5CC4_ys[v17 + 1] = dword_4F5CC4_ys[1]; v28 = v17; v18 = dword_4F5CC4_ys[1] >= v8; v19 = 0; v29 = 0; if ( v17 <= 0 ) goto LABEL_29; do { if ( a3a >= 2 ) break; v20 = v19; v21 = dword_4F5CC4_ys[v20 + 2]; if ( v18 ^ v21 >= v8 ) { v22 = dword_4F5D98_xs[v20 + 1]; if ( v22 >= a4a ) v23 = 0; else v23 = 2; v24 = v23 | dword_4F5D98_xs[v20] < a4a; if ( v24 != 3 ) { if ( !v24 || (v25 = v22 - dword_4F5D98_xs[v20], LODWORD(v26) = v25 << 16, HIDWORD(v26) = v25 >> 16, dword_4F5D98_xs[v20] + ((signed int)(((unsigned __int64)(v26 / (v21 - dword_4F5CC4_ys[v20 + 1]) * ((v8 - dword_4F5CC4_ys[v20 + 1]) << 16)) >> 16) + 32768) >> 16) >= a4a) ) ++a3a; } } v18 = v21 >= v8; v19 = v29++ + 1; } while ( v29 < v28 ); result = 1; if ( a3a != 1 ) LABEL_29: result = 0; return result; } //----- (004077F1) -------------------------------------------------------- bool __fastcall sub_4077F1(int a1, int a2, int a3, ODMFace *a4, BSPVertexBuffer *a5) { ODMFace *v5; // eax@1 unsigned int v6; // esi@1 signed int v7; // edi@1 char v8; // zf@2 unsigned __int16 *v9; // edx@3 int v10; // ecx@4 unsigned __int16 *v11; // edx@8 int v12; // ecx@9 int v13; // edx@12 int v14; // ecx@13 int v15; // esi@14 bool v16; // edi@14 int v17; // ecx@16 int v18; // edx@16 int v19; // eax@17 signed int v20; // ebx@18 int v21; // edi@20 signed int v22; // eax@22 signed __int64 v23; // qtt@22 bool result; // eax@25 int v25; // [sp+14h] [bp-8h]@14 int a4a; // [sp+28h] [bp+Ch]@2 signed int a5a; // [sp+2Ch] [bp+10h]@14 v5 = a4; v6 = a4->uAttributes; v7 = 0; if ( v6 & 0x100 ) { v8 = a4->uNumVertices == 0; a4a = a1; a3 = a2; if ( !v8 ) { v9 = v5->pVertexIDs; do { ++v7; dword_4F5BF4_xs[v7] = a5->pVertices[*v9].x; v10 = *v9; ++v9; dword_4F5B24_ys[v7] = a5->pVertices[v10].y; } while ( v7 < v5->uNumVertices ); } } else { if ( v6 & 0x200 ) { v8 = a4->uNumVertices == 0; a4a = a1; if ( !v8 ) { v11 = v5->pVertexIDs; do { ++v7; dword_4F5BF4_xs[v7] = a5->pVertices[*v11].x; v12 = *v11; ++v11; dword_4F5B24_ys[v7] = a5->pVertices[v12].z; } while ( v7 < v5->uNumVertices ); } } else { v8 = a4->uNumVertices == 0; a4a = a2; if ( !v8 ) { v13 = (int)v5->pVertexIDs; do { ++v7; dword_4F5BF4_xs[v7] = a5->pVertices[*(short *)v13].y; v14 = *(short *)v13; v13 += 2; dword_4F5B24_ys[v7] = a5->pVertices[v14].z; } while ( v7 < v5->uNumVertices ); } } } v15 = v5->uNumVertices; a5a = 0; dword_4F5BF4_xs[v15 + 1] = dword_4F5BF4_xs[1]; dword_4F5B24_ys[v15 + 1] = dword_4F5B24_ys[1]; v25 = 0; v16 = dword_4F5B24_ys[1] >= a3; if ( v15 <= 0 ) goto LABEL_29; do { if ( a5a >= 2 ) break; v17 = v25; v18 = dword_4F5B24_ys[v25 + 2]; if ( v16 ^ v18 >= a3 ) { v19 = dword_4F5BF4_xs[v17 + 2]; if ( v19 >= a4a ) v20 = 0; else v20 = 2; v21 = v20 | dword_4F5BF4_xs[v17 + 1] < a4a; if ( v21 != 3 ) { if ( !v21 || (v22 = v19 - dword_4F5BF4_xs[v17 + 1], LODWORD(v23) = v22 << 16, HIDWORD(v23) = v22 >> 16, dword_4F5BF4_xs[v17 + 1] + ((signed int)(((unsigned __int64)(v23 / (v18 - dword_4F5B24_ys[v17 + 1]) * ((a3 - dword_4F5B24_ys[v17 + 1]) << 16)) >> 16) + 32768) >> 16) >= a4a) ) ++a5a; } } ++v25; v16 = v18 >= a3; } while ( v25 < v15 ); result = 1; if ( a5a != 1 ) LABEL_29: result = 0; return result; } //----- (00407A1C) -------------------------------------------------------- bool __fastcall sub_407A1C(int x, int z, int y, Vec3_int_ v) { unsigned int v4; // esi@1 Vec3_int_ v5; // ST08_12@2 int v6; // edi@2 int v7; // ebx@2 int v8; // esi@2 signed int v9; // ecx@2 int v10; // eax@2 int v11; // ecx@4 int v12; // eax@4 int v13; // ebx@4 int v14; // edx@6 char *v15; // edi@16 ODMFace *v16; // esi@19 int v17; // ST34_4@25 int v18; // ST38_4@25 int v19; // eax@25 char v20; // zf@25 int v21; // ebx@25 int v22; // eax@26 signed int v23; // edi@26 int v24; // ST34_4@30 signed __int64 v25; // qtt@31 int v26; // eax@31 Vec3_int_ v27; // ST08_12@37 Vec3_int_ v28; // ST08_12@37 int v29; // edi@37 int v30; // ebx@37 int v31; // esi@37 signed int v32; // ecx@37 int v33; // eax@37 int v34; // ecx@39 int v35; // eax@39 int v36; // ebx@39 int v37; // edx@41 char *v38; // edi@51 ODMFace *v39; // esi@54 int v40; // ebx@60 int v41; // eax@61 signed int v42; // edi@61 signed __int64 v43; // qtt@66 int v44; // eax@66 Vec3_int_ v45; // ST08_12@73 int v46; // edi@73 int v47; // ebx@73 int v48; // esi@73 signed int v49; // ecx@73 int v50; // eax@73 int v51; // edx@75 int v52; // ecx@75 int v53; // eax@75 int v54; // ebx@75 int v55; // edi@77 int v56; // ecx@77 int v57; // eax@81 int v58; // esi@81 int v59; // eax@90 BLVSector *v60; // edx@90 int v61; // ecx@90 BLVFace *v62; // esi@91 int v63; // ST34_4@98 int v64; // ST30_4@98 int v65; // eax@98 int v66; // ebx@98 int v67; // eax@99 signed int v68; // edi@99 int v69; // ST2C_4@103 signed __int64 v70; // qtt@104 int v71; // eax@104 Vec3_int_ v72; // ST08_12@111 Vec3_int_ v73; // ST08_12@111 int v74; // edi@111 int v75; // ebx@111 int v76; // esi@111 signed int v77; // ecx@111 int v78; // eax@111 int v79; // edx@113 int v80; // ecx@113 int v81; // eax@113 int v82; // ebx@113 int v83; // edi@115 int v84; // ecx@115 int v85; // eax@119 int v86; // esi@119 int v87; // ecx@128 BLVSector *v88; // eax@128 int v89; // ecx@128 BLVFace *v90; // esi@129 int v91; // ebx@136 int v92; // eax@137 signed int v93; // edi@137 signed __int64 v94; // qtt@142 int v95; // eax@142 Vec3_int_ v97; // [sp-18h] [bp-94h]@1 int v98; // [sp-Ch] [bp-88h]@88 int v99; // [sp-Ch] [bp-88h]@126 int v100; // [sp-8h] [bp-84h]@88 int v101; // [sp-8h] [bp-84h]@126 int v102; // [sp-4h] [bp-80h]@88 int v103; // [sp-4h] [bp-80h]@126 int v104; // [sp+Ch] [bp-70h]@13 int v105; // [sp+Ch] [bp-70h]@48 int v106; // [sp+10h] [bp-6Ch]@18 int v107; // [sp+10h] [bp-6Ch]@98 int v108; // [sp+10h] [bp-6Ch]@104 int v109; // [sp+18h] [bp-64h]@25 int v110; // [sp+18h] [bp-64h]@31 int i; // [sp+18h] [bp-64h]@90 int v112; // [sp+18h] [bp-64h]@128 signed int v113; // [sp+20h] [bp-5Ch]@1 signed int v114; // [sp+24h] [bp-58h]@1 unsigned __int64 a4; // [sp+28h] [bp-54h]@1 unsigned int a4_8; // [sp+30h] [bp-4Ch]@1 int v117; // [sp+34h] [bp-48h]@4 int v118; // [sp+34h] [bp-48h]@39 int v119; // [sp+34h] [bp-48h]@75 int v120; // [sp+34h] [bp-48h]@113 int v121; // [sp+38h] [bp-44h]@4 int v122; // [sp+38h] [bp-44h]@39 int v123; // [sp+38h] [bp-44h]@76 int v124; // [sp+38h] [bp-44h]@114 int v125; // [sp+3Ch] [bp-40h]@4 int v126; // [sp+3Ch] [bp-40h]@39 int v127; // [sp+3Ch] [bp-40h]@77 int v128; // [sp+3Ch] [bp-40h]@115 int v129; // [sp+40h] [bp-3Ch]@11 int v130; // [sp+40h] [bp-3Ch]@46 int v131; // [sp+40h] [bp-3Ch]@78 int v132; // [sp+40h] [bp-3Ch]@116 int v133; // [sp+44h] [bp-38h]@10 int v134; // [sp+44h] [bp-38h]@45 int v135; // [sp+44h] [bp-38h]@81 int v136; // [sp+44h] [bp-38h]@119 int v137; // [sp+48h] [bp-34h]@7 int v138; // [sp+48h] [bp-34h]@42 int v139; // [sp+48h] [bp-34h]@82 int v140; // [sp+48h] [bp-34h]@120 int v141; // [sp+4Ch] [bp-30h]@6 int v142; // [sp+4Ch] [bp-30h]@41 int v143; // [sp+4Ch] [bp-30h]@75 int v144; // [sp+4Ch] [bp-30h]@113 int v145; // [sp+50h] [bp-2Ch]@5 int v146; // [sp+50h] [bp-2Ch]@40 int v147; // [sp+50h] [bp-2Ch]@75 int v148; // [sp+50h] [bp-2Ch]@113 int v149; // [sp+54h] [bp-28h]@4 int v150; // [sp+54h] [bp-28h]@39 int v151; // [sp+54h] [bp-28h]@75 int v152; // [sp+54h] [bp-28h]@113 int sDepth; // [sp+58h] [bp-24h]@17 int sDeptha; // [sp+58h] [bp-24h]@52 int sDepthb; // [sp+58h] [bp-24h]@90 char *a5; // [sp+5Ch] [bp-20h]@16 char *a5a; // [sp+5Ch] [bp-20h]@51 signed int a5b; // [sp+5Ch] [bp-20h]@83 signed int a5c; // [sp+5Ch] [bp-20h]@121 signed int v160; // [sp+60h] [bp-1Ch]@12 signed int v161; // [sp+60h] [bp-1Ch]@47 int v162; // [sp+60h] [bp-1Ch]@128 int v163; // [sp+64h] [bp-18h]@2 int outx; // [sp+68h] [bp-14h]@2 int outy; // [sp+6Ch] [bp-10h]@2 int outz; // [sp+70h] [bp-Ch]@2 Vec3_int_ pOut; // [sp+74h] [bp-8h]@2 int ya; // [sp+84h] [bp+8h]@60 int yb; // [sp+84h] [bp+8h]@136 int ve; // [sp+88h] [bp+Ch]@60 int va; // [sp+88h] [bp+Ch]@60 int vb; // [sp+88h] [bp+Ch]@66 int vf; // [sp+88h] [bp+Ch]@136 int vc; // [sp+88h] [bp+Ch]@136 int vd; // [sp+88h] [bp+Ch]@142 int v_4; // [sp+8Ch] [bp+10h]@60 int v_4a; // [sp+8Ch] [bp+10h]@65 int v_4b; // [sp+8Ch] [bp+10h]@136 int v_4c; // [sp+8Ch] [bp+10h]@141 int v_8; // [sp+90h] [bp+14h]@53 a4 = __PAIR__(z, x); v4 = stru_5C6E00->Atan2(v.x - x, v.y - z); v114 = 0; v97.z = y; v113 = 0; a4_8 = v4; *(_QWORD *)&v97.x = a4; if ( uCurrentlyLoadedLevelType != LEVEL_Outdoor) { Vec3_int_::Rotate(32, stru_5C6E00->uIntegerHalfPi + v4, 0, v97, &pOut.x, &pOut.y, &outz); v45.z = v.z; *(_QWORD *)&v45.x = *(_QWORD *)&v; Vec3_int_::Rotate(32, stru_5C6E00->uIntegerHalfPi + v4, 0, v45, &outx, &outy, &v163); v46 = outy - pOut.y; v47 = v163 - outz; v48 = outx - pOut.x; v49 = integer_sqrt(v48 * v48 + v46 * v46 + v47 * v47); v50 = 65536; if ( v49 ) v50 = 65536 / v49; v51 = outx; v143 = v48 * v50; v52 = v46 * v50; v53 = v47 * v50; v54 = pOut.x; v147 = v52; v151 = v53; v119 = pOut.x; if ( pOut.x < outx ) { v123 = outx; } else { v119 = outx; v123 = pOut.x; } v55 = pOut.y; v56 = outy; v127 = pOut.y; if ( pOut.y < outy ) { v131 = outy; } else { v127 = outy; v131 = pOut.y; } v57 = v163; v58 = outz; v135 = outz; if ( outz < v163 ) { v139 = v163; } else { v135 = v163; v139 = outz; } a5b = 0; while ( !v114 ) { if ( a5b ) { v102 = v58; v100 = v55; v98 = v54; } else { v102 = v57; v100 = v56; v98 = v51; } v59 = pIndoor->GetSector(v98, v100, v102); v60 = pIndoor->pSectors; v61 = 116 * v59; sDepthb = 0; for ( i = 116 * v59; sDepthb < *(__int16 *)((char *)&pIndoor->pSectors->uNumWalls + v61) + 2 * *(__int16 *)((char *)&pIndoor->pSectors->uNumFloors + v61); ++sDepthb ) { v62 = &pIndoor->pFaces[(*(unsigned __int16 **)((char *)&v60->pWalls + v61))[sDepthb]]; if ( v62->TwoSided() || v119 > v62->pBounding.x2 || v123 < v62->pBounding.x1 || v127 > v62->pBounding.y2 || v131 < v62->pBounding.y1 || v135 > v62->pBounding.z2 || v139 < v62->pBounding.z1 || (v63 = (unsigned __int64)(v143 * (signed __int64)v62->pFacePlane_old.vNormal.x) >> 16, v64 = (unsigned __int64)(v151 * (signed __int64)v62->pFacePlane_old.vNormal.z) >> 16, v65 = (unsigned __int64)(v147 * (signed __int64)v62->pFacePlane_old.vNormal.y) >> 16, v20 = v63 + v64 + v65 == 0, v66 = v63 + v64 + v65, v107 = v63 + v64 + v65, v20) ) goto LABEL_107; v67 = outz * v62->pFacePlane_old.vNormal.z; v68 = -(v62->pFacePlane_old.dist + v67 + pOut.y * v62->pFacePlane_old.vNormal.y + pOut.x * v62->pFacePlane_old.vNormal.x); if ( v66 <= 0 ) { if ( v62->pFacePlane_old.dist + v67 + pOut.y * v62->pFacePlane_old.vNormal.y + pOut.x * v62->pFacePlane_old.vNormal.x < 0 ) goto LABEL_107; } else { if ( v62->pFacePlane_old.dist + v67 + pOut.y * v62->pFacePlane_old.vNormal.y + pOut.x * v62->pFacePlane_old.vNormal.x > 0 ) goto LABEL_107; } v69 = abs(-(v62->pFacePlane_old.dist + v67 + pOut.y * v62->pFacePlane_old.vNormal.y + pOut.x * v62->pFacePlane_old.vNormal.x)) >> 14; if ( v69 <= abs(v66) ) { LODWORD(v70) = v68 << 16; HIDWORD(v70) = v68 >> 16; v71 = v70 / v107; v108 = v70 / v107; if ( v71 >= 0 ) { if ( sub_4075DB( pOut.x + ((signed int)(((unsigned __int64)(v108 * (signed __int64)v143) >> 16) + 32768) >> 16), pOut.y + ((signed int)(((unsigned __int64)(v108 * (signed __int64)v147) >> 16) + 32768) >> 16), outz + ((signed int)(((unsigned __int64)(v108 * (signed __int64)v151) >> 16) + 32768) >> 16), v62) ) { v114 = 1; break; } } } v61 = i; LABEL_107: v60 = pIndoor->pSectors; } ++a5b; if ( a5b >= 2 ) break; v57 = v163; v56 = outy; v51 = outx; v58 = outz; v55 = pOut.y; v54 = pOut.x; } v72.z = y; *(_QWORD *)&v72.x = a4; Vec3_int_::Rotate(32, a4_8 - stru_5C6E00->uIntegerHalfPi, 0, v72, &pOut.x, &pOut.y, &outz); v73.z = v.z; *(_QWORD *)&v73.x = *(_QWORD *)&v; Vec3_int_::Rotate(32, a4_8 - stru_5C6E00->uIntegerHalfPi, 0, v73, &outx, &outy, &v163); v74 = outy - pOut.y; v75 = v163 - outz; v76 = outx - pOut.x; v77 = integer_sqrt(v76 * v76 + v74 * v74 + v75 * v75); v78 = 65536; if ( v77 ) v78 = 65536 / v77; v79 = outx; v144 = v76 * v78; v80 = v74 * v78; v81 = v75 * v78; v82 = pOut.x; v148 = v80; v152 = v81; v120 = pOut.x; if ( pOut.x < outx ) { v124 = outx; } else { v120 = outx; v124 = pOut.x; } v83 = pOut.y; v84 = outy; v128 = pOut.y; if ( pOut.y < outy ) { v132 = outy; } else { v128 = outy; v132 = pOut.y; } v85 = v163; v86 = outz; v136 = outz; if ( outz < v163 ) { v140 = v163; } else { v136 = v163; v140 = outz; } a5c = 0; while ( 1 ) { if ( v113 ) return !v114 || !v113; if ( a5c ) { v103 = v86; v101 = v83; v99 = v82; } else { v103 = v85; v101 = v84; v99 = v79; } v87 = pIndoor->GetSector(v99, v101, v103); v88 = pIndoor->pSectors; v89 = 116 * v87; v162 = 0; v112 = v89; if ( *(__int16 *)((char *)&pIndoor->pSectors->uNumWalls + v89) + 2 * *(__int16 *)((char *)&pIndoor->pSectors->uNumFloors + v89) > 0 ) break; LABEL_148: ++a5c; if ( a5c >= 2 ) return !v114 || !v113; v85 = v163; v84 = outy; v79 = outx; v86 = outz; v83 = pOut.y; v82 = pOut.x; } while ( 1 ) { v90 = &pIndoor->pFaces[(*(unsigned __int16 **)((char *)&v88->pWalls + v89))[v162]]; if ( v90->TwoSided() || v120 > v90->pBounding.x2 || v124 < v90->pBounding.x1 || v128 > v90->pBounding.y2 || v132 < v90->pBounding.y1 || v136 > v90->pBounding.z2 || v140 < v90->pBounding.z1 || (yb = (unsigned __int64)(v144 * (signed __int64)v90->pFacePlane_old.vNormal.x) >> 16, v_4b = (unsigned __int64)(v148 * (signed __int64)v90->pFacePlane_old.vNormal.y) >> 16, vf = (unsigned __int64)(v152 * (signed __int64)v90->pFacePlane_old.vNormal.z) >> 16, v20 = yb + vf + v_4b == 0, v91 = yb + vf + v_4b, vc = yb + vf + v_4b, v20) ) goto LABEL_145; v92 = outz * v90->pFacePlane_old.vNormal.z; v93 = -(v90->pFacePlane_old.dist + v92 + pOut.y * v90->pFacePlane_old.vNormal.y + pOut.x * v90->pFacePlane_old.vNormal.x); if ( v91 <= 0 ) { if ( v90->pFacePlane_old.dist + v92 + pOut.y * v90->pFacePlane_old.vNormal.y + pOut.x * v90->pFacePlane_old.vNormal.x < 0 ) goto LABEL_145; } else { if ( v90->pFacePlane_old.dist + v92 + pOut.y * v90->pFacePlane_old.vNormal.y + pOut.x * v90->pFacePlane_old.vNormal.x > 0 ) goto LABEL_145; } v_4c = abs(-(v90->pFacePlane_old.dist + v92 + pOut.y * v90->pFacePlane_old.vNormal.y + pOut.x * v90->pFacePlane_old.vNormal.x)) >> 14; if ( v_4c <= abs(v91) ) { LODWORD(v94) = v93 << 16; HIDWORD(v94) = v93 >> 16; v95 = v94 / vc; vd = v94 / vc; if ( v95 >= 0 ) { if ( sub_4075DB( pOut.x + ((signed int)(((unsigned __int64)(vd * (signed __int64)v144) >> 16) + 32768) >> 16), pOut.y + ((signed int)(((unsigned __int64)(vd * (signed __int64)v148) >> 16) + 32768) >> 16), outz + ((signed int)(((unsigned __int64)(vd * (signed __int64)v152) >> 16) + 32768) >> 16), v90) ) { v113 = 1; goto LABEL_148; } } } v89 = v112; LABEL_145: v88 = pIndoor->pSectors; ++v162; if ( v162 >= *(__int16 *)((char *)&pIndoor->pSectors->uNumWalls + v89) + 2 * *(__int16 *)((char *)&pIndoor->pSectors->uNumFloors + v89) ) goto LABEL_148; } } Vec3_int_::Rotate(32, stru_5C6E00->uIntegerHalfPi + v4, 0, v97, &pOut.x, &pOut.y, &outz); v5.z = v.z; *(_QWORD *)&v5.x = *(_QWORD *)&v; Vec3_int_::Rotate(32, stru_5C6E00->uIntegerHalfPi + v4, 0, v5, &outx, &outy, &v163); v6 = outy - pOut.y; v7 = v163 - outz; v8 = outx - pOut.x; v9 = integer_sqrt(v8 * v8 + v6 * v6 + v7 * v7); v10 = 65536; if ( v9 ) v10 = 65536 / v9; v125 = v8 * v10; v11 = v10; v12 = v7 * v10; v13 = pOut.x; v117 = v12; v121 = v6 * v11; v149 = pOut.x; if ( pOut.x < outx ) { v145 = outx; } else { v149 = outx; v145 = pOut.x; } v14 = outy; v141 = pOut.y; if ( pOut.y < outy ) { v137 = outy; } else { v141 = outy; v137 = pOut.y; } v133 = outz; if ( outz < v163 ) { v129 = v163; } else { v133 = v163; v129 = outz; } v160 = 0; if ( (signed int)pOutdoor->uNumBModels > 0 ) { v104 = 0; while ( 1 ) { v15 = (char *)&pOutdoor->pBModels[v104].pVertices; a5 = (char *)&pOutdoor->pBModels[v104].pVertices; if ( sub_4088E9(v13, pOut.y, outx, v14, pOutdoor->pBModels[v104].vPosition.x, pOutdoor->pBModels[v104].vPosition.y) <= pOutdoor->pBModels[v104].sBoundingRadius + 128 ) { sDepth = 0; if ( *((int *)v15 + 2) > 0 ) break; } LABEL_36: ++v160; ++v104; if ( v160 >= (signed int)pOutdoor->uNumBModels ) goto LABEL_37; v14 = outy; v13 = pOut.x; } v106 = 0; while ( 1 ) { v16 = (ODMFace *)(v106 + *((int *)a5 + 4)); if ( v149 > v16->pBoundingBox.x2 || v145 < v16->pBoundingBox.x1 || v141 > v16->pBoundingBox.y2 || v137 < v16->pBoundingBox.y1 || v133 > v16->pBoundingBox.z2 || v129 < v16->pBoundingBox.z1 || (v17 = (unsigned __int64)(v125 * (signed __int64)v16->pFacePlane.vNormal.x) >> 16, v18 = (unsigned __int64)(v121 * (signed __int64)v16->pFacePlane.vNormal.y) >> 16, v19 = (unsigned __int64)(v117 * (signed __int64)v16->pFacePlane.vNormal.z) >> 16, v20 = v17 + v18 + v19 == 0, v21 = v17 + v18 + v19, v109 = v17 + v18 + v19, v20) ) goto LABEL_33; v22 = pOut.y * v16->pFacePlane.vNormal.y; v23 = -(v16->pFacePlane.dist + v22 + outz * v16->pFacePlane.vNormal.z + pOut.x * v16->pFacePlane.vNormal.x); if ( v21 <= 0 ) { if ( v16->pFacePlane.dist + v22 + outz * v16->pFacePlane.vNormal.z + pOut.x * v16->pFacePlane.vNormal.x < 0 ) goto LABEL_33; } else { if ( v16->pFacePlane.dist + v22 + outz * v16->pFacePlane.vNormal.z + pOut.x * v16->pFacePlane.vNormal.x > 0 ) goto LABEL_33; } v24 = abs(-(v16->pFacePlane.dist + v22 + outz * v16->pFacePlane.vNormal.z + pOut.x * v16->pFacePlane.vNormal.x)) >> 14; if ( v24 <= abs(v21) ) { LODWORD(v25) = v23 << 16; HIDWORD(v25) = v23 >> 16; v26 = v25 / v109; v110 = v25 / v109; if ( v26 >= 0 ) { if ( sub_4077F1( pOut.x + ((signed int)(((unsigned __int64)(v110 * (signed __int64)v125) >> 16) + 32768) >> 16), pOut.y + ((signed int)(((unsigned __int64)(v110 * (signed __int64)v121) >> 16) + 32768) >> 16), outz + ((signed int)(((unsigned __int64)(v110 * (signed __int64)v117) >> 16) + 32768) >> 16), v16, (BSPVertexBuffer *)a5) ) { v114 = 1; goto LABEL_36; } } } LABEL_33: ++sDepth; v106 += 308; if ( sDepth >= *((int *)a5 + 2) ) goto LABEL_36; } } LABEL_37: v27.z = y; *(_QWORD *)&v27.x = a4; Vec3_int_::Rotate(32, a4_8 - stru_5C6E00->uIntegerHalfPi, 0, v27, &pOut.x, &pOut.y, &outz); v28.z = v.z; *(_QWORD *)&v28.x = *(_QWORD *)&v; Vec3_int_::Rotate(32, a4_8 - stru_5C6E00->uIntegerHalfPi, 0, v28, &outx, &outy, &v163); v29 = outy - pOut.y; v30 = v163 - outz; v31 = outx - pOut.x; v32 = integer_sqrt(v31 * v31 + v29 * v29 + v30 * v30); v33 = 65536; if ( v32 ) v33 = 65536 / v32; v126 = v31 * v33; v34 = v33; v35 = v30 * v33; v36 = pOut.x; v118 = v35; v122 = v29 * v34; v150 = pOut.x; if ( pOut.x < outx ) { v146 = outx; } else { v150 = outx; v146 = pOut.x; } v37 = outy; v142 = pOut.y; if ( pOut.y < outy ) { v138 = outy; } else { v142 = outy; v138 = pOut.y; } v134 = outz; if ( outz < v163 ) { v130 = v163; } else { v134 = v163; v130 = outz; } v161 = 0; if ( (signed int)pOutdoor->uNumBModels > 0 ) { v105 = 0; while ( 1 ) { v38 = (char *)&pOutdoor->pBModels[v105].pVertices; a5a = (char *)&pOutdoor->pBModels[v105].pVertices; if ( sub_4088E9(v36, pOut.y, outx, v37, pOutdoor->pBModels[v105].vPosition.x, pOutdoor->pBModels[v105].vPosition.y) <= pOutdoor->pBModels[v105].sBoundingRadius + 128 ) { sDeptha = 0; if ( *((int *)v38 + 2) > 0 ) break; } LABEL_71: ++v161; ++v105; if ( v161 >= (signed int)pOutdoor->uNumBModels ) return !v114 || !v113; v37 = outy; v36 = pOut.x; } v_8 = 0; while ( 1 ) { v39 = (ODMFace *)(v_8 + *((int *)a5a + 4)); if ( v150 > v39->pBoundingBox.x2 || v146 < v39->pBoundingBox.x1 || v142 > v39->pBoundingBox.y2 || v138 < v39->pBoundingBox.y1 || v134 > v39->pBoundingBox.z2 || v130 < v39->pBoundingBox.z1 || (ya = (unsigned __int64)(v126 * (signed __int64)v39->pFacePlane.vNormal.x) >> 16, ve = (unsigned __int64)(v122 * (signed __int64)v39->pFacePlane.vNormal.y) >> 16, v_4 = (unsigned __int64)(v118 * (signed __int64)v39->pFacePlane.vNormal.z) >> 16, v20 = ya + ve + v_4 == 0, v40 = ya + ve + v_4, va = ya + ve + v_4, v20) ) goto LABEL_68; v41 = pOut.y * v39->pFacePlane.vNormal.y; v42 = -(v39->pFacePlane.dist + v41 + outz * v39->pFacePlane.vNormal.z + pOut.x * v39->pFacePlane.vNormal.x); if ( v40 <= 0 ) { if ( v39->pFacePlane.dist + v41 + outz * v39->pFacePlane.vNormal.z + pOut.x * v39->pFacePlane.vNormal.x < 0 ) goto LABEL_68; } else { if ( v39->pFacePlane.dist + v41 + outz * v39->pFacePlane.vNormal.z + pOut.x * v39->pFacePlane.vNormal.x > 0 ) goto LABEL_68; } v_4a = abs(-(v39->pFacePlane.dist + v41 + outz * v39->pFacePlane.vNormal.z + pOut.x * v39->pFacePlane.vNormal.x)) >> 14; if ( v_4a <= abs(v40) ) { LODWORD(v43) = v42 << 16; HIDWORD(v43) = v42 >> 16; v44 = v43 / va; vb = v43 / va; if ( v44 >= 0 ) { if ( sub_4077F1( pOut.x + ((signed int)(((unsigned __int64)(vb * (signed __int64)v126) >> 16) + 32768) >> 16), pOut.y + ((signed int)(((unsigned __int64)(vb * (signed __int64)v122) >> 16) + 32768) >> 16), outz + ((signed int)(((unsigned __int64)(vb * (signed __int64)v118) >> 16) + 32768) >> 16), v39, (BSPVertexBuffer *)a5a) ) { v113 = 1; goto LABEL_71; } } } LABEL_68: ++sDeptha; v_8 += 308; if ( sDeptha >= *((int *)a5a + 2) ) goto LABEL_71; } } return !v114 || !v113; } //----- (00408768) -------------------------------------------------------- void InitializeActors() { signed int v5; // [sp+Ch] [bp-10h]@1 signed int v6; // [sp+10h] [bp-Ch]@1 signed int v7; // [sp+14h] [bp-8h]@1 signed int v8; // [sp+18h] [bp-4h]@1 v8 = 0; v6 = 0; v7 = 0; v5 = 0; if ( !_strcmpi(pCurrentMapName, "d25.blv") ) v8 = 1; if ( !_strcmpi(pCurrentMapName, "d26.blv") ) v6 = 1; if (_449B57_test_bit(pParty->_quest_bits, 99)) v7 = 1; if (_449B57_test_bit(pParty->_quest_bits, 100)) v5 = 1; Log::Warning(L"%S %S %u", __FILE__, __FUNCTION__, __LINE__); // ai_near_actors_targets_pid[i] for AI_Stand seems always 0; original code behaviour is identical for (uint i = 0; i < uNumActors; ++i) { auto actor = pActors + i; if (actor->CanAct() || actor->uAIState == Disabled) { actor->vPosition.x = actor->vInitialPosition.x; actor->vPosition.y = actor->vInitialPosition.y; actor->vPosition.z = actor->vInitialPosition.z; actor->sCurrentHP = actor->pMonsterInfo.uHP; if (actor->uAIState != Disabled) { Actor::AI_Stand(i, ai_near_actors_targets_pid[i], actor->pMonsterInfo.uRecoveryTime, 0); } } actor->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; if (!v8 || v7) if (!v6 || v5) if (actor->IsPeasant()) BYTE2(actor->uAttributes) &= 0xF7u; BYTE2(actor->uAttributes) &= 0x7Fu; if (BYTE2(actor->uAttributes) & 0x40) Actor::_4031C1_update_job(i, pParty->uCurrentHour, 1); } } //----- (00408896) -------------------------------------------------------- void InitializeSpriteObjects() { for (uint i = 0; i < uNumSpriteObjects; ++i) { auto item = pSpriteObjects + i; if (item->uType && (item->uSoundID & 8 || pObjectList->pObjects[item->uType].uFlags & 0x10)) SpriteObject::OnInteraction(i); } for (uint i = 0; i < 100; ++i) array_5118E8.pElements[i].field_C_time_left = 0; } //----- (004088E9) -------------------------------------------------------- signed int __fastcall sub_4088E9(int a1, int a2, int a3, int a4, int a5, int a6) { int v6; // esi@1 int v7; // edi@1 int v8; // eax@1 signed int result; // eax@1 int v10; // [sp+Ch] [bp-4h]@1 int v11; // [sp+18h] [bp+8h]@1 v6 = a1; v10 = a2; v7 = a3 - a1; v11 = abs(a3 - a1); v8 = abs(a4 - v10); result = integer_sqrt(v11 * v11 + v8 * v8); if ( result ) result = abs((v7 * (v10 - a6) - (a4 - v10) * (v6 - a5)) / result); return result; } //----- (00408A27) -------------------------------------------------------- unsigned int __thiscall SearchAliveActors(unsigned int *pTotalActors) { unsigned int *v1; // esi@1 int v2; // eax@1 unsigned int v3; // ebp@1 signed int v4; // ebx@1 Actor *v5; // edi@2 unsigned int v6; // eax@3 int v8; // [sp+Ch] [bp-4h]@1 v1 = pTotalActors; v2 = GetAlertStatus(); v3 = 0; v4 = 0; *v1 = 0; v8 = v2; if ( (signed int)uNumActors > 0 ) { v5 = pActors; do { v6 = v5->uAttributes; if ( (v6 & 0x100000) == v8 ) { ++*v1; if ( v5->IsNotAlive() == 1 ) ++v3; } ++v4; ++v5; } while ( v4 < (signed int)uNumActors ); } return v3; } //----- (00408A7E) -------------------------------------------------------- unsigned int __fastcall SearchActorByMonsterID(unsigned int *pTotalActors, int uMonsterID) { unsigned int *v2; // esi@1 signed int v3; // ebx@1 Actor *v4; // edi@2 int v5; // eax@3 int v7; // [sp+8h] [bp-Ch]@1 int v8; // [sp+Ch] [bp-8h]@1 unsigned int v9; // [sp+10h] [bp-4h]@1 v7 = uMonsterID; v2 = pTotalActors; v3 = 0; v8 = GetAlertStatus(); *v2 = 0; v9 = 0; if ( (signed int)uNumActors > 0 ) { v4 = pActors;//[0].pMonsterInfo.uID; do { v5 = v4->uAttributes; // actor::attributes if ( (v5 & 0x100000) == v8 ) { if ( v4->pMonsterInfo.field_33 == v7 ) { ++*v2; if ( v4->IsNotAlive() == 1 ) ++v9; } } ++v3; ++v4; } while ( v3 < (signed int)uNumActors ); } return v9; } //----- (00408AE7) -------------------------------------------------------- unsigned int __fastcall SearchActorByGroup(unsigned int *pTotalActors, unsigned int uGroup) { unsigned int *v2; // esi@1 signed int v3; // ebx@1 Actor *v4; // edi@2 int v5; // eax@3 unsigned int v7; // [sp+8h] [bp-Ch]@1 int v8; // [sp+Ch] [bp-8h]@1 unsigned int v9; // [sp+10h] [bp-4h]@1 v7 = uGroup; v2 = pTotalActors; v3 = 0; v8 = GetAlertStatus(); *v2 = 0; v9 = 0; if ( (signed int)uNumActors > 0 ) { v4 = pActors;//[0].uGroup; do { v5 = v4->uAttributes; if ( (v5 & 0x100000) == v8 ) { if ( v4->uGroup == v7 ) { ++*v2; if ( v4->IsNotAlive() == 1 ) ++v9; } } ++v3; ++v4; } while ( v3 < (signed int)uNumActors ); } return v9; } //----- (00408B54) -------------------------------------------------------- unsigned int __fastcall SearchActorByID(unsigned int *pTotalActors, unsigned int a2) { unsigned int v2; // edi@1 unsigned int *v3; // esi@1 int v4; // eax@1 unsigned int v5; // ebx@1 unsigned int v6; // edx@1 v2 = a2; v3 = pTotalActors; v4 = GetAlertStatus(); v5 = 0; *v3 = 0; v6 = pActors[v2].uAttributes; if ( (v6 & 0x100000) == v4 ) { *v3 = 1; if ( pActors[v2].IsNotAlive() == 1 ) v5 = 1; } return v5; } //----- (00409BE8) -------------------------------------------------------- void __cdecl sub_409BE8() { void *v0; // eax@1 stru348 *v1; // eax@1 int v2; // ecx@1 int v3; // eax@1 v0 = window_SpeakInHouse->ptr_1C; dword_4E1874 = 5; v1 = &stru_4E1890[(int)((char *)v0 - 108)]; amuint_4E1860 = v1->field_4; amuint_4E1864 = v1->field_6; amuint_4E1868 = v1->field_8 - 1; amuint_4E186C = v1->field_A - 1; amuint_4E1870 = v1->field_C - 1; amuint_505884 = v1->field_E; amuint_505888 = v1->field_10; amuint_50588C = v1->field_12; dword_4E1878 = 1; dword_4E187C = 1; dword_4E1880 = 1; dword_4E1884 = v1->field_0; v2 = v1->field_2; v3 = v1->field_14; dword_4E1888 = v2; dword_4DF3A4 = v3; } // 4DF3A4: using guessed type int dword_4DF3A4; // 4E1860: using guessed type int amuint_4E1860; // 4E1864: using guessed type int amuint_4E1864; // 4E1868: using guessed type int amuint_4E1868; // 4E186C: using guessed type int amuint_4E186C; // 4E1870: using guessed type int amuint_4E1870; // 4E1874: using guessed type int dword_4E1874; // 4E1878: using guessed type int dword_4E1878; // 4E187C: using guessed type int dword_4E187C; // 4E1880: using guessed type int dword_4E1880; // 4E1884: using guessed type int dword_4E1884; // 4E1888: using guessed type int dword_4E1888; // 505884: using guessed type int amuint_505884; // 505888: using guessed type int amuint_505888; // 50588C: using guessed type int amuint_50588C; //----- (0040D75D) -------------------------------------------------------- char __fastcall pPrimaryWindow_draws_text(int a1, const char *pText, int *pXY) { const char *v3; // ST0C_4@1 __int64 v4; // qax@1 v3 = pText; v4 = LOBYTE(pFontComic->uFontHeight) - 3; return pPrimaryWindow->DrawText( pFontComic, *pXY, pXY[1] - (((signed int)v4 - HIDWORD(v4)) >> 1) + 3, 0, v3, 0, 0, 0); } //----- (0040DB27) -------------------------------------------------------- void __fastcall DrawRect(Vec4_int_ *pXYZW, unsigned __int16 uColor, char bSolidFill) { Vec4_int_ *v3; // esi@1 unsigned __int16 v4; // bp@1 unsigned int i; // ebx@3 v3 = pXYZW; v4 = uColor; pRenderer->BeginScene(); pRenderer->Clip_v2(0, 0, 639u, 479u); if ( bSolidFill ) { for ( i = v3->y; (signed int)i <= v3->w; ++i ) pRenderer->Line2D(v3->x, i, v3->z, i, v4); } else { pRenderer->Line2D(v3->x, v3->y, v3->z, v3->y, v4); pRenderer->Line2D(v3->z, v3->y, v3->z, v3->w, v4); pRenderer->Line2D(v3->z, v3->w, v3->x, v3->w, v4); pRenderer->Line2D(v3->x, v3->w, v3->x, v3->y, v4); } pRenderer->EndScene(); } //----- (0040DDB1) -------------------------------------------------------- int __fastcall rand_interval(int a, int b) { return a + rand() % (b - a + 1); } //----- (0040DEB4) -------------------------------------------------------- char *__fastcall inv_strcat(const char *Source, char *Dest) { return strcat(Dest, Source); } //----- (0040DEBE) -------------------------------------------------------- char *__fastcall inv_strcpy(const char *Source, char *Dest) { return strcpy(Dest, Source); } //----- (0040DEC8) -------------------------------------------------------- void __fastcall intToString(int val, char *pOut) { sprintf(pOut, "%d", val); } //----- (0040DEDB) -------------------------------------------------------- unsigned int __stdcall R8G8B8_to_TargetFormat(int uColor) { return GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat((unsigned __int8)uColor, BYTE1(uColor), BYTE2(uColor)); } //----- (0040DEF3) -------------------------------------------------------- unsigned int __fastcall GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(unsigned __int16 r, unsigned __int16 g, unsigned __int16 b) { return ((unsigned int)b >> (8 - LOBYTE(pRenderer->uTargetBBits))) | pRenderer->uTargetGMask & (g << (LOBYTE(pRenderer->uTargetGBits) + LOBYTE(pRenderer->uTargetBBits) - 8)) | pRenderer->uTargetRMask & (r << (LOBYTE(pRenderer->uTargetGBits) + LOBYTE(pRenderer->uTargetRBits) + LOBYTE(pRenderer->uTargetBBits) - 8)); } //----- (0040DF3D) -------------------------------------------------------- void __cdecl CallRenderPresent() { pRenderer->Present(); } //----- (0040DFA7) -------------------------------------------------------- int __stdcall retzero_sub_40DFA7(int a1) { return 0; } // 40DFA7: using guessed type int __stdcall retzero_sub_40DFA7(int); //----- (0040DFD1) -------------------------------------------------------- void stru272::_40DFD1() { stru272 *v1; // esi@1 stru272_stru0 *v2; // eax@1 v1 = this; v2 = (stru272_stru0 *)malloc(0x5Cu); v1->ptr_0 = v2; v2->field_0 = 0x67707274u; v1->ptr_0->field_8 = 0; v1->ptr_0->field_30 = 0.0; v1->ptr_0->field_58 = 0; v1->ptr_0->field_59 = 0; } //----- (0040DFFE) -------------------------------------------------------- int stru272_stru0::_40DFFE() { signed int result; // eax@2 if ( this->field_0 == 0x67707274 ) { this->field_0 = 0x78787878u; free(this); result = 0; } else { result = 2; } return result; } //----- (0040E01A) -------------------------------------------------------- int stru272_stru0::_40E01A(int a2) { signed int result; // eax@2 auto a1 = this; if ( a1->field_0 == 0x67707274 ) { a1->field_4 = *(int *)(a2 + 32); a1->field_C = *(int *)a2 << 16; a1->field_10 = *(int *)(a2 + 4) << 16; a1->field_14 = *(int *)(a2 + 8) << 16; a1->field_18 = *(int *)(a2 + 12) << 16; a1->field_1C = *(int *)(a2 + 16); a1->field_20 = *(int *)(a2 + 20); a1->field_24 = *(int *)(a2 + 24); a1->field_28 = *(float *)(a2 + 28) * 65536.0; LODWORD(a1->field_2C) = *(int *)(a2 + 36); a1->field_34 = (signed __int64)(*(float *)(a2 + 40) * 65536.0); a1->field_38 = (signed __int64)(*(float *)(a2 + 44) * 65536.0); a1->field_3C = *(int *)(a2 + 48); a1->field_40 = *(int *)(a2 + 52); a1->field_54 = *(int *)(a2 + 56); a1->field_59 = 1; result = 0; } else { result = 2; } return result; } //----- (0040E0F5) -------------------------------------------------------- int stru272_stru0::_40E0F5(char a2, char a3) { signed int result; // eax@2 int v4; // edx@7 int v5; // eax@7 auto a1 = this; if ( a1->field_0 == 0x67707274 ) { if ( a2 ) { a1->field_8 = 0; a1->field_30 = 0.0; } if ( a1->field_59 && a3 ) { v4 = a1->field_4; v5 = a1->field_54; do { *(int *)v5 = 0; v5 += 28; --v4; } while ( v4 ); a1->field_58 = 0; } result = 0; } else { result = 2; } return result; } //----- (0040E133) -------------------------------------------------------- int stru272_stru0::_40E133() { stru272_stru0 *v1; // edi@1 int v3; // ST18_4@3 double v4; // st7@3 double v5; // st6@4 char v6; // bl@8 int v7; // esi@8 int v8; // ecx@10 signed int v9; // eax@10 int v10; // ecx@10 signed int v11; // eax@10 signed int v12; // edx@12 signed int v13; // edx@12 int v14; // [sp+8h] [bp-10h]@8 int v15; // [sp+Ch] [bp-Ch]@8 float v16; // [sp+14h] [bp-4h]@3 v1 = this; if ( this->field_0 != 0x67707274 ) return 2; v3 = this->field_8; v16 = this->field_30; v4 = (double)v3; if ( v3 > 0 ) { v5 = v16 + this->field_2C; v16 = v5; if ( v5 > v4 ) v16 = v4; } if ( v16 >= 1.0 || this->field_58 ) { v6 = 0; v7 = this->field_54; v14 = (signed __int64)this->field_28; v15 = this->field_4; while ( *(int *)v7 <= 0 ) { if ( v16 >= 1.0 ) { *(int *)v7 = v1->field_3C + rand() % (v1->field_40 - v1->field_3C + 1); *(int *)(v7 + 20) = (rand() % 17 - 8) << 16; *(int *)(v7 + 24) = (rand() % 17 - 8) << 16; v12 = v1->field_C + rand() % (v1->field_14 - 1 - v1->field_C + 1); *(int *)(v7 + 12) = v12; *(int *)(v7 + 4) = v12 >> 16; v16 = v16 - 1.0; v13 = v1->field_10 + rand() % (v1->field_18 - 1 - v1->field_10 + 1); *(int *)(v7 + 16) = v13; *(int *)(v7 + 8) = v13 >> 16; --v1->field_8; goto LABEL_13; } LABEL_14: v7 += 28; --v15; if ( !v15 ) { v1->field_58 = v6; v1->field_30 = v16; return 0; } } v8 = *(int *)(v7 + 20); --*(int *)v7; v9 = v8 + *(int *)(v7 + 12); v10 = v14 + *(int *)(v7 + 24); *(int *)(v7 + 12) = v9; *(int *)(v7 + 4) = v9 >> 16; v11 = v10 + *(int *)(v7 + 16); *(int *)(v7 + 24) = v10; *(int *)(v7 + 16) = v11; *(int *)(v7 + 8) = v11 >> 16; LABEL_13: v6 = 1; goto LABEL_14; } return 0; } //----- (0040E2A7) -------------------------------------------------------- int stru272_stru0::_40E2A7() { int result; // eax@2 if ( this->field_0 == 0x67707274 ) { if ( this->field_8 <= 0 ) result = this->field_58 != 0 ? 2 : 0; else result = 1; } else { result = 3; } return result; } //----- (0040F82D) -------------------------------------------------------- void __fastcall ZBuffer_Fill(int *pZBuffer, int uTextureId, int iZValue) { ZBuffer_DoFill(pZBuffer, (Texture *)(uTextureId != -1 ? (int)&pIcons_LOD->pTextures[uTextureId] : 0), iZValue); } //----- (0040F845) -------------------------------------------------------- __int16 __fastcall sub_40F845(int a1, int a2, int a3, int a4, int a5, __int16 a6, int a7) { int v7; // edi@1 int v8; // esi@1 int v9; // ecx@2 int v10; // eax@3 v7 = a1; v8 = a2; do { v9 = a3; do { v10 = *(char *)v8++; if ( (char)v10 ) { if ( (char)v10 == 1 ) { LOWORD(v10) = *(short *)(a5 + 2 * v10); *(short *)v7 = v10; } else { LOWORD(v10) = a6; *(short *)v7 = a6; } } v7 += 2; --v9; } while ( v9 ); v7 = a7 + v7 - a3 - a3; --a4; } while ( a4 ); return v10; } //----- (0040F89C) -------------------------------------------------------- void __fastcall ZBuffer_DoFill(int *pZBuffer, Texture *pTex, int uZValue) { void *v3; // eax@3 void *v4; // esi@5 int *v5; // edi@5 int v6; // eax@5 int v7; // ecx@6 Texture *v8; // [sp+Ch] [bp-14h]@1 int *v9; // [sp+10h] [bp-10h]@1 int v10; // [sp+14h] [bp-Ch]@1 int v11; // [sp+18h] [bp-8h]@1 void *v12; // [sp+1Ch] [bp-4h]@5 v10 = pTex->uTextureWidth; v8 = pTex; v9 = pZBuffer; v11 = pTex->uTextureHeight; if ( pIcons_LOD->dword_011BA4 && pTex->uDecompressedSize ) v3 = pTex->UnzipPalette(); else v3 = pTex->pLevelOfDetail0; v12 = v3; v4 = v3; v5 = v9; v6 = 0; do { v7 = v10; do { LOBYTE(v6) = *(char *)v4; v4 = (char *)v4 + 1; if ( v6 ) *v5 = uZValue; ++v5; --v7; } while ( v7 ); v5 += 640 - v10; --v11; } while ( v11 ); if ( pIcons_LOD->dword_011BA4 ) { if ( v8->uDecompressedSize ) free(v12); } } //----- (0040F92A) -------------------------------------------------------- void __fastcall sub_40F92A(int *pZBuffer, Texture *a2, int a3) { Texture *v3; // esi@1 void *v4; // eax@3 int *v5; // edi@5 int v6; // ecx@6 int *v7; // [sp+Ch] [bp-10h]@1 int v8; // [sp+10h] [bp-Ch]@1 int v9; // [sp+18h] [bp-4h]@1 v3 = a2; v7 = pZBuffer; v8 = a2->uTextureWidth; v9 = a2->uTextureHeight; if ( pIcons_LOD->dword_011BA4 && a2->uDecompressedSize ) v4 = a2->UnzipPalette(); else v4 = a2->pLevelOfDetail0; v5 = v7; do { v6 = v8; do { *v5 = a3; ++v5; --v6; } while ( v6 ); v5 += 640 - v8; --v9; } while ( v9 ); if ( pIcons_LOD->dword_011BA4 ) { if ( v3->uDecompressedSize ) free(v4); } } //----- (00410AF5) -------------------------------------------------------- void __cdecl SetMoonPhaseNames() { aMoonPhaseNames[0] = pGlobalTXT_LocalizationStrings[150]; aMoonPhaseNames[1] = pGlobalTXT_LocalizationStrings[171]; aMoonPhaseNames[2] = pGlobalTXT_LocalizationStrings[102]; aMoonPhaseNames[3] = pGlobalTXT_LocalizationStrings[169]; aMoonPhaseNames[4] = pGlobalTXT_LocalizationStrings[92]; } //----- (00410B28) -------------------------------------------------------- void __thiscall DrawSpellDescriptionPopup(int spell_index) { Player *v1; // edi@1 SpellInfo *v2; // esi@1 unsigned int v3; // eax@2 int v4; // eax@4 LONG v5; // ecx@4 int v6; // eax@10 char *v7; // ST44_4@12 unsigned __int16 v8; // ax@12 GUIWindow a1; // [sp+Ch] [bp-68h]@4 int v10; // [sp+60h] [bp-14h]@1 POINT a2; // [sp+64h] [bp-10h]@1 int v12; // [sp+6Ch] [bp-8h]@4 int v13; // [sp+70h] [bp-4h]@4 v1 = pPlayers[uActiveCharacter]; v10 = spell_index; v2 = &pSpellStats->pInfos[spell_index + 11 * v1->lastOpenedSpellbookPage + 1]; if ( pMouse->GetCursorPos(&a2)->y <= 250 ) v3 = pMouse->GetCursorPos(&a2)->y + 30; else v3 = 30; a1.uFrameY = v3; a1.uFrameWidth = 328; a1.uFrameHeight = 68; a1.uFrameX = 90; a1.uFrameZ = 417; a1.uFrameW = v3 + 67; a1.Hint = 0; a2.y = pFontSmallnum->GetLineWidth(pGlobalTXT_LocalizationStrings[LOCSTR_NORMAL]); v13 = pFontSmallnum->GetLineWidth(pGlobalTXT_LocalizationStrings[LOCSTR_MASTER]); v12 = pFontSmallnum->GetLineWidth(pGlobalTXT_LocalizationStrings[LOCSTR_EXPERT]); v4 = pFontSmallnum->GetLineWidth(pGlobalTXT_LocalizationStrings[LOCSTR_GRAND]); v5 = a2.y; if ( v13 > a2.y ) v5 = v13; if ( v12 > v5 ) v5 = v12; if ( v4 > v5 ) v5 = v4; sprintf( pTmpBuf2, "%s\n\n%s\t%03d:\t%03d%s\t000\n%s\t%03d:\t%03d%s\t000\n%s\t%03d:\t%03d%s\t000\n%s\t%03d:\t%03d%s", v2->pDescription, pGlobalTXT_LocalizationStrings[LOCSTR_NORMAL], v5 + 3, v5 + 10, v2->pBasicSkillDesc, pGlobalTXT_LocalizationStrings[LOCSTR_EXPERT], v5 + 3, v5 + 10, v2->pExpertSkillDesc, pGlobalTXT_LocalizationStrings[LOCSTR_MASTER], v5 + 3, v5 + 10, v2->pMasterSkillDesc, pGlobalTXT_LocalizationStrings[LOCSTR_GRAND], v5 + 3, v5 + 10, v2->pGrandmasterSkillDesc); v6 = pFontSmallnum->CalcTextHeight(pTmpBuf2, &a1, 0, 0); a1.uFrameHeight += v6; if ( (signed int)a1.uFrameHeight < 150 ) a1.uFrameHeight = 150; a1.uFrameWidth = 460; a1.DrawMessageBox(0); a1.uFrameWidth -= 12; a1.uFrameHeight -= 12; v7 = v2->pName; a1.uFrameZ = a1.uFrameX + a1.uFrameWidth - 1; a1.uFrameW = a1.uFrameHeight + a1.uFrameY - 1; v8 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); a1.DrawTitleText(pFontArrus, 0x78u, 0xCu, v8, v7, 3u); a1.DrawText(pFontSmallnum, 120, 44, 0, pTmpBuf2, 0, 0, 0); a1.uFrameWidth = 108; a1.uFrameZ = a1.uFrameX + 107; a1.DrawTitleText(pFontComic, 0xCu, 0x4Bu, 0, pSkillNames[v1->lastOpenedSpellbookPage + 12], 3u); sprintf( pTmpBuf, "%s\n%d", pGlobalTXT_LocalizationStrings[LOCSTR_SP_COST], pSpellDatas[spell_index + 11 * v1->lastOpenedSpellbookPage + 1].mana_per_skill[v1->pActiveSkills[v1->lastOpenedSpellbookPage + PLAYER_SKILL_FIRE]]); // *(&[0].field_12 //temp_fix field_14 // + ((unsigned int)LOBYTE(v1->pActiveSkills[v1->lastOpenedSpellbookPage + 12]) >> 6) // + 10 * (int)((char *)v10 + 11 * v1->lastOpenedSpellbookPage))); a1.DrawTitleText(pFontComic, 0xCu, a1.uFrameHeight - LOBYTE(pFontComic->uFontHeight) - 16, 0, pTmpBuf, 3u); dword_507B00_spell_info_to_draw_in_popup = 0; } // 507B00: using guessed type int dword_507B00_spell_info_to_draw_in_popup; //----- (00410D99) -------------------------------------------------------- signed int __fastcall sub_410D99_get_map_index(int a1) { int v1; // edi@1 signed int v2; // ebp@1 const char **v3; // esi@2 char *v4; // ebx@2 v1 = a1; v2 = 1; if ( _strcmpi(pMapStats->pInfos[1].pFilename, (const char *)&pGames_LOD->pSubIndices[a1]) ) { v3 = (const char **)&pMapStats->pInfos[1].pFilename; v4 = (char *)&pMapStats->pInfos[1].pFilename; do { if ( !*(int *)v4 ) break; v3 += 17; ++v2; v4 = (char *)v3; } while ( _strcmpi(*v3, (const char *)&pGames_LOD->pSubIndices[v1]) ); } return v2; } //----- (00410DEC) -------------------------------------------------------- unsigned int __cdecl DrawLloydBeaconsScreen() { Player *v0; // esi@1 char *v1; // eax@1 unsigned __int16 v2; // ax@6 unsigned int result; // eax@11 unsigned int v4; // esi@13 unsigned int v5; // ecx@13 char v6; // zf@13 LloydBeacon *v7; // esi@14 int v8; // eax@14 unsigned __int64 v9; // kr08_8@14 unsigned int v10; // esi@14 unsigned int v11; // eax@14 char *v12; // eax@19 char *v13; // ecx@22 int v14; // eax@27 unsigned int v15; // [sp-10h] [bp-98h]@25 unsigned __int16 v16; // [sp-Ch] [bp-94h]@25 int v17; // [sp-8h] [bp-90h]@21 char *v18; // [sp-8h] [bp-90h]@25 Texture *v19; // [sp-4h] [bp-8Ch]@4 char *v20; // [sp-4h] [bp-8Ch]@21 unsigned int v21; // [sp-4h] [bp-8Ch]@25 GUIWindow v22; // [sp+Ch] [bp-7Ch]@1 unsigned int v23; // [sp+64h] [bp-24h]@14 __int64 v24; // [sp+68h] [bp-20h]@14 unsigned int v25; // [sp+70h] [bp-18h]@13 char *Str; // [sp+74h] [bp-14h]@14 int v27; // [sp+78h] [bp-10h]@11 LloydBeacon *v28; // [sp+7Ch] [bp-Ch]@12 RGBTexture *v29; // [sp+80h] [bp-8h]@12 int uNumMaxBeacons; // [sp+84h] [bp-4h]@6 v0 = &pParty->pPlayers[_506348_current_lloyd_playerid]; pRenderer->DrawTextureIndexed(8u, 8u, pTexture_LloydBeacons[(unsigned __int8)bRecallingBeacon]); v1 = pGlobalTXT_LocalizationStrings[523]; // Recall Beacon v22.uFrameX = 8; v22.uFrameY = 8; v22.uFrameWidth = 428; v22.uFrameHeight = 344; v22.uFrameZ = 435; v22.uFrameW = 351; if ( !bRecallingBeacon ) v1 = pGlobalTXT_LocalizationStrings[375]; // Set Beacon sprintf(pTmpBuf, "%s", v1); v22.DrawTitleText(pBook2Font, 0, 22u, 0, pTmpBuf, 3u); if ( bRecallingBeacon ) { pRenderer->DrawTextureTransparent(pBtn_Book_1->uX, pBtn_Book_1->uY, pTex_tab_an_6b__zoom_on); v19 = pTex_tab_an_6a__zoom_off; } else { pRenderer->DrawTextureTransparent(pBtn_Book_1->uX, pBtn_Book_1->uY, pTex_tab_an_6a__zoom_off); v19 = pTex_tab_an_6b__zoom_on; } pRenderer->DrawTextureTransparent(pBtn_Book_2->uX, pBtn_Book_2->uY, v19); v2 = v0->pActiveSkills[14]; uNumMaxBeacons = 1; if ( HIBYTE(v2) & 1 || (v2 & 0x80u) != 0 ) { uNumMaxBeacons = 5; } else { if ( v2 & 0x40 ) uNumMaxBeacons = 3; } result = 0; v27 = 0; if ( uNumMaxBeacons > 0 ) { v29 = pSavegameThumbnails; v28 = v0->pInstalledBeacons; while ( 1 ) { v22.uFrameWidth = 92; v4 = result; v22.uFrameHeight = 68; v5 = pLloydsBeaconsPreviewXs[result]; v22.uFrameY = pLloydsBeaconsPreviewYs[result]; v25 = v22.uFrameY; v22.uFrameX = v5; v22.uFrameW = v22.uFrameY + 67; v6 = v29->pPixels == 0; v22.uFrameZ = v5 + 91; if ( !v6 ) break; if ( !bRecallingBeacon ) { pRenderer->DrawTextureTransparent( pLloydsBeacons_SomeXs[v4], pLloydsBeacons_SomeYs[v4], pTexture_CurrentBook); v21 = 3; v18 = pGlobalTXT_LocalizationStrings[19]; v16 = 1; v14 = pSpellFont->CalcTextHeight(pGlobalTXT_LocalizationStrings[19], &v22, 0, 0); v15 = (signed int)v22.uFrameHeight / 2 - v14 / 2; goto LABEL_28; } LABEL_29: ++v29; ++v28; result = v27++ + 1; if ( v27 >= uNumMaxBeacons ) goto LABEL_30; } pRenderer->DrawTextureTransparent( pLloydsBeacons_SomeXs[v4], pLloydsBeacons_SomeYs[v4], pTexture_CurrentBook); pRenderer->DrawTextureRGB(pLloydsBeaconsPreviewXs[v4], pLloydsBeaconsPreviewYs[v4], v29); v7 = v28; Str = pMapStats->pInfos[sub_410D99_get_map_index(HIWORD(v28->field_18))].pName; v8 = pSpellFont->CalcTextHeight(Str, &v22, 0, 0); v22.uFrameY += -6 - v8; v22.DrawTitleText(pSpellFont, 0, 0, 1u, Str, 3u); v9 = v7->uBeaconTime - pParty->uTimePlayed; LODWORD(v24) = LODWORD(v7->uBeaconTime) - LODWORD(pParty->uTimePlayed); HIDWORD(v24) = HIDWORD(v9); v23 = (unsigned __int64)((signed __int64)((double)v24 * 0.234375) / 60 / 60) >> 32; v10 = (signed __int64)((double)v24 * 0.234375) / 60 / 60; v11 = v10 / 0x18; if ( (unsigned int)((signed __int64)((double)v24 * 0.234375) / 60 / 60) / 0x18 ) { v13 = pGlobalTXT_LocalizationStrings[57]; // Days if ( v11 > 1 ) { LABEL_24: v20 = v13; v17 = v11 + 1; LABEL_25: sprintf(pTmpBuf, "%lu %s", v17, v20); v21 = 3; v18 = pTmpBuf; v16 = 1; v22.uFrameY = v25 + v22.uFrameHeight + 4; v15 = 0; LABEL_28: v22.DrawTitleText(pSpellFont, 0, v15, v16, v18, v21); goto LABEL_29; } } else { if ( (signed __int64)(__PAIR__(v23, v10) + 1) <= 23 ) { if ( (v23 & 0x80000000u) != 0 || (signed int)v23 <= 0 && v10 <= 1 ) v12 = pGlobalTXT_LocalizationStrings[109];// Hour else v12 = pGlobalTXT_LocalizationStrings[110];// Hours v20 = v12; v17 = v10 + 1; goto LABEL_25; } } v13 = pGlobalTXT_LocalizationStrings[56]; // Day goto LABEL_24; } LABEL_30: if ( byte_506360 ) { /*result = pMessageQueue_50CBD0->uNumMessages; if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)181; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; result = 3 * pMessageQueue_50CBD0->uNumMessages + 3; *(&pMessageQueue_50CBD0->uNumMessages + result) = 0; ++pMessageQueue_50CBD0->uNumMessages; }*/ pMessageQueue_50CBD0->AddMessage(UIMSG_B5, 0, 0); } return result; } //----- (00411150) -------------------------------------------------------- char *__cdecl DrawTownPortalScreen() { signed int v0; // edi@1 __int16 v1; // dx@8 POINT *v2; // edi@17 int v3; // edi@17 __int16 v4; // dx@24 GUIWindow v6; // [sp+Ch] [bp-64h]@1 POINT v7; // [sp+60h] [bp-10h]@17 POINT a2; // [sp+68h] [bp-8h]@17 pRenderer->ClearZBuffer(0, 479); pRenderer->DrawTextureTransparent(8u, 8u, pTexture_CurrentBook); pRenderer->DrawTextureTransparent( 0x1D7u, 0x1BDu, (Texture *)(uExitCancelTextureId != -1 ? (int)&pIcons_LOD->pTextures[uExitCancelTextureId] : 0)); v6.uFrameX = 8; v6.uFrameY = 8; v6.uFrameWidth = 460; v6.uFrameHeight = 344; v6.uFrameZ = 467; v6.uFrameW = 351; v0 = 0; do { if ( !v0 ) { v1 = 206; LABEL_14: if ( !(unsigned __int16)_449B57_test_bit(pParty->_quest_bits, v1) ) goto LABEL_16; goto LABEL_15; } if ( v0 == 1 ) { v1 = 208; goto LABEL_14; } if ( v0 == 2 ) { v1 = 207; goto LABEL_14; } if ( v0 == 3 ) { v1 = 211; goto LABEL_14; } if ( v0 == 4 ) { v1 = 209; goto LABEL_14; } if ( v0 == 5 ) { v1 = 210; goto LABEL_14; } LABEL_15: pRenderer->_4A612A( pTownPortalBook_xs[v0], pTownPortalBook_ys[v0], *(&pTexture_TownPortalHarmn + v0), v0 + 1); LABEL_16: ++v0; } while ( v0 < 6 ); v2 = pMouse->GetCursorPos(&a2); v3 = pRenderer->pActiveZBuffer[v2->x + pSRZBufferLineOffsets[pMouse->GetCursorPos(&v7)->y]] & 0xFFFF; if ( !v3 ) // Town Portal return v6.DrawTitleText(pBook2Font, 0, 22u, 0, pGlobalTXT_LocalizationStrings[10], 3u); if ( v3 == 1 ) { v4 = 206; LABEL_30: if ( (unsigned __int16)_449B57_test_bit(pParty->_quest_bits, v4) ) goto LABEL_31; return v6.DrawTitleText(pBook2Font, 0, 22u, 0, pGlobalTXT_LocalizationStrings[10], 3u); } if ( v3 == 2 ) { v4 = 208; goto LABEL_30; } if ( v3 == 3 ) { v4 = 207; goto LABEL_30; } if ( v3 == 4 ) { v4 = 211; goto LABEL_30; } if ( v3 == 5 ) { v4 = 209; goto LABEL_30; } if ( v3 == 6 ) { v4 = 210; goto LABEL_30; } LABEL_31: pRenderer->DrawTextureIndexed(word_4E1D3A[v3], pTownPortalBook_xs[v3 + 5], *(&pTex_tab_an_6b__zoom_on + v3)); return v6.DrawTitleText(pBook2Font, 0, 22u, 0, pGlobalTXT_LocalizationStrings[10], 3u); } // 4E1D3A: using guessed type __int16 word_4E1D3A[]; //----- (00411300) -------------------------------------------------------- void LoadSpellbook(unsigned int school) { //unsigned int v1; // esi@1 Player *pPlayer; // ecx@1 char v3; // al@1 //int v4; // edi@5 //Texture *result; // eax@6 //unsigned char *v6; // edi@7 //unsigned int v7; // eax@7 //unsigned __int8 v8; // sf@8 //unsigned __int8 v9; // of@8 char pContainer[20]; // [sp+Ch] [bp-1Ch]@7 //Texture *v11; // [sp+20h] [bp-8h]@5 //int v12; // [sp+24h] [bp-4h]@5 byte_506550 = 0; //v1 = uID; pPlayer = pPlayers[uActiveCharacter]; v3 = pPlayer->uQuickSpell; if ( v3 && (unsigned __int8)v3 / 11 == school ) dword_50654C = (unsigned __int8)v3 - 11 * school; else dword_50654C = 0; //char *v11 = &pPlayer->field_152[11 * school + 63]; for (uint i = 1; i < 12; ++i) { //if (v11[i]) if (pPlayer->spellbook.pChapters[school].bIsSpellAvailable[i - 1]) { sprintf(pContainer, "SB%sS%02d", spellbook_texture_filename_suffices[school], pSpellbookSpellIndices[school][i]); dword_506408[i] = pIcons_LOD->LoadTexturePtr(pContainer, TEXTURE_16BIT_PALETTE); sprintf(pContainer, "SB%sC%02d", spellbook_texture_filename_suffices[school], pSpellbookSpellIndices[school][i]); dword_5063D8[i] = pIcons_LOD->LoadTexturePtr(pContainer, TEXTURE_16BIT_PALETTE); } } } //----- (0041140B) -------------------------------------------------------- GUIWindow *__cdecl sub_41140B() { signed int v0; // esi@1 GUIButton *v1; // eax@3 GUIButton *v2; // esi@4 GUIWindow *result; // eax@5 v0 = 0; do { dword_5063D8[11+v0]->Release(); dword_506408[11+v0]->Release(); --v0; } while ( v0 >= -11 ); pIcons_LOD->_40F9C5(); v1 = pGUIWindow_CurrentMenu->pControlsHead; if ( v1 ) { do { v2 = v1->pNext; pAllocator->FreeChunk(v1); v1 = v2; } while ( v2 ); } pGUIWindow_CurrentMenu->pControlsHead = 0; pGUIWindow_CurrentMenu->pControlsTail = 0; result = pGUIWindow_CurrentMenu; pGUIWindow_CurrentMenu->uNumControls = 0; return result; } //----- (00411473) -------------------------------------------------------- void __cdecl sub_411473() { Texture **v0; // esi@1 Texture **v1; // edi@1 Texture *v2; // ecx@2 Texture *v3; // ecx@2 pTexture_pagemask->Release(); pTexture_506448->Release(); pTexture_50643C->Release(); v0 = &pTextures_tabs[0][1]; v1 = pTextures_5064A0; do { (*v1)->Release(); v2 = *(v0 - 1); *v1 = 0; v2->Release(); v3 = *v0; *(v0 - 1) = 0; v3->Release(); *v0 = 0; ++v1; v0 += 2; } while ( (signed int)v1 < (signed int)&pTextures_5064A0[9] ); pAudioPlayer->PlaySound((SoundID)231, 0, 0, -1, 0, 0, 0, 0); pIcons_LOD->_4114F2(); } //----- (00411597) -------------------------------------------------------- void __cdecl OnCloseSpellook() { pAllocator->FreeChunk(pSpellFont); pSpellFont = 0; pAllocator->FreeChunk(pBookFont); pBookFont = 0; pAllocator->FreeChunk(pBook2Font); pBook2Font = 0; pAllocator->FreeChunk(pAutonoteFont); pAutonoteFont = 0; pTexture_mapbordr->Release(); pAudioPlayer->PlaySound((SoundID)231, 0, 0, -1, 0, 0, 0, 0); pIcons_LOD->_4114F2(); dword_506364 = 0; } // 506364: using guessed type int dword_506364; //----- (00412AF9) -------------------------------------------------------- void __cdecl sub_412AF9() { int v0; // ecx@1 v0 = 0; if ( uActiveCharacter ) v0 = pParty->pPlayers[uActiveCharacter-1].lastOpenedSpellbookPage;//*((char *)&pParty->pPartyBuffs[5].uExpireTime + 6972 * uActiveCharacter + 2); pRenderer->DrawTextureIndexed(8u, 8u, pTextures_5064A0[v0]); pRenderer->DrawTextureIndexed(0x1DCu, 0x1C2u, pTexture_50643C); pRenderer->DrawTextureIndexed(0x231u, 0x1C2u, pTexture_506448); } //----- (00412B58) -------------------------------------------------------- void __cdecl DrawSpellBookContent() { Player *v0; // ebx@1 int v1; // ebp@1 unsigned int v2; // eax@1 Texture *v3; // edi@1 int v4; // esi@1 Texture *v5; // eax@3 Texture *v6; // edx@5 int v7; // eax@8 int v8; // eax@11 POINT *v9; // esi@13 int v10; // eax@13 Texture *v11; // edx@14 int v12; // eax@15 signed int v13; // ecx@18 unsigned int v14; // esi@18 unsigned int v15; // edi@18 Texture *pPageTexture; // eax@21 unsigned int v17; // [sp-Ch] [bp-2Ch]@8 unsigned int v18; // [sp-Ch] [bp-2Ch]@15 unsigned int v19; // [sp-8h] [bp-28h]@8 unsigned int v20; // [sp-8h] [bp-28h]@15 Texture *v21; // [sp-4h] [bp-24h]@15 signed int v22; // [sp-4h] [bp-24h]@22 Texture *v23; // [sp+10h] [bp-10h]@5 POINT a2; // [sp+18h] [bp-8h]@13 POINT v24; int v25; sub_412AF9(); v0 = pPlayers[uActiveCharacter]; v1 = 11 * v0->lastOpenedSpellbookPage; v2 = pIcons_LOD->FindTextureByName("Pending"); v3 = (Texture *)(v2 != -1 ? (int)&pIcons_LOD->pTextures[v2] : 0); pRenderer->ClearZBuffer(0, 479); v4 = 1; if ( __OFSUB__(v1, v1 + 11) ^ 1 ) { do { if ( *(&v0->_guilds_member_bits[v1 + 63] + v4) ) { v5 = (Texture *)dword_506408[v4]; if ( v5 != v3 ) { if ( dword_50654C == v4 ) { v6 = dword_5063D8[v4]; v23 = dword_5063D8[v4]; } else { v23 = dword_506408[v4]; v6 = v5; } if ( v6->pLevelOfDetail0 ) { v7 = v0->lastOpenedSpellbookPage; // v7 = (12 * v0->lastOpenedSpellbookPage + pSpellbookSpellIndices[v0->lastOpenedSpellbookPage][v4]); v19 = pViewport->uViewportY + pIconPos[v7][pSpellbookSpellIndices[v7][v4]].Ypos; v17 = pViewport->uViewportX + pIconPos[v7][pSpellbookSpellIndices[v7][v4]].Xpos; if ( BYTE1(v6->pBits) & 2 ) pRenderer->DrawTextureTransparent(v17, v19, v6); else pRenderer->DrawTextureIndexed(v17, v19, v6); pRenderer->_4A612A(pIconPos[v7][pSpellbookSpellIndices[v7][v4]].Xpos, pIconPos[v7][pSpellbookSpellIndices[v7][v4]].Ypos, v23, v4); } } } ++v4; } while ( v4 + v1 - 1 < v1 + 11 ); } v9 = pMouse->GetCursorPos(&a2); v10 = pRenderer->pActiveZBuffer[v9->x + pSRZBufferLineOffsets[pMouse->GetCursorPos(&v24)->y]] & 0xFFFF; if ( v10 ) { v11 = dword_5063D8[v10]; if ( v11->pLevelOfDetail0 ) { v21 = dword_5063D8[v10]; v12 = v0->lastOpenedSpellbookPage; // v12 = (12 * v0->lastOpenedSpellbookPage + pSpellbookSpellIndices[v0->lastOpenedSpellbookPage][v10]); v20 = pViewport->uViewportY + pIconPos[v12][pSpellbookSpellIndices[v12][v10]].Ypos; v18 = pViewport->uViewportX + pIconPos[v12][pSpellbookSpellIndices[v12][v10]].Xpos; if ( BYTE1(v11->pBits) & 2 ) pRenderer->DrawTextureTransparent(v18, v20, v21); else pRenderer->DrawTextureIndexed(v18, v20, v21); } } v13 = 0; a2.x = (LONG)&v0->pActiveSkills[12]; v14 = (unsigned int)&v0->pActiveSkills[12]; v15 = (unsigned int)&v0->pActiveSkills[12]; v25 = 0; do { if ( *(short *)a2.x ) { if ( v0->lastOpenedSpellbookPage == v13 ) { pPageTexture = pTextures_tabs[v13][1]; switch ( v13 ) { case 0: v14 = 406; v22 = 9; goto LABEL_27; case 1: v14 = 406; goto LABEL_38; case 2: v14 = 406; v22 = 84; goto LABEL_27; case 3: v14 = 406; goto LABEL_26; case 4: v14 = 407; goto LABEL_29; case 5: v15 = 196; goto LABEL_34; case 6: v15 = 234; goto LABEL_34; case 7: v15 = 272; goto LABEL_34; case 8: v15 = 309; LABEL_34: v14 = 405; break; default: break; } } else { pPageTexture = pTextures_tabs[v13][0]; switch ( v13 ) { case 0: v14 = 415; v22 = 10; goto LABEL_27; case 1: v14 = 415; LABEL_38: v22 = 46; goto LABEL_27; case 2: v14 = 415; v22 = 83; goto LABEL_27; case 3: v14 = 415; LABEL_26: v22 = 121; LABEL_27: v15 = v22; break; case 4: v14 = 415; LABEL_29: v15 = 158; break; case 5: v15 = 196; goto LABEL_46; case 6: v15 = 234; goto LABEL_46; case 7: v15 = 271; goto LABEL_46; case 8: v15 = 307; LABEL_46: v14 = 416; break; default: break; } } pRenderer->DrawTextureTransparent(v14, v15, pPageTexture); v13 = v25; } a2.x += 2; ++v13; v25 = v13; } while ( v13 < 9 ); } // 506408: using guessed type int dword_506408[]; // 50654C: using guessed type int dword_50654C; //----- (00412E85) -------------------------------------------------------- char __cdecl DrawBook_History() { unsigned int v0; // eax@3 unsigned int v1; // eax@7 int v2; // eax@10 const char *v3; // eax@10 signed int v4; // ecx@12 int v5; // ecx@14 int v6; // eax@21 int v7; // esi@21 char *v8; // eax@21 int v9; // eax@22 unsigned int v11; // [sp-8h] [bp-64h]@3 unsigned int v12; // [sp-8h] [bp-64h]@7 Texture *v13; // [sp-4h] [bp-60h]@3 Texture *v14; // [sp-4h] [bp-60h]@7 GUIWindow a1; // [sp+8h] [bp-54h]@10 pRenderer->DrawTextureIndexed(pViewport->uViewportX, pViewport->uViewportY, pTextures_5064A0[11]); if ( dword_506548 || !dword_506528 ) { v13 = pTex_tab_an_6a__zoom_off; v11 = pViewport->uViewportY + 2; v0 = pViewport->uViewportX + 407; } else { v13 = pTex_tab_an_6b__zoom_on; v11 = pViewport->uViewportY + 1; v0 = pViewport->uViewportX + 398; } pRenderer->DrawTextureTransparent(v0, v11, v13); if ( dword_506544 || dword_506528 + awards_count >= awards_count2 ) { v14 = pTex_tab_an_7a__zoot_off; v12 = pViewport->uViewportY + 38; v1 = pViewport->uViewportX + 407; } else { v14 = pTex_tab_an_7b__zoot_on; v12 = pViewport->uViewportY + 38; v1 = pViewport->uViewportX + 398; } pRenderer->DrawTextureTransparent(v1, v12, v14); if ( !byte_5C6D50[dword_506528] ) { v2 = achievedAwardsIndex[dword_506528]; a1.uFrameWidth = 460; a1.uFrameX = 8; a1.uFrameY = 8; a1.uFrameHeight = 344; v3 = (const char *)pStorylineText->StoreLine[v2].pPageTitle;//field_4[]; a1.uFrameZ = 467; a1.uFrameW = 351; if ( v3 ) a1.DrawTitleText(pBook2Font, 0, 0x16u, 0, v3, 3u); } a1.uFrameX = 48; a1.uFrameY = 70; a1.uFrameWidth = 360; a1.uFrameHeight = 264; v4 = LOBYTE(pAutonoteFont->uFontHeight) - 3; a1.uFrameZ = 407; a1.uFrameHeight = v4 * 264 / v4; a1.uFrameW = a1.uFrameHeight + 69; if ( dword_506544 && dword_506528 + awards_count < awards_count2 ) { pAudioPlayer->PlaySound((SoundID)230, 0, 0, -1, 0, 0, 0, 0); v5 = dword_50651C++; dword_506528 += awards_count; byte_506130[v5] = awards_count; } if ( dword_506548 && dword_50651C ) { pAudioPlayer->PlaySound((SoundID)230, 0, 0, -1, 0, 0, 0, 0); --dword_50651C; dword_506528 -= (unsigned __int8)byte_506130[dword_50651C]; } if ( !awards_count || dword_506528 < 1 ) { dword_506528 = 0; dword_50651C = 0; } dword_506544 = 0; v6 = achievedAwardsIndex[dword_506528]; dword_506548 = 0; awards_count = 0; //v7 = *pStorylineText->StoreLine[v6].pText;//*(&pStorylineText->field_0 + 3 * v6); v7 = (int)pStorylineText->StoreLine[v6].pText;//*(&pStorylineText->field_0 + 3 * v6); v8 = BuilDialogueString( pStorylineText->StoreLine[v6].pText, uActiveCharacter - 1, 0, 0, 0, (__int64 *)&pParty->field_3C._s_times[ v6 + 21]); if ( v7 ) { v9 = pAutonoteFont->_44C6C2(v8, &a1, 1u, (unsigned __int8)byte_5C6D50[dword_506528]); LOBYTE(v8) = a1.DrawText(pAutonoteFont, 1, 0, 0, (const char *)v9, 0, a1.uFrameY + a1.uFrameHeight, 0); ++awards_count; } return (char)v8; } //----- (00413126) -------------------------------------------------------- void __cdecl DrawBook_Quests() { unsigned int v0; // eax@3 unsigned int v1; // eax@7 int v2; // ecx@11 int v3; // ebx@16 int v4; // eax@19 const char *v5; // edi@19 int v6; // eax@19 unsigned int v7; // edi@19 unsigned int v8; // [sp-8h] [bp-68h]@3 unsigned int v9; // [sp-8h] [bp-68h]@7 Texture *v10; // [sp-4h] [bp-64h]@3 Texture *v11; // [sp-4h] [bp-64h]@7 GUIWindow a1; // [sp+Ch] [bp-54h]@9 pRenderer->DrawTextureIndexed(pViewport->uViewportX, pViewport->uViewportY, pTexture_CurrentBook); if ( dword_506548 || !dword_506528 ) { v10 = pTex_tab_an_6a__zoom_off; v8 = pViewport->uViewportY + 2; v0 = pViewport->uViewportX + 407; } else { v10 = pTex_tab_an_6b__zoom_on; v8 = pViewport->uViewportY + 1; v0 = pViewport->uViewportX + 398; } pRenderer->DrawTextureTransparent(v0, v8, v10); if ( dword_506544 || dword_506528 + awards_count >= awards_count2 ) { v11 = pTex_tab_an_7a__zoot_off; v9 = pViewport->uViewportY + 38; v1 = pViewport->uViewportX + 407; } else { v11 = pTex_tab_an_7b__zoot_on; v9 = pViewport->uViewportY + 38; v1 = pViewport->uViewportX + 398; } pRenderer->DrawTextureTransparent(v1, v9, v11); a1.uFrameWidth = 460; a1.uFrameHeight = 344; a1.uFrameX = 8; a1.uFrameY = 8; a1.uFrameZ = 467; a1.uFrameW = 351; a1.DrawTitleText(pBook2Font, 0, 0x16u, 0, pGlobalTXT_LocalizationStrings[174], 3u); a1.uFrameX = 48; a1.uFrameY = 70; a1.uFrameWidth = 360; a1.uFrameHeight = 264; a1.uFrameZ = 407; a1.uFrameW = 333; if ( dword_506544 && dword_506528 + awards_count < awards_count2 ) { pAudioPlayer->PlaySound((SoundID)230, 0, 0, -1, 0, 0, 0, 0); v2 = dword_50651C++; dword_506528 += awards_count; byte_506130[v2] = awards_count; } if ( dword_506548 && dword_50651C ) { pAudioPlayer->PlaySound((SoundID)230, 0, 0, -1, 0, 0, 0, 0); --dword_50651C; dword_506528 -= (unsigned __int8)byte_506130[dword_50651C]; } if ( !awards_count || (v3 = dword_506528, dword_506528 < 1) ) { v3 = 0; dword_50651C = 0; dword_506528 = 0; } dword_506544 = 0; dword_506548 = 0; awards_count = 0; while ( v3 < awards_count2 ) { v4 = achievedAwardsIndex[v3]; ++awards_count; v5 = pQuestTable[v4-1];//(&dword_722F10)[4 * v4]; a1.DrawText(pAutonoteFont, 1, 0, 0, pQuestTable[v4-1], 0, 0, 0);//(&dword_722F10)[4 * v4], 0, 0, 0); v6 = pAutonoteFont->CalcTextHeight(v5, &a1, 1, 0); v7 = a1.uFrameY + v6; if ( (signed int)(a1.uFrameY + v6) > (signed int)a1.uFrameHeight ) break; pRenderer->DrawTextureTransparent(100, v7 + 12, pTextures_5064A0[10]); ++v3; a1.uFrameY = v7 + 24; } } //----- (0041338E) -------------------------------------------------------- void __cdecl DrawBook_Autonotes() { unsigned int v0; // eax@3 unsigned int v1; // eax@7 signed int v2; // ebp@11 unsigned int v3; // eax@18 unsigned int v4; // eax@24 unsigned int v5; // eax@30 unsigned int v6; // eax@36 unsigned int v7; // eax@42 signed int v8; // ebp@47 int v9; // eax@52 int v10; // eax@56 int v11; // edx@57 int v12; // ebp@64 int v13; // eax@65 const char *v14; // edi@65 int v15; // eax@65 unsigned int v16; // edi@65 unsigned int v17; // [sp-8h] [bp-70h]@3 unsigned int v18; // [sp-8h] [bp-70h]@7 unsigned int v19; // [sp-8h] [bp-70h]@18 unsigned int v20; // [sp-8h] [bp-70h]@24 unsigned int v21; // [sp-8h] [bp-70h]@30 unsigned int v22; // [sp-8h] [bp-70h]@36 unsigned int v23; // [sp-8h] [bp-70h]@42 Texture *v24; // [sp-4h] [bp-6Ch]@3 Texture *v25; // [sp-4h] [bp-6Ch]@7 Texture *v26; // [sp-4h] [bp-6Ch]@18 Texture *v27; // [sp-4h] [bp-6Ch]@24 Texture *v28; // [sp-4h] [bp-6Ch]@30 Texture *v29; // [sp-4h] [bp-6Ch]@36 Texture *v30; // [sp-4h] [bp-6Ch]@42 signed __int16 v31; // [sp+10h] [bp-58h]@1 char *v32; // [sp+10h] [bp-58h]@49 GUIWindow a1; // [sp+14h] [bp-54h]@46 v31 = 0; pRenderer->DrawTextureIndexed(pViewport->uViewportX, pViewport->uViewportY, pTexture_AutonotesBook); if ( dword_506548 || !dword_506528 ) { v24 = pTex_tab_an_6a__zoom_off; v17 = pViewport->uViewportY + 2; v0 = pViewport->uViewportX + 407; } else { v24 = pTex_tab_an_6b__zoom_on; v17 = pViewport->uViewportY + 1; v0 = pViewport->uViewportX + 398; } pRenderer->DrawTextureTransparent(v0, v17, v24); if ( dword_506544 || dword_506528 + awards_count >= awards_count2 ) { v25 = pTex_tab_an_7a__zoot_off; v18 = pViewport->uViewportY + 38; v1 = pViewport->uViewportX + 407; } else { v25 = pTex_tab_an_7b__zoot_on; v18 = pViewport->uViewportY + 38; v1 = pViewport->uViewportX + 398; } pRenderer->DrawTextureTransparent(v1, v18, v25); if ( !dword_506540 ) { if ( dword_506568 ) { pRenderer->DrawTextureTransparent( pViewport->uViewportX + 408, pViewport->uViewportY + 113, pTexture_506390); v2 = 1; goto LABEL_16; } goto LABEL_14; } if ( !dword_506568 ) { LABEL_14: v2 = 1; goto LABEL_15; } v2 = 1; v31 = 1; pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); LABEL_15: dword_506568 = 0; pRenderer->DrawTextureTransparent(pViewport->uViewportX + 398, pViewport->uViewportY + 113, pTexture_506394); LABEL_16: if ( dword_50653C ) { if ( dword_506568 != v2 ) { v31 = v2; pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); } } else { if ( dword_506568 != v2 ) { v26 = pTexture_506388; v19 = pViewport->uViewportY + 150; v3 = pViewport->uViewportX + 408; goto LABEL_22; } } v26 = pTexture_50638C; dword_506568 = v2; v19 = pViewport->uViewportY + 150; v3 = pViewport->uViewportX + 399; LABEL_22: pRenderer->DrawTextureTransparent(v3, v19, v26); if ( dword_506538 ) { if ( dword_506568 != 2 ) { v31 = v2; pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); } } else { if ( dword_506568 != 2 ) { v27 = pTexture_506380; v20 = pViewport->uViewportY + 188; v4 = pViewport->uViewportX + 408; goto LABEL_28; } } v27 = pTexture_506384; dword_506568 = 2; v20 = pViewport->uViewportY + 188; v4 = pViewport->uViewportX + 397; LABEL_28: pRenderer->DrawTextureTransparent(v4, v20, v27); if ( dword_506534 ) { if ( dword_506568 != 3 ) { v31 = v2; pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); } } else { if ( dword_506568 != 3 ) { v28 = pTexture_506378; v21 = pViewport->uViewportY + 226; v5 = pViewport->uViewportX + 408; goto LABEL_34; } } v28 = pTexture_50637C; dword_506568 = 3; v21 = pViewport->uViewportY + 226; v5 = pViewport->uViewportX + 397; LABEL_34: pRenderer->DrawTextureTransparent(v5, v21, v28); if ( dword_506530 ) { if ( dword_506568 != 4 ) { v31 = v2; pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); } } else { if ( dword_506568 != 4 ) { v29 = pTexture_506370; v22 = pViewport->uViewportY + 263; v6 = pViewport->uViewportX + 408; goto LABEL_40; } } v29 = pTexture_506374; dword_506568 = 4; v22 = pViewport->uViewportY + 264; v6 = pViewport->uViewportX + 397; LABEL_40: pRenderer->DrawTextureTransparent(v6, v22, v29); if ( dword_50652C ) { if ( dword_506568 != 5 ) { v31 = v2; pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); } } else { if ( dword_506568 != 5 ) { v30 = pTexture_506368; v23 = pViewport->uViewportY + 302; v7 = pViewport->uViewportX + 408; goto LABEL_46; } } v30 = pTexture_50636C; dword_506568 = 5; v23 = pViewport->uViewportY + 302; v7 = pViewport->uViewportX + 397; LABEL_46: pRenderer->DrawTextureTransparent(v7, v23, v30); a1.uFrameWidth = 460; a1.uFrameHeight = 344; a1.uFrameX = 8; a1.uFrameY = 8; a1.uFrameZ = 467; a1.uFrameW = 467; a1.DrawTitleText(pBook2Font, 0, 0x16u, 0, pGlobalTXT_LocalizationStrings[154], 3u); a1.uFrameX = 48; a1.uFrameY = 70; a1.uFrameWidth = 360; a1.uFrameHeight = 264; a1.uFrameZ = 407; a1.uFrameW = 333; if ( v31 ) { awards_count2 = 0; dword_506528 = 0; dword_50651C = 0; awards_count = 0; v8 = 0; do { //if ( dword_72371C[2 * v8] == dword_506568 ) if ( pAutonoteTxt[v8-1].eType == dword_506568 ) { //v32 = (&dword_723718_autonote_related)[8 * (signed __int16)v8]; v32 = (char *)pAutonoteTxt[v8-1].pText; if ( (short)v8 ) { if ( (unsigned __int16)_449B57_test_bit(pParty->_autonote_bits, v8) && v32 ) { v9 = awards_count++; achievedAwardsIndex[v9] = (signed __int16)v8; } } } ++v8; } while ( v8 < 196 ); awards_count2 = awards_count; } else { if ( dword_506544 ) { v10 = awards_count + dword_506528; if ( awards_count + dword_506528 < awards_count2 ) { v11 = dword_50651C++; byte_506130[v11] = awards_count; dword_506528 = v10; pAudioPlayer->PlaySound((SoundID)230, 0, 0, -1, 0, 0, 0, 0); } } if ( dword_506548 && dword_50651C ) { --dword_50651C; dword_506528 -= (unsigned __int8)byte_506130[dword_50651C]; pAudioPlayer->PlaySound((SoundID)230, 0, 0, -1, 0, 0, 0, 0); } if ( !awards_count || dword_506528 < 1 ) { dword_506528 = 0; dword_50651C = 0; } } v12 = dword_506528; dword_50652C = 0; dword_506544 = 0; dword_506548 = 0; awards_count = 0; dword_506530 = 0; dword_506534 = 0; dword_506538 = 0; dword_50653C = 0; dword_506540 = 0; while ( v12 < awards_count2 ) { v13 = achievedAwardsIndex[v12]; ++awards_count; //v14 = (&dword_723718_autonote_related)[8 * v13]; v14 = pAutonoteTxt[v13-1].pText; //a1.DrawText(pAutonoteFont, 1, 0, 0, (&dword_723718_autonote_related)[8 * v13], 0, 0, 0); a1.DrawText(pAutonoteFont, 1, 0, 0, pAutonoteTxt[v13-1].pText, 0, 0, 0); v15 = pAutonoteFont->CalcTextHeight(v14, &a1, 1, 0); v16 = a1.uFrameY + v15; if ( (signed int)(a1.uFrameY + v15) > (signed int)a1.uFrameHeight ) break; pRenderer->DrawTextureTransparent(0x64u, v16 + 12, pTextures_5064A0[10]); ++v12; a1.uFrameY = v16 + 24; } } //----- (00413980) -------------------------------------------------------- char *__cdecl DrawBook_Maps() { unsigned int v0; // eax@3 unsigned int v1; // eax@7 unsigned int v2; // eax@10 unsigned int v3; // eax@13 unsigned int v4; // eax@16 unsigned int v5; // eax@19 int v6; // eax@31 unsigned int v7; // eax@35 unsigned int v9; // [sp-8h] [bp-E0h]@3 unsigned int v10; // [sp-8h] [bp-E0h]@7 unsigned int v11; // [sp-8h] [bp-E0h]@10 unsigned int v12; // [sp-8h] [bp-E0h]@13 unsigned int v13; // [sp-8h] [bp-E0h]@16 unsigned int v14; // [sp-8h] [bp-E0h]@19 Texture *v15; // [sp-4h] [bp-DCh]@3 Texture *v16; // [sp-4h] [bp-DCh]@7 Texture *v17; // [sp-4h] [bp-DCh]@10 Texture *v18; // [sp-4h] [bp-DCh]@13 Texture *v19; // [sp-4h] [bp-DCh]@16 Texture *v20; // [sp-4h] [bp-DCh]@19 char Str[120]; // [sp+Ch] [bp-CCh]@37 GUIWindow v22; // [sp+84h] [bp-54h]@35 pRenderer->DrawTextureIndexed(pViewport->uViewportX, pViewport->uViewportY, pTextures_5064A0[12]); if ( dword_506548 || viewparams->field_2C / 128 >= 12 ) { v15 = pTex_tab_an_6a__zoom_off; v9 = pViewport->uViewportY + 2; v0 = pViewport->uViewportX + 408; } else { v15 = pTex_tab_an_6b__zoom_on; v9 = pViewport->uViewportY + 1; v0 = pViewport->uViewportX + 398; } pRenderer->DrawTextureTransparent(v0, v9, v15); if ( dword_506544 || viewparams->field_2C / 128 <= 3 ) { v16 = pTex_tab_an_7a__zoot_off; v10 = pViewport->uViewportY + 38; v1 = pViewport->uViewportX + 408; } else { v16 = pTex_tab_an_7b__zoot_on; v10 = pViewport->uViewportY + 38; v1 = pViewport->uViewportX + 398; } pRenderer->DrawTextureTransparent(v1, v10, v16); if ( dword_506540 ) { v17 = pTexture_506390; v11 = pViewport->uViewportY + 113; v2 = pViewport->uViewportX + 408; } else { v17 = pTexture_506394; v11 = pViewport->uViewportY + 113; v2 = pViewport->uViewportX + 398; } pRenderer->DrawTextureTransparent(v2, v11, v17); if ( dword_50653C ) { v18 = pTexture_506388; v12 = pViewport->uViewportX + 150; v3 = pViewport->uViewportY + 408; } else { v18 = pTexture_50638C; v12 = pViewport->uViewportX + 150; v3 = pViewport->uViewportY + 399; } pRenderer->DrawTextureTransparent(v3, v12, v18); if ( dword_506538 ) { v19 = pTexture_506380; v13 = pViewport->uViewportY + 188; v4 = pViewport->uViewportX + 408; } else { v19 = pTexture_506384; v13 = pViewport->uViewportY + 188; v4 = pViewport->uViewportX + 397; } pRenderer->DrawTextureTransparent(v4, v13, v19); if ( dword_506534 ) { v20 = pTexture_506378; v14 = pViewport->uViewportY + 226; v5 = pViewport->uViewportX + 408; } else { v20 = pTexture_50637C; v14 = pViewport->uViewportY + 226; v5 = pViewport->uViewportX + 397; } pRenderer->DrawTextureTransparent(v5, v14, v20); if ( dword_506544 ) viewparams->_443291(); if ( dword_506548 ) viewparams->_443249(); if ( dword_506540 ) viewparams->_443219(); if ( dword_50653C ) viewparams->_443231(); if ( dword_506538 ) viewparams->_44323D(); //v6 = dword_506534; if ( dword_506534 ) { viewparams->_443225(); //v6 = dword_506534; } if ( dword_506548 | dword_506544 | dword_506540 | dword_50653C | dword_506538 | dword_506534 ) pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); dword_506548 = 0; dword_506544 = 0; dword_506534 = 0; dword_506538 = 0; dword_50653C = 0; dword_506540 = 0; DrawBook_Map_sub(97, 49, 361, 313, 0); pRenderer->DrawTextureTransparent(75, 22, pTexture_mapbordr); v22.uFrameWidth = 460; v22.uFrameHeight = 344; v22.uFrameX = 8; v22.uFrameY = 8; v22.uFrameZ = 467; v22.uFrameW = 467; v7 = pMapStats->GetMapInfo(pCurrentMapName); if ( v7 ) v22.DrawTitleText(pBook2Font, 0xFFFFFFF2u, 0xCu, 0, pMapStats->pInfos[v7].pName, 3u); v22.uFrameX = 0; sprintf(Str, pGlobalTXT_LocalizationStrings[659], pParty->vPosition.x, pParty->vPosition.y); return v22.DrawTitleText(pFontComic, 0, 0x140u, 0, Str, 0); } //----- (00413CC6) -------------------------------------------------------- void __thiscall SellectDrawBook(unsigned int uBook) { enum WindowType pWindowType; // esi@1 pWindowType = (enum WindowType)uBook; pRenderer->DrawTextureIndexed(471u, 445u, (Texture *)(uExitCancelTextureId != -1 ? (int)&pIcons_LOD->pTextures[uExitCancelTextureId] : 0)); switch ( pWindowType ) { case WINDOW_Lloyd: // 177 DrawLloydBeaconsScreen(); break; case WINDOW_TownPortal: //195 DrawTownPortalScreen(); break; case WINDOW_QuestBook: //200 DrawBook_Quests(); break; case WINDOW_AutonotesBook: //201 DrawBook_Autonotes(); break; case WINDOW_MapsBook://202 DrawBook_Maps(); break; case WINDOW_CalendarBook://203 DrawBook_Calendar(); break; case WINDOW_HistoryBook://224 DrawBook_History(); break; } } //----- (00413D3C) -------------------------------------------------------- char *__cdecl GetDayPart() { if ( pParty->uCurrentHour > 4 ) { if ( pParty->uCurrentHour == 5 ) return pGlobalTXT_LocalizationStrings[55]; if ( pParty->uCurrentHour == 20 ) return pGlobalTXT_LocalizationStrings[566]; if ( pParty->uCurrentHour <= 0x14 || pParty->uCurrentHour > 0x17 ) return pGlobalTXT_LocalizationStrings[56]; } return pGlobalTXT_LocalizationStrings[567]; } //----- (00413D6F) -------------------------------------------------------- char __cdecl DrawBook_Calendar() { unsigned int v0; // esi@1 char *v1; // eax@5 int v2; // ecx@5 char *v3; // eax@6 GUIWindow a1; // [sp+Ch] [bp-60h]@5 unsigned int v6; // [sp+60h] [bp-Ch]@1 int v7; // [sp+64h] [bp-8h]@1 int a5; // [sp+68h] [bp-4h]@1 v0 = pParty->uCurrentHour; v6 = pMapStats->GetMapInfo(pCurrentMapName); a5 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0x4Bu, 0x4Bu, 0x4Bu); pRenderer->DrawTextureIndexed(pViewport->uViewportX, pViewport->uViewportY, pTextures_5064A0[13]); v7 = (unsigned __int8)pDayMoonPhase[pParty->uDaysPlayed]; if ( (signed int)v0 <= 12 ) { if ( !v0 ) v0 = 12; } else { v0 -= 12; } a1.uFrameX = 8; a1.uFrameY = 8; a1.uFrameWidth = 460; a1.uFrameHeight = 344; a1.uFrameZ = 467; a1.uFrameW = 467; a1.DrawTitleText(pBook2Font, 0, 0x16u, 0, pGlobalTXT_LocalizationStrings[186], 3u); if ( pParty->uCurrentHour >= 12 ) { if ( pParty->uCurrentHour >= 24 ) v2=0; else v2=1; } else v2=0; v1 = GetDayPart(); sprintf( pTmpBuf, "%s\t100:\t110%d:%02d %s - %s", pGlobalTXT_LocalizationStrings[526], v0, pParty->uCurrentMinute, aAMPMNames[v2], v1); a1.DrawText(pBookFont, 70, 55, a5, pTmpBuf, 0, 0, 0); sprintf( pTmpBuf, "%s\t100:\t110%d - %s", pGlobalTXT_LocalizationStrings[56], pParty->uDaysPlayed + 1, aDayNames[pParty->uDaysPlayed % 7]); a1.DrawText(pBookFont, 70, 2 * LOBYTE(pBookFont->uFontHeight) + 49, a5, pTmpBuf, 0, 0, 0); sprintf( pTmpBuf, "%s\t100:\t110%d - %s", pGlobalTXT_LocalizationStrings[146], pParty->uCurrentMonth + 1, aMonthNames[pParty->uCurrentMonth]); a1.DrawText(pBookFont, 70, 4 * LOBYTE(pBookFont->uFontHeight) + 43, a5, pTmpBuf, 0, 0, 0); sprintf(pTmpBuf, "%s\t100:\t110%d", pGlobalTXT_LocalizationStrings[245], pParty->uCurrentYear); a1.DrawText(pBookFont, 70, 6 * LOBYTE(pBookFont->uFontHeight) + 37, a5, pTmpBuf, 0, 0, 0); sprintf(pTmpBuf, "%s\t100:\t110%s", pGlobalTXT_LocalizationStrings[530], aMoonPhaseNames[v7]); a1.DrawText(pBookFont, 70, 8 * LOBYTE(pBookFont->uFontHeight) + 31, a5, pTmpBuf, 0, 0, 0); if ( v6 ) v3 = pMapStats->pInfos[v6].pName; else v3 = "Unknown"; sprintf(pTmpBuf, "%s\t100:\t110%s", pGlobalTXT_LocalizationStrings[531], v3); return a1.DrawText(pBookFont, 70, 10 * LOBYTE(pBookFont->uFontHeight) + 25, a5, pTmpBuf, 0, 0, 0); } //----- (00413FF1) -------------------------------------------------------- void __cdecl SetMonthNames() { aMonthNames[0] = pGlobalTXT_LocalizationStrings[415]; aMonthNames[1] = pGlobalTXT_LocalizationStrings[416]; aMonthNames[2] = pGlobalTXT_LocalizationStrings[417]; aMonthNames[3] = pGlobalTXT_LocalizationStrings[418]; aMonthNames[4] = pGlobalTXT_LocalizationStrings[419]; aMonthNames[5] = pGlobalTXT_LocalizationStrings[420]; aMonthNames[6] = pGlobalTXT_LocalizationStrings[421]; aMonthNames[7] = pGlobalTXT_LocalizationStrings[422]; aMonthNames[8] = pGlobalTXT_LocalizationStrings[423]; aMonthNames[9] = pGlobalTXT_LocalizationStrings[424]; aMonthNames[10] = pGlobalTXT_LocalizationStrings[425]; aMonthNames[11] = pGlobalTXT_LocalizationStrings[426]; } //----- (0041406F) -------------------------------------------------------- void __cdecl SetDayNames() { aDayNames[0] = pGlobalTXT_LocalizationStrings[145]; aDayNames[1] = pGlobalTXT_LocalizationStrings[230]; aDayNames[2] = pGlobalTXT_LocalizationStrings[243]; aDayNames[3] = pGlobalTXT_LocalizationStrings[227]; aDayNames[4] = pGlobalTXT_LocalizationStrings[91]; aDayNames[5] = pGlobalTXT_LocalizationStrings[188]; aDayNames[6] = pGlobalTXT_LocalizationStrings[222]; } //----- (004140BB) -------------------------------------------------------- void __cdecl SetSpellSchoolNames() { aSpellSchoolNames[0] = pGlobalTXT_LocalizationStrings[87]; aSpellSchoolNames[1] = pGlobalTXT_LocalizationStrings[6]; aSpellSchoolNames[2] = pGlobalTXT_LocalizationStrings[240]; aSpellSchoolNames[3] = pGlobalTXT_LocalizationStrings[70]; aSpellSchoolNames[4] = pGlobalTXT_LocalizationStrings[214]; aSpellSchoolNames[5] = pGlobalTXT_LocalizationStrings[142]; aSpellSchoolNames[6] = pGlobalTXT_LocalizationStrings[29]; aSpellSchoolNames[7] = pGlobalTXT_LocalizationStrings[133]; aSpellSchoolNames[8] = pGlobalTXT_LocalizationStrings[54]; } //----- (0041411B) -------------------------------------------------------- void __cdecl SetAttributeNames() { aAttributeNames[0] = pGlobalTXT_LocalizationStrings[144]; aAttributeNames[1] = pGlobalTXT_LocalizationStrings[116]; aAttributeNames[2] = pGlobalTXT_LocalizationStrings[163]; aAttributeNames[3] = pGlobalTXT_LocalizationStrings[75]; aAttributeNames[4] = pGlobalTXT_LocalizationStrings[1]; aAttributeNames[5] = pGlobalTXT_LocalizationStrings[211]; aAttributeNames[6] = pGlobalTXT_LocalizationStrings[136]; } //----- (00414162) -------------------------------------------------------- void __cdecl uGameUIFontMain_initialize() { uGameUIFontMain = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xAu, 0, 0); } //----- (00414174) -------------------------------------------------------- void __cdecl uGameUIFontShadow_initialize() { uGameUIFontShadow = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xE6u, 214u, 193u); } //----- (004141CA) -------------------------------------------------------- GUIWindow *__fastcall ModalWindow(const char *pStr, int a4) { const char *v2; // edi@1 int v3; // esi@1 GUIWindow *result; // eax@1 v2 = pStr; v3 = a4; pEventTimer->Pause(); dword_506F0C[0] = pCurrentScreen; result = GUIWindow::Create(0, 0, 640, 480, WINDOW_FinalWindow, v3, (int)v2); ptr_507BDC = result; pCurrentScreen = SCREEN_PRESS_ESCAPE_MESSAGE; return result; } // 4E28F8: using guessed type int pCurrentScreen; //----- (0041420D) -------------------------------------------------------- void __cdecl sub_41420D_press_esc() { GUIWindow v0; // [sp+4h] [bp-54h]@1 sprintf(pTmpBuf2, "%s\n \n%s", ptr_507BDC->Hint, pGlobalTXT_LocalizationStrings[61]);// Press Escape v0.Hint = pTmpBuf2; v0.uFrameWidth = 400; v0.uFrameHeight = 100; v0.uFrameX = 120; v0.uFrameY = 140; v0.uFrameZ = 519; v0.uFrameW = 239; v0.DrawMessageBox(0); } //----- (0041426F) -------------------------------------------------------- void __cdecl sub_41426F() { GUIWindow *v0; // ecx@1 v0 = ptr_507BDC; pMessageQueue_50CBD0->AddMessage((UIMessageType)(int)ptr_507BDC->ptr_1C, 0, 0); /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)(int)ptr_507BDC->ptr_1C; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; }*/ v0->Release(); ptr_507BDC = 0; pCurrentScreen = dword_506F0C[0]; pEventTimer->Resume(); } // 4E28F8: using guessed type int pCurrentScreen; //----- (004142D3) -------------------------------------------------------- char __cdecl GameMenuUI_DrawKeyBindings() { unsigned int v0; // ebp@1 int v1; // ecx@2 unsigned int v2; // eax@6 GUIWindow *v3; // edx@6 signed int v4; // ecx@7 signed int v5; // eax@8 const char *v6; // ST0C_4@16 unsigned int v7; // eax@16 const char *v8; // ST0C_4@16 unsigned int v9; // eax@16 const char *v10; // ST0C_4@16 unsigned int v11; // eax@16 const char *v12; // ST0C_4@16 unsigned int v13; // eax@16 const char *v14; // ST0C_4@16 unsigned int v15; // eax@16 const char *v16; // ST0C_4@16 unsigned int v17; // eax@16 const char *v18; // ST0C_4@16 unsigned int v19; // eax@16 const char *v20; // ST0C_4@16 unsigned int v21; // eax@16 signed int v22; // ebp@16 const char *v23; // ST0C_4@16 unsigned int v24; // eax@16 const char *v25; // ST0C_4@16 unsigned int v26; // eax@16 const char *v27; // ST0C_4@16 unsigned int v28; // eax@16 const char *v29; // ST0C_4@16 unsigned int v30; // eax@16 const char *v31; // ST0C_4@16 unsigned int v32; // eax@16 const char *v33; // ST0C_4@17 unsigned int v34; // eax@17 const char *v35; // ST0C_4@17 unsigned int v36; // eax@17 const char *v37; // ST0C_4@17 unsigned int v38; // eax@17 const char *v39; // ST0C_4@17 unsigned int v40; // eax@17 const char *v41; // ST0C_4@17 unsigned int v42; // eax@17 const char *v43; // ST0C_4@17 unsigned int v44; // eax@17 const char *v45; // ST0C_4@17 unsigned int v46; // eax@17 const char *v47; // ST0C_4@17 unsigned int v48; // eax@17 const char *v49; // ST0C_4@17 unsigned int v50; // eax@17 const char *v51; // ST0C_4@17 unsigned int v52; // eax@17 const char *v53; // ST0C_4@17 unsigned int v54; // eax@17 const char *v55; // ST0C_4@17 unsigned int v56; // eax@17 const char *v57; // ST0C_4@17 unsigned int v58; // eax@17 unsigned int v59; // eax@18 int v61; // [sp-14h] [bp-28h]@16 const char *v62; // [sp-10h] [bp-24h]@16 int v63; // [sp-Ch] [bp-20h]@16 int v64; // [sp-8h] [bp-1Ch]@16 unsigned int v65; // [sp-4h] [bp-18h]@16 unsigned int a5; // [sp+10h] [bp-4h]@1 v0 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu); a5 = v0; if ( byte_4E28FC ) { v1 = dword_507C0C + 15; dword_507C0C = v1; if ( v1 == 255 ) byte_4E28FC = 0; } else { v1 = dword_507C0C - 15; dword_507C0C = v1; if ( v1 == 15 ) byte_4E28FC = 1; } v2 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(v1, 0, 0); v3 = pGUIWindow_CurrentMenu; dword_507C08 = v2; if ( pGUIWindow_CurrentMenu->field_40 == 2 ) { pPrevVirtualCidesMapping[dword_506E68] = pKeyActionMap->pPressedKeysBuffer[0]; memset(&KeyButtonFlagChangesArray, 0, sizeof(KeyButtonFlagChangesArray)); v4 = 0; do { v5 = 0; do { if ( v4 != v5 && pPrevVirtualCidesMapping[v4] == pPrevVirtualCidesMapping[v5] ) { KeyButtonFlagChangesArray[v4] = 1; KeyButtonFlagChangesArray[v5] = 1; } ++v5; } while ( v5 < 28 ); ++v4; } while ( v4 < 28 ); dword_506E68 = -1; v3->field_40 = 0; } pRenderer->DrawTextureIndexed(8, 8, (Texture *)(uTextureID_Optkb[0] != -1 ? &pIcons_LOD->pTextures[uTextureID_Optkb[0]] : 0)); if ( KeyboardPageNum == 1 ) { pRenderer->DrawTextureIndexed(0x13, 0x12E, (Texture *)(uTextureID_Optkb[3] != -1 ? &pIcons_LOD->pTextures[uTextureID_Optkb[3]] : 0)); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 23, 142, v0, ascii_4E2D5C, 0, 0, 0); v6 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[0]); v7 = sub_414D24(0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 127, 142, v7, v6, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 23, 163, v0, ascii_4E2D50, 0, 0, 0); v8 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[1]); v9 = sub_414D24(1); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 127, 163, v9, v8, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 23, 184, v0, ascii_4E2D48, 0, 0, 0); v10 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[2]); v11 = sub_414D24(2); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 127, 184, v11, v10, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 23, 205, v0, ascii_4E2D40, 0, 0, 0); v12 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[3]); v13 = sub_414D24(3); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 127, 205, v13, v12, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 23, 226, v0, ascii_4E2D38, 0, 0, 0); v14 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[4]); v15 = sub_414D24(4); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 127, 226, v15, v14, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 23, 247, v0, ascii_4E2D30, 0, 0, 0); v16 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[5]); v17 = sub_414D24(5); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 127, 247, v17, v16, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 23, 268, v0, ascii_4E2D28, 0, 0, 0); v18 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[6]); v19 = sub_414D24(6); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 127, 268, v19, v18, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 247, 142, v0, ascii_4E2D1C, 0, 0, 0); v20 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[7]); v21 = sub_414D24(7); v22 = 350; pGUIWindow_CurrentMenu->DrawText(pFontLucida, 350, 142, v21, v20, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 247, 163, a5, ascii_4E2D14, 0, 0, 0); v23 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[8]); v24 = sub_414D24(8); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 350, 163, v24, v23, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 247, 184, a5, ascii_4E2D0C, 0, 0, 0); v25 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[9]); v26 = sub_414D24(9); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 350, 184, v26, v25, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 247, 205, a5, ascii_4E2D04, 0, 0, 0); v27 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[10]); v28 = sub_414D24(10); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 350, 205, v28, v27, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 247, 226, a5, ascii_4E2CFC, 0, 0, 0); v29 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[11]); v30 = sub_414D24(11); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 350, 226, v30, v29, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 247, 247, a5, ascii_4E2CF0, 0, 0, 0); v31 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[12]); v32 = sub_414D24(12); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 350, 247, v32, v31, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 247, 268, a5, ascii_4E2CE8, 0, 0, 0); v65 = 0; v64 = 0; v63 = 0; v62 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[13]); v61 = 13; } else { pRenderer->DrawTextureIndexed(0x7F, 0x12E, (Texture *)(uTextureID_Optkb[4] != -1 ? &pIcons_LOD->pTextures[uTextureID_Optkb[4]] : 0)); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 23, 142, v0, ascii_4E2CDC, 0, 0, 0); v33 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[14]); v34 = sub_414D24(14); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 127, 142, v34, v33, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 23, 163, v0, ascii_4E2CD4, 0, 0, 0); v35 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[15]); v36 = sub_414D24(15); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 127, 163, v36, v35, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 23, 184, v0, ascii_4E2CC8, 0, 0, 0); v37 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[16]); v38 = sub_414D24(16); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 127, 184, v38, v37, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 23, 205, v0, ascii_4E2CBC, 0, 0, 0); v39 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[17]); v40 = sub_414D24(17); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 127, 205, v40, v39, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 23, 226, v0, ascii_4E2CB0, 0, 0, 0); v41 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[18]); v42 = sub_414D24(18); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 127, 226, v42, v41, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 23, 247, v0, ascii_4E2CA4, 0, 0, 0); v43 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[19]); v44 = sub_414D24(19); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 127, 247, v44, v43, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 23, 268, v0, ascii_4E2C9C, 0, 0, 0); v45 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[20]); v46 = sub_414D24(20); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 127, 268, v46, v45, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 247, 142, v0, ascii_4E2C90, 0, 0, 0); v47 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[21]); v48 = sub_414D24(21); v22 = 350; pGUIWindow_CurrentMenu->DrawText(pFontLucida, 350, 142, v48, v47, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 247, 163, a5, ascii_4E2C84, 0, 0, 0); v49 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[22]); v50 = sub_414D24(22); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 350, 163, v50, v49, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 247, 184, a5, ascii_4E2C7C, 0, 0, 0); v51 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[23]); v52 = sub_414D24(23); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 350, 184, v52, v51, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 247, 205, a5, ascii_4E2C70, 0, 0, 0); v53 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[24]); v54 = sub_414D24(24); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 350, 205, v54, v53, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 247, 226, a5, ascii_4E2C68, 0, 0, 0); v55 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[25]); v56 = sub_414D24(25); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 350, 226, v56, v55, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 247, 247, a5, ascii_4E2C5C, 0, 0, 0); v57 = pKeyActionMap->GetVKeyDisplayName(pPrevVirtualCidesMapping[26]); v58 = sub_414D24(26); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 350, 247, v58, v57, 0, 0, 0); pGUIWindow_CurrentMenu->DrawText(pFontLucida, 247, 268, a5, ascii_4E2C54, 0, 0, 0); v65 = 0; v64 = 0; v63 = 0; v62 = pKeyActionMap->GetVKeyDisplayName(pWindowList_at_506F50_minus1_indexing[0]); v61 = 27; } v59 = sub_414D24(v61); return pGUIWindow_CurrentMenu->DrawText(pFontLucida, v22, 268, v59, v62, v63, v64, v65); } //----- (00414D24) -------------------------------------------------------- unsigned int __thiscall sub_414D24(int _this) { int v1; // esi@1 unsigned int v2; // edi@1 unsigned int v3; // ebx@1 unsigned int result; // eax@1 v1 = _this; v2 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xE1u, 0xCDu, 0x23u); v3 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFu, 0, 0); result = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu); if ( dword_506E68 == v1 ) { if ( GetTickCount() % 0x3E8 <= 0x1F4 ) result = v3; else result = v2; } else { if ( KeyButtonFlagChangesArray[v1] ) result = dword_507C08; } return result; } // 506E68: using guessed type int dword_506E68; // 506E6C: using guessed type __int16 word_506E6C[18]; // 507C08: using guessed type int dword_507C08; //----- (00414D9A) -------------------------------------------------------- void __cdecl GameMenuUI_DrawVideoOptions() { const char *v0; // ST0C_4@3 unsigned __int16 v1; // ax@3 int v2; // eax@10 GUIWindow v3; // [sp+8h] [bp-54h]@3 pRenderer->DrawTextureIndexed( 8u, 8u, (Texture *)(uTextureID_507C10 != -1 ? &pIcons_LOD->pTextures[uTextureID_507C10] : 0)); if ( !pRenderer->bWindowMode && GammaController::IsGammaSupported() ) { pRenderer->DrawTextureIndexed( 17 * uGammaPos + 42, 162u, (Texture *)(pTextureIDs_GammaPositions[uGammaPos] != -1 ? &pIcons_LOD->pTextures[pTextureIDs_GammaPositions[uGammaPos]] : 0)); pRenderer->DrawTextureRGB(0x112u, 0xA9u, &stru_506E40); v3.uFrameX = 22; v0 = pGlobalTXT_LocalizationStrings[226]; v3.uFrameY = 190; v3.uFrameWidth = 211; v3.uFrameHeight = 79; v3.uFrameZ = 232; v3.uFrameW = 268; v1 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); v3.DrawTitleText(pFontSmallnum, 0, 0, v1, v0, 3u); } if ( !pRenderer->pRenderD3D ) { pRenderer->DrawTextureIndexed( 0x14u, 0x119u, (Texture *)(uTextureID_507C50 != -1 ? &pIcons_LOD->pTextures[uTextureID_507C50] : 0)); pRenderer->DrawTextureIndexed( 0x14u, 0x12Fu, (Texture *)(uTextureID_507C54 != -1 ? &pIcons_LOD->pTextures[uTextureID_507C54] : 0)); v2 = uTextureID_507C58; goto LABEL_12; } if ( pGame->uFlags2 & GAME_FLAGS_2_DRAW_BLOODSPLATS ) pRenderer->DrawTextureIndexed( 0x14u, 0x119u, (Texture *)(uTextureID_507C14 != -1 ? &pIcons_LOD->pTextures[uTextureID_507C14] : 0)); if ( pRenderer->bUseColoredLights ) pRenderer->DrawTextureIndexed( 0x14u, 0x12Fu, (Texture *)(uTextureID_507C18 != -1 ? &pIcons_LOD->pTextures[uTextureID_507C18] : 0)); if ( pRenderer->bTinting ) { v2 = uTextureID_507C1C; LABEL_12: pRenderer->DrawTextureIndexed(0x14u, 0x145u, (Texture *)(v2 != -1 ? &pIcons_LOD->pTextures[v2] : 0)); } } //----- (00414F82) -------------------------------------------------------- void __cdecl DrawGameOptions() { signed int v0; // eax@1 pRenderer->DrawTextureIndexed(8, 8, (Texture *)(uTextureID_Options != -1 ? &pIcons_LOD->pTextures[uTextureID_Options] : 0)); pRenderer->DrawTextureIndexed(8, 132, (Texture *)(uTextureID_ControlBG[0] != -1 ? &pIcons_LOD->pTextures[uTextureID_ControlBG[0]] : 0)); v0 = 0; if ( uTurnSpeed == 128 ) { v0 = 2; } else { if ( uTurnSpeed == 64 ) v0 = 1; } pRenderer->DrawTextureIndexed(BtnTurnCoord[v0], 270, (Texture *)(uTextureID_ControlBG[v0 + 1] != -1 ? &pIcons_LOD->pTextures[uTextureID_ControlBG[v0 + 1]] : 0)); if ( bWalkSound ) pRenderer->DrawTextureIndexed(20, 303, (Texture *)(uTextureID_ControlBG[21] != -1 ? &pIcons_LOD->pTextures[uTextureID_ControlBG[21]] : 0)); if ( bShowDamage ) pRenderer->DrawTextureIndexed(128, 303, (Texture *)(uTextureID_ControlBG[22] != -1 ? &pIcons_LOD->pTextures[uTextureID_ControlBG[22]] : 0)); if ( bFlipOnExit ) pRenderer->DrawTextureIndexed(128, 325, (Texture *)(uTextureID_ControlBG[9] != -1 ? &pIcons_LOD->pTextures[uTextureID_ControlBG[9]] : 0)); if ( bAlwaysRun ) pRenderer->DrawTextureIndexed(20, 325, (Texture *)(uTextureID_ControlBG[20] != -1 ? &pIcons_LOD->pTextures[uTextureID_ControlBG[20]] : 0)); pRenderer->DrawTextureIndexed(17 * (char)uSoundVolumeMultiplier + 265, 162, (Texture *)(uTextureID_ControlBG[(char)uSoundVolumeMultiplier + 10] != -1 ? &pIcons_LOD->pTextures[uTextureID_ControlBG[(char)uSoundVolumeMultiplier + 10]] : 0)); pRenderer->DrawTextureIndexed(17 * (char)uMusicVolimeMultiplier + 265, 216, (Texture *)(uTextureID_ControlBG[(char)uMusicVolimeMultiplier + 10] != -1 ? &pIcons_LOD->pTextures[uTextureID_ControlBG[(char)uMusicVolimeMultiplier + 10]] : 0)); pRenderer->DrawTextureIndexed(17 * (char)uVoicesVolumeMultiplier + 265, 270, (Texture *)(uTextureID_ControlBG[(char)uVoicesVolumeMultiplier + 10] != -1 ? &pIcons_LOD->pTextures[uTextureID_ControlBG[(char)uVoicesVolumeMultiplier + 10]] : 0)); } //----- (004151D9) -------------------------------------------------------- void __fastcall DrawPopupWindow(unsigned int uX, unsigned int uY, unsigned int uWidth, unsigned int uHeight) { unsigned int v4; // ebx@1 Texture *v5; // edi@1 signed int uTileWidth; // ecx@1 int v7; // eax@5 int v8; // ecx@10 unsigned int v9; // ebx@14 int v10; // [sp+10h] [bp-28h]@5 signed int uTileHeight; // [sp+18h] [bp-20h]@1 int v12; // [sp+1Ch] [bp-1Ch]@7 int v13; // [sp+20h] [bp-18h]@1 int a5; // [sp+24h] [bp-14h]@5 unsigned int a5a; // [sp+24h] [bp-14h]@11 unsigned int a4; // [sp+28h] [bp-10h]@1 int uNumXTiles; // [sp+2Ch] [bp-Ch]@3 unsigned int uNumXTilesa; // [sp+2Ch] [bp-Ch]@6 unsigned int uNumXTilesb; // [sp+2Ch] [bp-Ch]@11 unsigned int a2a; // [sp+30h] [bp-8h]@1 unsigned int v21; // [sp+34h] [bp-4h]@5 unsigned int v22; // [sp+34h] [bp-4h]@11 v4 = uY; a2a = uX; a4 = uX + uWidth; pRenderer->Clip(uX, v4, uX + uWidth, v4 + uHeight); v5 = (Texture *)(uTextureID_Parchment != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_Parchment] : 0); uTileWidth = (uTextureID_Parchment != -1 ? pIcons_LOD->pTextures[uTextureID_Parchment].uTextureWidth : 24); v13 = (uTextureID_Parchment != -1 ? pIcons_LOD->pTextures[uTextureID_Parchment].uTextureWidth : 24); uTileHeight = (uTextureID_Parchment != -1 ? pIcons_LOD->pTextures[uTextureID_Parchment].uTextureHeight : 26); if ( (uTextureID_Parchment != -1 ? pIcons_LOD->pTextures[uTextureID_Parchment].uTextureWidth : 24) && (uTextureID_Parchment != -1 ? pIcons_LOD->pTextures[uTextureID_Parchment].uTextureHeight : 26) ) { uNumXTiles = (signed int)uWidth / uTileWidth; if ( (signed int)uWidth % uTileWidth ) ++uNumXTiles; a5 = 0; v21 = v4; v7 = uNumXTiles + 1; v10 = uNumXTiles + 1; do { uNumXTilesa = a2a - v13; if ( v7 > 0 ) { v12 = v7; do { uNumXTilesa += v13; pRenderer->DrawTextureIndexed(uNumXTilesa, v21, v5); --v12; } while ( v12 ); v7 = v10; } v21 += uTileHeight; v8 = a5++; } while ( v8 < (signed int)uHeight / uTileHeight ); a5a = v4 + uHeight - 32; pRenderer->DrawTextureTransparent( a2a, v4, (Texture *)(uTextureID_5076AC != -1 ? &pIcons_LOD->pTextures[uTextureID_5076AC] : 0)); pRenderer->DrawTextureTransparent( a2a, a5a, (Texture *)(uTextureID_5076B4 != -1 ? &pIcons_LOD->pTextures[uTextureID_5076B4] : 0)); pRenderer->DrawTextureTransparent( a4 - 32, v4, (Texture *)(uTextureID_5076A8 != -1 ? &pIcons_LOD->pTextures[uTextureID_5076A8] : 0)); pRenderer->DrawTextureTransparent( a4 - 32, a5a, (Texture *)(uTextureID_5076B0 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_5076B0] : 0)); uNumXTilesb = a2a + 32; v22 = v4 + uHeight - 10; if ( (signed int)uWidth > 64 ) { pRenderer->Clip(a2a + 32, v4, a4 - 32, v4 + uHeight); pRenderer->DrawTextureTransparent( uNumXTilesb, v4, (Texture *)(uTextureID_507698 != -1 ? &pIcons_LOD->pTextures[uTextureID_507698] : 0)); pRenderer->DrawTextureTransparent( uNumXTilesb, v22, (Texture *)(uTextureID_5076A4 != -1 ? &pIcons_LOD->pTextures[uTextureID_5076A4] : 0)); if ( (signed int)uWidth > 512 ) { pRenderer->DrawTextureTransparent( a2a + 544, v4, (Texture *)(uTextureID_507698 != -1 ? &pIcons_LOD->pTextures[uTextureID_507698] : 0)); pRenderer->DrawTextureTransparent( a2a + 544, v22, (Texture *)(uTextureID_5076A4 != -1 ? &pIcons_LOD->pTextures[uTextureID_5076A4] : 0)); } } v9 = v4 + 32; if ( (signed int)uHeight > 64 ) { pRenderer->Clip(a2a, v9, a4, a5a); pRenderer->DrawTextureTransparent( a2a, v9, (Texture *)(uTextureID_5076A0 != -1 ? &pIcons_LOD->pTextures[uTextureID_5076A0] : 0)); pRenderer->DrawTextureTransparent( a4 - 10, v9, (Texture *)(uTextureID_50769C != -1 ? &pIcons_LOD->pTextures[uTextureID_50769C] : 0)); } pRenderer->ResetClip(); } } //----- (00415485) -------------------------------------------------------- void DrawCopyrightWindow() { GUIWindow Dst; // [sp+8h] [bp-54h]@1 memset(&Dst, 0, 0x54u); Dst.uFrameWidth = 624; Dst.uFrameHeight = 256; Dst.uFrameX = 8; Dst.uFrameY = 30; // c 1999 The 3DO Company. Dst.uFrameHeight = pFontSmallnum->CalcTextHeight(pGlobalTXT_LocalizationStrings[157], &Dst, 24, 0) + 2 * LOBYTE(pFontSmallnum->uFontHeight) + 24; Dst.uFrameY = 470 - Dst.uFrameHeight; Dst.uFrameZ = Dst.uFrameX + Dst.uFrameWidth - 1; Dst.uFrameW = 469; Dst.DrawMessageBox(0); Dst.uFrameWidth -= 24; Dst.uFrameX += 12; Dst.uFrameY += 12; Dst.uFrameHeight -= 12; Dst.uFrameZ = Dst.uFrameX + Dst.uFrameWidth - 1; Dst.uFrameW = Dst.uFrameY + Dst.uFrameHeight - 1; Dst.DrawTitleText(pFontSmallnum, 0, 0xCu, 0, pGlobalTXT_LocalizationStrings[157], 3u); } //----- (004156F0) -------------------------------------------------------- void __cdecl GUI_UpdateWindows() // Íóæíî âñ¸ ïðåîáðàçîâàòü â êåéñû { GUIWindow *pWindow; // esi@4 unsigned int pWindowType; // eax@4 int v2; // eax@10 int v3; // eax@11 int v4; // eax@12 int v5; // eax@20 int v6; // eax@21 int v7; // eax@29 int v8; // eax@30 int v9; // eax@31 void *v10; // eax@41 int v11; // ecx@42 int v12; // eax@48 int v13; // eax@49 int v14; // eax@57 int v15; // eax@58 int v16; // eax@59 int v17; // eax@60 int v18; // eax@61 int v19; // eax@62 void *v20; // ebp@66 char *pHint; // edx@66 GUIButton *pButtonPtr_1C; // ebp@79 char *pHint1; // edx@80 char v24; // zf@81 //unsigned int v25; // eax@91 int v26; // eax@98 unsigned int v27; // ebp@106 GUIWindow *pGUIWindow2; // ecx@109 unsigned int v29; // eax@111 GUIFont *pGUIFont; // ST1C_4@115 int v31; // eax@115 void *v32; // ebp@118 int v33; // eax@119 int v34; // eax@120 int v35; // eax@121 int v36; // eax@122 int v37; // eax@123 int v38; // eax@124 int v39; // eax@129 //char *v40; // edx@138 unsigned int pNumMessages; // eax@142 GUIButton *pGUIButton; // ebp@146 //char *v43; // edx@146 unsigned int pX; // [sp-1Ch] [bp-124h]@17 unsigned int pY; // [sp-18h] [bp-120h]@17 Texture *pTexture; // [sp-14h] [bp-11Ch]@17 Texture *pTexture2; // [sp-14h] [bp-11Ch]@86 int i; // [sp+0h] [bp-108h]@3 ItemGen pItemGen; // [sp+4h] [bp-104h]@98 GUIButton GUIButton2; // [sp+28h] [bp-E0h]@133 ItemGen ItemGen2; // [sp+E4h] [bp-24h]@129 if (GetCurrentMenuID() != MENU_CREATEPARTY) sub_41CD4F(34); for ( i = 1; i <= uNumVisibleWindows; ++i ) { //v0 = (GUIWindow *)&pWindowList_at_506F50_minus1_indexing[21 * pVisibleWindowsIdxs[i]]; pWindow = &pWindowList[pVisibleWindowsIdxs[i] - 1]; pWindowType = pWindow->eWindowType; switch (pWindow->eWindowType) { case WINDOW_MainMenu_Load: { GameUI_MainMenu_DrawLoad(); break; } case WINDOW_5E: // window that initiates savegame loading { if (pWindow->Hint != (char *)1) pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); auto pGUIButton3 = (GUIButton *)pWindow->ptr_1C; pRenderer->DrawTextureIndexed(pWindow->uFrameX, pWindow->uFrameY, pGUIButton3->pTextures[0]); pHint = pWindow->Hint; viewparams->bRedrawGameUI = 1; if ( pHint && pHint != (char *)1 ) pGUIButton3->DrawLabel(pHint, pFontCreate, 0, 0); pWindow->Release(); if (pCurrentScreen == SCREEN_SAVEGAME) pMessageQueue_50CBD0->AddMessage(UIMSG_SaveGame, 0, 0); else pMessageQueue_50CBD0->AddMessage(UIMSG_LoadGame, 0, 0); break; } case WINDOW_3: { pTexture = (Texture *)(uTextureID_Options != -1 ? &pIcons_LOD->pTextures[uTextureID_Options] : 0);//pWindowType == 3 (0x3) pY = pViewport->uViewportY; pX = pViewport->uViewportX; pRenderer->DrawTextureIndexed(pX, pY, pTexture); viewparams->bRedrawGameUI = 1; break; } case WINDOW_CharacterRecord: { CharacterUI_CharacterScreen_Draw(uActiveCharacter); break; } case WINDOW_Options: { DrawGameOptions(); break; } case WINDOW_Book: { SellectDrawBook((unsigned int)pWindow->ptr_1C); break; } case WINDOW_QuickReference: { QuickRefDraw(); break; } case WINDOW_Rest: { RestUI_Draw(); break; } case WINDOW_Dialogue: { DrawDialogueUI(); break; } case WINDOW_ChangeLocation: { TravelUI_Draw(); break; } case WINDOW_SpellBook: { DrawSpellBookContent(); break; } case WINDOW_GreetingNPC: { DrawBranchlessDialogueUI(); break; } case WINDOW_Transition: { TransitionUI_Draw(); break; } case WINDOW_Scroll: { CreateScrollWindow(); break; } case WINDOW_FinalWindow: { sub_41420D_press_esc(); break; } case WINDOW_VideoOptions: { GameMenuUI_DrawVideoOptions(); break; } case WINDOW_KeyMappingOptions: { GameMenuUI_DrawKeyBindings(); break; } case WINDOW_17: { sub_4606FE(); break; } case WINDOW_1F: { pRenderer->ClearZBuffer(0, 479); draw_leather(); CharacterUI_InventoryTab_Draw(uActiveCharacter, 1); CharacterUI_DrawPaperdoll(uActiveCharacter); pRenderer->DrawTextureTransparent(pBtn_ExitCancel->uX, pBtn_ExitCancel->uY, (Texture *)(uTextureID_x_x_u != -1 ? &pIcons_LOD->pTextures[uTextureID_x_x_u] : 0)); break; } case WINDOW_RestWindow: { memset(&GUIButton2, 0, 0xBCu);//pWindowType == 98 (0x62) WINDOW_RestWindow GUIButton2.uZ = 197; GUIButton2.uW = 197; GUIButton2.uX = 27; GUIButton2.uY = 161; GUIButton2.uWidth = 171; GUIButton2.uHeight = 37; GUIButton2.pParent = pButton_RestUI_WaitUntilDawn->pParent; pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); pRenderer->DrawTextureIndexed(pWindow->uFrameX, pWindow->uFrameY, *((Texture **)pWindow->ptr_1C + 15)); viewparams->bRedrawGameUI = 1; GUIButton2.DrawLabel(pGlobalTXT_LocalizationStrings[183], pFontCreate, 0, 0);//Îòäûõ è ëå÷åíèå 8 ÷àñîâ GUIButton2.pParent = 0; pGUIWindow2 = pWindow; pGUIWindow2->Release(); break; } case WINDOW_60: { if ( pWindow->Hint != (char *)1 ) pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); pGUIButton = (GUIButton *)pWindow->ptr_1C; pRenderer->DrawTextureIndexed(pWindow->uFrameX, pWindow->uFrameY, pGUIButton->pTextures[0]); pHint = pWindow->Hint; viewparams->bRedrawGameUI = 1; if ( pHint && pHint != (char *)1 ) pGUIButton->DrawLabel(pHint, pFontCreate, 0, 0); pWindow->Release(); pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); break; } case WINDOW_61: { if ( pWindow->Hint != (char *)1 )//pWindowType == WINDOW_61 pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); v32 = pWindow->ptr_1C; pRenderer->DrawTextureIndexed(pWindow->uFrameX, pWindow->uFrameY, *((Texture **)v32 + 16)); pHint = pWindow->Hint; viewparams->bRedrawGameUI = 1; if ( pHint && pHint != (char *)1 ) ((GUIButton *)v32)->DrawLabel(pHint, pFontCreate, 0, 0); pWindow->Release(); pNumMessages = pMessageQueue_50CBD0->uNumMessages; pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); break; } case WINDOW_63: { pTexture = (Texture *)*((_DWORD *)pWindow->ptr_1C + 15);//pWindowType == 99 (0x63) WINDOW_63 pY = pWindow->uFrameY; pX = pWindow->uFrameX; pRenderer->DrawTextureIndexed(pX, pY, pTexture); viewparams->bRedrawGameUI = 1; break; } case WINDOW_CharacterWindow_Inventory: { pWindow->DrawMessageBox(0); pWindow->DrawText(pFontLucida, 10, 20, 0, "Making item number", 0, 0, 0); pWindow->DrawText(pFontLucida, 10, 40, 0, (const char *)pKeyActionMap->pPressedKeysBuffer, 0, 0, 0); if ( !pKeyActionMap->field_204 ) { ItemGen2.Reset(); pWindow->Release(); pEventTimer->Resume(); pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = 1; v39 = atoi((const char *)pKeyActionMap->pPressedKeysBuffer); if ( v39 > 0 ) { if ( v39 < 800 ) SpawnActor(v39); } } break; } case WINDOW_Chest: { if ( pCurrentScreen == SCREEN_CHEST ) { Chest::DrawChestUI((unsigned int)pWindow->ptr_1C); } else if ( pCurrentScreen == SCREEN_F ) { pRenderer->ClearZBuffer(0, 479); draw_leather(); CharacterUI_InventoryTab_Draw(uActiveCharacter, 1); pRenderer->DrawTextureIndexed(pBtn_ExitCancel->uX, pBtn_ExitCancel->uY, (Texture *)(uExitCancelTextureId != -1 ? (int)&pIcons_LOD->pTextures[uExitCancelTextureId] : 0)); } break; } case WINDOW_HouseInterior: { pWindowList[pVisibleWindowsIdxs[i] - 1].HouseDialogManager(); if ( !window_SpeakInHouse ) continue; v10 = window_SpeakInHouse->ptr_1C; if ( (signed int)v10 >= 53 ) continue; if ( pParty->field_3C._shop_ban_times[(signed int)v10] <=pParty->uTimePlayed ) { if ( (signed int)v10 < 53 ) { pParty->field_3C._shop_ban_times[(signed int)v10] = 0; } continue; } pNumMessages = pMessageQueue_50CBD0->uNumMessages; pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); break; } default: { break; } } } if ( GetCurrentMenuID() == -1 ) GameUI_DrawFoodAndGold(); if ( sub_4637E0_is_there_popup_onscreen() ) sub_416D62_ShowPopupWindow_MonsterRecord_ItemInfo_etcsub_416D62(0); } //----- (00416196) -------------------------------------------------------- void __cdecl identify_item() { Player *v0; // esi@2 POINT *v1; // edi@2 signed int v2; // ecx@5 signed int v3; // eax@5 int v4; // eax@5 char v5; // sf@5 int v6; // eax@5 int v7; // eax@7 unsigned __int16 v8; // ax@10 int v9; // edi@10 int v10; // eax@10 int v11; // edx@13 LONG v12; // edx@23 signed int v13; // edx@23 int v14; // edx@25 unsigned int v15; // edi@25 signed int v16; // edx@27 int v17; // eax@54 unsigned int v18; // edx@57 int v19; // eax@65 int v20; // edi@67 int v21; // eax@72 int v22; // ecx@74 int v23; // edx@78 int v24; // eax@79 int v25; // eax@80 int v26; // eax@84 ItemGen *v27; // esi@98 unsigned int v28; // eax@98 ItemGen *v29; // edi@98 unsigned int v30; // ecx@103 double v31; // st7@112 unsigned __int64 v32; // qax@113 unsigned int v33; // ecx@117 int v34; // eax@126 unsigned int v35; // ecx@127 double v36; // st7@132 signed __int64 v37; // qax@135 unsigned int v38; // eax@138 Vec3_int_ v39; // [sp-18h] [bp-A8h]@83 int *v40; // [sp-Ch] [bp-9Ch]@83 int *v41; // [sp-8h] [bp-98h]@83 int *v42; // [sp-4h] [bp-94h]@83 GUIWindow v43; // [sp+Ch] [bp-84h]@137 unsigned int pY; // [sp+60h] [bp-30h]@2 int v45; // [sp+64h] [bp-2Ch]@10 unsigned int pX; // [sp+68h] [bp-28h]@2 int v47; // [sp+6Ch] [bp-24h]@25 POINT y; // [sp+70h] [bp-20h]@2 POINT a2; // [sp+78h] [bp-18h]@2 Vec3_int_ pOut; // [sp+80h] [bp-10h]@2 unsigned int v51; // [sp+8Ch] [bp-4h]@23 if ( dword_50CDCC ) return; v0 = pPlayers[uActiveCharacter]; v1 = pMouse->GetCursorPos(&a2); pOut.z = pRenderer->pActiveZBuffer[v1->x + pSRZBufferLineOffsets[pMouse->GetCursorPos(&y)->y]] & 0xFFFF; pMouse->GetClickPos(&pX, &pY); if ( !pOut.z ) { if ( (signed int)pX <= 13 || (signed int)pX >= 462 || (v2 = pX - 14, v3 = pY - 17, pX = v2, pY = v3, v4 = 14 * (v3 >> 5), v2 >>= 5, v5 = v2 + v4 < 0, v6 = v2 + v4, pOut.z = v6, v5) || v6 > 126 || (v7 = v0->GetItemIDAtInventoryIndex(&pOut.z)) == 0 ) return; pOut.z = v7; } if ( !v0->CanAct() ) { sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[427], v0->pName, pGlobalTXT_LocalizationStrings[541]); v43.Hint = pTmpBuf; v43.uFrameWidth = 384; v43.uFrameHeight = 180; v43.uFrameY = 40; if ( pMouse->GetCursorPos(&a2)->x <= 320 ) v38 = pMouse->GetCursorPos(&a2)->x + 30; else v38 = pMouse->GetCursorPos(&a2)->x - 414; v43.uFrameX = v38; v43.DrawMessageBox(0); return; } --pOut.z; LOBYTE(v8) = v0->GetActualSkillLevel(PLAYER_SKILL_ALCHEMY); v9 = v8 & 0x3F; v45 = v8 & 0x3F; pOut.y = SkillToMastery(v8); v10 = pOut.z; if ( pParty->pPickedItem.uItemID == 220 ) { LABEL_116: GameUI_DrawItemInfo(&v0->pInventoryItems[v10]); return; } if ( (signed int)pParty->pPickedItem.uItemID < 200 || (signed int)pParty->pPickedItem.uItemID > 219 || (v11 = (int)((char *)v0 + 36 * pOut.z), *(int *)(v11 + 532) != 220) ) { if ( (signed int)pParty->pPickedItem.uItemID < 221 || (signed int)pParty->pPickedItem.uItemID > 271 || (v12 = (LONG)((char *)v0 + 36 * pOut.z), a2.y = v12, v13 = *(int *)(v12 + 532), v51 = v13, v13 < 221) || v13 > 271 ) { if ( pParty->pPickedItem.uItemID != 236 && ((signed int)pParty->pPickedItem.uItemID < 246 || (signed int)pParty->pPickedItem.uItemID > 250) && pParty->pPickedItem.uItemID != 263 && pParty->pPickedItem.uItemID != 233 ) goto LABEL_116; v27 = &v0->pInventoryItems[pOut.z]; v28 = v27->uItemID; v51 = pItemsTable->pItems[v27->uItemID].uEquipType; v29 = (ItemGen *)(1800 * pParty->pPickedItem.uEnchantmentType); if ( pParty->pPickedItem.uItemID != 233 ) { if ( pParty->pPickedItem.uItemID == 236 ) { v35 = v27->uAttributes; if ( v35 & 2 || (v51 & 0x80000000u) != 0 || (signed int)v51 > 12 || (signed int)v28 >= 500 ) goto LABEL_92; LOWORD(v35) = v35 | 0x210; v27->uAttributes = v35; } else { if ( (signed int)pParty->pPickedItem.uItemID <= 245 ) goto LABEL_92; if ( (signed int)pParty->pPickedItem.uItemID <= 250 ) { v27->UpdateTempBonus(pParty->uTimePlayed); v33 = v27->uItemID; if ( (signed int)v27->uItemID >= 64 && (signed int)v33 <= 65 || (pOut.y = v27->uAttributes, pOut.y & 2) || v27->uSpecEnchantmentType || v27->uEnchantmentType || v51 && v51 != 1 && v51 != 2 || (signed int)v33 >= 500 ) goto LABEL_92; v34 = *(int *)&aSbwb00[4 * pParty->pPickedItem.uItemID + 4]; a2.y = (int)v29 << 7; v31 = (double)(signed int)((int)v29 << 7); v27->uSpecEnchantmentType = v34; } else { if ( pParty->pPickedItem.uItemID != 263 || (v27->UpdateTempBonus(pParty->uTimePlayed), v30 = v27->uItemID, (signed int)v27->uItemID >= 64) && (signed int)v30 <= 65 || (pOut.y = v27->uAttributes, pOut.y & 2) || v27->uSpecEnchantmentType || v27->uEnchantmentType || v51 && v51 != 1 && v51 != 2 || (signed int)v30 >= 500 ) goto LABEL_92; a2.y = (int)v29 << 7; v27->uSpecEnchantmentType = 40; v31 = (double)a2.y; } v32 = pParty->uTimePlayed + (signed int)(signed __int64)(v31 * 0.033333335); LODWORD(v27->uExpireTime) = v32; LODWORD(v32) = pOut.y; LOBYTE(v32) = LOBYTE(pOut.y) | 0x18; HIDWORD(v27->uExpireTime) = HIDWORD(v32); v27->uAttributes = v32; } dword_50C9A8 = 256; goto LABEL_92; } v36 = (70.0 - (double)pParty->pPickedItem.uEnchantmentType) * 0.01; if ( v36 < 0.0 ) v36 = 0.0; if ( v51 != 12 ) { pAudioPlayer->PlaySound(SOUND_27, 0, 0, -1, 0, 0, 0, 0); return; } a2.y = v27->uMaxCharges; v37 = (signed __int64)((double)a2.y - v36 * (double)a2.y); v27->uMaxCharges = v37; v27->uNumCharges = (unsigned __int8)v37; goto LABEL_92; } v14 = v13 - 222; v15 = pParty->pPickedItem.uItemID - 222; v47 = v14; y.y = 0; if ( pParty->pPickedItem.uItemID == 221 || v51 == 221 ) { v16 = 5; } else { v16 = *(short *)&pItemsTable->field_EDE0[2 * (v14 + 50 * v15) + 388]; v10 = pOut.z; } v51 = v16; if ( v45 ) { if ( v16 < 225 || v16 > 227 ) { if ( v16 < 228 || v16 > 239 ) { if ( v16 < 240 || v16 > 261 ) { if ( v16 >= 262 && pOut.y != 4 ) { LABEL_53: v51 = 4; goto LABEL_54; } } else { if ( pOut.y <= 2 ) { LABEL_38: v51 = 3; goto LABEL_54; } } } else { if ( pOut.y == 1 ) { LABEL_35: v51 = 2; goto LABEL_54; } } } } else { if ( v16 >= 225 && v16 <= 227 ) { v51 = 1; goto LABEL_54; } if ( v16 >= 228 && v16 <= 239 ) goto LABEL_35; if ( v16 >= 240 && v16 <= 261 ) goto LABEL_38; if ( v16 >= 262 ) goto LABEL_53; } LABEL_54: pOut.y = 0; pOut.x = v10 + 1; v17 = (int)v0->pInventoryIndices; while ( *(int *)v17 != pOut.x ) { ++pOut.y; v17 += 4; if ( pOut.y >= 126 ) { v18 = y.y; goto LABEL_59; } } v18 = pOut.y; LABEL_59: if ( !v51 ) { LABEL_115: v10 = pOut.z; goto LABEL_116; } if ( v51 == 1 ) { v0->RemoveItemAtInventoryIndex(v18); v26 = rand(); v0->ReceiveDamage(v26 % 11 + 10, 0); pAudioPlayer->PlaySound(SOUND_8, 0, 0, -1, 0, 0, 0, 0); pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; }*/ v42 = (int *)&a2.y; v41 = (int *)&y.y; v40 = (int *)&pOut; v39.z = pParty->vPosition.z + pParty->sEyelevel; } else { if ( v51 == 2 ) { v0->RemoveItemAtInventoryIndex(v18); v25 = rand(); v0->ReceiveDamage(v25 % 71 + 30, 0); v23 = 1; } else { if ( v51 == 3 ) { v0->RemoveItemAtInventoryIndex(v18); v24 = rand(); v0->ReceiveDamage(v24 % 201 + 50, 0); v23 = 5; } else { if ( v51 != 4 ) { if ( v51 != 5 ) { v19 = v0->AddItem(0xFFFFFFFFu, 0xDCu); if ( v19 ) *(int *)&v0->field_1F5[36 * v19 + 15] = 1; v20 = v47 + 50 * v15; v0->pInventoryItems[pOut.z].uItemID = v51; v0->pInventoryItems[pOut.z].uEnchantmentType = (pParty->pPickedItem.uEnchantmentType + v0->pInventoryItems[pOut.z].uEnchantmentType) / 2; v0->SetVariable(VAR_AutoNotes, *(short *)&pItemsTable->potion_note[2 * v20 ]);//field_10168 + 388 LABEL_74: v22 = (int)((char *)v0 + 36 * pOut.z); if ( !(pItemsTable->pItems[*(int *)(v22 + 532) ].uItemID_Rep_St) ) *(int *)(v22 + 552) |= 1u; if ( !dword_4E455C ) goto LABEL_92; v0->PlaySound(SPEECH_16, 0); goto LABEL_91; } if ( v45 ) { if ( *(int *)(a2.y + 532) == 221 ) *(int *)(a2.y + 532) = pParty->pPickedItem.uItemID; else *(int *)(a2.y + 536) = pParty->pPickedItem.uEnchantmentType; v21 = v0->AddItem(0xFFFFFFFFu, 0xDCu); if ( v21 ) *(int *)&v0->field_1F5[36 * v21 + 15] = 1; goto LABEL_74; } goto LABEL_115; } v0->RemoveItemAtInventoryIndex(v18); v0->SetCondition(0x10u, 0); v23 = 0; } } v0->_4160CA(v23); pAudioPlayer->PlaySound(SOUND_8, 0, 0, -1, 0, 0, 0, 0); pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; }*/ v42 = (int *)&a2.y; v41 = (int *)&y.y; v40 = (int *)&pOut; v39.z = pParty->vPosition.z + pParty->sEyelevel; } *(_QWORD *)&v39.x = *(_QWORD *)&pParty->vPosition.x; Vec3_int_::Rotate(64, pParty->sRotationY, pParty->sRotationX, v39, v40, v41, v42); sub_42F7EB_DropItemAt(0x41Bu, pOut.x, y.y, a2.y, 0, 1, 0, 0, 0); if ( dword_4E455C ) { if ( v0->CanAct() ) v0->PlaySound(SPEECH_17, 0); ShowStatusBarString(pGlobalTXT_LocalizationStrings[444], 2u); LABEL_91: dword_4E455C = 0; } LABEL_92: pMouse->RemoveHoldingItem(); dword_50CDCC = 1; return; } *(int *)(v11 + 536) = v9 + pItemsTable->pItems[pParty->pPickedItem.uItemID].uDamageDice; switch ( pParty->pPickedItem.uItemID ) { case 0xC8u: case 0xC9u: case 0xCAu: case 0xCBu: case 0xCCu: v0->pInventoryItems[pOut.z].uItemID = 222; break; case 0xCDu: case 0xCEu: case 0xCFu: case 0xD0u: case 0xD1u: v0->pInventoryItems[pOut.z].uItemID = 223; break; case 0xD2u: case 0xD3u: case 0xD4u: case 0xD5u: case 0xD6u: v0->pInventoryItems[pOut.z].uItemID = 224; break; case 0xD7u: case 0xD8u: case 0xD9u: case 0xDAu: case 0xDBu: v0->pInventoryItems[pOut.z].uItemID = 221; break; default: break; } pMouse->RemoveHoldingItem(); dword_50CDCC = 1; if ( dword_4E455C ) { v0->PlaySound(SPEECH_16, 0); dword_4E455C = 0; } } //----- (00416B01) -------------------------------------------------------- void __thiscall sub_416B01(void *_this)//PopupWindowForBenefitAndJoinText { int v1; // edi@2 int v2; // ecx@2 NPCData *v3; // eax@2 NPCData *v4; // esi@7 NPCData *v5; // eax@16 NPCData *v6; // esi@16 const CHAR *v7; // eax@18 unsigned int v8; // eax@25 unsigned int v9; // eax@25 const char *v10; // ST14_4@26 char *v11; // esi@26 const char *v12; // ST18_4@27 unsigned __int16 v13; // ax@28 char *v14; // eax@28 GUIWindow a1; // [sp+Ch] [bp-60h]@23 int a2; // [sp+60h] [bp-Ch]@16 void *v17; // [sp+64h] [bp-8h]@1 LPCSTR lpsz; // [sp+68h] [bp-4h]@6 v17 = _this; if ( bNoNPCHiring != 1 ) { v1 = 0; v2 = 0; v3 = pParty->pHirelings; /*do { if ( v3->pName ) pTmpBuf[v1++] = v2; ++v3; ++v2; } while ( (signed int)v3 < (signed int)&pParty->pPickedItem );*/ for (int i = 0; i < 2; ++i) { if (pParty->pHirelings[i].pName) pTmpBuf[v1++] = i; } lpsz = 0; if ( (signed int)pNPCStats->uNumNewNPCs > 0 ) { /*v4 = pNPCStats->pNewNPCData; do { if ( v4->uFlags & 0x80 && (!pParty->pHirelings[0].pName || strcmp(v4->pName, pParty->pHirelings[0].pName)) && (!pParty->pHirelings[1].pName || strcmp(v4->pName, pParty->pHirelings[1].pName)) ) pTmpBuf[v1++] = (char)lpsz + 2; ++lpsz; ++v4; } while ( (signed int)lpsz < (signed int)pNPCStats->uNumNewNPCs );*/ for (int i = 0; i < pNPCStats->uNumNewNPCs; ++i) { if (pNPCStats->pNewNPCData[i].Hired()) { if (!pParty->pHirelings[0].pName || strcmp((char *)pNPCStats->pNewNPCData[i].pName, (char *)pParty->pHirelings[0].pName)) { if (!pParty->pHirelings[1].pName || strcmp((char *)pNPCStats->pNewNPCData[i].pName, (char *)pParty->pHirelings[1].pName)) pTmpBuf[v1++] = i + 2; } } } } if ( (signed int)((char *)v17 + (unsigned __int8)pParty->field_709) < v1 ) { uDialogue_SpeakingActorNPC_ID = -1 - (unsigned __int8)pParty->field_709 - (int)v17; v5 = GetNewNPCData(uDialogue_SpeakingActorNPC_ID, (int)&a2); v6 = v5; if ( v5 ) { if ( a2 == 57 ) v7 = pNPCTopics[512].pText; else v7 = (const CHAR *)pNPCStats->pProfessions[v5->uProfession].pBenefits; lpsz = v7; if ( !v7 ) { lpsz = (LPCSTR)pNPCStats->pProfessions[v5->uProfession].pJoinText; if ( !lpsz ) lpsz = ""; } a1.Hint = 0; a1.uFrameX = 38; a1.uFrameY = 60; a1.uFrameWidth = 276; a1.uFrameZ = 313; a1.uFrameHeight = pFontArrus->CalcTextHeight(lpsz, &a1, 0, 0) + 2 * LOBYTE(pFontArrus->uFontHeight) + 24; if ( (signed int)a1.uFrameHeight < 130 ) a1.uFrameHeight = 130; a1.uFrameWidth = 400; a1.uFrameZ = a1.uFrameX + 399; a1.DrawMessageBox(0); sprintf(pTmpBuf2, "NPC%03d", v6->uPortraitID); v8 = pIcons_LOD->LoadTexture(pTmpBuf2, TEXTURE_16BIT_PALETTE); pRenderer->DrawTextureIndexed( a1.uFrameX + 22, a1.uFrameY + 36, (Texture *)(v8 != -1 ? &pIcons_LOD->pTextures[v8] : 0)); v9 = v6->uProfession; if ( v9 ) { v10 = v6->pName; v11 = pTmpBuf; sprintfex(pTmpBuf, pGlobalTXT_LocalizationStrings[429], v10, aNPCProfessionNames[v9]); } else { v12 = v6->pName; v11 = pTmpBuf; strcpy(pTmpBuf, v12); } v13 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); a1.DrawTitleText(pFontArrus, 0, 0xCu, v13, v11, 3u); a1.uFrameWidth -= 24; a1.uFrameZ = a1.uFrameX + a1.uFrameWidth - 1; v14 = BuilDialogueString((char *)lpsz, uActiveCharacter - 1, 0, 0, 0, 0); a1.DrawText(pFontArrus, 100, 36, 0, v14, 0, 0, 0); } } } } //----- (00416D62) -------------------------------------------------------- void sub_416D62_ShowPopupWindow_MonsterRecord_ItemInfo_etcsub_416D62(Vec2_int_ *_this) { signed int pPlayerNum; // eax@12 char *v2; // eax@32 void *v3; // ecx@52 unsigned int v4; // eax@59 int v5; // esi@62 signed int v6; // esi@64 signed int v7; // esi@69 ItemGen *v8; // ecx@70 unsigned int v9; // eax@72 unsigned int v10; // eax@76 char v11; // zf@83 GUIButton *pButton; // esi@84 unsigned int v13; // ecx@85 char *pStr; // edi@85 signed int pControlID; // eax@92 int v16; // eax@95 int v17; // eax@96 enum PLAYER_SKILL_TYPE v18; // eax@98 char *pStr2; // eax@99 unsigned int v20; // eax@108 unsigned int pSkillId; // eax@109 const char *pSkillInfo; // eax@111 //char *v23; // ebx@112 char *pHint; // edx@113 unsigned int pColor; // eax@113 GUIWindow pWindow; // [sp+4h] [bp-74h]@32 double v27; // [sp+58h] [bp-20h]@33 struct tagPOINT Point; // [sp+60h] [bp-18h]@6 char *v29; // [sp+68h] [bp-10h]@33 float v30; // [sp+6Ch] [bp-Ch]@33 unsigned int pX; // [sp+70h] [bp-8h]@3 unsigned int pY; // [sp+74h] [bp-4h]@3 if ( pCurrentScreen == SCREEN_VIDEO ) return; if ( _this ) { pX = _this->x; pY = _this->y; } else { pMouse->GetClickPos(&pX, &pY); } if ( pRenderer->bWindowMode ) { GetCursorPos(&Point); ScreenToClient(hWnd, &Point); if ( Point.x < 1 || Point.y < 1 || Point.x > 638 || Point.y > 478 ) { back_to_game(); return; } } if ( pParty->pPickedItem.uItemID )//íàæàòèå íà ïîðòðåò ïåðñà ïðàâîé êíîïêîé ìûøè ñ ðàñòâîðîì { //v1 = 0; //do for ( pPlayerNum = 0; pPlayerNum < 4; ++pPlayerNum) { if ( (signed int)pX > RightClickPortraitXmin[pPlayerNum] && (signed int)pX < RightClickPortraitXmax[pPlayerNum] && (signed int)pY > 375 && (signed int)pY < 466 ) { pPlayers[uActiveCharacter]->UseItem_DrinkPotion_etc(pPlayerNum + 1, 1); return; } //++v1; } //while ( v1 < 4 ); } pEventTimer->Pause(); switch(pCurrentScreen) { case SCREEN_CASTING: { identify_item(); break; } case SCREEN_CHEST: { if ( !pPlayers[uActiveCharacter]->CanAct() ) { sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[427],//%s íå â ñîñòîÿíèè %s pPlayers[uActiveCharacter]->pName, pGlobalTXT_LocalizationStrings[541]);//Îïîçíàòü ïðåäìåòû pWindow.Hint = pTmpBuf; pWindow.uFrameWidth = 384; pWindow.uFrameHeight = 180; pWindow.uFrameY = 40; if ( (signed int)pX <= 320 ) v10 = pX + 30; else v10 = pX - 414; pWindow.uFrameX = v10; pWindow.DrawMessageBox(0); } else { v9 = pX + pSRZBufferLineOffsets[pY]; if ( pRenderer->pActiveZBuffer[v9] & 0xFFFF ) { // __debugbreak(); // invalid indexing will result in invalid object ptr // v8 = (ItemGen *)(&pOtherOverlayList->pOverlays[49].field_4 + 2662 * (unsigned int)pChestWindow->ptr_1C + 18* *((short *)&pChests[0].igChestItems[139].uExpireTime // + (pRenderer->pActiveZBuffer[v9] & 0xFFFF) + 2662 * (unsigned int)pChestWindow->ptr_1C + 3)); v10=pChests[pChestWindow->par1C].pInventoryIndices[(pRenderer->pActiveZBuffer[v9] & 0xFFFF)-1]; v8 =&pChests[pChestWindow->par1C].igChestItems[v10-1]; GameUI_DrawItemInfo(v8); } } break; } case SCREEN_GAME: { if (GetCurrentMenuID() > 0) break; if ( (signed int)pY > (signed int)pViewport->uViewportW ) { pWindow.ptr_1C = (void *)((signed int)pX / 118); if ( (signed int)pX / 118 < 4 ) { pWindow.Hint = 0; pWindow.uFrameWidth = 400; pWindow.uFrameHeight = 200; pWindow.uFrameX = 38; pWindow.uFrameY = 60; pAudioPlayer->StopChannels(-1, -1); pWindow.DrawQuickCharRecord(); } } else if ( (signed int)pX > (signed int)pViewport->uViewportZ ) { if ( (signed int)pY >= 130 ) { if ( (signed int)pX >= 476 && (signed int)pX <= 636 && (signed int)pY >= 240 && (signed int)pY <= 300 ) { pWindow.Hint = 0; pWindow.uFrameWidth = 400; pWindow.uFrameHeight = 200; pWindow.uFrameX = 38; pWindow.uFrameY = 60; pAudioPlayer->StopChannels(-1, -1); pWindow._41D73D_draw_buff_tooltip(); } else if ( (signed int)pX < 485 || (signed int)pX > 548 || (signed int)pY < 156 || (signed int)pY > 229 ) { if (!( (signed int)pX < 566 || (signed int)pX > 629 || (signed int)pY < 156 || (signed int)pY > 229 )) { pAudioPlayer->StopChannels(-1, -1); v3 = (void *)1; } } else { pAudioPlayer->StopChannels(-1, -1); v3 = 0; sub_416B01(v3); } } else { pWindow.Hint = _4443D5_GetMinimapRightClickText(); pWindow.uFrameWidth = 256; pWindow.uFrameX = 130; pWindow.uFrameY = 140; pWindow.uFrameHeight = 64; pAudioPlayer->StopChannels(-1, -1); pWindow.DrawMessageBox(0); } } else { pWindow.Hint = 0; pWindow.uFrameWidth = 320; pWindow.uFrameHeight = 320; v4 = pX - 350; if ( (signed int)pX <= 320 ) v4 = pX + 30; pWindow.uFrameX = v4; pWindow.uFrameY = 40; if ( pRenderer->pRenderD3D ) LOWORD(v5) = pGame->pVisInstance->get_picked_object_zbuf_val(); else v5 = pRenderer->pActiveZBuffer[pX + pSRZBufferLineOffsets[pY]]; v6 = (unsigned __int16)v5; if ( (v6 & 7) != OBJECT_Item) { if ( (v6 & 7) == OBJECT_Actor) { if ( pRenderer->uNumSceneBegins ) { pWindow.DrawMessageBox(1); MonsterPopup_Draw(v6 >> 3, &pWindow); } else { pRenderer->BeginScene(); pWindow.DrawMessageBox(1); MonsterPopup_Draw(v6 >> 3, &pWindow); pRenderer->EndScene(); } } } else { v7 = v6 >> 3; if ( ! (pObjectList->pObjects[pSpriteObjects[v7].uObjectDescID].uFlags & 0x10 ) ) { v8 = &pSpriteObjects[v7].stru_24; GameUI_DrawItemInfo(v8); } } } break; } case SCREEN_BOOKS: { if ( !dword_506364 || (signed int)pX < (signed int)pViewport->uViewportX || (signed int)pX > (signed int)pViewport->uViewportZ || (signed int)pY < (signed int)pViewport->uViewportY || (signed int)pY > (signed int)pViewport->uViewportW || (v2 = (char *)sub_444564(), (pWindow.Hint = v2) == 0) ) break; v30 = (double)(pFontArrus->GetLineWidth(v2) + 32); v27 = v30 + 6.7553994e15; v29 = (char *)LODWORD(v27); pWindow.uFrameWidth = LODWORD(v27); pWindow.uFrameX = pX + 5; pWindow.uFrameY = pY + 5; pWindow.uFrameHeight = 64; pAudioPlayer->StopChannels(-1, -1); pWindow.DrawMessageBox(0); break; } case SCREEN_CHARACTERS: case SCREEN_E: case SCREEN_F: { if ( (signed int)pX > 467 && pCurrentScreen != SCREEN_E ) { identify_item(); } else if ( (signed int)pY >= 345 ) break; else if ( pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] == 100 )//2DEvent - CharacerScreenStats { CharacterUI_StatsTab_ShowHint(); } else if ( pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] == 101 )//2DEvent - CharacerScreenSkills { CharacterUI_SkillsTab_ShowHint(); } else { v11 = pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] == 103;//2DEvent - CharacerScreenInventory if ( v11 ) identify_item(); } break; } case SCREEN_SPELL_BOOK: { if ( dword_507B00_spell_info_to_draw_in_popup ) DrawSpellDescriptionPopup(dword_507B00_spell_info_to_draw_in_popup - 1); break; } case SCREEN_HOUSE: { if ( (signed int)pY < 345 && (signed int)pX < 469 ) sub_4B1A2D();//identify item in inventory break; } case SCREEN_PARTY_CREATION: { pWindow.Hint = 0; pStr = 0; for ( pButton = pGUIWindow_CurrentMenu->pControlsHead; pButton; pButton = pButton->pNext) { if ( pButton->uButtonType == 1 && pButton->uButtonType != 3 && (signed int)pX > (signed int)pButton->uX && (signed int)pX < (signed int)pButton->uZ && (signed int)pY > (signed int)pButton->uY && (signed int)pY < (signed int)pButton->uW ) { pControlID = pButton->uControlID; switch ( pControlID ) { case 0: //stats info pWindow.Hint = pAttributeDescriptions[(signed int)pButton->uControlParam % 7]; pStr = aAttributeNames[(signed int)pButton->uControlParam % 7]; break; case 62: //Plus button info pStr = pGlobalTXT_LocalizationStrings[670];//Äîáàâèòü pWindow.Hint = pGlobalTXT_LocalizationStrings[671];//"Äîáàâëÿåò î÷êî ê âûäåëåííîìó íàâûêó, çàáèðàÿ åãî èç íàêîïèòåëÿ î÷êîâ" break; case 63: //Minus button info pStr = pGlobalTXT_LocalizationStrings[668];//Âû÷åñòü pWindow.Hint = pGlobalTXT_LocalizationStrings[669];//"Âû÷èòàåò î÷êî èç âûäåëåííîãî íàâûêà, âîçâðàùàÿ åãî â íàêîïèòåëü î÷êîâ" break; case 64: //Available skill button info v18 = pParty->pPlayers[uPlayerCreationUI_SelectedCharacter].GetSkillIdxByOrder(pButton->uControlParam + 4); pStr = pSkillNames[v18]; pWindow.Hint = pSkillDesc[v18]; break; case 65: //Available Class Info pWindow.Hint = pClassDescriptions[pButton->uControlParam]; pStr = pClassNames[pButton->uControlParam]; break; case 66: //OK Info pWindow.Hint = pGlobalTXT_LocalizationStrings[664];//Ùåëêíèòå çäåñü äëÿ óòâåðæäåíèÿ ñîñòàâà îòðÿäà è ïðîäîëæåíèÿ èãðû. pStr = pGlobalTXT_LocalizationStrings[665];//Êíîïêà ÎÊ break; case 67: //Clear info pWindow.Hint = pGlobalTXT_LocalizationStrings[666];//Ñáðàñûâàåò âñå ïàðàìåòðû è íàâûêè îòðÿäà. pStr = pGlobalTXT_LocalizationStrings[667];//Êíîïêà Î÷èñòèòü break; case 118: // Character info pStr = pParty->pPlayers[pButton->uControlParam].pName; pWindow.Hint = pClassDescriptions[pParty->pPlayers[pButton->uControlParam].classType]; break; } if ( pControlID > 68 && pControlID <= 75 ) //Sellected skills info { pSkillId = pParty->pPlayers[pButton->uControlParam].GetSkillIdxByOrder(pControlID - 72); pY = 0; if ( (signed int)pSkillId < 37 ) { pSkillInfo = CharacterUI_GetSkillDescText(pButton->uControlParam, (enum PLAYER_SKILL_TYPE)pSkillId); strcpy(pTmpBuf2, pSkillInfo); pWindow.Hint = pTmpBuf2; pStr = pSkillNames[pSkillId]; } } } } if ( pWindow.Hint ) { pHint = pWindow.Hint; pWindow.Hint = 0; pWindow.uFrameWidth = 384; pWindow.uFrameHeight = 256; pWindow.uFrameX = 128; pWindow.uFrameY = 40; pWindow.uFrameHeight = pFontSmallnum->CalcTextHeight(pHint, &pWindow, 24, 0) + 2 * LOBYTE(pFontLucida->uFontHeight) + 24; pWindow.uFrameZ = pWindow.uFrameX + pWindow.uFrameWidth - 1; pWindow.uFrameW = pWindow.uFrameY + pWindow.uFrameHeight - 1; pWindow.DrawMessageBox(0); pWindow.uFrameX += 12; pWindow.uFrameWidth -= 24; pWindow.uFrameY += 12; pWindow.uFrameHeight -= 12; pWindow.uFrameZ = pWindow.uFrameX + pWindow.uFrameWidth - 1; pWindow.uFrameW = pWindow.uFrameY + pWindow.uFrameHeight - 1; pColor = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFF, 0xFF, 0x9B); sprintf(pTmpBuf, format_4E2D80, pColor, pStr);//"\f%05d%s\f00000\n" pWindow.DrawTitleText(pFontCreate, 0, 0, 0, pTmpBuf, 3); pWindow.DrawText(pFontSmallnum, 1, pFontLucida->uFontHeight, 0, pHint, 0, 0, 0); } break; } default: { break; } } dword_507BF0_is_there_popup_onscreen = 1; viewparams->bRedrawGameUI = 1; } //----- (004175C0) -------------------------------------------------------- void UI_OnMouseLeftClick(int *pXY) { int *pXY_; // esi@1 signed int y; // eax@7 signed int x; // ecx@7 unsigned int v4; // eax@11 signed int v5; // eax@17 signed int v6; // esi@19 int v7; // esi@30 GUIWindow *v8; // edx@31 GUIButton *i; // esi@37 signed int v10; // eax@50 int v11; // ecx@52 unsigned int pX; // [sp+14h] [bp-8h]@7 unsigned int pY; // [sp+18h] [bp-4h]@7 pXY_ = pXY; if ( pCurrentScreen == SCREEN_VIDEO || sub_4637E0_is_there_popup_onscreen() ) return; if ( pGUIWindow2 && pGUIWindow2->ptr_1C == (void *)33 ) { sub_4452BB(); return; } if ( pXY_ ) { x = *pXY_; y = pXY_[1]; pX = *pXY_; pY = y; } else { pMouse->GetClickPos(&pX, &pY); y = pY; x = pX; } if ( pCurrentScreen != SCREEN_GAME || !dword_507B98_ctrl_pressed ) goto LABEL_30; v4 = GetCurrentMenuID(); x = pX; if ( (v4 & 0x80000000u) == 0 || (signed int)pX < (signed int)pViewport->uViewportX || (signed int)pX > (signed int)pViewport->uViewportZ ) { y = pY; LABEL_30: v7 = uNumVisibleWindows; if ( uNumVisibleWindows < 0 ) return; while ( 1 ) { //v8 = (GUIWindow *)&pWindowList_at_506F50_minus1_indexing[21 * pVisibleWindowsIdxs[v7]]; v8 = &pWindowList[pVisibleWindowsIdxs[v7] - 1]; if ( x >= (signed int)v8->uFrameX ) { if ( x <= (signed int)v8->uFrameZ && y >= (signed int)v8->uFrameY && y <= (signed int)v8->uFrameW ) break; } --v7; if ( v7 < 0 ) return; } for ( i = v8->pControlsHead; ; i = i->pNext ) { if ( !i ) return; if ( i->uButtonType == 1 ) goto LABEL_41; if ( i->uButtonType != 2 ) break; if ( (signed int)(signed __int64)sqrt((double)((x - i->uX) * (x - i->uX) + (y - i->uY) * (y - i->uY))) < (signed int)i->uWidth ) goto LABEL_50; y = pY; x = pX; LABEL_45: ; } if ( i->uButtonType != 3 ) goto LABEL_45; LABEL_41: if ( x >= (signed int)i->uX && x <= (signed int)i->uZ && y >= (signed int)i->uY && y <= (signed int)i->uW ) { LABEL_50: i->field_2C_is_pushed = 1; v10 = pMessageQueue_50CBD0->uNumMessages; if ( pMessageQueue_50CBD0->uNumMessages ) { v10 = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; } //v11 = i->uControlParam; pMessageQueue_50CBD0->AddMessage((UIMessageType)i->uControlID, i->uControlParam, 0); return; } goto LABEL_45; } y = pY; if ( (signed int)pY < (signed int)pViewport->uViewportY || (signed int)pY > (signed int)pViewport->uViewportW ) goto LABEL_30; if ( pRenderer->pRenderD3D ) v5 = pGame->pVisInstance->get_picked_object_zbuf_val(); else v5 = pRenderer->pActiveZBuffer[pX + pSRZBufferLineOffsets[pY]]; v6 = (unsigned __int16)v5; if ( (v5 & 7) == OBJECT_Actor && uActiveCharacter && v5 < 33554432 && pPlayers[uActiveCharacter]->CanAct() && pPlayers[uActiveCharacter]->CanSteal() ) { /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)27; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v6 >> 3; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; }*/ pMessageQueue_50CBD0->AddMessage(UIMSG_1B, v6 >> 3, 0); if ( pParty->bTurnBasedModeOn == 1 ) { if ( pTurnEngine->field_4 == 3 ) pTurnEngine->field_18 |= 8u; } } } //----- (00417871) -------------------------------------------------------- void __thiscall sub_417871(int *pXY) { POINT v1; // [sp+0h] [bp-18h]@5 POINT a2; // [sp+8h] [bp-10h]@5 unsigned int pY; // [sp+10h] [bp-8h]@3 unsigned int pX; // [sp+14h] [bp-4h]@3 if ( !pRenderer->pRenderD3D ) { if ( pXY ) { pX = *pXY; pY = pXY[1]; } else { pMouse->GetClickPos(&pX, &pY); } pMouse->GetCursorPos(&a2); pMouse->GetCursorPos(&v1); } } //----- (004178C4) -------------------------------------------------------- void __cdecl sub_4178C4() { if ( pArcomageGame->bGameInProgress == 1 ) { if (pAsyncMouse) pArcomageGame->stru1.field_0 = 7; } } //----- (004178E1) -------------------------------------------------------- void __cdecl sub_4178E1() { if ( pArcomageGame->bGameInProgress == 1 ) { if (pAsyncMouse) pArcomageGame->stru1.field_0 = 8; } } //----- (004178FE) -------------------------------------------------------- unsigned int __fastcall UI_GetHealthManaStringColor(signed int a1, signed int a2) { unsigned __int16 v2; // dx@2 unsigned __int16 v3; // cx@2 int v5; // eax@5 unsigned __int16 v6; // [sp-4h] [bp-8h]@2 if ( a1 <= a2 ) { if ( a1 == a2 ) return 0; v5 = 100 * a1 / a2; v3 = 255; if ( v5 >= 25 ) { v6 = 100; v2 = 255; } else { v6 = 0; v2 = 0; } } else { v6 = 0; v2 = 255; v3 = 0; } return GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(v3, v2, v6); } //----- (00417939) -------------------------------------------------------- signed int __thiscall GetConditionDrawColor(unsigned int uConditionIdx) { unsigned int v1; // ebx@1 signed int v2; // edi@1 unsigned int v3; // esi@1 unsigned int v4; // eax@1 unsigned int v6; // [sp+Ch] [bp-4h]@1 v1 = uConditionIdx; v2 = 65535; v3 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xE1u, 0xCDu, 0x23u); v6 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0x23u, 0); v4 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0, 0xFFu, 0); switch ( v1 ) { case 0u: case 1u: case 3u: case 4u: case 5u: case 6u: case 7u: v2 = v4; break; case 2u: case 8u: case 9u: case 0xCu: case 0xDu: v2 = v3; break; case 0xAu: case 0xBu: case 0xEu: case 0xFu: case 0x10u: v2 = v6; break; default: return v2; } return v2; } //----- (004179BC) -------------------------------------------------------- char __fastcall sub_4179BC_draw_tooltip(const char *a1, const char *a2) { const char *v2; // ebx@1 const char *v3; // edi@1 unsigned int v4; // eax@1 GUIWindow Dst; // [sp+Ch] [bp-5Ch]@1 POINT v6; // [sp+60h] [bp-8h]@1 v2 = a2; v3 = a1; memset(&Dst, 0, 0x54u); Dst.uFrameWidth = 384; Dst.uFrameHeight = 256; Dst.uFrameX = 128; Dst.uFrameY = pMouse->GetCursorPos(&v6)->y + 30; Dst.uFrameHeight = pFontSmallnum->CalcTextHeight(v2, &Dst, 24, 0) + 2 * LOBYTE(pFontLucida->uFontHeight) + 24; Dst.uFrameZ = Dst.uFrameX + Dst.uFrameWidth - 1; Dst.uFrameW = Dst.uFrameY + Dst.uFrameHeight - 1; Dst.DrawMessageBox(0); Dst.uFrameX += 12; Dst.uFrameWidth -= 24; Dst.uFrameY += 12; Dst.uFrameHeight -= 12; Dst.uFrameZ = Dst.uFrameX + Dst.uFrameWidth - 1; Dst.uFrameW = Dst.uFrameY + Dst.uFrameHeight - 1; v4 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); sprintf(pTmpBuf, format_4E2D80, v4, v3); Dst.DrawTitleText(pFontCreate, 0, 0, 0, pTmpBuf, 3u); return Dst.DrawText(pFontSmallnum, 1, LOBYTE(pFontLucida->uFontHeight), 0, v2, 0, 0, 0); } //----- (00417AD4) -------------------------------------------------------- unsigned int __fastcall GetSkillColor(unsigned int uPlayerClass, enum PLAYER_SKILL_TYPE uPlayerSkillType, signed int skill_level) { int v8; // eax@10 int v12; // eax@14 unsigned int yellow; // [sp+Ch] [bp-Ch]@1 unsigned int red; // [sp+10h] [bp-8h]@1 unsigned int white; // [sp+14h] [bp-4h]@1 white = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu); red = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0, 0); yellow = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0); if ( !(uPlayerClass % 4) ) { if ( byte_4ED970_skill_learn_ability_by_class_table[uPlayerClass][uPlayerSkillType] >= skill_level ) return white; if ( byte_4ED970_skill_learn_ability_by_class_table[uPlayerClass + 1][uPlayerSkillType] < skill_level && byte_4ED970_skill_learn_ability_by_class_table[uPlayerClass + 2][uPlayerSkillType] < skill_level ) { v12 = byte_4ED970_skill_learn_ability_by_class_table[uPlayerClass + 3][uPlayerSkillType]; if ( v12 < skill_level ) return red; } return yellow; } if ( (uPlayerClass % 4) == 1 ) { if ( byte_4ED970_skill_learn_ability_by_class_table[uPlayerClass][uPlayerSkillType] >= skill_level ) return white; if ( byte_4ED970_skill_learn_ability_by_class_table[uPlayerClass + 1][uPlayerSkillType] < skill_level ) { v8 = byte_4ED970_skill_learn_ability_by_class_table[uPlayerClass + 2][uPlayerSkillType]; if ( v8 < skill_level) return red; } return yellow; } if ( (uPlayerClass % 4) == 2 || (uPlayerClass % 4) == 3 ) { if ( byte_4ED970_skill_learn_ability_by_class_table[uPlayerClass][uPlayerSkillType] < skill_level ) return red; } return white; } //----- (00417BB5) -------------------------------------------------------- const char *__fastcall CharacterUI_GetSkillDescText(unsigned int uPlayerID, enum PLAYER_SKILL_TYPE uPlayerSkillType) { //enum PLAYER_SKILL_TYPE v2; // esi@1 //unsigned int v3; // ebx@1 int v4; // edi@1 int v5; // eax@1 Player *pPlayer; // ebx@7 char v7; // al@7 char v8; // cl@7 unsigned int v9; // eax@8 unsigned int v10; // eax@8 unsigned int v11; // eax@8 enum PLAYER_SKILL_TYPE v12; // edi@8 unsigned int v13; // eax@8 unsigned int v14; // eax@8 enum PLAYER_SKILL_TYPE v15; // esi@8 int v16; // edi@8 char v17; // al@8 int v18; // ST5C_4@8 int v19; // ST4C_4@8 int v20; // ST3C_4@8 int v21; // ST2C_4@8 int v22; // ST1C_4@8 char *v23; // esi@8 unsigned int v24; // eax@9 unsigned int v25; // eax@9 unsigned int v26; // eax@9 unsigned int v27; // ecx@9 enum PLAYER_SKILL_TYPE v28; // ebx@9 unsigned int v29; // eax@9 char a2[1200]; // [sp+Ch] [bp-538h]@7 char Source[120]; // [sp+4BCh] [bp-88h]@7 unsigned __int16 *v33; // [sp+534h] [bp-10h]@1 int v34; // [sp+538h] [bp-Ch]@1 unsigned __int16 *v35; // [sp+53Ch] [bp-8h]@1 //enum PLAYER_SKILL_TYPE v36; // [sp+540h] [bp-4h]@1 //v2 = uPlayerSkillType; //v3 = uPlayerID; //v36 = uPlayerSkillType; v4 = pFontSmallnum->GetLineWidth(pGlobalTXT_LocalizationStrings[431]);// Normal v34 = pFontSmallnum->GetLineWidth(pGlobalTXT_LocalizationStrings[433]);// Expert v33 = (unsigned __int16 *)pFontSmallnum->GetLineWidth(pGlobalTXT_LocalizationStrings[432]);// Master v5 = pFontSmallnum->GetLineWidth(pGlobalTXT_LocalizationStrings[96]);// Grand v35 = (unsigned __int16 *)v4; if ( v34 > v4 ) v35 = (unsigned __int16 *)v34; if ( (signed int)v33 > (signed int)v35 ) v35 = v33; if ( v5 > (signed int)v35 ) v35 = (unsigned __int16 *)v5; pPlayer = &pParty->pPlayers[uPlayerID]; //v33 = &pPlayer->pActiveSkills[uPlayerSkillType]; v7 = pPlayer->GetActualSkillLevel(uPlayerSkillType); v8 = pPlayer->pActiveSkills[uPlayerSkillType]; a2[0] = 0; Source[0] = 0; if ( (v8 & 0x3F) == (v7 & 0x3F) ) { strcpy(a2, "%s\n\n"); v24 = GetSkillColor(pPlayer->classType, uPlayerSkillType, 1); sprintf(Source, format_4E2DC8, v24); strcat(a2, Source); strcat(a2, "%s\t%03d:\t%03d%s\t000\n"); v25 = GetSkillColor(pPlayer->classType, uPlayerSkillType, 2); sprintf(Source, format_4E2DC8, v25); strcat(a2, Source); strcat(a2, "%s\t%03d:\t%03d%s\t000\n"); v26 = GetSkillColor(pPlayer->classType, uPlayerSkillType, 3); sprintf(Source, format_4E2DC8, v26); strcat(a2, Source); strcat(a2, "%s\t%03d:\t%03d%s\t000\n"); v27 = pPlayer->classType; v28 = uPlayerSkillType; v29 = GetSkillColor(v27, uPlayerSkillType, 4); sprintf(Source, format_4E2DC8, v29); strcat(a2, Source); strcat(a2, "%s\t%03d:\t%03d%s\t000\n"); v23 = static_sub_417BB5_out_string; sprintf(static_sub_417BB5_out_string, a2, pSkillDesc[v28], pGlobalTXT_LocalizationStrings[431], // Normal (char *)v35 + 3, v35 + 5, pNormalSkillDesc[v28], pGlobalTXT_LocalizationStrings[433], // Expert (char *)v35 + 3, v35 + 5, pExpertSkillDesc[v28], pGlobalTXT_LocalizationStrings[432], // Master (char *)v35 + 3, v35 + 5, pMasterSkillDesc[v28], pGlobalTXT_LocalizationStrings[96], // Grand (char *)v35 + 3, v35 + 5, pGrandSkillDesc[v28]); } else { strcpy(a2, "%s\n\n"); v9 = GetSkillColor(pPlayer->classType, uPlayerSkillType, 1); sprintf(Source, format_4E2DC8, v9); strcat(a2, Source); strcat(a2, "%s\t%03d:\t%03d%s\t000\n"); v10 = GetSkillColor(pPlayer->classType, uPlayerSkillType, 2); sprintf(Source, format_4E2DC8, v10); strcat(a2, Source); strcat(a2, "%s\t%03d:\t%03d%s\t000\n"); v11 = GetSkillColor(pPlayer->classType, uPlayerSkillType, 3); sprintf(Source, format_4E2DC8, v11); strcat(a2, Source); strcat(a2, "%s\t%03d:\t%03d%s\t000\n"); v12 = uPlayerSkillType; v13 = GetSkillColor(pPlayer->classType, uPlayerSkillType, 4); sprintf(Source, format_4E2DC8, v13); strcat(a2, Source); strcat(a2, "%s\t%03d:\t%03d%s\t000\n\n"); v14 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu); sprintf(Source, format_4E2DC8, v14); strcat(a2, Source); strcat(a2, "%s: +%d"); v15 = v12; v16 = (int)(v35 + 5); v15 = (PLAYER_SKILL_TYPE)((int)v15 * 4); v34 = (int)((char *)v35 + 3); v17 = pPlayer->GetActualSkillLevel(uPlayerSkillType); v18 = *(int *)((char *)pGrandSkillDesc + v15); v19 = *(int *)((char *)pMasterSkillDesc + v15); v20 = *(int *)((char *)pExpertSkillDesc + v15); v21 = *(int *)((char *)pNormalSkillDesc + v15); v22 = *(int *)((char *)pSkillDesc + v15); v23 = static_sub_417BB5_out_string; sprintf( static_sub_417BB5_out_string, a2, v22, pGlobalTXT_LocalizationStrings[431], v34, v16, v21, pGlobalTXT_LocalizationStrings[433], v34, v16, v20, pGlobalTXT_LocalizationStrings[432], v34, v16, v19, pGlobalTXT_LocalizationStrings[96], v34, v16, v18, pGlobalTXT_LocalizationStrings[623], (v17 & 0x3F) - (*(char *)v33 & 0x3F)); } return v23; } //----- (00417FE5) -------------------------------------------------------- char __cdecl CharacterUI_SkillsTab_ShowHint() { unsigned int v0; // ecx@1 unsigned int v1; // eax@1 GUIButton *i; // esi@6 const char *v3; // eax@12 unsigned int pX; // [sp+4h] [bp-8h]@1 unsigned int pY; // [sp+8h] [bp-4h]@1 pMouse->GetClickPos(&pX, &pY); v0 = pX; v1 = pY; if ( (signed int)pX < 24 || (signed int)pX > 455 || (signed int)pY < 18 || (signed int)pY > 36 ) { for ( i = pGUIWindow_CurrentMenu->pControlsHead; i; i = i->pNext ) { if ( i->uControlID == 121 && (signed int)v0 >= (signed int)i->uX && (signed int)v0 <= (signed int)i->uZ && (signed int)v1 >= (signed int)i->uY && (signed int)v1 <= (signed int)i->uW ) { v3 = CharacterUI_GetSkillDescText(uActiveCharacter - 1, (enum PLAYER_SKILL_TYPE)i->uControlParam); sub_4179BC_draw_tooltip(pSkillNames[i->uControlParam], v3); v1 = pY; v0 = pX; } } } else { LOBYTE(v1) = sub_4179BC_draw_tooltip(pGlobalTXT_LocalizationStrings[207], pSkillPointsAttributeDescription); } return v1; } //----- (00418083) -------------------------------------------------------- char __cdecl CharacterUI_StatsTab_ShowHint() { LONG _x; // esi@1 Player *_y; // eax@1 int v2; // edi@1 __int16 *v3; // ecx@1 LONG v4; // edx@2 signed int v5; // edx@4 char *v6; // ecx@9 char *v7; // ebx@9 unsigned int v8; // ebx@15 unsigned __int64 v9; // kr00_8@15 char *v10; // ST2C_4@15 signed int v11; // eax@15 char *v12; // ecx@17 char *v13; // eax@20 Player *v14; // esi@28 int v15; // ebx@28 int v16; // eax@33 POINT a2; // [sp+Ch] [bp-24h]@1 __int64 v19; // [sp+14h] [bp-1Ch]@15 char *v20; // [sp+1Ch] [bp-14h]@13 Player *v21; // [sp+20h] [bp-10h]@13 unsigned int v22; // [sp+24h] [bp-Ch]@15 int *v23; // [sp+28h] [bp-8h]@13 const char *v24; // [sp+2Ch] [bp-4h]@10 _x = pMouse->GetCursorPos(&a2)->x; _y = (Player *)pMouse->GetCursorPos(&a2)->y; v2 = 0; v3 = &array_4E2940[0].field_2; while ( 1 ) { v4 = *(v3 - 1); if ( _x >= v4 ) { if ( _x <= v4 + v3[1] ) { v5 = *v3; if ( (signed int)_y >= v5 ) { if ( (signed int)_y <= v5 + v3[2] ) break; } } } v3 += 4; ++v2; if ( (signed int)v3 >= (signed int)&off_4E2A12 ) return (char)_y; } switch ( v2 ) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: LOBYTE(_y) = 4 * v2; v6 = aAttributeNames[v2]; v7 = pAttributeDescriptions[v2]; goto LABEL_46; case 7: LOBYTE(_y) = LOBYTE(pGlobalTXT_LocalizationStrings[108]); v7 = pHealthPointsAttributeDescription; v24 = pGlobalTXT_LocalizationStrings[108]; goto LABEL_47; case 8: LOBYTE(_y) = LOBYTE(pGlobalTXT_LocalizationStrings[212]); v7 = pSpellPointsAttributeDescription; v24 = pGlobalTXT_LocalizationStrings[212]; goto LABEL_47; case 9: LOBYTE(_y) = LOBYTE(pGlobalTXT_LocalizationStrings[12]); v7 = pArmourClassAttributeDescription; v24 = pGlobalTXT_LocalizationStrings[12]; goto LABEL_47; case 10: v24 = pGlobalTXT_LocalizationStrings[47]; strcpy(pTmpBuf2, pPlayerConditionAttributeDescription); v7 = pTmpBuf2; v20 = pTmpBuf2; strcat(pTmpBuf2, "\n"); extern unsigned int pConditionImportancyTable[18]; v23 = (int *)pConditionImportancyTable; _y = pPlayers[uActiveCharacter]; v21 = pPlayers[uActiveCharacter]; do { if ( _y->pConditions[*v23] ) { strcat(pTmpBuf2, " \n"); v8 = *v23; v9 = pParty->uTimePlayed - v21->pConditions[*v23]; a2.x = LODWORD(pParty->uTimePlayed) - LODWORD(v21->pConditions[*v23]); a2.y = HIDWORD(v9); v19 = (signed __int64)((double)*(signed __int64 *)&a2 * 0.234375) / 60 / 60; v22 = (unsigned int)v19 / 0x18; v10 = aCharacterConditionNames[v8]; v19 %= 24i64; v11 = GetConditionDrawColor(v8); sprintf(pTmpBuf, &byte_4E2DE8, v11, v10); strcat(pTmpBuf2, pTmpBuf); if ( v19 && v19 <= 1 ) v12 = pGlobalTXT_LocalizationStrings[109]; else v12 = pGlobalTXT_LocalizationStrings[110]; if ( !v22 || (v13 = pGlobalTXT_LocalizationStrings[56], v22 > 1) ) v13 = pGlobalTXT_LocalizationStrings[57]; sprintf(pTmpBuf, "%lu %s, %lu %s", v22, v13, v19, v12); strcat(pTmpBuf2, pTmpBuf); v7 = v20; _y = v21; } ++v23; } while ( (signed int)v23 < (signed int)&unk_4EDF40 ); goto LABEL_47; case 11: LOBYTE(_y) = LOBYTE(pGlobalTXT_LocalizationStrings[172]); v7 = pFastSpellAttributeDescription; v24 = pGlobalTXT_LocalizationStrings[172]; goto LABEL_47; case 12: LOBYTE(_y) = LOBYTE(pGlobalTXT_LocalizationStrings[5]); v7 = pPlayerAgeAttributeDescription; v24 = pGlobalTXT_LocalizationStrings[5]; goto LABEL_47; case 13: LOBYTE(_y) = LOBYTE(pGlobalTXT_LocalizationStrings[131]); v7 = pPlayerLevelAttributeDescription; v24 = pGlobalTXT_LocalizationStrings[131]; goto LABEL_47; case 14: v14 = pPlayers[uActiveCharacter]; v24 = pGlobalTXT_LocalizationStrings[83]; v15 = v14->uLevel; do { if ( (signed __int64)v14->uExperience < (unsigned int)sub_4B46F8(v15) ) break; ++v15; } while ( v15 <= 10000 ); pTmpBuf[0] = 0; pTmpBuf2[0] = 0; if ( v15 > v14->uLevel ) sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[147], v15); v16 = sub_4B46F8(v15) - LODWORD(v14->uExperience); sprintf(pTmpBuf2, pGlobalTXT_LocalizationStrings[538], v16, v15 + 1); strcat(pTmpBuf, "\n"); strcat(pTmpBuf, pTmpBuf2); LOBYTE(_y) = sprintf(pTmpBuf2, "%s\n \n%s", pPlayerExperienceAttributeDescription, pTmpBuf); v7 = pTmpBuf2; goto LABEL_47; case 15: LOBYTE(_y) = LOBYTE(pGlobalTXT_LocalizationStrings[587]); v7 = pAttackBonusAttributeDescription; v24 = pGlobalTXT_LocalizationStrings[587]; goto LABEL_47; case 16: LOBYTE(_y) = LOBYTE(pGlobalTXT_LocalizationStrings[588]); v7 = pAttackDamageAttributeDescription; v24 = pGlobalTXT_LocalizationStrings[588]; goto LABEL_47; case 17: LOBYTE(_y) = LOBYTE(pGlobalTXT_LocalizationStrings[589]); v7 = pMissleBonusAttributeDescription; v24 = pGlobalTXT_LocalizationStrings[589]; goto LABEL_47; case 18: LOBYTE(_y) = LOBYTE(pGlobalTXT_LocalizationStrings[590]); v7 = pMissleDamageAttributeDescription; v24 = pGlobalTXT_LocalizationStrings[590]; goto LABEL_47; case 19: LOBYTE(_y) = LOBYTE(pGlobalTXT_LocalizationStrings[87]); v7 = pFireResistanceAttributeDescription; v24 = pGlobalTXT_LocalizationStrings[87]; goto LABEL_47; case 20: LOBYTE(_y) = LOBYTE(pGlobalTXT_LocalizationStrings[6]); v7 = pAirResistanceAttributeDescription; v24 = pGlobalTXT_LocalizationStrings[6]; goto LABEL_47; case 21: LOBYTE(_y) = LOBYTE(pGlobalTXT_LocalizationStrings[240]); v7 = pWaterResistanceAttributeDescription; v24 = pGlobalTXT_LocalizationStrings[240]; goto LABEL_47; case 22: LOBYTE(_y) = LOBYTE(pGlobalTXT_LocalizationStrings[70]); v7 = pEarthResistanceAttributeDescription; v24 = pGlobalTXT_LocalizationStrings[70]; goto LABEL_47; case 23: LOBYTE(_y) = LOBYTE(pGlobalTXT_LocalizationStrings[142]); v7 = pMindResistanceAttributeDescription; v24 = pGlobalTXT_LocalizationStrings[142]; goto LABEL_47; case 24: LOBYTE(_y) = LOBYTE(pGlobalTXT_LocalizationStrings[29]); v7 = pBodyResistanceAttributeDescription; v24 = pGlobalTXT_LocalizationStrings[29]; goto LABEL_47; case 25: LOBYTE(_y) = LOBYTE(pGlobalTXT_LocalizationStrings[207]); v7 = pSkillPointsAttributeDescription; v24 = pGlobalTXT_LocalizationStrings[207]; goto LABEL_47; case 26: _y = (Player *)(4 * pPlayers[uActiveCharacter]->classType); v6 = *(char **)((char *)_y->pConditions + (int)pClassNames); v7 = *(char **)((char *)_y->pConditions + (int)pClassDescriptions); LABEL_46: v24 = v6; LABEL_47: if ( v24 && v7 ) LOBYTE(_y) = sub_4179BC_draw_tooltip(v24, v7); break; default: return (char)_y; } return (char)_y; } //----- (00418511) -------------------------------------------------------- char __fastcall CharacterUI_StatsTab_Draw(unsigned int uPlayerID) { Player *pPlayer; // edi@1 unsigned int v2; // eax@1 unsigned int v3; // eax@1 unsigned int v4; // eax@2 int v5; // ST20_4@4 int v6; // ST1C_4@4 int v7; // ebp@4 int v8; // eax@4 unsigned int v9; // eax@4 int v10; // ST34_4@4 int v11; // ST20_4@4 int v12; // ST1C_4@4 int v13; // ebp@4 int v14; // eax@4 unsigned int v15; // eax@4 int v16; // ST34_4@4 int v17; // ST20_4@4 int v18; // ST1C_4@4 int v19; // ebp@4 int v20; // eax@4 unsigned int v21; // eax@4 int v22; // ST34_4@4 int v23; // ST20_4@4 int v24; // ST1C_4@4 int v25; // ebp@4 int v26; // eax@4 unsigned int v27; // eax@4 int v28; // ST34_4@4 int v29; // ST20_4@4 int v30; // ST1C_4@4 int v31; // ebp@4 int v32; // eax@4 unsigned int v33; // eax@4 int v34; // ST34_4@4 int v35; // ST20_4@4 int v36; // ST1C_4@4 int v37; // ebp@4 int v38; // eax@4 unsigned int v39; // eax@4 int v40; // ST34_4@4 int v41; // ST20_4@4 int v42; // ST1C_4@4 int v43; // ebp@4 int v44; // eax@4 unsigned int v45; // eax@4 int v46; // ebp@4 signed int v47; // ST20_4@6 int v48; // ST1C_4@6 signed int v49; // eax@6 unsigned int v50; // eax@6 int v51; // ST20_4@8 int v52; // ST1C_4@8 int v53; // eax@8 unsigned int v54; // eax@8 int v55; // ST34_4@8 int v56; // ST20_4@8 int v57; // ST1C_4@8 int v58; // ebp@8 int v59; // eax@8 unsigned int v60; // eax@8 unsigned int v61; // ebp@8 unsigned int v62; // eax@8 char *v63; // ST20_4@8 signed int v64; // eax@8 unsigned int v65; // ebp@8 unsigned __int8 v66; // al@8 char *v67; // eax@9 unsigned int v68; // ST20_4@11 unsigned int v69; // ST1C_4@11 signed int v70; // ebp@11 signed int v71; // eax@11 unsigned int v72; // eax@11 int v73; // ST20_4@13 int v74; // ST1C_4@13 int v75; // ebp@13 int v76; // eax@13 unsigned int v77; // eax@13 char *v78; // ecx@14 int v79; // ST20_4@16 char *v80; // ST40_4@16 unsigned int v81; // eax@16 int v82; // ST34_4@16 int v83; // eax@16 int v84; // ST34_4@16 char *v85; // eax@16 int v86; // ST34_4@16 int v87; // eax@16 int v88; // ST34_4@16 char *v89; // eax@16 int v90; // eax@16 int v91; // ST20_4@19 unsigned int v92; // eax@19 int v93; // eax@19 int v94; // ST20_4@22 unsigned int v95; // eax@22 int v96; // eax@22 int v97; // ST20_4@25 unsigned int v98; // eax@25 int v99; // eax@25 int v100; // ST20_4@27 unsigned int v101; // eax@27 int v102; // eax@27 int v103; // ST20_4@30 unsigned int v104; // eax@30 char *v105; // ST20_4@32 unsigned int v106; // eax@32 int v107; // eax@33 int v108; // ST20_4@36 unsigned int v109; // eax@36 char *v110; // ST20_4@38 unsigned int v111; // eax@38 int uY; // [sp+10h] [bp-10h]@6 int uYa; // [sp+10h] [bp-10h]@11 int uYb; // [sp+10h] [bp-10h]@13 int uYc; // [sp+10h] [bp-10h]@16 int uYd; // [sp+10h] [bp-10h]@19 int uYe; // [sp+10h] [bp-10h]@22 int uYf; // [sp+10h] [bp-10h]@25 int uYg; // [sp+10h] [bp-10h]@27 int uYh; // [sp+10h] [bp-10h]@33 const char *a2; // [sp+14h] [bp-Ch]@4 const char *a2a; // [sp+14h] [bp-Ch]@6 const char *a2b; // [sp+14h] [bp-Ch]@11 const char *a2c; // [sp+14h] [bp-Ch]@16 const char *a2d; // [sp+14h] [bp-Ch]@19 const char *a2e; // [sp+14h] [bp-Ch]@22 const char *a2f; // [sp+14h] [bp-Ch]@25 const char *a2g; // [sp+14h] [bp-Ch]@27 const char *a2h; // [sp+14h] [bp-Ch]@33 int v131; // [sp+18h] [bp-8h]@16 int v132; // [sp+18h] [bp-8h]@19 int v133; // [sp+18h] [bp-8h]@22 int v134; // [sp+18h] [bp-8h]@25 int v135; // [sp+18h] [bp-8h]@27 int v136; // [sp+18h] [bp-8h]@33 int v137; // [sp+1Ch] [bp-4h]@27 int v138; // [sp+1Ch] [bp-4h]@33 pPlayer = &pParty->pPlayers[uPlayerID-1]; v2 = pIcons_LOD->LoadTexture("fr_stats", TEXTURE_16BIT_PALETTE); pRenderer->DrawTextureIndexed(8, 8, (Texture *)(v2 != -1 ? (int)&pIcons_LOD->pTextures[v2] : 0)); v3 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu); sprintf(pTmpBuf, format_4E2DC8, v3); sprintf(pTmpBuf2, pGlobalTXT_LocalizationStrings[429], pPlayer->pName, pClassNames[pPlayer->classType]);//^Pi[%s] %s strcat(pTmpBuf, pTmpBuf2); if ( pPlayer->uSkillPoints ) v4 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0, 0xFFu, 0); else v4 = 0xFFFFu; sprintf(pTmpBuf2, "\xC" "00000\xD" "180%s: \xC%05d%d\xC" "00000\n\n\n", pGlobalTXT_LocalizationStrings[207], v4, pPlayer->uSkillPoints);//Skill points strcat(pTmpBuf, pTmpBuf2); pGUIWindow_CurrentMenu->DrawText(pFontArrus, 26, 18, 0, pTmpBuf, 0, 0, 0); v5 = pPlayer->GetBaseStrength(); v6 = pPlayer->GetActualMight(); v7 = pPlayer->GetBaseStrength(); v8 = pPlayer->GetActualMight(); v9 = UI_GetHealthManaStringColor(v8, v7); sprintf(pTmpBuf, "%s\f%05u\r424%d\f00000 /\t185%d\n", pGlobalTXT_LocalizationStrings[144], v9, v6, v5);//Might pGUIWindow_CurrentMenu->DrawText(pFontArrus, 26, 53, 0, pTmpBuf, 0, 0, 0); v10 = LOBYTE(pFontArrus->uFontHeight) + 51; v11 = pPlayer->GetBaseIntelligence(); v12 = pPlayer->GetActualIntelligence(); v13 = pPlayer->GetBaseIntelligence(); v14 = pPlayer->GetActualIntelligence(); v15 = UI_GetHealthManaStringColor(v14, v13); sprintf(pTmpBuf, "%s\f%05u\r424%d\f00000 /\t185%d\n", pGlobalTXT_LocalizationStrings[116], v15, v12, v11);//Intellect pGUIWindow_CurrentMenu->DrawText(pFontArrus, 26, v10, 0, pTmpBuf, 0, 0, 0); v16 = LOBYTE(pFontArrus->uFontHeight) + v10 - 2; v17 = pPlayer->GetBaseWillpower(); v18 = pPlayer->GetActualWillpower(); v19 = pPlayer->GetBaseWillpower(); v20 = pPlayer->GetActualWillpower(); v21 = UI_GetHealthManaStringColor(v20, v19); sprintf(pTmpBuf, "%s\f%05u\r424%d\f00000 /\t185%d\n", pGlobalTXT_LocalizationStrings[163], v21, v18, v17);// pGUIWindow_CurrentMenu->DrawText(pFontArrus, 26, v16, 0, pTmpBuf, 0, 0, 0); v22 = LOBYTE(pFontArrus->uFontHeight) + v16 - 2; v23 = pPlayer->GetBaseEndurance(); v24 = pPlayer->GetActualEndurance(); v25 = pPlayer->GetBaseEndurance(); v26 = pPlayer->GetActualEndurance(); v27 = UI_GetHealthManaStringColor(v26, v25); sprintf(pTmpBuf, "%s\f%05u\r424%d\f00000 /\t185%d\n", pGlobalTXT_LocalizationStrings[75], v27, v24, v23);// pGUIWindow_CurrentMenu->DrawText(pFontArrus, 26, v22, 0, pTmpBuf, 0, 0, 0); v28 = LOBYTE(pFontArrus->uFontHeight) + v22 - 2; v29 = pPlayer->GetBaseAccuracy(); v30 = pPlayer->GetActualAccuracy(); v31 = pPlayer->GetBaseAccuracy(); v32 = pPlayer->GetActualAccuracy(); v33 = UI_GetHealthManaStringColor(v32, v31); sprintf(pTmpBuf, "%s\f%05u\r424%d\f00000 /\t185%d\n", pGlobalTXT_LocalizationStrings[1], v33, v30, v29); pGUIWindow_CurrentMenu->DrawText(pFontArrus, 26, v28, 0, pTmpBuf, 0, 0, 0); v34 = LOBYTE(pFontArrus->uFontHeight) + v28 - 2; v35 = pPlayer->GetBaseSpeed(); v36 = pPlayer->GetActualSpeed(); v37 = pPlayer->GetBaseSpeed(); v38 = pPlayer->GetActualSpeed(); v39 = UI_GetHealthManaStringColor(v38, v37); sprintf(pTmpBuf, "%s\f%05u\r424%d\f00000 /\t185%d\n", pGlobalTXT_LocalizationStrings[211], v39, v36, v35); pGUIWindow_CurrentMenu->DrawText(pFontArrus, 26, v34, 0, pTmpBuf, 0, 0, 0); v40 = LOBYTE(pFontArrus->uFontHeight) + v34 - 2; v41 = pPlayer->GetBaseLuck(); v42 = pPlayer->GetActualLuck(); v43 = pPlayer->GetBaseLuck(); v44 = pPlayer->GetActualLuck(); v45 = UI_GetHealthManaStringColor(v44, v43); sprintf(pTmpBuf, "%s\f%05u\r424%d\f00000 /\t185%d\n\n", pGlobalTXT_LocalizationStrings[136], v45, v42, v41); pGUIWindow_CurrentMenu->DrawText(pFontArrus, 26, v40, 0, pTmpBuf, 0, 0, 0); a2 = "%s\f%05u\r424%d\f00000 /\t185%d\n"; v46 = v40 + 2 * LOBYTE(pFontArrus->uFontHeight) + 5; if ( pPlayer->GetMaxHealth() >= 1000 ) a2 = "%s\f%05u\r388%d\f00000 / %d\n"; v47 = pPlayer->GetMaxHealth(); v48 = pPlayer->sHealth; v49 = pPlayer->GetMaxHealth(); v50 = UI_GetHealthManaStringColor(pPlayer->sHealth, v49); sprintf(pTmpBuf, a2, pGlobalTXT_LocalizationStrings[108], v50, v48, v47); pGUIWindow_CurrentMenu->DrawText(pFontArrus, 26, v46, 0, pTmpBuf, 0, 0, 0); a2a = "%s\f%05u\r424%d\f00000 /\t185%d\n"; uY = LOBYTE(pFontArrus->uFontHeight) + v46 - 2; if ( pPlayer->GetMaxMana() >= 1000 ) a2a = "%s\f%05u\r388%d\f00000 / %d\n"; v51 = pPlayer->GetMaxMana(); v52 = pPlayer->sMana; v53 = pPlayer->GetMaxMana(); v54 = UI_GetHealthManaStringColor(pPlayer->sMana, v53); sprintf(pTmpBuf, a2a, pGlobalTXT_LocalizationStrings[212], v54, v52, v51); pGUIWindow_CurrentMenu->DrawText(pFontArrus, 26, uY, 0, pTmpBuf, 0, 0, 0); v55 = LOBYTE(pFontArrus->uFontHeight) + uY - 2; v56 = pPlayer->GetBaseAC(); v57 = pPlayer->GetActualAC(); v58 = pPlayer->GetBaseAC(); v59 = pPlayer->GetActualAC(); v60 = UI_GetHealthManaStringColor(v59, v58); sprintf(pTmpBuf, "%s\f%05u\r424%d\f00000 /\t185%d\n\n", pGlobalTXT_LocalizationStrings[12], v60, v57, v56); pGUIWindow_CurrentMenu->DrawText(pFontArrus, 26, v55, 0, pTmpBuf, 0, 0, 0); v61 = v55 + 2 * LOBYTE(pFontArrus->uFontHeight) - 2; v62 = pPlayer->GetMajorConditionIdx(); v63 = aCharacterConditionNames[v62]; v64 = GetConditionDrawColor(v62); sprintf(pTmpBuf, "%s: \f%05d%s\n", pGlobalTXT_LocalizationStrings[47], v64, v63); pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 0x1Au, v61, 0, pTmpBuf, 226, 0); v65 = LOBYTE(pFontArrus->uFontHeight) + v61 - 1; v66 = pPlayer->uQuickSpell; if ( v66 ) v67 = pSpellStats->pInfos[v66].pShortName; else v67 = pGlobalTXT_LocalizationStrings[153]; sprintf(pTmpBuf, "%s: %s", pGlobalTXT_LocalizationStrings[172], v67); pGUIWindow_CurrentMenu->DrawTextInRect(pFontArrus, 0x1Au, v65, 0, pTmpBuf, 226, 0); v68 = pPlayer->GetBaseAge(); v69 = pPlayer->GetActualAge(); v70 = pPlayer->GetBaseAge(); v71 = pPlayer->GetActualAge(); v72 = UI_GetHealthManaStringColor(v71, v70); sprintf(pTmpBuf, "%s\f%05u\t100%d\f00000 / %d\n", pGlobalTXT_LocalizationStrings[5], v72, v69, v68); pGUIWindow_CurrentMenu->DrawText(pFontArrus, 266, 50, 0, pTmpBuf, 0, 0, 0); a2b = "%s\f%05u\t100%d\f00000 / %d\n"; uYa = LOBYTE(pFontArrus->uFontHeight) + 48; if ( pPlayer->GetBaseLevel() > 99 ) a2b = format_4E2E68; v73 = pPlayer->GetBaseLevel(); v74 = pPlayer->GetActualLevel(); v75 = pPlayer->GetBaseLevel(); v76 = pPlayer->GetActualLevel(); v77 = UI_GetHealthManaStringColor(v76, v75); sprintf(pTmpBuf, a2b, pGlobalTXT_LocalizationStrings[131], v77, v74, v73); pGUIWindow_CurrentMenu->DrawText(pFontArrus, 266, uYa, 0, pTmpBuf, 0, 0, 0); uYb = uYa + LOBYTE(pFontArrus->uFontHeight) - 2; if ( (signed __int64)pPlayer->uExperience <= 9999999 ) v78 = pGlobalTXT_LocalizationStrings[83]; else v78 = pGlobalTXT_LocalizationStrings[17]; v79 = LODWORD(pPlayer->uExperience); v80 = v78; v81 = pPlayer->GetExperienceDisplayColor(); sprintf(pTmpBuf, "%s\r180\f%05d%lu\f00000\n\n", v80, v81, v79); pGUIWindow_CurrentMenu->DrawText(pFontArrus, 266, uYb, 0, pTmpBuf, 0, 0, 0); v82 = uYb + 2 * LOBYTE(pFontArrus->uFontHeight); v83 = pPlayer->GetActualAttack(0); sprintf(pTmpBuf, "%s\t100%+d\n", pGlobalTXT_LocalizationStrings[18], v83); pGUIWindow_CurrentMenu->DrawText(pFontArrus, 266, v82, 0, pTmpBuf, 0, 0, 0); v84 = v82 + LOBYTE(pFontArrus->uFontHeight) - 2; v85 = pPlayer->GetMeleeDamageString(); sprintf(pTmpBuf, "%s\t100 %s\n", pGlobalTXT_LocalizationStrings[53], v85); pGUIWindow_CurrentMenu->DrawText(pFontArrus, 266, v84, 0, pTmpBuf, 0, 0, 0); v86 = v84 + LOBYTE(pFontArrus->uFontHeight) - 2; v87 = pPlayer->GetRangedAttack(); sprintf(pTmpBuf, "%s\t100%+d\n", pGlobalTXT_LocalizationStrings[203], v87); pGUIWindow_CurrentMenu->DrawText(pFontArrus, 266, v86, 0, pTmpBuf, 0, 0, 0); v88 = v86 + LOBYTE(pFontArrus->uFontHeight) - 2; v89 = pPlayer->GetRangedDamageString(); sprintf(pTmpBuf, "%s\t100 %s\n\n", pGlobalTXT_LocalizationStrings[53], v89); pGUIWindow_CurrentMenu->DrawText(pFontArrus, 266, v88, 0, pTmpBuf, 0, 0, 0); a2c = format_4E2E10; uYc = v88 + 2 * LOBYTE(pFontArrus->uFontHeight) - 4; v131 = pPlayer->GetActualResistance(CHARACTER_ATTRIBUTE_RESIST_FIRE); v90 = pPlayer->GetBaseResistance(CHARACTER_ATTRIBUTE_RESIST_FIRE); if ( v131 > 99 || v90 > 99 ) a2c = format_4E2E68; v91 = v90; v92 = UI_GetHealthManaStringColor(v131, v90); sprintf(pTmpBuf, a2c, pGlobalTXT_LocalizationStrings[87], v92, v131, v91); pGUIWindow_CurrentMenu->DrawText(pFontArrus, 266, uYc, 0, pTmpBuf, 0, 0, 0); a2d = format_4E2E10; uYd = uYc + LOBYTE(pFontArrus->uFontHeight) - 2; v132 = pPlayer->GetActualResistance(CHARACTER_ATTRIBUTE_RESIST_AIR); v93 = pPlayer->GetBaseResistance(CHARACTER_ATTRIBUTE_RESIST_AIR); if ( v132 > 99 || v93 > 99 ) a2d = format_4E2E68; v94 = v93; v95 = UI_GetHealthManaStringColor(v132, v93); sprintf(pTmpBuf, a2d, pGlobalTXT_LocalizationStrings[6], v95, v132, v94); pGUIWindow_CurrentMenu->DrawText(pFontArrus, 266, uYd, 0, pTmpBuf, 0, 0, 0); a2e = format_4E2E10; uYe = uYd + LOBYTE(pFontArrus->uFontHeight) - 2; v133 = pPlayer->GetActualResistance(CHARACTER_ATTRIBUTE_RESIST_WATER); v96 = pPlayer->GetBaseResistance(CHARACTER_ATTRIBUTE_RESIST_WATER); if ( v133 > 99 || v96 > 99 ) a2e = format_4E2E68; v97 = v96; v98 = UI_GetHealthManaStringColor(v133, v96); sprintf(pTmpBuf, a2e, pGlobalTXT_LocalizationStrings[240], v98, v133, v97); pGUIWindow_CurrentMenu->DrawText(pFontArrus, 266, uYe, 0, pTmpBuf, 0, 0, 0); a2f = format_4E2E10; uYf = uYe + LOBYTE(pFontArrus->uFontHeight) - 2; v134 = pPlayer->GetActualResistance(CHARACTER_ATTRIBUTE_RESIST_EARTH); v99 = pPlayer->GetBaseResistance(CHARACTER_ATTRIBUTE_RESIST_EARTH); if ( v134 > 99 ) a2f = format_4E2E68; v100 = v99; v101 = UI_GetHealthManaStringColor(v134, v99); sprintf(pTmpBuf, a2f, pGlobalTXT_LocalizationStrings[70], v101, v134, v100); pGUIWindow_CurrentMenu->DrawText(pFontArrus, 266, uYf, 0, pTmpBuf, 0, 0, 0); a2g = format_4E2E10; uYg = uYf + LOBYTE(pFontArrus->uFontHeight) - 2; v135 = pPlayer->GetActualResistance(CHARACTER_ATTRIBUTE_RESIST_MIND); v102 = pPlayer->GetBaseResistance(CHARACTER_ATTRIBUTE_RESIST_MIND); v137 = v102; if ( v135 > 99 || v102 > 99 ) a2g = format_4E2E68; v103 = v102; v104 = UI_GetHealthManaStringColor(v135, v102); sprintf(pTmpBuf, a2g, pGlobalTXT_LocalizationStrings[142], v104, v135, v103); if ( pPlayer->classType == PLAYER_CLASS_LICH && v137 == 200 ) { v105 = pGlobalTXT_LocalizationStrings[625]; v106 = UI_GetHealthManaStringColor(v135, 200); sprintf(pTmpBuf, format_4E2E00, pGlobalTXT_LocalizationStrings[142], v106, v105); } pGUIWindow_CurrentMenu->DrawText(pFontArrus, 266, uYg, 0, pTmpBuf, 0, 0, 0); a2h = format_4E2E10; uYh = uYg + LOBYTE(pFontArrus->uFontHeight) - 2; v136 = pPlayer->GetActualResistance(CHARACTER_ATTRIBUTE_RESIST_BODY); v107 = pPlayer->GetBaseResistance(CHARACTER_ATTRIBUTE_RESIST_BODY); v138 = v107; if ( v136 > 99 || v107 > 99 ) a2h = format_4E2E68; v108 = v107; v109 = UI_GetHealthManaStringColor(v136, v107); sprintf(pTmpBuf, a2h, pGlobalTXT_LocalizationStrings[29], v109, v136, v108); if ( pPlayer->classType == PLAYER_CLASS_LICH && v138 == 200 ) { v110 = pGlobalTXT_LocalizationStrings[625]; v111 = UI_GetHealthManaStringColor(v136, 200); sprintf(pTmpBuf, format_4E2E00, pGlobalTXT_LocalizationStrings[29], v111, v110); } return pGUIWindow_CurrentMenu->DrawText(pFontArrus, 266, uYh, 0, pTmpBuf, 0, 0, 0); } //----- (00419100) -------------------------------------------------------- void FillAwardsData() { Player *pPlayer; // esi@1 pPlayer = pPlayers[uActiveCharacter]; memset(&achievedAwardsIndex, 0, 4000); memset(pTmpBuf2, 0, 0x7D0u); dword_506544 = 0; dword_506548 = 0; awards_count = 0; dword_50651C = 0; dword_506528 = 0; for(int i=0; i<105; ++i) { if ( _449B57_test_bit((unsigned char*)&pPlayer->_guilds_member_bits, i) && pAwards[i].pText ) achievedAwardsIndex[awards_count++] = i; } awards_count2 = awards_count; awards_count = 0; //sort awards index if ( awards_count2>0 ) { for(int i=0; i<awards_count2; ++i) achievedAwardsIndex[awards_count2 + i] = rand() % 16; for(int i=1; i<awards_count2-1; ++i) { for (int j = i; j < awards_count2-1; ++j ) { int tmp=achievedAwardsIndex[j]; if(pAwards[j].uSort < pAwards[i].uSort) { achievedAwardsIndex[j] = achievedAwardsIndex[i]; achievedAwardsIndex[i] = tmp; } } } } } //----- (00419220) -------------------------------------------------------- void __cdecl sub_419220() { GUIButton *i; // eax@2 if ( !dword_507CBC ) { dword_507CBC = 1; for ( i = pGUIWindow_CurrentMenu->pControlsHead; i; i = i->pNext ) { if ( i->uControlID == 120 ) { dword_50698C = i->uX; dword_506988 = i->uY; dword_506984 = i->uZ; dword_506980 = i->uW; i->uW = 0; i->uZ = 0; i->uY = 0; i->uX = 0; } } pBtn_Up = pGUIWindow_CurrentMenu->CreateButton( 0x1B6u, 0x2Eu, (uTextureID_ar_up_up != -1 ? pIcons_LOD->pTextures[uTextureID_ar_up_up].uTextureWidth : 24), (uTextureID_ar_up_up != -1 ? pIcons_LOD->pTextures[uTextureID_ar_up_up].uTextureHeight : 26), 1, 0, 0xA9u, 0, 0, "", (Texture *)(uTextureID_ar_up_up != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_ar_up_up] : 0), uTextureID_ar_up_dn != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_ar_up_dn] : 0, 0); pBtn_Down = pGUIWindow_CurrentMenu->CreateButton( 0x1B6u, 0x124u, (uTextureID_ar_dn_up != -1 ? pIcons_LOD->pTextures[uTextureID_ar_dn_up].uTextureWidth : 24), (uTextureID_ar_dn_up != -1 ? pIcons_LOD->pTextures[uTextureID_ar_dn_up].uTextureHeight : 26), 1, 0, 0xAAu, 0, 0, "", (Texture *)(uTextureID_ar_dn_up != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_ar_dn_up] : 0), uTextureID_ar_dn_dn != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_ar_dn_dn] : 0, 0); ptr_507BA4 = pGUIWindow_CurrentMenu->CreateButton( 0x1B8u, 0x3Eu, 0x10u, 0xE8u, 1, 0, 0xC0u, 0, 0, "", 0); } } //----- (00419379) -------------------------------------------------------- void __cdecl sub_419379() { GUIButton *i; // esi@2 if ( dword_507CBC ) { dword_507CBC = 0; GUIButton::_41D0D8(ptr_507BA4); GUIButton::_41D0D8(pBtn_Up); GUIButton::_41D0D8(pBtn_Down); pBtn_Down = 0; pBtn_Up = 0; for ( i = pGUIWindow_CurrentMenu->pControlsHead; i; i = i->pNext ) { if ( i->uControlID == 120 ) { i->uX = dword_50698C; i->uY = dword_506988; i->uZ = dword_506984; i->uW = dword_506980; pGUIWindow_CurrentMenu->_41D08F(1, 0, 0, 0); } } } } //----- (00419401) -------------------------------------------------------- void __cdecl CharacterUI_SkillScreen_Draw() { unsigned int v0; // ecx@3 GUIButton *pButton; // eax@3 GUIFont *v2; // eax@8 unsigned int v3; // esi@8 int v4; // eax@10 unsigned int v5; // esi@14 int v6; // eax@17 unsigned int v7; // esi@19 int v8; // eax@21 unsigned int v9; // esi@25 int v10; // eax@27 int a2; // [sp+10h] [bp-14h]@1 int v12; // [sp+14h] [bp-10h]@8 int v13; // [sp+14h] [bp-10h]@19 int *v14; // [sp+18h] [bp-Ch]@8 int *v15; // [sp+18h] [bp-Ch]@14 int *v16; // [sp+18h] [bp-Ch]@19 int *v17; // [sp+18h] [bp-Ch]@25 Player *v18; // [sp+1Ch] [bp-8h]@8 int a5; // [sp+20h] [bp-4h]@8 a2 = 0; if ( dword_507CC0 ) sub_4196A0(); v0 = uActiveCharacter; dword_507CC0 = uActiveCharacter; for ( pButton = pGUIWindow_CurrentMenu->pControlsHead; pButton; pButton = pButton->pNext ) { if ( pButton->uControlID == 120 ) { dword_50698C = pButton->uX; dword_506988 = pButton->uY; dword_506984 = pButton->uZ; dword_506980 = pButton->uW; pButton->uW = 0; pButton->uZ = 0; pButton->uY = 0; pButton->uX = 0; v0 = uActiveCharacter; } } v12 = 0; a5 = pGUIWindow_CurrentMenu->uNumControls; v18 = &pParty->pPlayers[v0-1]; v2 = pFontLucida; v14 = pWeaponSkills; v3 = 2 * LOBYTE(pFontLucida->uFontHeight) + 13; do { if ( v18->pActiveSkills[*v14] & 0x3F )//crash { v4 = LOBYTE(v2->uFontHeight); v3 = v3 + v4 - 3; ++a2; ++v12; pGUIWindow_CurrentMenu->CreateButton(0x18u, v3, 0xCCu, v4 - 3, 3, *v14 | 0x8000, 0x79u, *v14, 0, "", 0, 0); v2 = pFontLucida; } ++v14; } while ( v14 <= &pWeaponSkills[8] ); if ( !v12 ) v3 = v3 + LOBYTE(v2->uFontHeight) - 3; v15 = pMagicSkills; v5 = v3 + 2 * LOBYTE(v2->uFontHeight) - 6; do { if ( v18->pActiveSkills[*v15] & 0x3F && a2 < 15 ) { v6 = LOBYTE(v2->uFontHeight); v5 = v5 + v6 - 3; ++a2; pGUIWindow_CurrentMenu->CreateButton(0x18u, v5, 0xCCu, v6 - 3, 3, *v15 | 0x8000, 0x79u, *v15, 0, "", 0, 0); v2 = pFontLucida; } ++v15; } while ( v15 <= &pMagicSkills[8] ); v13 = 0; v16 = pArmorSkills; v7 = 2 * LOBYTE(v2->uFontHeight) + 13; do { if ( v18->pActiveSkills[*v16] & 0x3F ) { v8 = LOBYTE(v2->uFontHeight); v7 = v7 + v8 - 3; ++a2; ++v13; pGUIWindow_CurrentMenu->CreateButton(0xF6u, v7, 0xCCu, v8 - 3, 3, *v16 | 0x8000, 0x79u, *v16, 0, "", 0, 0); v2 = pFontLucida; } ++v16; } while ( v16 <= &pArmorSkills[4] ); if ( !v13 ) v7 = v7 + LOBYTE(v2->uFontHeight) - 3; v17 = pMiscSkills; v9 = v7 + 2 * LOBYTE(v2->uFontHeight) - 6; do { if ( v18->pActiveSkills[*v17] & 0x3F ) { v10 = LOBYTE(v2->uFontHeight); v9 = v9 + v10 - 3; ++a2; pGUIWindow_CurrentMenu->CreateButton(0xF6u, v9, 0xCCu, v10 - 3, 3, *v17 | 0x8000, 0x79u, *v17, 0, "", 0, 0); v2 = pFontLucida; } ++v17; } while ( v17 <= &pMiscSkills[11] ); if ( a2 ) pGUIWindow_CurrentMenu->_41D08F(a2, 1, 0, a5); }