view mm7_5.cpp @ 107:ccc0cf95706a

Слияние
author Ritor1
date Mon, 05 Nov 2012 09:16:17 +0600
parents 51a5b0dc3f30
children 8be5293b6b33
line wrap: on
line source

#include "mm7.h"

#include "MapInfo.h"
#include "Game.h"
#include "GUIWindow.h"
#include "GUIFont.h"
#include "GUIButton.h"
#include "GUIProgressBar.h"
#include "Party.h"
#include "AudioPlayer.h"
#include "Outdoor.h"
#include "IndoorCamera.h"
#include "Overlays.h"
#include "Monsters.h"
#include "Arcomage.h"
#include "LOD.h"
#include "Actor.h"
#include "Allocator.h"
#include "Events.h"
#include "Viewport.h"
#include "FrameTableInc.h"
#include "Math.h"
#include "LayingItem.h"
#include "ObjectList.h"
#include "Chest.h"
#include "PaletteManager.h"
#include "DecorationList.h"
#include "SaveLoad.h"
#include "stru123.h"
#include "Time.h"
#include "IconFrameTable.h"
#include "stru179.h"
#include "Awards.h"
#include "Autonotes.h"
#include "stru160.h"
#include "stru279.h"
#include "TurnEngine.h"
#include "stru277.h"
#include "Weather.h"
#include "stru272.h"
#include "stru298.h"
#include "StorylineTextTable.h"
#include "Events2D.h"
#include "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 *v3; // ecx@13
  int v4; // ecx@18
  NPCData *v5; // 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 *v26; // eax@204
  unsigned int v27; // edx@204
  unsigned int v28; // ecx@204
  GUIWindow *v29; // 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 *v36; // 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 *v43; // 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 *v49; // ecx@410
  ODMFace *v50; // 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 *v58; // edx@442
  unsigned int v59; // eax@445
  signed int v60; // ST64_4@459
  NPCData *v61; // 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 *v72; // esi@527
  char *v73; // ecx@533
  signed int v74; // edi@535
  int v75; // eax@535
  int v76; // esi@535
  int v77; // eax@537
  Player *v78; // ecx@549
  int v79; // ecx@550
  unsigned int v80; // edx@550
  signed int v81; // eax@552
  POINT *v82; // eax@553
  signed int v83; // ecx@554
  signed int v84; // ecx@554
  GUIButton *v85; // 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 v94; // 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 *v100; // eax@648
  int v101; // ecx@648
  int v102; // edx@652
  int v103; // eax@671
  Player *v104; // ecx@718
  int v105; // eax@718
  Player *v106; // 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 *v117; // 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 v141; // [sp-8h] [bp-604h]@56
  enum WindowType v142; // [sp-8h] [bp-604h]@60
  unsigned __int8 v143; // [sp-8h] [bp-604h]@86
  int v144; // [sp-8h] [bp-604h]@107
  enum WindowType v145; // [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 *v149; // [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 *v164; // [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 v172; // [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 *thisc; // [sp+14h] [bp-5E8h]@373
  Player *thisd; // [sp+14h] [bp-5E8h]@377
  char *thise; // [sp+14h] [bp-5E8h]@445
  Player *thisf; // [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 *thisj; // [sp+14h] [bp-5E8h]@604
  Player *thisk; // [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 *v195; // [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;
          goto _continue;
        case UIMSG_PlayArcomage:
          pVideoPlayer->_4BF5B2();
          pArcomageGame->bGameInProgress = 1;
          PrepareArcomage();
          goto _continue;
        case UIMSG_StartNPCDialogue:
          if ( !uActiveCharacter )
            goto _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;
          v3 = &pActors[uMessageParam];
          goto _actor_init_dlg;
        case UIMSG_Quit|0x2:
        case 0x87:
          if ( bNoNPCHiring != 1
            && !pCurrentScreen )
          {
            if ( pMessageQueue_50CBD0->uNumMessages )
              pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0;
            uAction = 0;
            uNumSeconds = uMessage - 134;
            v4 = 0;
            v5 = pParty->pHirelings;
            do
            {
              if ( v5->pName )
              {
                v6 = uAction++;
                pTmpBuf[v6] = v4;
              }
              ++v5;
              ++v4;
            }
            while ( (signed int)v5 < (signed int)&pParty->pPickedItem );
            _this = 0;
            if ( (signed int)pNPCStats->uNumNewNPCs > 0 )
            {
              v195 = pNPCStats->pNewNPCData;
              do
              {
                if ( v195->uFlags & 0x80
                  && (!pParty->pHirelings[0].pName || strcmp(v195->pName, pParty->pHirelings[0].pName))
                  && (!pParty->pHirelings[1].pName || strcmp(v195->pName, pParty->pHirelings[1].pName)) )
                {
                  v7 = uAction++;
                  pTmpBuf[v7] = _this + 2;
                }
                ++_this;
                ++v195;
              }
              while ( _this < (signed int)pNPCStats->uNumNewNPCs );
            }
            if ( (signed int)(uNumSeconds + (unsigned __int8)pParty->field_709) < uAction )
            {
              //Actor::Actor(&actor);
              memset(&actor, 0, 0x344u);
              actor.uNPC_ID += -1 - (unsigned __int8)pParty->field_709 - uNumSeconds;
              v3 = &actor;
_actor_init_dlg:
              v3->InitializeDialogue(v0);
            }
          }
          goto _continue;
        case 0x51:
          sub_4BDB56_buy_skill____();
          goto _continue;
        case UIMSG_AF:
          sub_4B2001(uMessageParam);
          goto _continue;
        case 0x195:
          sub_4BCACC_bounties(uMessageParam);
          goto _continue;
        case 0x88:
          sub_4BC49B(uMessageParam);
          goto _continue;
        case 0x19A:
          _4B4224_UpdateNPCTopics(uMessageParam);
          goto _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;
LABEL_188:
            pCurrentScreen = 0;
            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;
          }
_release_tex_and_continue:
          stru_506E40.Release();
          goto _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 = 12;
          GameUI_DrawLoadMenu(v0);
          goto _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 = 0;
            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], 2u);// "Are you sure?  Click again to quit"
            pAudioPlayer->PlaySound(SOUND_20001, 0, 0, -1, 0, 0, 0, 0);
            dword_6BE138 = 132;
          }
          goto _release_tex_and_continue;
        case 0x80:
          pIcons_LOD->_40F9C5();
          pIcons_LOD->_4114F2();
          pGUIWindow_CurrentMenu->Release();
          pCurrentScreen = 2;
          v162 = 0;
          v148 = 0;
          v141 = (WindowType)8;
          goto LABEL_439;
        case UIMSG_A2:
          --dword_6A0C9C;
          if ( dword_6A0C9C < 0 )
            dword_6A0C9C = 0;
          v163 = 0;
          v8 = 199;
          v149 = ptr_69BD5C;
          goto LABEL_60;
        case UIMSG_A3:
          ++dword_6A0C9C;
          if ( dword_6A0C9C >= uMessageParam )
            dword_6A0C9C = uMessageParam - 1;
          v163 = 0;
          v8 = 323;
          v149 = ptr_69BD58;
LABEL_60:
          v142 = (WindowType)90;
          v137 = 17;
          v133 = 17;
          v9 = 215;
          goto LABEL_733;
        case UIMSG_A6:
          v163 = 0;
          v8 = 302;
          v149 = ptr_69BD60;
          v9 = 350;
          v142 = (WindowType)96;
          v137 = 42;
          v133 = 106;
          goto LABEL_733;
        case UIMSG_A4:
          v163 = 0;
          v8 = 302;
          v149 = ptr_69BD64;
          v9 = 241;
          v142 = (WindowType)94;
          v137 = 42;
          v133 = 106;
          goto LABEL_733;
        case UIMSG_A5:
          if ( pGUIWindow_CurrentMenu->field_40 == v0 )
            pKeyActionMap->_459ED1(0);
          if ( pCurrentScreen != 11
            || uLoadGameUI_SelectedSlot != dword_6A0C9C + uMessageParam )
          {
            v10 = dword_6A0C9C + uMessageParam;
            if ( dword_6BE138 == dword_6A0C9C + uMessageParam )
            {
              if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 )
              {
                pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)164;
                pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0;
                *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0;
                v11 = pMessageQueue_50CBD0->uNumMessages + 1;
                v13 = __OFSUB__(pMessageQueue_50CBD0->uNumMessages + 1, 40);
                v12 = (signed int)pMessageQueue_50CBD0->uNumMessages - 39 < 0;
                ++pMessageQueue_50CBD0->uNumMessages;
                if ( v12 ^ v13 )
                {
                  pMessageQueue_50CBD0->pMessages[v11].eType = (UIMessageType)82;
                  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->_459E5A(0, 19, pGUIWindow_CurrentMenu);
            if ( strcmp(
                   (const char *)&pSavegameHeader + 100 * uLoadGameUI_SelectedSlot,
                   pGlobalTXT_LocalizationStrings[72]) )// "Empty"
              strcpy(
                (char *)pKeyActionMap->pPressedKeysBuffer,
                (const char *)&pSavegameHeader + 100 * uLoadGameUI_SelectedSlot);
            pKeyActionMap->uNumKeysPressed = strlen((const char *)pKeyActionMap->pPressedKeysBuffer);
          }
          goto _continue;
        case UIMSG_LoadGame:
          if ( pSavegameUsedSlots[uLoadGameUI_SelectedSlot] )
          {
            LoadGame(uLoadGameUI_SelectedSlot);
            uGameState = 3;
          }
          goto _release_tex_and_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);
          goto _release_tex_and_continue;
        case UIMSG_StartNewGame|0x2:
          pGUIWindow_CurrentMenu->Release();
          pCurrentScreen = 11;
          GameUI_DrawSaveMenu();
          goto _continue;
        case UIMSG_Game_OpenOptionsDialog:
          if ( pMessageQueue_50CBD0->uNumMessages )
            pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0;
          pGUIWindow_CurrentMenu->Release();
          viewparams->field_48 = v0;
          pCurrentScreen = 2;
          uTextureID_507C60 = pIcons_LOD->LoadTexture("ControlBG", TEXTURE_16BIT_PALETTE);
          uTextureID_507C6C = pIcons_LOD->LoadTexture("con_16x", TEXTURE_16BIT_PALETTE);
          uTextureID_507C68 = pIcons_LOD->LoadTexture("con_32x", TEXTURE_16BIT_PALETTE);
          uTextureID_507C70 = pIcons_LOD->LoadTexture("con_ArrL", TEXTURE_16BIT_PALETTE);
          uTextureID_507C74 = pIcons_LOD->LoadTexture("con_ArrR", TEXTURE_16BIT_PALETTE);
          uTextureID_507C64[0] = pIcons_LOD->LoadTexture("con_Smoo", TEXTURE_16BIT_PALETTE);
          pTextureIDs_SoundLevels[9] = pIcons_LOD->LoadTexture("convol00", TEXTURE_16BIT_PALETTE);
          pTextureIDs_SoundLevels[0] = pIcons_LOD->LoadTexture("convol10", TEXTURE_16BIT_PALETTE);
          pTextureIDs_SoundLevels[1] = pIcons_LOD->LoadTexture("convol20", TEXTURE_16BIT_PALETTE);
          pTextureIDs_SoundLevels[2] = pIcons_LOD->LoadTexture("convol30", TEXTURE_16BIT_PALETTE);
          pTextureIDs_SoundLevels[3] = pIcons_LOD->LoadTexture("convol40", TEXTURE_16BIT_PALETTE);
          pTextureIDs_SoundLevels[4] = pIcons_LOD->LoadTexture("convol50", TEXTURE_16BIT_PALETTE);
          pTextureIDs_SoundLevels[5] = pIcons_LOD->LoadTexture("convol60", TEXTURE_16BIT_PALETTE);
          pTextureIDs_SoundLevels[6] = pIcons_LOD->LoadTexture("convol70", TEXTURE_16BIT_PALETTE);
          pTextureIDs_SoundLevels[7] = pIcons_LOD->LoadTexture("convol80", TEXTURE_16BIT_PALETTE);
          pTextureIDs_SoundLevels[8] = pIcons_LOD->LoadTexture("convol90", TEXTURE_16BIT_PALETTE);
          uTextureID_507C84 = pIcons_LOD->LoadTexture("option04", TEXTURE_16BIT_PALETTE);
          uTextureID_507CB0 = pIcons_LOD->LoadTexture("option03", TEXTURE_16BIT_PALETTE);
          uTextureID_507CB8 = pIcons_LOD->LoadTexture("option02", TEXTURE_16BIT_PALETTE);
          uTextureID_507CB4 = 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_507C6C != -1 ? pIcons_LOD->pTextures[uTextureID_507C6C].uTextureWidth : 24),
            (uTextureID_507C6C != -1 ? pIcons_LOD->pTextures[uTextureID_507C6C].uTextureHeight : 26),
            v0,
            0,
            0xB8u,
            0x80u,
            0,
            v1,
            0);
          pGUIWindow_CurrentMenu->CreateButton(
            0x5Du,
            0x10Eu,
            (uTextureID_507C68 != -1 ? pIcons_LOD->pTextures[uTextureID_507C68].uTextureWidth : 24),
            (uTextureID_507C68 != -1 ? pIcons_LOD->pTextures[uTextureID_507C68].uTextureHeight : 26),
            v0,
            0,
            0xB8u,
            0x40u,
            0,
            v1,
            0);
          pGUIWindow_CurrentMenu->CreateButton(
            0xA4u,
            0x10Eu,
            (uTextureID_507C64[0] != -1 ? pIcons_LOD->pTextures[uTextureID_507C64[0]].uTextureWidth : 24),
            (uTextureID_507C64[0] != -1 ? pIcons_LOD->pTextures[uTextureID_507C64[0]].uTextureHeight : 26),
            v0,
            0,
            0xB8u,
            0,
            0,
            v1,
            0);
          pGUIWindow_CurrentMenu->CreateButton(
            0x14u,
            0x12Fu,
            (uTextureID_507CB4 != -1 ? pIcons_LOD->pTextures[uTextureID_507CB4].uTextureWidth : 24),
            (uTextureID_507CB4 != -1 ? pIcons_LOD->pTextures[uTextureID_507CB4].uTextureHeight : 26),
            v0,
            0,
            0xB9u,
            0,
            0,
            v1,
            0);
          pGUIWindow_CurrentMenu->CreateButton(
            0x80u,
            0x12Fu,
            (uTextureID_507CB8 != -1 ? pIcons_LOD->pTextures[uTextureID_507CB8].uTextureWidth : 24),
            (uTextureID_507CB8 != -1 ? pIcons_LOD->pTextures[uTextureID_507CB8].uTextureHeight : 26),
            v0,
            0,
            0xBBu,
            0,
            0,
            v1,
            0);
          pGUIWindow_CurrentMenu->CreateButton(
            0x14u,
            0x145u,
            (uTextureID_507CB0 != -1 ? pIcons_LOD->pTextures[uTextureID_507CB0].uTextureWidth : 24),
            (uTextureID_507CB0 != -1 ? pIcons_LOD->pTextures[uTextureID_507CB0].uTextureHeight : 26),
            v0,
            0,
            0xE1u,
            0,
            0,
            v1,
            0);
          pGUIWindow_CurrentMenu->CreateButton(
            0x80u,
            0x145u,
            (uTextureID_507C84 != -1 ? pIcons_LOD->pTextures[uTextureID_507C84].uTextureWidth : 24),
            (uTextureID_507C84 != -1 ? pIcons_LOD->pTextures[uTextureID_507C84].uTextureHeight : 26),
            v0,
            0,
            0xE2u,
            0,
            0,
            v1,
            0);
          ptr_50C9CC = pGUIWindow_CurrentMenu->CreateButton(
                         243u,
                         162u,
                         16u,
                         16u,
                         v0,
                         0,
                         111u,
                         4u,
                         0,
                         v1,
                         &pIcons_LOD->pTextures[uTextureID_507C70],
                         0);
          ptr_50C9C8 = pGUIWindow_CurrentMenu->CreateButton(
                         0x1B3u,
                         0xA2u,
                         0x10u,
                         0x10u,
                         v0,
                         0,
                         0x6Fu,
                         5u,
                         0,
                         v1,
                         &pIcons_LOD->pTextures[uTextureID_507C74],
                         0);
          pGUIWindow_CurrentMenu->CreateButton(0x107u, 0xA2u, 0xACu, 0x11u, v0, 0, 0x6Fu, 0, 0, v1, 0);
          ptr_50C9CC = pGUIWindow_CurrentMenu->CreateButton(
                         0xF3u,
                         0xD8u,
                         0x10u,
                         0x10u,
                         v0,
                         0,
                         0x70u,
                         4u,
                         0,
                         v1,
                         &pIcons_LOD->pTextures[uTextureID_507C70],
                         0);
          ptr_50C9C8 = pGUIWindow_CurrentMenu->CreateButton(
                         0x1B3u,
                         0xD8u,
                         0x10u,
                         0x10u,
                         v0,
                         0,
                         0x70u,
                         5u,
                         0,
                         v1,
                         &pIcons_LOD->pTextures[uTextureID_507C74],
                         0);
          pGUIWindow_CurrentMenu->CreateButton(0x107u, 0xD8u, 0xACu, 0x11u, v0, 0, 0x70u, 0, 0, v1, 0);
          ptr_50C9CC = pGUIWindow_CurrentMenu->CreateButton(
                         0xF3u,
                         0x10Eu,
                         0x10u,
                         0x10u,
                         v0,
                         0,
                         0xBAu,
                         4u,
                         0,
                         v1,
                         &pIcons_LOD->pTextures[uTextureID_507C70],
                         0);
          ptr_50C9C8 = pGUIWindow_CurrentMenu->CreateButton(
                         0x1B3u,
                         0x10Eu,
                         0x10u,
                         0x10u,
                         v0,
                         0,
                         0xBAu,
                         5u,
                         0,
                         v1,
                         &pIcons_LOD->pTextures[uTextureID_507C74],
                         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);
          v164 = 0;
          v150 = v1;
          v143 = 86;
          v138 = 0;
          v134 = 421;
          v131 = 0;
          v129 = v0;
          v126 = 40;
          v124 = 214;
          v122 = 194;
          v120 = 19;
          goto LABEL_117;
        case UIMSG_OpenKeyMappingOptions:
          if ( pMessageQueue_50CBD0->uNumMessages )
            pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0;
          pGUIWindow_CurrentMenu->Release();
          viewparams->field_48 = 1;
          pCurrentScreen = 26;
          uTextureID_507BF4 = pIcons_LOD->LoadTexture("optkb", TEXTURE_16BIT_PALETTE);
          uTextureID_507BF8 = pIcons_LOD->LoadTexture("optkb_h", TEXTURE_16BIT_PALETTE);
          uTextureID_507BFC = pIcons_LOD->LoadTexture("resume1", TEXTURE_16BIT_PALETTE);
          uTextureID_507C00 = pIcons_LOD->LoadTexture("optkb_1", TEXTURE_16BIT_PALETTE);
          uTextureID_507C04 = 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;
          dword_506F08 = 1;
          memset(word_506E6C, 0, 0x1Cu);
          word_506E6C[14] = 0;
          memcpy(pPrevVirtualCidesMapping, pKeyActionMap->pVirtualKeyCodesMapping, 0x78u);
          goto LABEL_90;
        default:
          goto _continue;
        case UIMSG_ResetKeyMapping|0x1:
          if ( dword_506E68 != -1 )
            goto LABEL_623;
          v14 = uMessageParam;
          if ( dword_506F08 != v0 )
            v14 = uMessageParam + 14;
          dword_506E68 = v14;
          pKeyActionMap->_459E5A(0, v0, pGUIWindow_CurrentMenu);
          goto _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 = __OFSUB__(uAction, 28);
            v12 = uAction - 28 < 0;
            *((char *)word_506E6C + v18) = 0;
          }
          while ( v12 ^ v13 );
          v165 = 0;
          v151 = 0;
          v144 = 0;
          v139 = 0;
          v135 = -1;
          v132 = 0;
          v130 = 0;
          v127 = 219;
          goto _play_sound_and_continue;
        case 0x1A0:
          dword_506F08 = v0;
          goto _continue;
        case UIMSG_StartNPCDialogue|0x100:
          dword_506F08 = 2;
          goto _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 = 28;
          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() )
            {
              ptr_50C9CC = pGUIWindow_CurrentMenu->CreateButton(
                             0x15u,
                             0xA1u,
                             0x10u,
                             0x10u,
                             1,
                             0,
                             0x1A9u,
                             4u,
                             0,
                             v1,
                             &pIcons_LOD->pTextures[uTextureID_507C20],
                             0);
              ptr_50C9C8 = pGUIWindow_CurrentMenu->CreateButton(
                             0xD5u,
                             0xA1u,
                             0x10u,
                             0x10u,
                             1,
                             0,
                             0x1A9u,
                             5u,
                             0,
                             v1,
                             &pIcons_LOD->pTextures[uTextureID_507C24],
                             0);
              v164 = 0;
              v150 = v1;
              v143 = 0;
              v138 = 0;
              v134 = 425;
              v131 = 0;
              v129 = 1;
              v126 = 18;
              v124 = 170;
              v122 = 162;
              v120 = 42;
LABEL_117:
              pGUIWindow_CurrentMenu->CreateButton(
                v120,
                v122,
                v124,
                v126,
                v129,
                v131,
                v134,
                v138,
                v143,
                v150,
                v164);
            }
          }
          goto _continue;
        case UIMSG_ToggleTint|0x1:
          if ( uMessageParam == 4 )
          {
            --uGammaPos;
            if ( (uGammaPos & 0x80000000u) != 0 )
            {
              uGammaPos = 0;
              goto LABEL_128;
            }
            v19 = (double)(signed int)uGammaPos * 0.1 + 0.6;
            pGame->pGammaController->Initialize(v19);
            v166 = v0;
            v152 = (int)ptr_50C9CC;
            v145 = (WindowType)90;
            v140 = 0;
            v136 = 0;
            v20 = 21;
            goto LABEL_122;
          }
          if ( uMessageParam == 5 )
          {
            ++uGammaPos;
            if ( (signed int)uGammaPos <= 9 )
            {
              v21 = (double)(signed int)uGammaPos * 0.1 + 0.6;
              pGame->pGammaController->Initialize(v21);
              v20 = 213;
              v166 = v0;
              v152 = (int)ptr_50C9C8;
              v145 = (WindowType)90;
              v140 = 0;
              v136 = 0;
LABEL_122:
              GUIWindow::Create(v20, 0xA1u, v136, v140, v145, v152, v166);
              goto LABEL_128;
            }
            uGammaPos = 9;
          }
          else
          {
            uGammaPos = (pMouse->GetCursorPos(&a2)->x - 42) / 17;
            v22 = (double)(signed int)uGammaPos * 0.1 + 0.6;
            pGame->pGammaController->Initialize(v22);
          }
LABEL_128:
          v165 = 0;
          v151 = 0;
          v144 = 0;
          v139 = 0;
          v135 = -1;
          v132 = 0;
          v130 = 0;
          v127 = 21;
          goto _play_sound_and_continue;
        case UIMSG_ToggleBloodsplats:
          pGame->ToggleFlags2(0x20u);
          goto _continue;
        case UIMSG_ToggleColoredLights:
          pRenderer->bUseColoredLights = pRenderer->bUseColoredLights == 0;
          goto _continue;
        case UIMSG_ToggleTint:
          pRenderer->bTinting = pRenderer->bTinting == 0;
          goto _continue;
        case UIMSG_ChangeMusicVolume:
          if ( uMessageParam == 4 )
          {
            --uMusicVolimeMultiplier;
            if ( (char)uMusicVolimeMultiplier < 1 )
              uMusicVolimeMultiplier = 0;
            v167 = v0;
            v23 = 243;
            v153 = (int)ptr_50C9CC;
LABEL_136:
            GUIWindow::Create(v23, 0xD8u, 0, 0, (enum WindowType)90, v153, v167);
            goto LABEL_143;
          }
          if ( uMessageParam == 5 )
          {
            ++uMusicVolimeMultiplier;
            if ( (char)uMusicVolimeMultiplier > 9 )
              uMusicVolimeMultiplier = 9;
            v167 = v0;
            v23 = 435;
            v153 = (int)ptr_50C9C8;
            goto LABEL_136;
          }
          uMusicVolimeMultiplier = (pMouse->GetCursorPos(&v202)->x - 263) / 17;
          if ( (char)uMusicVolimeMultiplier > 9 )
            uMusicVolimeMultiplier = 9;
LABEL_143:
          if ( uMusicVolimeMultiplier )
            pAudioPlayer->PlaySound(
              SOUND_Bell,
              -1,
              0,
              -1,
              0,
              0,
              (signed __int64)(pSoundVolumeLevels[(char)uMusicVolimeMultiplier] * 64.0),
              0);
          pAudioPlayer->SetMusicVolume(
            (signed __int64)(pSoundVolumeLevels[(char)uMusicVolimeMultiplier] * 64.0));
          goto _continue;
        case UIMSG_ChangeSoundVolume:
          if ( uMessageParam == 4 )
          {
            --uSoundVolumeMultiplier;
            if ( (char)uSoundVolumeMultiplier < 1 )
              uSoundVolumeMultiplier = 0;
            v168 = v0;
            v24 = 243;
            v154 = (int)ptr_50C9CC;
LABEL_150:
            GUIWindow::Create(v24, 0xA2u, 0, 0, (enum WindowType)90, v154, v168);
            goto LABEL_157;
          }
          if ( uMessageParam == 5 )
          {
            ++uSoundVolumeMultiplier;
            if ( (char)uSoundVolumeMultiplier > 8 )
              uSoundVolumeMultiplier = 9;
            v168 = v0;
            v24 = 435;
            v154 = (int)ptr_50C9C8;
            goto LABEL_150;
          }
          uSoundVolumeMultiplier = (pMouse->GetCursorPos(&v207)->x - 263) / 17;
          if ( (char)uSoundVolumeMultiplier > 8 )
            uSoundVolumeMultiplier = 9;
LABEL_157:
          pAudioPlayer->SetMasterVolume(
            (signed __int64)(pSoundVolumeLevels[(char)uSoundVolumeMultiplier] * 128.0));
          v165 = 0;
          v151 = 0;
          v144 = 0;
          v139 = 0;
          v135 = -1;
          v132 = 0;
          v130 = -1;
          v127 = 218;
          goto _play_sound_and_continue;
        case UIMSG_ToggleFlipOnExit:
          bFlipOnExit = bFlipOnExit == 0;
          goto _continue;
        case UIMSG_ToggleAlwaysRun:
          bAlwaysRun = bAlwaysRun == 0;
          goto _continue;
        case UIMSG_ToggleWalkSound:
          bWalkSound = bWalkSound == 0;
          goto _continue;
        case UIMSG_ToggleShowDamage:
          bShowDamage = bShowDamage == 0;
          goto _continue;
        case UIMSG_ChangeVoiceVolume:
          if ( uMessageParam == 4 )
          {
            --uVoicesVolumeMultiplier;
            if ( (char)uVoicesVolumeMultiplier < 1 )
              uVoicesVolumeMultiplier = 0;
            v169 = v0;
            v25 = 243;
            v155 = (int)ptr_50C9CC;
LABEL_166:
            GUIWindow::Create(v25, 0x10Eu, 0, 0, (enum WindowType)90, v155, v169);
            goto LABEL_173;
          }
          if ( uMessageParam == 5 )
          {
            ++uVoicesVolumeMultiplier;
            if ( (char)uVoicesVolumeMultiplier > 8 )
              uVoicesVolumeMultiplier = 9;
            v169 = v0;
            v25 = 435;
            v155 = (int)ptr_50C9C8;
            goto LABEL_166;
          }
          uVoicesVolumeMultiplier = (pMouse->GetCursorPos(&v205)->x - 263) / 17;
          if ( (char)uVoicesVolumeMultiplier > 8 )
            uVoicesVolumeMultiplier = 9;
LABEL_173:
          if ( !uVoicesVolumeMultiplier )
            goto _continue;
          v165 = 0;
          v151 = (signed __int64)(pSoundVolumeLevels[(char)uVoicesVolumeMultiplier] * 128.0);
          v144 = 0;
          v139 = 0;
          v135 = -1;
          v132 = 0;
          v130 = -1;
          v127 = 5788;
          goto _play_sound_and_continue;
        case UIMSG_SetTurnSpeed:
          if ( uMessageParam )
            pParty->sRotationY = uMessageParam * pParty->sRotationY / uMessageParam;
          uTurnSpeed = uMessageParam;
          goto _continue;
        case UIMSG_SetGraphicsMode:
          if ( !bUseLoResSprites )
          {
            byte_6BE388_graphicsmode = uMessageParam;
LABEL_184:
            MM7Initialization();
            goto _continue;
          }
          if ( uMessageParam )
          {
            if ( uMessageParam == 1 )
            {
              byte_6BE388_graphicsmode = 0;
            }
            else
            {
              if ( uMessageParam != 2 )
                goto _continue;
              byte_6BE388_graphicsmode = 1;
            }
            goto LABEL_184;
          }
          ModalWindow(pNPCTopics[453].pText, 0);
          goto _continue;
        case UIMSG_SkillUp|0x2:
          pGUIWindow_CurrentMenu->Release();
          pEventTimer->Resume();
          goto LABEL_188;
        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);
          ptr_507BE0 = GUIWindow::Create(493u, 355u, 0, 0, (enum WindowType)99, (int)ptr_507A10, 0);
          bFlashQuestBook = 0;
          goto _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);
          ptr_507BE0 = GUIWindow::Create(527u, 353u, 0, 0, (enum WindowType)99, (int)ptr_507A0C, 0);
          bFlashAutonotesBook = 0;
          goto _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);
          v26 = GUIWindow::Create(0, 0, 640u, 480u, WINDOW_Book, uMessage, 0);
          v27 = 353;
          v28 = 546;
          v170 = 0;
          v156 = (int)ptr_507A08;
          goto LABEL_210;
        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);
          v26 = GUIWindow::Create(0, 0, 640, 480, WINDOW_Book, uMessage, 0);
          v27 = 354;
          v28 = 570;
          v170 = 0;
          v156 = (int)dword_507A04;
LABEL_210:
          pGUIWindow_CurrentMenu = v26;
          ptr_507BE0 = GUIWindow::Create(v28, v27, 0, 0, (enum WindowType)99, v156, v170);
          goto _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);
          ptr_507BE0 = GUIWindow::Create(0x258u, 0x169u, 0, 0, (enum WindowType)99, (int)ptr_507A00, 0);
          bFlashHistoryBook = 0;
          goto _continue;
        case UIMSG_CloseBook:
          back_to_game();
          if ( pMessageQueue_50CBD0->uNumMessages )
            pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0;
          if ( pCurrentScreen > 15 )
          {
            if ( pCurrentScreen >= 17
              && (pCurrentScreen <= 18
               || pCurrentScreen == 104) )
            {
LABEL_229:
              if ( dword_50CDC8 )
                goto LABEL_232;
              sub_42FC15();
              goto LABEL_231;
            }
          }
          else
          {
            if ( pCurrentScreen >= 14
              || pCurrentScreen == 4
              || pCurrentScreen == 10 )
              goto LABEL_229;
            if ( pCurrentScreen == 13
              && !dword_50CDC8
              && !dword_5C35C8 )
            {
              sub_42FC15();
              dword_5C35C8 = 0;
LABEL_231:
              uMessageParam = v0;
              goto LABEL_232;
            }
          }
LABEL_232:
          if ( !ptr_507BDC )
          {
            pRenderer->ClearZBuffer(0, 479);
            viewparams->bRedrawGameUI = v0;
            viewparams->field_48 = v0;
            if ( pCurrentScreen )
            {
              if ( pCurrentScreen > 103 )
              {
                if ( pCurrentScreen == 104 )
                  goto LABEL_321;
              }
              else
              {
                if ( pCurrentScreen < 100 )
                {
                  switch ( pCurrentScreen )
                  {
                    case 23:
                      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;
                      }
                      goto LABEL_322;
                    case 3:
                      ptr_507BE0->Release();
                      //crt_deconstruct_ptr_6A0118();
                      ptr_507BE0 = 0;
                      pEventTimer->Resume();
                      goto LABEL_322;
                    case 11:
                    case 12:
                      pIcons_LOD->_4114F2();
                      //crt_deconstruct_ptr_6A0118();
                      goto LABEL_291;
                    case 15:
                      pCurrentScreen = 10;
                      goto _continue;
                    case 10:
                      v29 = ptr_507BB8;
                      goto LABEL_249;
                    case 25:
                      v29 = ptr_507BC8;
LABEL_249:
                      v29->Release();
                      pIcons_LOD->_4114F2();
                      pCurrentScreen = 0;
                      viewparams->bRedrawGameUI = v0;
                      pEventTimer->Resume();
                      goto _continue;
                    case 2:
                      thisa = (signed int)&uTextureID_507C60;
                      do
                      {
                        if ( *(int *)thisa )
                          pIcons_LOD->pTextures[*(int *)thisa].Release();
                        thisa += 4;
                      }
                      while ( thisa < (signed int)&dword_507CBC );
                      memset(&uTextureID_507C60, 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;
                        goto LABEL_261;
                      }
                      if ( uTurnSpeed == 64 )
                      {
                        v171 = 2;
LABEL_261:
                        v30 = v171;
                        goto LABEL_262;
                      }
                      if ( uTurnSpeed != 128 )
                        goto LABEL_291;
                      v30 = v0;
LABEL_262:
                      v31 = "TurnDelta";
LABEL_263:
                      WriteWindowsRegistryInt(v31, v30);
LABEL_291:
                      stru_506E40.Release();
                      break;
                    case 1:
                      pIcons_LOD->_40F9C5();
                      pIcons_LOD->_4114F2();
                      pIcons_LOD->_40F9C5();
                      pIcons_LOD->_4114F2();
                      goto LABEL_291;
                    case 28:
                      if ( pRenderer->pRenderD3D )
                      {
                        WriteWindowsRegistryInt("Colored Lights", pRenderer->bUseColoredLights);
                        WriteWindowsRegistryInt("Tinting", pRenderer->bTinting);
                        WriteWindowsRegistryInt("Bloodsplats", (LOBYTE(pGame->uFlags2) >> 5) & 1);
                      }
                      if ( pRenderer->bWindowMode )
                        goto LABEL_291;
                      v30 = uGammaPos;
                      v31 = "GammaPos";
                      goto LABEL_263;
                    case 26:
                      v197 = 1;
                      v32 = 0;
                      while ( *((char *)word_506E6C + v32) != 1 )
                      {
                        ++v32;
                        if ( v32 >= 28 )
                        {
                          thisb = (signed int)&uTextureID_507BF4;
                          do
                          {
                            if ( *(int *)thisb )
                              pIcons_LOD->pTextures[*(int *)thisb].Release();
                            thisb += 4;
                          }
                          while ( thisb < (signed int)&dword_507C08 );
                          memset(&uTextureID_507BF4, 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 )
                              v172 = (KeyToggleType)v0;
                            else
                              v172 = (KeyToggleType)0;
                            pKeyActionMap->SetKeyMapping(
                              uAction,
                              pPrevVirtualCidesMapping[uAction],
                              v172);
                            ++uAction;
                          }
                          while ( uAction < 28 );
                          pKeyActionMap->StoreMappings();
                          goto LABEL_291;
                        }
                      }
                      goto LABEL_623;
                    case 5:
                      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;
                      goto LABEL_322;
                    case 14:
                      pGUIWindow_CurrentMenu->Release();
                      pCurrentScreen = 13;
                      pIcons_LOD->_4114F2();
                      goto _continue;
                    case 13:
                      if ( uDialogueType )
                        uDialogueType = 0;
                      if ( uGameState == 2 )
                      {
                        while ( sub_4BD8B5() )
                          ;
                      }
                      else
                      {
                        if ( sub_4BD8B5() )
                          goto _continue;
                      }
                      sub_4B1D27();
                      pAudioPlayer->PlaySound((SoundID)(SOUND_EnteringAHouse|0x1), 814, 0, -1, 0, 0, 0, 0);
                      pVideoPlayer->Unload();
                      pGUIWindow_CurrentMenu = ptr_507BC0;
                      goto LABEL_322;
                    case 18:
                      if ( uCurrentHouse_Animation == 153 )
                        HousePlaySomeSound(0x99u, 3);
                      pVideoPlayer->Unload();
                      goto LABEL_306;
                    case 4:
LABEL_306:
                      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 19:
                      memset(GameUI_StatusBar_TimedString, 0, 0xC8u);
                      sub_4452BB();
                      goto LABEL_317;
                    case 17:
                      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 16:
                      pVideoPlayer->Unload();
                      goto _continue;
                    case 7:
                      goto LABEL_319;
                    default:
                      goto LABEL_322;
                  }
                  goto LABEL_322;
                }
LABEL_319:
                sub_4196A0();
                sub_419379();
LABEL_321:
                pIcons_LOD->_4114F2();
              }
LABEL_322:
              if ( ptr_507BD4 )
              {
                if ( pCurrentScreen == 7 )
                {
                  pMouse->SetCursorBitmap("MICON2");
                }
                else
                {
                  ptr_507BD4->Release();
                  ptr_507BD4 = 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 == ptr_507BC0 )
                ptr_507BC0 = 0;
              pGUIWindow_CurrentMenu = 0;
              pEventTimer->Resume();
              pCurrentScreen = 0;
              viewparams->bRedrawGameUI = v0;
              pIcons_LOD->_4355F7();
              goto _continue;
            }
            v36 = ptr_507BD4;
            if ( !ptr_507BD4 )
            {
              dword_6BE138 = -1;
              GUIWindow::Create(0x25Au, 0x1C2u, 0, 0, (enum WindowType)90, (int)ptr_5079F0, 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_507944 = pIcons_LOD->LoadTexture("options", TEXTURE_16BIT_PALETTE);
              uTextureID_507940 = pIcons_LOD->LoadTexture("new1", TEXTURE_16BIT_PALETTE);
              uTextureID_50793C = pIcons_LOD->LoadTexture("load1", TEXTURE_16BIT_PALETTE);
              uTextureID_507938 = pIcons_LOD->LoadTexture("save1", TEXTURE_16BIT_PALETTE);
              uTextureID_507934 = pIcons_LOD->LoadTexture("controls1", TEXTURE_16BIT_PALETTE);
              uTextureID_507930 = pIcons_LOD->LoadTexture("resume1", TEXTURE_16BIT_PALETTE);
              uTextureID_50792C = pIcons_LOD->LoadTexture("quit1", TEXTURE_16BIT_PALETTE);
              ptr_50C9C4 = pGUIWindow_CurrentMenu->CreateButton(
                             0x13u,
                             0x9Bu,
                             0xD6u,
                             0x28u,
                             v0,
                             0,
                             0x7Cu,
                             0,
                             0x4Eu,
                             pGlobalTXT_LocalizationStrings[614],// "New Game"
                             (Texture *)(uTextureID_507940 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_507940] : 0),
                             0);
              ptr_50C9C0 = pGUIWindow_CurrentMenu->CreateButton(
                             0x13u,
                             0xD1u,
                             0xD6u,
                             0x28u,
                             v0,
                             0,
                             0x7Eu,
                             0,
                             0x53u,
                             pGlobalTXT_LocalizationStrings[615],// "Save Game"
                             (Texture *)(uTextureID_507938 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_507938] : 0),
                             0);
              ptr_50C9BC = pGUIWindow_CurrentMenu->CreateButton(
                             0x13u,
                             0x107u,
                             0xD6u,
                             0x28u,
                             v0,
                             0,
                             0x7Du,
                             0,
                             0x4Cu,
                             pGlobalTXT_LocalizationStrings[616],// "Load Game"
                             (Texture *)(uTextureID_50793C != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_50793C] : 0),
                             0);
              pyt_50C9B8 = pGUIWindow_CurrentMenu->CreateButton(
                             0xF1u,
                             0x9Bu,
                             0xD6u,
                             0x28u,
                             v0,
                             0,
                             0x7Fu,
                             0,
                             0x43u,
                             pGlobalTXT_LocalizationStrings[617],// ""Sound, Keyboard, Game Options:""
                             (Texture *)(uTextureID_507934 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_507934] : 0),
                             0);
              ptr_50C9B4 = pGUIWindow_CurrentMenu->CreateButton(
                             0xF1u,
                             0xD1u,
                             0xD6u,
                             0x28u,
                             v0,
                             0,
                             0x84u,
                             0,
                             0x51u,
                             pGlobalTXT_LocalizationStrings[618],// "Quit"
                             (Texture *)(uTextureID_50792C != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_50792C] : 0),
                             0);
              ptr_50C9B0 = pGUIWindow_CurrentMenu->CreateButton(
                             0xF1u,
                             0x107u,
                             0xD6u,
                             0x28u,
                             v0,
                             0,
                             0x7Bu,
                             0,
                             0x52u,
                             pGlobalTXT_LocalizationStrings[619],// "Return to Game"
                             (Texture *)(uTextureID_507930 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_507930] : 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);
              goto _continue;
            }
            goto LABEL_333;
          }
          sub_41426F();
_continue:
          continue;
        case UIMSG_BC:
          if ( uMessageParam )
          {
            GUIWindow::Create(0x272u, 0xB3u, 0, 0, (enum WindowType)90, (int)ptr_5079E8, 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;
              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(0x1D5u, 0xB3u, 0, 0, (enum WindowType)90, (int)ptr_5079EC, 0);
            if ( pParty->field_709 )
            {
              --pParty->field_709;
              if ( pParty->field_709 < 1 )
                pParty->field_709 = 0;
            }
          }
          DrawHiredNPCs();
          goto _continue;
        case UIMSG_OpenRestUI|0x2:
          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
          {
            dword_597F18 = dword_5C341C;
            EventProcessor(dword_5C3418, 0, v0);
          }
          dword_597F18 = 0;
          if ( !_strcmpi(byte_6BE3B0, "d05.blv") )
            pParty->uTimePlayed += 1474560i64;
          goto _continue;
        case 0x19C:
          sub_42FC15();
          pVideoPlayer->Unload();
          sub_44603D();
          dword_597F18 = 0;
          goto LABEL_422;
        case UIMSG_CycleCharacters:
          v39 = GetAsyncKeyState(VK_SHIFT);
          v40 = CycleCharacter(v39);
          goto LABEL_421;
        case UIMSG_LoadGame|0x8:
          if ( pMessageQueue_50CBD0->uNumMessages )
            pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0;
          dword_50CDC8 = v0;
          sub_42FBDD();
          v195 = (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:
            sub_42FC15();
            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 = 0;
          }
          else
          {
            pParty->field_6E4 = 0;
            pParty->field_6E0 = 0;
            pStru277->_427D48(v0);
            sub_44603D();
            pEventTimer->Pause();
            pGameLoadingUI_ProgressBar->_443484((GUIProgressBar::Type)2);
            ++pGameLoadingUI_ProgressBar->uProgressMax;
            SaveGame(v0, 0);
            pGameLoadingUI_ProgressBar->Progress();
            RestAndHeal(1440 * (signed int)v195);
            if ( pParty->uNumFoodRations )
            {
              pParty->RestAndHeal();
              if ( ((pParty->uNumFoodRations - (signed int)v195) & 0x80000000u) != 0 )
              {
                thisc = pParty->pPlayers;
                do
                {
                  thisc->SetCondition(v0, 0);
                  ++thisc;
                }
                while ( (signed int)thisc < (signed int)pParty->pHirelings );
                ++pParty->field_764;
              }
              Party::TakeFood((unsigned int)v195);
            }
            else
            {
              thisd = pParty->pPlayers;
              do
              {
                thisd->SetCondition(v0, 0);
                ++thisd;
              }
              while ( (signed int)thisd < (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 = 0;
            pGameLoadingUI_ProgressBar->Release();
          }
          goto LABEL_422;
        case UIMSG_SaveGame|0x8:
          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);
            v43 = pMouse->GetCursorPos(&v208);
            v42 = pRenderer->pActiveZBuffer[*(int *)uNumSeconds + pSRZBufferLineOffsets[v43->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 ( v45 == 2 )
          {
            v47 = (pObjectList->pObjects[pLayingItems[v46].uObjectDescID].uFlags & 0x10) == 0;
LABEL_400:
            if ( !v47 )
              goto _continue;
            goto LABEL_415;
          }
          if ( v45 == 5 )
          {
            v48 = pLevelDecorations[v46].field_16_event_id == 0;
          }
          else
          {
            if ( v45 != 6 )
              goto _continue;
            if ( uCurrentlyLoadedLevelType != v0 )
            {
              v50 = &pOutdoor->pBModels[v44 >> 9].pFaces[v46 & 0x3F];
              if ( !(v50->uAttributes & 0x02000000) || !v50->sCogTriggeredID )
                goto _continue;
              v44 = uNumSeconds;
              goto LABEL_415;
            }
            v49 = &pIndoor->pFaces[v46];
            if ( !(BYTE3(v49->uAttributes) & 2) )
              goto _continue;
            v48 = pIndoor->pFaceExtras[v49->uFaceExtraID].uEventID == 0;
          }
          if ( v48 )
            goto _continue;
LABEL_415:
          v51 = ptr_507BD4->ptr_1C;
          *((char *)v51 + 8) &= 0xBFu;
LABEL_416:
          *((short *)v51 + 2) = uMessageParam;
          *((int *)v51 + 3) = v44;
          pParty->pPlayers[*((short *)v51 + 1)].SetRecoveryTime(300);
          v36 = ptr_507BD4;
LABEL_333:
          v36->Release();
          ptr_507BD4 = 0;
          pMouse->SetCursorBitmap("MICON1");
          GameUI_StatusBar_TimedStringTimeLeft = 0;
          unk_50C9A0 = 0;
          back_to_game();
          goto _continue;
        case UIMSG_ChangeGameState|0x40:
        case 0x8D:
        case 0x8F:
          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 ( ptr_507BD4 )
            {
              v52 = ptr_507BD4->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);
              ptr_507BD4->Release();
              ptr_507BD4 = 0;
              pEventTimer->Resume();
              pMouse->SetCursorBitmap("MICON1");
              GameUI_StatusBar_TimedStringTimeLeft = 0;
              unk_50C9A0 = 0;
            }
          }
          goto _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)ptr_507BC0->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;
        case UIMSG_C3:
          pAudioPlayer->StopChannels(-1, -1);
          v162 = uMessageParam;
          v148 = 195;
          goto LABEL_438;
        case UIMSG_B1:
          pAudioPlayer->StopChannels(-1, -1);
          v162 = 0;
          v148 = 177;
LABEL_438:
          v141 = (WindowType)9;
LABEL_439:
          pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, v141, v148, v162);
          goto _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 )
            goto _continue;
          v58 = pPlayers[_506348_current_lloyd_playerid + 1];
          uNumSeconds = (unsigned int)&v58->pInstalledBeacons[uMessageParam];
          if ( bRecallingBeacon )
          {
            if ( !*((int *)&pSavegameThumbnails->pPixels + 10 * uMessageParam) )
              goto _continue;
            v173 = pMapStats->pInfos[sub_410D99_get_map_index(HIWORD(v58->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);
          goto _set_status_string_pTmpBuf_and_continue;
        case UIMSG_B5:
          dword_50CDC8 = v0;
          goto LABEL_453;
        case UIMSG_B3:
          thisf = pPlayers[_506348_current_lloyd_playerid + 1];
          v195 = (NPCData *)&thisf->pInstalledBeacons[uMessageParam];
          if ( !*(_QWORD *)&v195->pName && bRecallingBeacon )
            goto _continue;
          byte_506360 = 1;
          thisf->CanCastSpell(uRequiredMana);
          if ( pParty->bTurnBasedModeOn )
          {
            v60 = sRecoveryTime;
            pParty->pTurnBasedPlayerRecoveryTimes[_506348_current_lloyd_playerid] = sRecoveryTime;
            thisf->SetRecoveryTime(v60);
            pTurnEngine->_40471C();
          }
          else
          {
            thisf->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(v195->uProfession)]) )
            {
              SaveGame(v0, 0);
              OnMapLeave();
              strcpy(pCurrentMapName, (const char *)&pGames_LOD->pSubIndices[HIWORD(v195->uProfession)]);
              dword_6BE364_game_settings_1 |= v0;
              uGameState = 2;
              _5B65A8_npcdata_uflags_or_other = v195->uFlags;
              _5B65AC_npcdata_fame_or_other = v195->fame;
              _5B65B0_npcdata_rep_or_other = v195->rep;
              _5B65B4_npcdata_loword_house_or_other = LOWORD(v195->house);
              _5B65B8_npcdata_hiword_house_or_other = HIWORD(v195->house);
              dword_5B65C0 = v0;
            }
            else
            {
              pParty->vPosition.x = v195->uFlags;
              pParty->vPosition.y = v195->fame;
              pParty->vPosition.z = v195->rep;
              pParty->uFallStartY = pParty->vPosition.z;
              pParty->sRotationY = LOWORD(v195->house);
              pParty->sRotationX = HIWORD(v195->house);
            }
            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;
            }
            //crt_deconstruct_ptr_6A0118();
            ptr_507BE0->Release();
            pGUIWindow_CurrentMenu->Release();
            ptr_507BE0 = 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;
            v61 = v195;
            thisg = 0;
            v62 = pParty->uTimePlayed + (signed __int64)((double)(qword_506350 << 7) * 0.033333335);
            v195->pName = (char *)v62;
            v61->uPortraitID = HIDWORD(v62);
            v61->uFlags = pParty->vPosition.x;
            v61->fame = pParty->vPosition.y;
            v61->rep = pParty->vPosition.z;
            LOWORD(v61->house) = LOWORD(pParty->sRotationY);
            HIWORD(v61->house) = LOWORD(pParty->sRotationX);
            if ( (signed int)pGames_LOD->uNumSubIndices / 2 <= 0 )
              goto _continue;
            uAction = 0;
            while ( _strcmpi((const char *)pGames_LOD->pSubIndices + uAction, pCurrentMapName) )
            {
              ++thisg;
              uAction += 32;
              if ( thisg >= (signed int)pGames_LOD->uNumSubIndices / 2 )
                goto _continue;
            }
            HIWORD(v195->uProfession) = thisg;
          }
          goto _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;
                    UpdateActors();
                  }
                  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;
                  }
                  goto _continue;
                }
                v63 = 210;
                break;
            }
          }
          else
          {
            v63 = 206;
          }
          if ( !(unsigned __int16)_449B57_test_bit(pParty->_award_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;
                v68 = 210;
                break;
            }
          }
          else
          {
            v68 = 206;
          }
          if ( !(unsigned __int16)_449B57_test_bit(pParty->_award_bits, v68) )
          {
            pRenderer->DrawTextureRGB(0, 0x160u, pTexture_StatusBar);
            goto _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;
                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;
          goto _continue;
        case UIMSG_C4:
          uGameState = 0;
          strcpy((char *)pKeyActionMap->pPressedKeysBuffer, "2");
          goto LABEL_524;
        case UIMSG_D5|0x8:
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 )
          {
            v195 = (NPCData *)((signed int)pGames_LOD->uNumSubIndices / 2);
            v70 = atoi(v216.pProperties[0]);
            if ( v70 <= 0 || v70 >= 77 )
            {
LABEL_90:
              v1 = "";
LABEL_91:
              v0 = 1;
              goto _continue;
            }
            v71 = v70;
            strcpy(Str2, pMapStats->pInfos[v70].pFilename);
            v72 = 0;
            if ( (signed int)v195 > 0 )
            {
              thish = 0;
              do
              {
                if ( !_strcmpi((const char *)&pGames_LOD->pSubIndices[thish], Str2) )
                  break;
                ++thish;
                v72 = (NPCData *)((char *)v72 + 1);
              }
              while ( (signed int)v72 < (signed int)v195 );
              if ( (signed int)v72 < (signed int)v195 )
              {
                strcpy(pCurrentMapName, (const char *)&pGames_LOD->pSubIndices[(int)v72]);
                dword_6BE364_game_settings_1 |= 1u;
                uGameState = 2;
                OnMapLeave();
                goto LABEL_90;
              }
            }
            sprintf(Str2, "No map found for %s", pMapStats->pInfos[v71].pName);
            v73 = Str2;
          }
          else
          {
            if ( v216.field_0 != 3 )
              goto LABEL_90;
            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;
              }
            }
            else
            {
              if ( v74 > -32768 )
              {
                if ( v74 < 32768 )
                {
                  v77 = thisi;
                  if ( thisi > -32768 )
                  {
                    if ( thisi < 32768 && v76 >= 0 && v76 < 10000 )
                      goto LABEL_544;
                  }
                }
              }
            }
            pAudioPlayer->PlaySound(SOUND_27, 0, 0, -1, 0, 0, 0, 0);
            v73 = "Can't jump to that location!";
          }
          ShowStatusBarString(v73, 6u);
          goto LABEL_90;
        case 0x19:
          if ( bUnderwater == 1 )
            goto LABEL_682;
          if ( !uActiveCharacter || (v78 = pPlayers[uActiveCharacter], v78->uTimeToRecovery) )
            goto LABEL_90;
          v79 = v78->uQuickSpell;
          v175 = uActiveCharacter;
          v159 = 0;
          v147 = 0;
          v80 = uActiveCharacter - 1;
          goto LABEL_679;
        case 0x46:
        case UIMSG_Quit|0x8:
          if ( pRenderer->pRenderD3D )
          {
            v81 = pGame->pVisInstance->get_picked_object_zbuf_val();
          }
          else
          {
            uNumSeconds = (unsigned int)pMouse->GetCursorPos(&v206);
            v82 = pMouse->GetCursorPos(&v201);
            v81 = pRenderer->pActiveZBuffer[*(int *)uNumSeconds + pSRZBufferLineOffsets[v82->y]];
          }
          v83 = v81;
          v44 = (unsigned __int16)v81;
          v84 = v83 >> 16;
          if ( (v44 & 7) != 3 || v84 >= 5120 )
            goto LABEL_90;
          v51 = ptr_507BD4->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;
        case 0x1C:
          if ( !uActiveCharacter
            || pCurrentScreen )
            goto LABEL_90;
          ptr_507BC8 = GUIWindow::Create(0, 0, 640, 480, (enum WindowType)104, uMessageParam, 0);
          pCurrentScreen = 25;
          pEventTimer->Pause();
          goto _continue;
        case 0x1B:
          if ( !uActiveCharacter )
            goto LABEL_90;
          if ( pParty->bTurnBasedModeOn != v0 )
            goto LABEL_569;
          if ( pTurnEngine->field_4 == v0 || pTurnEngine->field_4 == 3 )
            goto LABEL_90;
          if ( !(pTurnEngine->field_18 & 2) )
          {
LABEL_569:
            if ( pActors[uMessageParam].uAIState == 5 )
              stru_50C198.LootActor(&pActors[uMessageParam]);
            else
              Actor::StealFrom(uMessageParam);
          }
          goto _continue;
        case 0x17:
          if ( !uActiveCharacter )
            goto LABEL_90;
          if ( pParty->bTurnBasedModeOn != v0 )
            goto LABEL_577;
          if ( pTurnEngine->field_4 == v0 || pTurnEngine->field_4 == 3 )
            goto LABEL_90;
          if ( !(pTurnEngine->field_18 & 2) )
LABEL_577:
            _42ECB5_PlayerAttacksActor();
          goto _continue;
        case UIMSG_A7:
          v163 = (int)pGlobalTXT_LocalizationStrings[81];// "Exit Rest"
          v85 = pButton_RestUI_Exit;
          v149 = pButton_RestUI_Exit;
          v142 = (WindowType)96;
          goto LABEL_731;
        case UIMSG_ShowStatus_Player|0x1:
          if ( dword_506F14 == 2 )
            goto LABEL_621;
          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;
          goto _continue;
        case 0x60:
          if ( dword_506F14 == 2 )
            goto LABEL_621;
          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;
          goto _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;
        case 0x68:
          if ( pMessageQueue_50CBD0->uNumMessages )
            pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0;
          if ( pCurrentScreen )
            goto _continue;
          if ( sub_42F4DA() )
            goto LABEL_594;
          if ( pParty->bTurnBasedModeOn == v0 )
            goto LABEL_595;
          if ( !(pParty->uFlags & 0x88) )
          {
            RestUI_Initialize();
            goto _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;
          }
          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;
          v176 = 0;
          v160 = 13;
          goto LABEL_619;
        case 0x61:
          if ( dword_506F14 )
            goto LABEL_621;
          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 = 108;
LABEL_619:
              pPlayers[v89]->PlaySound(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;
            thisj = &pMapStats->pInfos[v90];
            if ( rand() % 100 + 1 <= thisj->field_30 )
            {
              v91 = rand() % 100;
              v92 = thisj->field_31;
              v93 = v91 + 1;
              if ( v93 > v92 )
                v195 = (NPCData *)((v93 > v92 + thisj->field_32) + 2);
              else
                v195 = (NPCData *)v0;
              if ( !sub_45063B(thisj, (int)v195) )
                v195 = 0;
              if ( v195 )
              {
                v94 = rand() % 4;
                LODWORD(pParty->pPlayers[v94].pConditions[2]) = 0;
                HIDWORD(pParty->pPlayers[v94].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;
                }
                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;
          }
          goto _continue;
        case UIMSG_ShowStatus_Funds|0x8:
          if ( dword_506F14 == 2 )
          {
LABEL_621:
            v96 = pGlobalTXT_LocalizationStrings[477];// "You are already resting!"
            goto LABEL_622;
          }
          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;
          goto _continue;
        case 0x4E:
          if ( dword_50654C && byte_506550 )
          {
            v173 = pSpellStats->pInfos[dword_50654C + 11 * pPlayers[uActiveCharacter]->pNumSpellBookPage].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);
          goto _continue;
        case 0x4F:
          if ( !uActiveCharacter
            || (uNumSeconds = (unsigned int)pPlayers[uActiveCharacter],
                !*(char *)(uNumSeconds + 11 * *(char *)(uNumSeconds + 6734) + uMessageParam + 402)) )
            goto _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;
        case 0x58:
          GUIWindow::Create(ptr_5064F8->uX, ptr_5064F8->uY, 0, 0, (enum WindowType)90, (int)ptr_5064F8, 0);
          if ( !uActiveCharacter )
            goto _continue;
          thisk = pPlayers[uActiveCharacter];
          if ( !byte_506550 || !dword_50654C )
          {
            v165 = 0;
            v151 = 0;
            v144 = 0;
            v139 = 0;
            v135 = -1;
            v132 = 0;
            thisk->uQuickSpell = 0;
            v130 = 0;
            dword_50654C = 0;
            v127 = 203;
            goto _play_sound_and_continue;
          }
          v99 = dword_50654C + 11 * pPlayers[uActiveCharacter]->pNumSpellBookPage;
          pPlayers[uActiveCharacter]->uQuickSpell = v99;
          stru_A750F8[uActiveCharacter + 3]._494836(v99, uActiveCharacter);
          if ( uActiveCharacter )
            thisk->PlaySound(12, 0);
          byte_506550 = 0;
          goto _continue;
        case 0x33:
          if ( !uActiveCharacter )
            goto _continue;
          v100 = pPlayers[uActiveCharacter];
          v195 = 0;
          uAction = 0;
          v101 = 0;
          thisl = (int)&v100->pActiveSkills[12];
          do
          {
            if ( *(short *)thisl )
            {
              if ( v100->pNumSpellBookPage == v101 )
                uAction = (int)v195;
              v102 = (int)v195;
              v195 = (NPCData *)((char *)v195 + 1);
              v217[v102] = v101;
            }
            thisl += 2;
            ++v101;
          }
          while ( v101 < 9 );
          if ( !v195 )
            goto LABEL_662;
          if ( GetAsyncKeyState(16) )
          {
            --uAction;
            if ( uAction < 0 )
              uAction = (int)((char *)v195 - 1);
          }
          else
          {
            ++uAction;
            if ( uAction >= (signed int)v195 )
              uAction = 0;
          }
          sub_41140B();
          pPlayers[uActiveCharacter]->pNumSpellBookPage = LOBYTE(v217[uAction]);
          goto LABEL_661;
        case UIMSG_SaveGame|0x4:
          if ( pTurnEngine->field_4 == 3 || !uActiveCharacter || uMessageParam == pPlayers[uActiveCharacter]->pNumSpellBookPage )
            goto _continue;
          sub_41140B();
          pPlayers[uActiveCharacter]->pNumSpellBookPage = uMessageParam;
LABEL_661:
          pGUIWindow_CurrentMenu->_411621();
LABEL_662:
          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_LoadGame|0x4:
          if ( pTurnEngine->field_4 != 3 )
          {
            if ( uActiveCharacter )
            {
              uNumSeconds = (unsigned int)pPlayers[uActiveCharacter];
              if ( *(char *)(uNumSeconds + 11 * *(char *)(uNumSeconds + 6734) + uMessageParam + 402) )
              {
                if ( dword_50654C - 1 == uMessageParam )
                {
                  pGUIWindow_CurrentMenu->Release();
                  pEventTimer->Resume();
                  viewparams->bRedrawGameUI = v0;
                  pCurrentScreen = 0;
                  pIcons_LOD->_4114F2();
                  v103 = dword_50654C + 11 * *(char *)(uNumSeconds + 6734);
                  if ( dword_50C9E8 < 40 )
                  {
                    dword_50C9EC[3 * dword_50C9E8] = 142;
                    dword_50C9F0[3 * dword_50C9E8] = v103;
                    *(&dword_50C9E8 + 3 * dword_50C9E8 + 3) = uActiveCharacter - 1;
                    ++dword_50C9E8;
                  }
                }
                else
                {
                  byte_506550 = 1;
                  dword_50654C = uMessageParam + 1;
                }
              }
            }
          }
          goto _continue;
        case 0x8E:
          if ( pTurnEngine->field_4 == 3 )
            goto _continue;
          v175 = 0;
          v159 = 0;
          v147 = 0;
          goto LABEL_678;
        case 0x92:
          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);
          }
          goto _continue;
        case 0x69:
          if ( pTurnEngine->field_4 == 3 )
            goto _continue;
          if ( bUnderwater == 1 )
          {
LABEL_682:
            v96 = pGlobalTXT_LocalizationStrings[652];// "You can not do that while you are underwater!"
LABEL_622:
            ShowStatusBarString(v96, 2u);
LABEL_623:
            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;
              if ( pCurrentScreen != 5
                && pCurrentScreen != 7
                && (pCurrentScreen <= 99
                 || pCurrentScreen > 103) )
              {
                pGUIWindow_CurrentMenu->Release();
LABEL_693:
                GUIWindow::Create(0x1DCu, 0x1C2u, 0, 0, (enum WindowType)90, (int)ptr_5079F8, 0);
                pCurrentScreen = 8;
                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;
                goto _continue;
              }
            }
          }
          goto _continue;
        case 0x6A:
          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, (enum WindowType)90, (int)ptr_5079F4, 0);
          viewparams->bRedrawGameUI = v0;
          pEventTimer->Pause();
          pAudioPlayer->StopChannels(-1, -1);
          pCurrentScreen = 104;
          pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, 640, 480, (enum WindowType)12, 5, 0);
          papredoll_dbrds[2] = pIcons_LOD->LoadTexture("BUTTEXI1", TEXTURE_16BIT_PALETTE);
          ptr_5076F4 = 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);
          goto _continue;
        case 0x6B:
          if ( pCurrentScreen )
          {
            pGUIWindow_CurrentMenu->Release();
            pEventTimer->Resume();
            pCurrentScreen = 0;
            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, (enum WindowType)92, (int)ptr_5079F0, 0);
LABEL_453:
          if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 )
            goto _continue;
          pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113;
          goto LABEL_770;
        case UIMSG_C0:
          dword_50651C = v0;
          if ( pMouse->GetCursorPos(&v211)->y > 178 )
            dword_50651C = -1;
          goto _continue;
        case UIMSG_A9:
          GUIWindow::Create(ptr_507B9C->uX, ptr_507B9C->uY, 0, 0, (WindowType)(WINDOW_HouseInterior|0x42), (int)ptr_507B9C, 0);
LABEL_707:
          dword_506548 = v0;
          goto _continue;
        case UIMSG_AA:
          GUIWindow::Create(ptr_507BA0->uX, ptr_507BA0->uY, 0, 0, (WindowType)(WINDOW_HouseInterior|0x42), (int)ptr_507BA0, 0);
LABEL_709:
          dword_506544 = v0;
          goto _continue;
        case 0x55:
          bRingsShownInCharScreen ^= v0;
          GUIButton::_41D0D8(ptr_507694);
          GUIButton::_41D0D8(ptr_507690);
          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;
          }
          ptr_507694 = pGUIWindow_CurrentMenu->CreateButton(
                         v121,
                         v123,
                         v125,
                         v128,
                         v0,
                         0,
                         0x55u,
                         0,
                         0,
                         pGlobalTXT_LocalizationStrings[64],// "Detail Toggle"
                         0);
          ptr_507690 = pGUIWindow_CurrentMenu->CreateButton(
                         0x1DCu,
                         0,
                         0xA4u,
                         0x159u,
                         v0,
                         0,
                         0x85u,
                         0,
                         0,
                         v1,
                         0);
          goto LABEL_422;
        case UIMSG_Quit|0x1:
          OnPaperdollLeftClick();
          goto _continue;
        case UIMSG_CloseBook|0x2:
          pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 100;
          sub_4196A0();
          sub_419379();
          v85 = pCharacterScreen_StatsBtn;
          goto LABEL_716;
        case UIMSG_ChangeMusicVolume|0x2:
          pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 101;
          sub_4196A0();
          sub_419379();
          sub_419401();
          v85 = pCharacterScreen_SkillsBtn;
          goto LABEL_716;
        case UIMSG_SkillUp:
          v104 = pPlayers[uActiveCharacter];
          v105 = (int)&v104->pActiveSkills[uMessageParam];
          LOWORD(v2) = *(short *)v105;
          uNumSeconds = v2;
          if ( v104->uSkillPoints < (v2 & 0x3F) + 1 )
          {
            v87 = pGlobalTXT_LocalizationStrings[488];// "You don't have enough skill points!"
          }
          else
          {
            if ( (uNumSeconds & 0x3F) < 0x3C )
            {
              *(short *)v105 = uNumSeconds + 1;
              v104->uSkillPoints -= v104->pActiveSkills[uMessageParam] & 0x3F;
              v104->PlaySound(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);
          goto _continue;
        case UIMSG_ChangeMusicVolume|0x4:
          pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 103;
          sub_419379();
          sub_4196A0();
          v85 = pCharacterScreen_InventoryBtn;
LABEL_716:
          v163 = 0;
          v149 = v85;
          v142 = (WindowType)91;
          goto LABEL_731;
        case UIMSG_A8:
          v85 = ptr_50767C;
          v163 = 0;
          v149 = ptr_50767C;
          v142 = (WindowType)97;
          goto LABEL_731;
        case UIMSG_CloseBook|0x4:
          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);
          sub_419100();
          goto _continue;
        case 0x47:
          switch ( uMessageParam )
          {
            default:
              goto _continue;
            case 11:
              goto LABEL_707;
            case 10:
              goto LABEL_709;
            case 0:
              v85 = pBtn_Book_1;
              dword_506544 = v0;
              break;
            case 1:
              v85 = pBtn_Book_2;
              dword_506548 = v0;
              break;
            case 2:
              dword_506540 = v0;
              if ( dword_506364 )
                goto _continue;
              v85 = pBtn_Book_3;
              break;
            case 3:
              dword_50653C = v0;
              if ( dword_506364 )
                goto _continue;
              v85 = pBtn_Book_4;
              break;
            case 4:
              dword_506538 = v0;
              if ( dword_506364 )
                goto _continue;
              v85 = pBtn_Book_5;
              break;
            case 5:
              dword_506534 = v0;
              if ( dword_506364 )
                goto _continue;
              v85 = pBtn_Book_6;
              break;
            case 6:
              v85 = pBtn_Autonotes_Misc;
              dword_506530 = v0;
              break;
            case 7:
              v85 = pBtn_Autonotes_Instructors;
              dword_50652C = v0;
              break;
          }
          v163 = v0;
          v149 = v85;
          v142 = (WindowType)92;
LABEL_731:
          v8 = v85->uY;
          v9 = v85->uX;
          goto LABEL_732;
        case UIMSG_SelectCharacter:
          if ( pMessageQueue_50CBD0->uNumMessages )
            pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0;
          GameUI_OnPlayerPortraitLeftClick(uMessageParam);
          goto _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;
        case UIMSG_ShowStatus_DateTime:
          v195 = (NPCData *)pParty->uCurrentHour;
          if ( (signed int)pParty->uCurrentHour <= 12 )
          {
            if ( !v195 )
              v195 = (NPCData *)12;
          }
          else
          {
            v195 = (NPCData *)((char *)v195 - 12);
          }
          if ( pParty->uCurrentHour < 0xC || (uNumSeconds = v0, pParty->uCurrentHour >= 0x18) )
            uNumSeconds = 0;
          sprintf(
            pTmpBuf,
            "%d:%02d%s %s %d %s %d",
            v195,
            pParty->uCurrentMinute,
            aAMPMNames[uNumSeconds],
            aDayNames[pParty->uDaysPlayed % 7],
            7 * pParty->uCurrentMonthWeek + pParty->uDaysPlayed % 7 + 1,
            aMonthNames[pParty->uCurrentMonth],
            pParty->uCurrentYear);
          goto _set_status_string_pTmpBuf_and_continue;
        case UIMSG_ShowStatus_Food:
          v173 = (char *)pParty->uNumFoodRations;
          v157 = pGlobalTXT_LocalizationStrings[501];// You have %lu food"
          goto _sprintex_2args_draw_status_and_continue;
        case UIMSG_ShowStatus_Player:
          v106 = pPlayers[uMessageParam];
          sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[429], v106->pName, pClassNames[v106->uClass]);// "%s the %s"
          strcat(pTmpBuf, ": ");
          v107 = v106->GetMajorConditionIdx();
          strcat(pTmpBuf, aCharacterConditionNames[v107]);
          sub_41C0B8_set_status_string(pTmpBuf);
          v108 = 8 * uMessageParam - 8;
          LOBYTE(v108) = v108 | 4;
          pMouse->uPointingObjectID = v108;
          goto _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);
          goto _set_status_string_pTmpBuf_and_continue;
        case 0xC:
          if ( pCurrentScreen == 15 )
            goto LABEL_762;
          sub_420E01();
          goto _continue;
        case UIMSG_ChangeMusicVolume|0x8:
LABEL_762:
          sub_421EA6_OnInventoryLeftClick();
          goto _continue;
        case 0xA:
          if ( !pRenderer->pRenderD3D )
            goto LABEL_772;
          v115 = pMessageQueue_50CBD0->uNumMessages;
          if ( !pMessageQueue_50CBD0->uNumMessages )
            goto LABEL_768;
          if ( pMessageQueue_50CBD0->pMessages[0].field_8 )
          {
            v115 = v0;
            pMessageQueue_50CBD0->uNumMessages = v0;
LABEL_769:
            pMessageQueue_50CBD0->pMessages[v115].eType = (UIMessageType)14;
LABEL_770:
            pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0;
            goto LABEL_771;
          }
          v115 = 0;
          pMessageQueue_50CBD0->uNumMessages = 0;
LABEL_768:
          if ( (signed int)v115 < 40 )
            goto LABEL_769;
          goto _continue;
        case 0xE:
LABEL_772:
          if ( pMessageQueue_50CBD0->uNumMessages )
            pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0;
          OnGameViewportClick();
          goto _continue;
        case 0xF:
          if ( pRenderer->pRenderD3D )
          {
            LOWORD(v116) = pGame->pVisInstance->get_picked_object_zbuf_val();
          }
          else
          {
            uNumSeconds = (unsigned int)pMouse->GetCursorPos(&v209);
            v117 = pMouse->GetCursorPos(&v204);
            v116 = pRenderer->pActiveZBuffer[*(int *)uNumSeconds + pSRZBufferLineOffsets[v117->y]];
          }
          v163 = 0;
          v149 = (GUIButton *)(unsigned __int16)v116;
          v142 = (WindowType)15;
          goto LABEL_779;
        case 0x54:
          v163 = 0;
          v149 = (GUIButton *)uMessageParam;
          v142 = (WindowType)22;
LABEL_779:
          v8 = 0;
          v9 = 0;
LABEL_732:
          v137 = 0;
          v133 = 0;
LABEL_733:
          GUIWindow::Create(v9, v8, v133, v137, v142, (int)v149, v163);
          goto _continue;
        case 0x194:
          if ( pMessageQueue_50CBD0->uNumMessages )
            pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0;
          OnPressSpace();
          goto _continue;
        case UIMSG_ChangeSoundVolume|0x100:
          if ( pCurrentScreen )
            goto _continue;
          pParty->uFlags |= 2u;
          GUIWindow::Create(0x207u, 0x88u, 0, 0, (enum WindowType)90, (int)dword_507A14, 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;
            }
            goto _continue;
          }
          v119 = 2048;
          if ( (signed int)v118 <= 2048 )
            goto LABEL_789;
          viewparams->field_28 = 11;
          goto LABEL_788;
        case UIMSG_ChangeMusicVolume|0x100:
          if ( pCurrentScreen )
            goto _continue;
          pParty->uFlags |= 2u;
          GUIWindow::Create(0x23Eu, 0x88u, 0, 0, (enum WindowType)90, (int)dword_507A18, 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;
            }
          }
          goto _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;
    }
    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;
        }
        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 ( ptr_507BC4 )
    free_book_subwindow();
  if ( !pCurrentScreen
    && !ptr_507BD4 )
    pEventTimer->Resume();
  viewparams->bRedrawGameUI = 1;
}
//----- (00435748) --------------------------------------------------------
void __cdecl GUI_MainMenuMessageProc()
{
  //AudioPlayer *v0; // ebp@2
  char *v1; // 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 *v7; // eax@56
  unsigned int v8; // edx@56
  Player *v9; // edi@57
  signed int v10; // eax@58
  GUIButton *v11; // 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
  unsigned int v18; // ecx@105
  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
  unsigned int v33; // [sp-20h] [bp-30h]@105
  signed int v34; // [sp-1Ch] [bp-2Ch]@36
  unsigned int v35; // [sp-1Ch] [bp-2Ch]@105
  int v36; // [sp-18h] [bp-28h]@36
  enum WindowType v37; // [sp-18h] [bp-28h]@105
  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 v46; // [sp+Ch] [bp-4h]@3
  Player *pPlayer;

  if ( pMessageQueue_50CBD0->uNumMessages )
  {
    //v0 = pAudioPlayer;
    v1 = (char *)pParty->pPlayers;
	pPlayer = pParty->pPlayers;
    do
    {
      pMessageQueue_50CBD0->PopMessage(&pUIMessageType, &uNum, &v46);
      switch (pUIMessageType)
      {
        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;

        case UIMSG_LoadGame:
        {
          if (!pSavegameUsedSlots[uLoadGameUI_SelectedSlot])
            continue;

          SetCurrentMenuID(MENU_LOAD);
        }
        continue;
      }


      switch (pUIMessageType)
      {
        case UIMSG_A5:   // WINDOW_5A
        {
            //main menu save/load wnd   clicking on savegame lines
          if (pGUIWindow_CurrentMenu->field_40 == 1)
            pKeyActionMap->_459ED1(0);
          if ( pCurrentScreen != 11 || uLoadGameUI_SelectedSlot != uNum + dword_6A0C9C )
          {
            //load clicked line
              v26 = uNum + dword_6A0C9C;
              if ( dword_6BE138 == uNum + dword_6A0C9C )
              {
                pMessageQueue_50CBD0->SendMessage(UIMSG_A4, 0, 0);
                pMessageQueue_50CBD0->SendMessage(UIMSG_LoadGame, 0, 0);
              }
              uLoadGameUI_SelectedSlot = v26;
              dword_6BE138 = v26;
          }
          else
          {
            //typing in the line
              pKeyActionMap->_459E5A(0, 19, pGUIWindow_CurrentMenu);
              strcpy(
                (char *)pKeyActionMap->pPressedKeysBuffer,
                pSavegameHeader[uLoadGameUI_SelectedSlot].pName);
              pKeyActionMap->uNumKeysPressed = strlen((const char *)pKeyActionMap->pPressedKeysBuffer);
          }
        }
        continue;


        case UIMSG_A4:
        {
          GUIWindow::Create(pGUIWindow_CurrentMenu->uFrameX + 241, pGUIWindow_CurrentMenu->uFrameY + 302,
                            61, 28, WINDOW_5E, (int)ptr_69BD64, 0);
        }
        continue;
      }

      if ( (signed int)pUIMessageType > UIMSG_PlayerCreationRemoveDownSkill )
      {
        if ( pUIMessageType > UIMSG_A3 )
        {
          if ( pUIMessageType == UIMSG_A6 )
          {
            v43 = 0;
            v39 = (int)ptr_69BD60;
            v8 = pGUIWindow_CurrentMenu->uFrameY + 302;
            v37 = (WindowType)95;
            v18 = pGUIWindow_CurrentMenu->uFrameX + 350;
            v35 = 28;
            v33 = 61;
            GUIWindow::Create(v18, v8, v33, v35, v37, v39, v43);
            continue;
          }
          if ( pUIMessageType == UIMSG_SelectFacePlayerBack )
          {
            pPlayer = &pParty->pPlayers[uNum];
            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,
              (enum WindowType)92, (int)pCreationUI_BtnPressLeft[v25], 1);
            //v0 = pAudioPlayer;
            pAudioPlayer->PlaySound((SoundID)66, 0, 0, -1, 0, 0, 0.0, 0);
            v22 = pPlayer;
            v22->PlaySound(102, 0);
            v1 = (char *)pParty->pPlayers;
            continue;
          }
          if ( pUIMessageType == UIMSG_SelectFacePlayerForward )
          {
            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, (enum WindowType)92,
			  (int)pCreationUI_BtnPressRight[v21], 1);
            //v0 = pAudioPlayer;
            pAudioPlayer->PlaySound((SoundID)66, 0, 0, -1, 0, 0, 0, 0);
            v22 = pPlayer;
            v22->PlaySound(102, 0);
            v1 = (char *)pParty->pPlayers;
            continue;
          }
          if ( pUIMessageType == UIMSG_AD )
          {
            GUIWindow::Create(pMainMenu_BtnNew->uX, pMainMenu_BtnNew->uY, 0, 0, (enum WindowType)90, (int)pMainMenu_BtnNew, 0);
          SetCurrentMenuID(MENU_LOAD);
          continue;
          }
          if ( pUIMessageType != UIMSG_AE )
            continue;
          GUIWindow::Create(pMainMenu_BtnExit->uX, pMainMenu_BtnExit->uY, 0, 0, (enum WindowType)90, (int)pMainMenu_BtnExit, 0);
LABEL_114:
          v40 = 10;
LABEL_89:
          v2 = v40;
          SetCurrentMenuID((MENU_STATE)v2);
          continue;
        }
        if ( pUIMessageType == UIMSG_A3 )
        {
          ++dword_6A0C9C;
          if ( dword_6A0C9C >= uNum )
            dword_6A0C9C = uNum - 1;
          if ( dword_6A0C9C < 1 )
            dword_6A0C9C = 0;
          v7 = pGUIWindow_CurrentMenu;
          v43 = 0;
          v39 = (int)ptr_69BD58;
          v8 = pGUIWindow_CurrentMenu->uFrameY + 323;
          goto LABEL_105;
        }
        if ( pUIMessageType == UIMSG_6B )
        {
          if ( pCurrentScreen )
          {
            pGUIWindow_CurrentMenu->Release();
            pEventTimer->Resume();
            pCurrentScreen = 0;
            viewparams->bRedrawGameUI = 1;
          }
          GUIWindow::Create(602, 450, 0, 0, (enum WindowType)92, (int)ptr_5079F0, 0);
          if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 )
            continue;
          pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = UIMSG_CloseBook;
          goto LABEL_93;
        }
        if ( pUIMessageType == UIMSG_CloseBook )
        {
          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() == 6 || GetCurrentMenuID() == 7 )
          {
            v17 = pCurrentScreen;
LABEL_83:
            if ( v17 == 16 )
              pVideoPlayer->FastForwardToFrame(pVideoPlayer->field_40);
            if (GetCurrentMenuID() == MENU_7)
            {
              v40 = 6;
              goto LABEL_89;
            }
            if (GetCurrentMenuID() == MENU_Credits)
            {
              v40 = 11;
              goto LABEL_89;
            }
            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;
            }
            continue;
          }
          v16 = GetCurrentMenuID() == 8;
          v17 = pCurrentScreen;
          if ( v16 && !pCurrentScreen )
            goto LABEL_83;
          if ( pCurrentScreen == 12 )
          {
            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 = 0;
            viewparams->bRedrawGameUI = v15;
            continue;
          }
          if ( pCurrentScreen == 16 )
          {
            pVideoPlayer->Unload();
          }
          else
          {
            if ( pCurrentScreen != 27 )
              goto LABEL_81;
            //VideoPlayer::dtor();
          }
        }
        else
        {
          if ( pUIMessageType == UIMSG_PlayerCreationSelectQuality )
          {
            pGUIWindow_CurrentMenu->pCurrentPosActiveItem = (pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem)
                                                      % 7 + pGUIWindow_CurrentMenu->pStartingPosActiveItem + 7 * uNum;
            uPlayerCreationUI_SelectedCharacter = uNum;
LABEL_36:
            v42 = 0;
            v38 = 0;
            v36 = 0;
            v34 = 0;
            v32 = -1;
            v31 = 0;
            v30 = 0;
            pSoundID = (SoundID)66;
LABEL_40:
            pAudioPlayer->PlaySound(pSoundID, v30, v31, v32, v34, v36, v38, v42);
            continue;
          }
          if ( pUIMessageType == UIMSG_PlayerCreationVoiceBack )
          {
            v9 = &pPlayer[uNum];
            v46 = v9->GetSexByVoice();
            do
            {
              v12 = ((v9->uVoiceID-- - 1) & 0x80000000u) != 0;
              if ( v12 )
                v9->uVoiceID = 19;
              v13 = v9->GetSexByVoice();
            }
            while ( v13 != v46 );
            v11 = pCreationUI_BtnPressLeft2[uNum];
            goto LABEL_60;
          }
          if ( pUIMessageType == UIMSG_PlayerCreationVoiceForward )
          {
            v9 = &pPlayer[uNum];
            v46 = v9->GetSexByVoice();
            do
            {
              v9->uVoiceID = (signed int)(v9->uVoiceID + 1) % 20;
              v10 = v9->GetSexByVoice();
            }
            while ( v10 != v46 );
            v11 = pCreationUI_BtnPressRight2[uNum];
LABEL_60:
            GUIWindow::Create(v11->uX, v11->uY, 0, 0, (enum WindowType)92, (int)v11, 1);
            pAudioPlayer->PlaySound((SoundID)66, 0, 0, -1, 0, 0, 0, 0);
            v9->PlaySound(102, 0);
            continue;
          }
          if ( pUIMessageType == UIMSG_A2 )
          {
            --dword_6A0C9C;
            if ( dword_6A0C9C < 0 )
              dword_6A0C9C = 0;
            v7 = pGUIWindow_CurrentMenu;
            v43 = 0;
            v39 = (int)ptr_69BD5C;
            v8 = pGUIWindow_CurrentMenu->uFrameY + 197;
LABEL_105:
            GUIWindow::Create(v7->uFrameX + 215, v8, 0, 0, (WindowType)90, v39, v43);
            continue;
          }
        }
      }
      else
      {
        if ( pUIMessageType == UIMSG_PlayerCreationRemoveDownSkill )
        {
          uPlayerCreationUI_SelectedCharacter = uNum;
          v41 = 3;
          v1 = (char *)pParty->pPlayers;
          v5 = (pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem) % 7
             + pGUIWindow_CurrentMenu->pStartingPosActiveItem + 7 * uNum;
          goto LABEL_44;
        }
        if ( (signed int)pUIMessageType > UIMSG_3C )
        {
          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);
            v42 = 0;
            v38 = 0;
            v36 = 0;
            v34 = 0;
            v32 = -1;
            v31 = 0;
            v30 = 0;
            pSoundID = (SoundID)20;
            goto LABEL_40;
          }
          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);
            v42 = 0;
            v38 = 0;
            v36 = 0;
            v34 = 0;
            v32 = -1;
            v31 = 0;
            v30 = 0;
            pSoundID = (SoundID)23;
            goto LABEL_40;
          }
          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;
            v42 = 0;
            v38 = 0;
            v36 = 0;
            v34 = 0;
            v32 = -1;
            v31 = 0;
            v30 = 0;
            pSoundID = (SoundID)24;
            goto LABEL_40;
          }
          if ( pUIMessageType == UIMSG_PlayerCreationSelectClass )
          {
            (&pPlayer[uPlayerCreationUI_SelectedCharacter])->Reset(uNum);
            goto LABEL_36;
          }
          if ( pUIMessageType == UIMSG_PlayerCreationClickOK )
          {
            GUIWindow::Create(580, 431, 0, 0, (enum WindowType)90, (int)pPlayerCreationUI_BtnOK, 0);
            if ( PlayerCreation_ComputeAttributeBonus() || !sub_4908DE() )
              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;
              v46 = pGUIWindow_CurrentMenu->pStartingPosActiveItem;
              v41 = 2;
              v5 = v4 % 7 + v46 + 7 * uNum;
LABEL_44:
              pGUIWindow_CurrentMenu->pCurrentPosActiveItem = v5;
              pParty->pPlayers[0].pActiveSkills[(&pPlayer[uPlayerCreationUI_SelectedCharacter])->GetSkillIdxByOrder(v41)
                                             + 3486 * uPlayerCreationUI_SelectedCharacter] = 0;
              continue;
            }
          }
        }
        else
        {
          switch ( pUIMessageType )
          {
            case 60:
              pAudioPlayer->PlaySound((SoundID)24, 0, 0, -1, 0, 0, 0, 0);
              v3 = (void *)uNum;
              uPlayerCreationUI_SelectedCharacter = uNum;
              pKeyActionMap->_459E5A(0, 15, pGUIWindow_CurrentMenu);
              pGUIWindow_CurrentMenu->ptr_1C = v3;
              break;
            case 5:
              uGameState = 1;
              break;
            case 17:
              pMouse->SetCursorBitmap("MICON2");
              break;
            default:
              if ( pUIMessageType == 58 )
                goto LABEL_114;
              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
  LayingItem *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
  char *v27; // edi@20
  char *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
  LayingItem *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 = &pLayingItems[v3];
        v36 = v4;
        v5 = v4->field_58;
        v2 = v5 & 7;
        v3 = v5 >> 3;
      }
      v41 = v2;
      v37 = v3;
      if ( stru_50FE08.field_3EC[v0] & 1 )
      {
        v6 = dword_4F6E08[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 = (char *)&pParty->pPlayers[0].pConditions[15];
            do
            {
              if ( !(*((int *)v27 - 1) | *((int *)v27 - 2)) && !*(_QWORD *)v27 && !*((_QWORD *)v27 + 1) )
                DamagePlayerFromMonster(*((short *)v1 - 300), stru_50FE08.field_450[v43], pVelocity, v26);
              v27 += 6972;
              ++v26;
            }
            while ( (signed int)v27 < (signed int)&pParty->pHirelings[1].evtb );
          }
        }
        uActorID = 0;
        if ( (signed int)uNumActors > 0 )
        {
          v28 = (char *)&pActors[0].vPosition.z;
          do
          {
            if ( ((Actor *)(v28 - 146))->CanAct() )
            {
              v29 = *(short *)v1;
              v30 = *((short *)v28 - 1) - *((short *)v1 - 100);
              a1 = *((short *)v28 - 2) - *((short *)v1 - 200);
              v31 = *(short *)v28;
              v48 = v30;
              v44 = v31;
              v32 = ((signed int)*((short *)v28 - 4) >> 1) - v29;
              v33 = *((short *)v28 - 5) + *((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(*((short *)v28 - 2), *((short *)v28 - 1), *(short *)v28 + 50, v34) )
                {
                  Vec3_int_::Normalize(&a1, &v48, &v44);
                  v35 = pVelocity;
                  pVelocity->x = a1;
                  v35->y = v48;
                  v35->z = v44;
                  switch ( v41 )
                  {
                    case 4:
                      DamageMonsterFromParty(*((short *)v1 - 300), uActorID, v35);
                      break;
                    case 3:
                      if ( v36 && pActors[v37].GetActorsRelation((Actor *)(v28 - 146)) )
                        sub_43B1B0(*((short *)v1 - 300), uActorID, pVelocity, v36->field_61);
                      break;
                    case 2:
                      sub_43B057(*((short *)v1 - 300), uActorID, v35);
                      break;
                  }
                }
              }
            }
            ++uActorID;
            v28 += 836;
          }
          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) --------------------------------------------------------
bool __fastcall DamageMonsterFromParty(signed int a1, unsigned int uActorID_Monster, Vec3_int_ *pVelocity)
{
  signed int v3; // eax@1
  LayingItem *v4; // ebx@1
  int v5; // edx@3
  bool uPlayerID; // eax@3
  Player *pPlayer; // edi@4
  Actor *pMonster; // esi@7
  LayingItem *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
  int 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) == 2 )
  {
    v4 = &pLayingItems[a1 >> 3];
    uDamageAmount = (int)v4;
    v61 = v4->field_60_distance_related_prolly_lod;
    v3 = v4->field_58;
    v54 = v4->field_58;
  }
  v5 = v3 & 7;
  uPlayerID = v3 >> 3;
  if ( v5 != 4 )
    return uPlayerID;
  pPlayer = &pParty->pPlayers[uPlayerID];
  if ( uPlayerID < 0 && uPlayerID > 3 )
  {
    MessageBoxW(nullptr, L"Invalid player in damageMonsterFromParty!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Damage.cpp:457", 0);
  }
  pMonster = &pActors[uActorID_Monster_];
  uPlayerID = pMonster->IsAlive();
  if ( uPlayerID )
    return uPlayerID;
  BYTE1(pMonster->uAttributes) |= 0xC0u;
  if ( pMonster->uAIState == Fleeing )
    pMonster->uAttributes |= 0x20000u;
  v58 = 0;
  v53 = 0;
  v57 = 0;
  if ( !v4 )
  {
    v51 = (unsigned __int64 *)pPlayer->pEquipment.uMainHand;
    v59 = 1;
    if ( pPlayer->HasItemEquipped(EQUIP_TWO_HANDED) )
    {
      v55 = pItemsTable->pItems[*(int *)&pPlayer->spellbook.pDarkSpellbook.bIsSpellAvailable[36 * (int)v51 + 5]].uSkillType;
      v28 = SkillToMastery(pPlayer->pActiveSkills[v55]);
      uDamageAmount = v28;
      if ( v55 )
      {
        if ( v55 == 6 )
        {
          if ( v28 >= 3 )
          {
            LOBYTE(v51) = pPlayer->GetActualSkillLevel(PLAYER_SKILL_MACE) & 0x3F;
            v51 = (unsigned __int64 *)(unsigned __int8)v51;
            if ( rand() % 100 < (unsigned __int8)v51 )
              v58 = 1;
          }
          if ( uDamageAmount >= 4 )
          {
            LOBYTE(v51) = pPlayer->GetActualSkillLevel(PLAYER_SKILL_MACE) & 0x3F;
            v51 = (unsigned __int64 *)(unsigned __int8)v51;
            if ( rand() % 100 < (unsigned __int8)v51 )
              v53 = 1;
          }
        }
      }
      else
      {
        if ( uDamageAmount >= 3 )
        {
          LOBYTE(v51) = pPlayer->GetActualSkillLevel((PLAYER_SKILL_TYPE)0) & 0x3F;
          v51 = (unsigned __int64 *)(unsigned __int8)v51;
          if ( rand() % 100 < (unsigned __int8)v51 )
            v58 = 1;
        }
      }
    }
    v50 = pMonster->pMonsterInfo.uID;
    a2 = 4;
    v27 = pPlayer->CalculateMeleeDamageTo(0, 0, v50);
    goto LABEL_65;
  }
  v19 = v4->field_48 == 99;
  v61 = v4->field_60_distance_related_prolly_lod;
  if ( !v19 )
  {
    v9 = (LayingItem *)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 = v55;
    v10 = v55;
    v11 = (int)v51;
    v12 = v52;
    if ( v55 < (signed int)v51 )
    {
      v10 = (int)v51;
      v11 = v55;
    }
    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 = uPlayerID;
    if ( uPlayerID >= 2560 )
    {
      if ( v61 >= 5120 && !(BYTE1(pMonster->uAttributes) & 4) )
        return uPlayerID;
      v61 = 2;
    }
    else
    {
      v61 = 1;
    }
    v4 = (LayingItem *)uDamageAmount;
  }
  v15 = v4->field_48;
  if ( v15 == 102 )
  {
    v16 = pPlayer->pActiveSkills[7];
    v61 = 1;
    if ( (signed int)SkillToMastery(v16) >= 3 )
      a4 = pPlayer->pActiveSkills[7] & 0x3F;
    a2 = 4;
    uDamageAmount = pPlayer->CalculateMeleeDamageTo(1, 1, 0);
    goto LABEL_67;
  }
  if ( v15 != 100 )
  {
    if ( v15 == 101 )
    {
      a2 = 0;
      v18 = pPlayer->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 = pPlayer->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(pPlayer, pMonster, v61, a4) )
      {
LABEL_68:
        LOWORD(uPlayerID) = pPlayer->PlaySound(52, 0);
        return uPlayerID;
      }
      goto LABEL_69;
    }
    if ( v15 == 34 )
    {
      uDamageAmount = 0;
      a2 = 4;
      v58 = 1;
      goto LABEL_67;
    }
    v50 = v4->field_48;
    a2 = pPlayer->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 = v27;
    goto LABEL_66;
  }
  v50 = pMonster->word_000086_some_monster_id;
  a2 = 4;
  v17 = pPlayer->CalculateRangedDamageTo(v50);
  v19 = v4->stru_24.uItemID == 0;
  uDamageAmount = v17;
  if ( !v19 && v4->stru_24.uAdditionalValue == 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 ( pPlayer->pConditions[1] )
    uDamageAmount >>= 1;
  if ( (signed __int64)pMonster->pActorBuffs[5].uExpireTime > 0 )
    uDamageAmount = 0;
  v61 = stru_50C198.CalcMagicalDamageToActor(pMonster, a2, uDamageAmount);
  if ( !v4 && pPlayer->IsUnarmed() && (signed __int64)pPlayer->pPlayerBuffs[6].uExpireTime > 0 )
  {
    v50 = pPlayer->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 )
      {
        pPlayer->sHealth += v61 / 5;
        if ( pPlayer->sHealth > pPlayer->GetMaxHealth() )
          pPlayer->sHealth = pPlayer->GetMaxHealth();
        v62 = 0;
      }
      v30 = stru_50C198.CalcMagicalDamageToActor(pMonster, a2, a4);
      uDamageAmount = v61 + v30;
    }
    else
    {
      v59 = 0;
      v57 = &pPlayer->pEquipment;
      do
      {
        if ( pPlayer->HasItemEquipped((ITEM_EQUIP_TYPE)v59) )
        {
          auto _s = (ItemGen *)&pPlayer->spellbook.pDarkSpellbook.bIsSpellAvailable[36 * v57->uOffHand + 5];
          a4 = _s->_439DF3_get_additional_damage(&a2, &v62);
          if ( v62 && pMonster->sCurrentHP > 0 )
          {
            pPlayer->sHealth += v61 / 5;
            if ( pPlayer->sHealth > pPlayer->GetMaxHealth() )
              pPlayer->sHealth = pPlayer->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 && !v58 )
    goto LABEL_68;
  if ( pMonster->sCurrentHP > 0 )
  {
    Actor::_4030AD(uActorID_Monster_, v54, 0);
    Actor::_43AC45(uActorID_Monster_, 1);
    if ( bShowDamage )
    {
      v50 = uDamageAmount;
      pMonsterName = (char *)pMonster;
      pPlayerName = pPlayer->pName;
      if ( v4 )
        v47 = pGlobalTXT_LocalizationStrings[189];// "%s shoots %s for %lu points"
      else
        v47 = pGlobalTXT_LocalizationStrings[164];// "%s hits %s for %lu damage"
      sprintf(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 & 0x20 )
        {
          v50 = 0;
          pMonsterName = 0;
          v34 = pMonster->vPosition.z;
          *(float *)&pPlayerName = (double)v55;
          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)v51;
          v51 = (unsigned __int64 *)v35;
          v37 = v36;
          v51 = (unsigned __int64 *)pMonster->vPosition.x;
          v38 = (double)v35;
          v39 = (double)(signed int)v51;
          pDecalBuilder->AddBloodsplat(v39, v38, v37, 1.0, 0.0, 0.0, *(float *)&pPlayerName, 0, 0);
        }
      }
    }
    Actor::Die(uActorID_Monster_);
    Actor::_438CF3(uActorID_Monster_);
    Actor::_43AC45(uActorID_Monster_, 1);
    if ( pMonster->pMonsterInfo.uExp )
      sub_4269A2_GivePartyExp(pMonsterStats->pInfos[pMonster->pMonsterInfo.uID].uExp);
    v40 = 51;
    if ( rand() % 100 < 20 )
      v40 = ((signed int)pMonster->pMonsterInfo.uHP >= 100) + 1;
    pPlayer->PlaySound(v40, 0);
    v41 = 0;
    if ( bShowDamage )
    {
      v50 = (int)pMonster;
      pMonsterName = (char *)uDamageAmount;
      pPlayerName = pPlayer->pName;             // "%s inflicts %lu points killing %s"
      sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[175], pPlayer->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 )
    pPlayer->ReceiveDamage(uDamageAmount, a2);
  v50 = 24;
  v59 = 20 * v61 / (signed int)pMonster->pMonsterInfo.uHP;
  if ( (pPlayer->_48EA46_calc_special_bonus_by_items(24) || v58 != 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 = pPlayer->pName;            // "%s stuns %s"
      sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[635], pPlayer->pName, pMonster);
      ShowStatusBarString(pTmpBuf, 2u);
    }
  }
  if ( v53 != v41 )
  {
    if ( pMonster->CanAct() )
    {
      if ( stru_50C198.GetMagicalResistance(pMonster, 3u) )
      {
        LOBYTE(v43) = pPlayer->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)v51 * 0.033333335);
        pMonster->pActorBuffs[6].Apply(v46, v45, 0, 0, 0);
        if ( bShowDamage )
        {
          v50 = (int)pMonster;
          pMonsterName = pPlayer->pName;        // "%s paralyzes %s"
          sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[636], pPlayer->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);
  }
  return 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
  LayingItem *v37; // ebx@77
  int v38; // edi@77
  int v39; // esi@77
  int v40; // eax@77
  int v41; // eax@77
  int v42; // eax@78
  char *v43; // eax@81
  Actor *v44; // esi@82
  char *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 | 4, 0);
                Actor::_43AC45(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 & 0x20 )
                    {
                      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::_438CF3(uActorID);
                Actor::_43AC45(uActorID, 1);
                if ( v7->pMonsterInfo.uExp )
                  sub_4269A2_GivePartyExp(pMonsterStats->pInfos[v7->pMonsterInfo.uID].uExp);
                v34 = 51;
                if ( rand() % 100 < 20 )
                  v34 = ((signed int)v7->pMonsterInfo.uHP >= 100) + 1;
                v6->PlaySound(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(48, 0);
        }
      }
    }
    viewparams->bRedrawGameUI = 1;
    return;
  }
  v37 = &pLayingItems[uActorID];
  v38 = v37->field_58 & 7;
  v39 = v37->field_58 >> 3;
  v40 = v37->field_58 & 7;
  uActorID = v37->field_58 >> 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 = (char *)&pParty->pPlayers[a4];
    v77 = Actor::_43B3E0_CalcDamage(v44, v74);
    v46 = v37->uItemType;
    if ( v37->uItemType == 545 )
    {
      LOBYTE(v51) = ((Player *)v45)->GetActualSkillLevel(PLAYER_SKILL_UNARMED);
      v52 = v51;
      if ( (signed int)SkillToMastery(v51) >= 4 && rand() % 100 < (v52 & 0x3F) )
      {
        sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[637], v45 + 168);
        ShowStatusBarString(pTmpBuf, 2u);
        ((Player *)v45)->PlaySound(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, (Player *)v45) )
      return;
    if ( *((_QWORD *)v45 + 782) > 0i64 )
      v77 >>= 1;
    if ( ((Player *)v45)->HasEnchantedItemEquipped(36) )
      v77 >>= 1;
    if ( ((Player *)v45)->HasEnchantedItemEquipped(69) )
      v77 >>= 1;
    if ( ((Player *)v45)->HasItemEquipped(EQUIP_ARMOUR)
      && *(int *)&v45[36 * *((int *)v45 + 1621) + 496] == 504 )
      v77 >>= 1;
    v75 = 0;
    v47 = (int)(v45 + 6472);
    do
    {
      if ( ((Player *)v45)->HasItemEquipped((ITEM_EQUIP_TYPE)v75) )
      {
        v48 = *(int *)&v45[36 * *(int *)v47 + 496];
        if ( v48 == 520 )
          v77 >>= 1;
        if ( v48 == 531 )
          v77 >>= 1;
        if ( ((Player *)v45)->GetEquippedItemEquipType(v75) == 4 && SkillToMastery(*((short *)v45 + 140)) == 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 = ((Player *)v45)->ReceiveDamage(v77, v50);
          if ( *((int *)v45 + 1553) >= 0 )
          {
            if ( *((int *)v45 + 1553) > 0 || *((int *)v45 + 1552) )
            {
              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 | 4, 0);
                      Actor::_43AC45(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 & 0x20 )
                          {
                            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::_438CF3(uActorID);
                      Actor::_43AC45(uActorID, 1);
                      if ( v44->pMonsterInfo.uExp )
                        sub_4269A2_GivePartyExp(pMonsterStats->pInfos[v44->pMonsterInfo.uID].uExp);
                      v64 = 51;
                      if ( rand() % 100 < 20 )
                        v64 = ((signed int)v44->pMonsterInfo.uHP >= 100) + 1;
                      ((Player *)v45)->PlaySound(v64, 0);
                    }
                  }
                }
              }
            }
          }
        }
        if ( !v74
          && !(dword_6BE368_debug_settings_2 & 0x10)
          && v44->pMonsterInfo.uSpecialAttack
          && rand() % 100 < v44->pMonsterInfo.uLevel * v44->pMonsterInfo.uSpecialAttackType )
          ((Player *)v45)->_48DCF6(v44->pMonsterInfo.uSpecialAttack, v44);
        if ( !pParty->bTurnBasedModeOn )
        {
          v65 = ((Player *)v45)->GetActualEndurance();
          v66 = (double)(20 - ((Player *)v45)->_48EA1B_get_static_effect(v65))
              * flt_6BE3A4_debug_recmod1
              * 2.133333333333333;
          ((Player *)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 = (char *)&pParty->pPlayers[a4];
LABEL_168:
    a4b = (Player *)v43;
    if ( v38 != 4 || v37->field_48 != 100 )
    {
      v70 = ((Player *)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 == 4 && !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 = &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 = pLayingItems[uLayingItemID].field_58 & 7;
  v5 = (a2 & 7) - 3;
  if ( v5 )
  {
    if ( v5 == 1 )
    {
      layingitem_vel_50FDFC.x = pLayingItems[v2].vVelocity.x;
      layingitem_vel_50FDFC.y = pLayingItems[v2].vVelocity.y;
      layingitem_vel_50FDFC.z = pLayingItems[v2].vVelocity.z;
      Vec3_int_::Normalize(&layingitem_vel_50FDFC.x, &layingitem_vel_50FDFC.y, &layingitem_vel_50FDFC.z);
      DamagePlayerFromMonster(8 * v6 | 2, pLayingItems[v2].field_61, &layingitem_vel_50FDFC, 0xFFFFFFFFu);
    }
  }
  else
  {
    layingitem_vel_50FDFC.x = pLayingItems[v2].vVelocity.x;
    layingitem_vel_50FDFC.y = pLayingItems[v2].vVelocity.y;
    layingitem_vel_50FDFC.z = pLayingItems[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, pLayingItems[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);
}

//----- (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 = sub_452A9E(*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
  LayingItem *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].IsAlive() )
  {
    if ( (a2 & 7) == 2 )
    {
      v4 = &pLayingItems[(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) --------------------------------------------------------
__int16 __fastcall sub_43B1B0(signed int a1, unsigned int a2, Vec3_int_ *pVelocity, signed int a4)
{
  int v4; // ebx@1
  LayingItem *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) == 2 )
  {
    v5 = &pLayingItems[a1 >> 3];
    v4 = v5->field_60_distance_related_prolly_lod;
    v17 = v5->field_58;
  }
  LOWORD(v6) = v17 & 7;
  if ( v6 == 3 )
  {
    v7 = &pActors[a2];
    v8 = &pActors[v17 >> 3];
    v6 = pActors[a2].IsAlive();
    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::_43AC45(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);
                }
                LOWORD(v6) = Actor::AddBloodsplatOnDamageOverlay(uActorID, 1, v14);
              }
              else
              {
                LOWORD(v6) = Actor::_4030AD(uActorID, v17, 0);
              }
              return v6;
            }
            v13 = v7->pMonsterInfo.uSpell2ID;
          }
          v12 = LOBYTE(pSpellStats->pInfos[v13].uSchool);
          goto LABEL_30;
        }
        v12 = v8->pMonsterInfo.uAttack1Type;
        goto LABEL_30;
      }
    }
  }
  return v6;
}


//----- (0043BCA7) --------------------------------------------------------
int __cdecl CharacterUI_LoadPaperdollTextures()
{
  int v0; // edi@7
  enum CHARACTER_RACE v1; // ebx@7
  signed int v2; // eax@7
  int v3; // ebx@10
  Player *v4; // edi@12
  unsigned __int8 v5; // cl@12
  int v6; // edi@16
  unsigned int v7; // eax@16
  Player *v8; // ebx@16
  char *v9; // ebx@16
  char v10; // al@16
  signed int v11; // edi@21
  Player *v12; // ebx@23
  Player *v13; // 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 = uTextureID_506438;
  do
  {
    v42 = v30 + 1;
    if ( sub_43EE77_ProbablyIfUnderwaterSuitIsEquipped(v30 + 1) )
    {
      v0 = v30;
      v1 = pPlayers[v30 + 1]->GetRace();
      v2 = pPlayers[v30 + 1]->GetSexByVoice();
      if ( v1 && v1 != 1 && v1 != 2 )
        v3 = (v2 != 0) + 3;
      else
        v3 = (v2 != 0) + 1;
      wsprintfA(pContainer, "pc23v%dBod", v3);
      papredoll_dbods[v0] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
      wsprintfA(pContainer, "pc23v%dlad", v3);
      papredoll_dlads[v0] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
      wsprintfA(pContainer, "pc23v%dlau", v3);
      papredoll_dlaus[v0] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
      wsprintfA(pContainer, "pc23v%drh", v3);
      papredoll_drhs[v0] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
      wsprintfA(pContainer, "pc23v%dlh", v3);
      papredoll_dlhs[v0] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
      wsprintfA(pContainer, "pc23v%dlhu", v3);
      papredoll_dlhus[v0] = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
      v4 = pPlayers[v0 + 1];
      v5 = v4->uFace;
      if ( v5 == 12 || v5 == 13 )
        papredoll_dbrds[(char)v5] = 0;
      papredoll_flying_feet[v4->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);
      v8 = pPlayers[v30 + 1];
      papredoll_dlhus[v30] = v7;
      v9 = (char *)&v8->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 )
    {
      v12 = pParty->pPlayers;
      while ( !sub_43EE15_player_has_item(v11 + 66, v12, 0) )
      {
        ++v12;
        if ( (signed int)v12 >= (signed int)pParty->pHirelings )
          goto LABEL_28;
      }
    }
    byte_5111C0[v11] = 1;
LABEL_28:
    ++v11;
  }
  while ( v11 < 54 );
  *(int *)byte_5111F6 = 0;
  *(int *)&byte_5111F6[4] = 0;
  *(int *)&byte_5111F6[8] = 0;
  *(int *)&byte_5111F6[12] = 0;
  *(int *)&byte_5111F6[16] = 0;
  v13 = pParty->pPlayers;
  v14 = 1;
  do
  {
    if ( sub_43EE15_player_has_item(0x204u, v13, 1) )
      byte_5111F6[2] = 1;
    if ( sub_43EE15_player_has_item(0x1F8u, v13, 1) )
      byte_5111F6[0] = 1;
    if ( sub_43EE15_player_has_item(0x1F9u, v13, 1) )
      byte_5111F6[1] = 1;
    if ( sub_43EE15_player_has_item(0x215u, v13, 1) )
      byte_5111F6[16] = 1;
    if ( sub_43EE15_player_has_item(0x200u, v13, 1) )
      byte_5111F6[3] = 1;
    if ( sub_43EE15_player_has_item(0x209u, v13, 1) )
      byte_5111F6[4] = 1;
    if ( sub_43EE15_player_has_item(0x20Au, v13, 1) )
      byte_5111F6[5] = 1;
    if ( sub_43EE15_player_has_item(0x20Bu, v13, 1) )
      byte_5111F6[6] = 1;
    if ( sub_43EE15_player_has_item(0x214u, v13, 1) )
      byte_5111F6[7] = 1;
    if ( sub_43EE15_player_has_item(0x220u, v13, 1) )
      byte_5111F6[8] = 1;
    if ( sub_43EE15_player_has_item(0x20Cu, v13, 1) )
      byte_5111F6[9] = 1;
    if ( sub_43EE15_player_has_item(0x217u, v13, 1) )
      byte_5111F6[10] = 1;
    if ( sub_43EE15_player_has_item(0x20Du, v13, 1) )
      byte_5111F6[11] = 1;
    if ( sub_43EE15_player_has_item(0x212u, v13, 1) )
      byte_5111F6[12] = 1;
    if ( sub_43EE15_player_has_item(0x223u, v13, 1) )
      byte_5111F6[13] = 1;
    if ( sub_43EE15_player_has_item(0x224u, v13, 1) )
      byte_5111F6[14] = 1;
    if ( sub_43EE15_player_has_item(0x226u, v13, 1) )
      byte_5111F6[15] = 1;
    ++v13;
  }
  while ( (signed int)v13 < (signed int)pParty->pHirelings );
  v15 = &stru_511698.field_2C;
  v35 = (char *)&stru_511718.field_18;
  do
  {
    v16 = 0;
    v39 = (unsigned int *)(v35 - 24);
    do
    {
      _43C91D_FormItemTextureFilename(pContainer, v16 + 100, v14, 0);
      v17 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
      ++v16;
      v18 = v39;
      ++v39;
      *v18 = v17;
    }
    while ( v16 < 5 );
    _43C91D_FormItemTextureFilename(pContainer, 535, v14, 0);
    v31 = 0;
    v19 = (unsigned int *)((char *)v15 - 44);
    *(int *)v35 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
    do
    {
      _43C91D_FormItemTextureFilename(pContainer, v31++ + 89, v14, 0);
      *v19 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
      ++v19;
    }
    while ( v31 < 11 );
    _43C91D_FormItemTextureFilename(pContainer, 521, v14, 0);
    v15->field_0 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
    _43C91D_FormItemTextureFilename(pContainer, 522, v14, 0);
    v15->field_4 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
    _43C91D_FormItemTextureFilename(pContainer, 523, v14, 0);
    v15->field_8 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
    _43C91D_FormItemTextureFilename(pContainer, 532, v14, 0);
    v15->field_C = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
    _43C91D_FormItemTextureFilename(pContainer, 544, v14, 0);
    v15->field_10 = 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;
  do
  {
    if ( sub_43EDB9_get_some_race_sex_relation_2(v20 - 1) )
    {
      _43C91D_FormItemTextureFilename(pContainer, 524, v20, 0);
      v32 = 66;
      *v41 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
      v36 = v21 - 152;
      do
      {
        _43C91D_FormItemTextureFilename(pContainer, v32, v20, 0);
        *(int *)(v36 - 4) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
        _43C91D_FormItemTextureFilename(pContainer, v32, v20, 1);
        *(int *)v36 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
        _43C91D_FormItemTextureFilename(pContainer, v32, v20, 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, v20, 0);
      *(int *)v21 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
      _43C91D_FormItemTextureFilename(pContainer, 516, v20, 1);
      *(int *)(v21 + 4) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
      _43C91D_FormItemTextureFilename(pContainer, 516, v20, 2);
      *(int *)(v21 + 8) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
      _43C91D_FormItemTextureFilename(pContainer, 505, v20, 0);
      *(int *)(v21 + 12) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
      _43C91D_FormItemTextureFilename(pContainer, 505, v20, 1);
      *(int *)(v21 + 16) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
      _43C91D_FormItemTextureFilename(pContainer, 505, v20, 2);
      *(int *)(v21 + 20) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
      _43C91D_FormItemTextureFilename(pContainer, 504, v20, 0);
      *(int *)(v21 + 24) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
      _43C91D_FormItemTextureFilename(pContainer, 504, v20, 1);
      *(int *)(v21 + 28) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
      _43C91D_FormItemTextureFilename(pContainer, 504, v20, 2);
      *(int *)(v21 + 32) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
      _43C91D_FormItemTextureFilename(pContainer, 533, v20, 0);
      *(int *)(v21 + 36) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
      _43C91D_FormItemTextureFilename(pContainer, 533, v20, 1);
      *(int *)(v21 + 40) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
      _43C91D_FormItemTextureFilename(pContainer, 533, v20, 2);
      *(int *)(v21 + 44) = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
      v33 = 0;
      v37 = (int)(v40 - 5);
      do
      {
        _43C91D_FormItemTextureFilename(pContainer, v33 + 115, v20, 0);
        v24 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
        ++v33;
        v25 = v37;
        v37 += 4;
        *(int *)v25 = v24;
      }
      while ( v33 < 5 );
      _43C91D_FormItemTextureFilename(pContainer, 512, v20, 0);
      v26 = v43;
      v38 = 105;
      v34 = v43;
      *v40 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
      do
      {
        _43C91D_FormItemTextureFilename(pContainer, v38, v20, 0);
        *(int *)((char *)paperdoll_array_511828 + v34) = pIcons_LOD->LoadTexture(
                                                           pContainer,
                                                           TEXTURE_16BIT_PALETTE);
        _43C91D_FormItemTextureFilename(pContainer, v38, v20, 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, v20, 0);
      *(int *)((char *)&paperdoll_array_511828[0][5] + v43) = pIcons_LOD->LoadTexture(
                                                                pContainer,
                                                                TEXTURE_16BIT_PALETTE);
      _43C91D_FormItemTextureFilename(pContainer, 530, v20, 0);
      *(int *)((char *)&paperdoll_array_511828[0][6] + v43) = pIcons_LOD->LoadTexture(
                                                                pContainer,
                                                                TEXTURE_16BIT_PALETTE);
      _43C91D_FormItemTextureFilename(pContainer, 547, v20, 0);
      *(int *)((char *)&paperdoll_array_511828[0][7] + v43) = pIcons_LOD->LoadTexture(
                                                                pContainer,
                                                                TEXTURE_16BIT_PALETTE);
      _43C91D_FormItemTextureFilename(pContainer, 548, v20, 0);
      *(int *)((char *)&paperdoll_array_511828[0][8] + v43) = pIcons_LOD->LoadTexture(
                                                                pContainer,
                                                                TEXTURE_16BIT_PALETTE);
      _43C91D_FormItemTextureFilename(pContainer, 550, v20, 0);
      *(int *)((char *)&paperdoll_array_511828[0][9] + v43) = pIcons_LOD->LoadTexture(
                                                                pContainer,
                                                                TEXTURE_16BIT_PALETTE);
      _43C91D_FormItemTextureFilename(pContainer, 525, v20, 1);
      *(int *)((char *)&dword_51179C + v43) = pIcons_LOD->LoadTexture(
                                                pContainer,
                                                TEXTURE_16BIT_PALETTE);
      _43C91D_FormItemTextureFilename(pContainer, 530, v20, 1);
      *(int *)((char *)&dword_5117A0 + v43) = pIcons_LOD->LoadTexture(
                                                pContainer,
                                                TEXTURE_16BIT_PALETTE);
      _43C91D_FormItemTextureFilename(pContainer, 547, v20, 1);
      *(int *)((char *)&dword_5117A4 + v43) = pIcons_LOD->LoadTexture(
                                                pContainer,
                                                TEXTURE_16BIT_PALETTE);
      _43C91D_FormItemTextureFilename(pContainer, 548, v20, 1);
      *(int *)((char *)&dword_5117A8 + v43) = pIcons_LOD->LoadTexture(
                                                pContainer,
                                                TEXTURE_16BIT_PALETTE);
      _43C91D_FormItemTextureFilename(pContainer, 550, v20, 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 v3; // edi@1
  signed int v4; // 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 v239; // [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 v248; // [sp+40h] [bp-Ch]@4
  int v249; // [sp+40h] [bp-Ch]@358
  signed int v250; // [sp+44h] [bp-8h]@1

  ppPlayer = &pPlayers[uPlayerID];
  pPlayer = *ppPlayer;
  uPlayerID_ = uPlayerID;
  v217 = *ppPlayer;
  pIcons_LOD->LoadTexture("sptext01", TEXTURE_16BIT_PALETTE);
  v3 = pPlayer->GetRace();
  v4 = pPlayer->GetSexByVoice();
  v250 = v4;
  if ( v3 && v3 != 1 && v3 != 2 )
  {
    v248 = 1;
    v5 = (v4 != 0) + 2;
  }
  else
  {
    v248 = 0;
    v5 = v4 != 0;
  }
  v239 = v5;
  v244 = (*ppPlayer)->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)&v217->spellbook.pDarkSpellbook.bIsSpellAvailable[36 * v21 + 5];
    v23 = *(int *)v22;
    v24 = papredoll_4E4C28 + array_4E4C30[v239].equip_x - pItemsTable->pItems[v23].uEquipX;
    a3b = paperdoll_4E4C2C + array_4E4C30[v239].equip_y - 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->_4A6776(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 = v217->pEquipment.uCloak;
      if ( !v31 )
        goto LABEL_93;
      v231 = v217->pEquipment.uCloak;
      v32 = (int)&v217->spellbook.pDarkSpellbook.bIsSpellAvailable[36 * v31 + 5];
      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 * v239;
              v35 = paperdoll_array_511828[0][v34];
              a2c = papredoll_4E4C28 + paperdoll_array_4E5570[0][v34][0];// TODO indexing
              v36 = paperdoll_4E4C2C + paperdoll_array_4E5570[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->_4A6776(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(
                  papredoll_4E4C28,
                  paperdoll_4E4C2C,
                  (Texture *)(*(unsigned int *)((char *)papredoll_dbods + v240) != -1 ? (int)&pIcons_LOD->pTextures[*(unsigned int *)((char *)papredoll_dbods + v240)] : 0));
                v43 = v217->pEquipment.uBody;
                if ( !v43 )
                  goto LABEL_127;
                v232 = v217->pEquipment.uBody;
                v44 = (int)&v217->spellbook.pDarkSpellbook.bIsSpellAvailable[36 * v43 + 5];
                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 * v239 + v45;
                        a2d = papredoll_4E4C28 + paperdoll_array_4E4E30[0][v46][0];// TODO indexing
                        v47 = paperdoll_4E4C2C + paperdoll_array_4E4E30[0][v46][1];
                        v48 = paperdoll_array_511290[0][v46][0];
                        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->_4A6776(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 = v217->pEquipment.field_20;
                          if ( !v56 )
                            goto LABEL_155;
                          v233 = v217->pEquipment.field_20;
                          v57 = (int)&v217->spellbook.pDarkSpellbook.bIsSpellAvailable[36 * v56 + 5];
                          v221 = v57;
                          v58 = *(int *)v57;
                          if ( *(int *)v57 == 529 )
                          {
                            a3e = paperdoll_4E4C2C + paredoll_array_4E54B8[v239][1];
                            a2e = papredoll_4E4C28 + paredoll_array_4E54B8[v239][0];
                            v59 = papredoll_flying_feet[v244];
                          }
                          else
                          {
                            if ( v58 == 512 )
                            {
                              a3e = paperdoll_4E4C2C + paredoll_array_4E54B8[v239][3];
                              a2e = papredoll_4E4C28 + paredoll_array_4E54B8[v239][2];
                              v59 = dword_511638[v239][5];
                            }
                            else
                            {
                              v60 = v58 - 115;
                              if ( v60 < 0 || v60 >= 5 )
                              {
                                a2e = 0;
                                a3e = 0;
                                v59 = dword_511638[v239][0];
                              }
                              else
                              {
                                v61 = v60 + 7 * v239;
                                a3e = paperdoll_4E4C2C + dword_4E5490[0][v61][1];
                                a2e = papredoll_4E4C28 + dword_4E5490[0][v61][0];
                                v59 = dword_511638[0][v60 + 6 * v239];
                              }
                            }
                          }
                          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->_4A6776(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:
                            v68 = v217;
                            v69 = v217->pEquipment.uMainHand;
                            uPlayerID_a = 2 * v239;
                            if ( !v69
                              || (v70 = *(int *)&v217->spellbook.pDarkSpellbook.bIsSpellAvailable[36 * v69 + 5],
                                  pItemsTable->pItems[v70].uEquipType != 1)
                              && (pItemsTable->pItems[v70].uSkillType != 4 || v217->pEquipment.uOffHand) )
                              pRenderer->DrawTextureTransparent(
                                papredoll_4E4C28 + dword_4E5AE0[2 * v239],
                                paperdoll_4E4C2C + dword_4E5AE0[2 * v239 + 1],
                                (Texture *)(*(unsigned int *)((char *)papredoll_dlads + v240) != -1 ? (int)&pIcons_LOD->pTextures[*(unsigned int *)((char *)papredoll_dlads + v240)] : 0));
                            v71 = v217->pEquipment.uBelt;
                            if ( v71 )
                            {
                              v234 = v217->pEquipment.uBelt;
                              v72 = (int)&v217->spellbook.pDarkSpellbook.bIsSpellAvailable[36 * v71 + 5];
                              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 * v239 + v73;
                                a2f = papredoll_4E4C28 + dword_4E57F0[0][v74][0];
                                a3f = paperdoll_4E4C2C + dword_4E57F0[0][v74][1];
                                if ( v248 != 1 || v73 == 5 )
                                  v75 = stru_511718.texids[v74];
                                else
                                  v75 = stru_511718.texids[v73 + 7 * (v239 - 2)];
                                v76 = *(int *)&v217->field_1F5[36 * v71 + 15];
                                if ( !(*(int *)&v217->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->_4A6776(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_191;
                                }
                                if ( (*(int *)&v217->field_1F5[36 * v71 + 15] & 0xF0) != 16 )
                                {
                                  if ( (*(int *)&v217->field_1F5[36 * v71 + 15] & 0xF0) == 32 )
                                  {
                                    v172 = "sp28a";
                                    goto LABEL_181;
                                  }
                                  if ( (*(int *)&v217->field_1F5[36 * v71 + 15] & 0xF0) == 64 )
                                  {
                                    v172 = "sp30a";
                                    goto LABEL_181;
                                  }
                                  if ( (*(int *)&v217->field_1F5[36 * v71 + 15] & 0xF0) == 128 )
                                  {
                                    v172 = "sp91a";
LABEL_181:
                                    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);
LABEL_191:
                                    v68 = v217;
                                    goto LABEL_192;
                                  }
                                }
                                v172 = "sptext01";
                                goto LABEL_181;
                              }
                            }
LABEL_192:
                            v82 = v68->pEquipment.uMainHand;
                            if ( v82 )
                            {
                              v83 = *(int *)&v68->spellbook.pDarkSpellbook.bIsSpellAvailable[36 * v82 + 5];
                              if ( pItemsTable->pItems[v83].uEquipType == 1
                                || pItemsTable->pItems[v83].uSkillType == 4 && !v68->pEquipment.uOffHand )
                                pRenderer->DrawTextureTransparent(
                                  papredoll_4E4C28 + pPaperdollLeftHand[uPlayerID_a],
                                  paperdoll_4E4C2C + pPaperdollLeftHand[uPlayerID_a + 1],
                                  (Texture *)(*(unsigned int *)((char *)papredoll_dlaus + v240) != -1 ? (int)&pIcons_LOD->pTextures[*(unsigned int *)((char *)papredoll_dlaus + v240)] : 0));
                            }
                            v84 = v68->pEquipment.uBody;
                            v235 = v84;
                            v85 = (int)((char *)v68 + 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 = v68->pEquipment.uCloak;
                                      if ( !v111 )
                                        goto LABEL_293;
                                      v236 = v68->pEquipment.uCloak;
                                      v112 = (int)&v68->spellbook.pDarkSpellbook.bIsSpellAvailable[36 * v111 + 5];
                                      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 * v239;
                                              v116 = dword_511788[v115];
                                              v115 *= 8;
                                              v117 = papredoll_4E4C28 + *(int *)((char *)&dword_4E56B0 + v115);
                                              a2h = papredoll_4E4C28 + *(int *)((char *)&dword_4E56B0 + v115);
                                              a3h = paperdoll_4E4C2C + *(int *)((char *)&dword_4E56B4 + v115);
                                              if ( v116 == pIcons_LOD->FindTextureByName("pending") )
                                              {
LABEL_292:
                                                v68 = v217;
LABEL_293:
                                                if ( v244 == 12 || v244 == 13 )
                                                {
                                                  v122 = papredoll_dbrds[v244];
                                                  if ( v122 != pIcons_LOD->FindTextureByName("Pending") )
                                                    pRenderer->DrawTextureTransparent(
                                                      papredoll_4E4C28 + dword_4E5AD0[2 * v244 - 24],
                                                      paperdoll_4E4C2C + dword_4E5AD4[2 * v244 - 24],
                                                      (Texture *)(v122 != -1 ? (int)&pIcons_LOD->pTextures[v122] : 0));
                                                }
                                                v123 = v68->pEquipment.uHelm;
                                                if ( !v123 )
                                                  goto LABEL_335;
                                                v237 = v123;
                                                v124 = (int)&v217->spellbook.pDarkSpellbook.bIsSpellAvailable[36 * v123 + 5];
                                                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;
LABEL_310:
                                                        if ( v125 < 0 || v125 >= 16 )
                                                          goto LABEL_335;
                                                        goto LABEL_312;
                                                      }
                                                      v192 = 15;
                                                      break;
                                                  }
                                                  v125 = v192;
LABEL_312:
                                                  v126 = 2 * (v125 + 16 * v239);
                                                  a2j = papredoll_4E4C28 + dword_4E58D0[v126];
                                                  a3i = paperdoll_4E4C2C + dword_4E58D4[v126];
                                                  if ( v248 != 1 || *(int *)v124 != 92 )
                                                    v127 = stru_511698.texids[v125 + 16 * v250];
                                                  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";
                                                        goto LABEL_325;
                                                      }
                                                      if ( (*(int *)(v124 + 20) & 0xF0) == 64 )
                                                      {
                                                        v180 = "sp30a";
                                                        goto LABEL_325;
                                                      }
                                                      if ( (*(int *)(v124 + 20) & 0xF0) == 128 )
                                                      {
                                                        v180 = "sp91a";
LABEL_325:
                                                        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";
                                                    goto LABEL_325;
                                                  }
                                                  v131 = v127 + 1;
                                                  v132 = (char *)&pIcons_LOD->pTextures[v127];
                                                  if ( v128 & 2 )
                                                  {
                                                    v133 = (Texture *)(v131 != 0 ? (int)v132 : 0);
                                                    pRenderer->_4A6776(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 = v217->pEquipment.uMainHand;
                                                  if ( !v134 )
                                                    goto LABEL_358;
                                                  v238 = v217->pEquipment.uMainHand;
                                                  v135 = (int)&v217->spellbook.pDarkSpellbook.bIsSpellAvailable[36 * v134 + 5];
                                                  v227 = v135;
                                                  v136 = *(int *)v135;
                                                  v137 = *(int *)v135;
                                                  a2k = papredoll_4E4C28
                                                      + array_4E4C30[v239].field_8
                                                      - pItemsTable->pItems[v137].uEquipX;
                                                  a3j = paperdoll_4E4C2C
                                                      + array_4E4C30[v239].field_C
                                                      - 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->_4A6776(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 = v217->pEquipment.uOffHand;
                                                    v249 = v217->pEquipment.uOffHand;
                                                    if ( !v145 )
                                                      goto LABEL_393;
                                                    v146 = (int)&v217->spellbook.pDarkSpellbook.bIsSpellAvailable[36 * v145 + 5];
                                                    v228 = v146;
                                                    v147 = *(int *)v146;
                                                    v148 = *(int *)v146;
                                                    v149 = pItemsTable->pItems[v148].uSkillType;
                                                    if ( v149 != 2 && v149 != 1 )
                                                    {
                                                      v245 = 0;
LABEL_362:
                                                      v150 = papredoll_4E4C28
                                                           + array_4E4C30[v239].field_0
                                                           - pItemsTable->pItems[v148].uEquipX;
                                                      a3k = paperdoll_4E4C2C
                                                          + LODWORD(array_4E4C30[v239].field_4)
                                                          - pItemsTable->pItems[v148].uEquipY;
                                                      goto LABEL_370;
                                                    }
                                                    v151 = v147 - 400;
                                                    v245 = 1;
                                                    if ( v151 )
                                                    {
                                                      v152 = v151 - 3;
                                                      if ( v152 )
                                                      {
                                                        if ( v152 != 12 )
                                                          goto LABEL_362;
                                                        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->_4A6776(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);
                                                          goto LABEL_391;
                                                        }
                                                        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";
LABEL_381:
                                                                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);
LABEL_391:
                                                                if ( v245 )
                                                                  pRenderer->DrawTextureTransparent(
                                                                    papredoll_4E4C28
                                                                  + pPaperdollLeftEmptyHand[uPlayerID_a],
                                                                    paperdoll_4E4C2C
                                                                  + 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;
                                                              }
LABEL_380:
                                                              v183 = "sptext01";
                                                              goto LABEL_381;
                                                            }
                                                            v183 = "sp30a";
                                                          }
                                                          v156 = pIcons_LOD;
                                                          goto LABEL_381;
                                                        }
                                                        v156 = pIcons_LOD;
                                                        goto LABEL_380;
                                                      }
                                                      a3k = 28;
                                                    }
                                                    else
                                                    {
                                                      a3k = 86;
                                                    }
                                                    v150 = 596;
                                                    goto LABEL_370;
                                                  }
                                                  if ( (*(int *)(v227 + 20) & 0xF0) != 16 )
                                                  {
                                                    if ( (*(int *)(v227 + 20) & 0xF0) == 32 )
                                                    {
                                                      v182 = "sp28a";
                                                      goto LABEL_348;
                                                    }
                                                    if ( (*(int *)(v227 + 20) & 0xF0) == 64 )
                                                    {
                                                      v182 = "sp30a";
                                                      goto LABEL_348;
                                                    }
                                                    if ( (*(int *)(v227 + 20) & 0xF0) == 128 )
                                                    {
                                                      v182 = "sp91a";
LABEL_348:
                                                      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";
                                                  goto LABEL_348;
                                                }
                                                v125 = 11;
                                                goto LABEL_310;
                                              }
                                              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->_4A6776(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";
                                                  goto LABEL_284;
                                                }
                                                if ( (*(int *)(v225 + 20) & 0xF0) == 64 )
                                                {
                                                  v179 = "sp30a";
                                                  goto LABEL_284;
                                                }
                                                if ( (*(int *)(v225 + 20) & 0xF0) == 128 )
                                                {
                                                  v179 = "sp91a";
LABEL_284:
                                                  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";
                                              goto LABEL_284;
                                            }
                                            v191 = 9;
                                            break;
                                        }
                                        v114 = v191;
                                        goto LABEL_274;
                                      }
                                      v114 = 5;
                                      goto LABEL_272;
                                    }
LABEL_209:
                                    if ( v68->pEquipment.uMainHand
                                      && (v68->GetEquippedItemEquipType(1u) == 1
                                       || v68->GetEquippedItemSkillType(EQUIP_TWO_HANDED) == 4
                                       && !v68->pEquipment.uOffHand) )
                                    {
                                      v91 = 17 * v239 + 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 = papredoll_4E4C28 + dword_4E5050[v93];
                                        v95 = dword_4E5050[v93 + 1];
                                      }
                                      else
                                      {
                                        v94 = v223;
                                        a2g = papredoll_4E4C28 + dword_4E5270[2 * v91];
                                        v95 = dword_4E5270[2 * v91 + 1];
                                      }
                                      a3g = paperdoll_4E4C2C + v95;
                                      if ( v94 == pIcons_LOD->FindTextureByName("pending") )
                                        goto LABEL_258;
                                      if ( *(int *)(v242 + 516) & 0xF0 )
                                      {
                                        if ( (*(int *)(v242 + 516) & 0xF0) != 16 )
                                        {
                                          if ( (*(int *)(v242 + 516) & 0xF0) == 32 )
                                          {
                                            v173 = "sp28a";
                                            goto LABEL_226;
                                          }
                                          if ( (*(int *)(v242 + 516) & 0xF0) == 64 )
                                          {
                                            v173 = "sp30a";
                                            goto LABEL_226;
                                          }
                                          if ( (*(int *)(v242 + 516) & 0xF0) == 128 )
                                          {
                                            v173 = "sp91a";
LABEL_226:
                                            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();
LABEL_249:
                                            pRenderer->_4A63E6(
                                              a2g,
                                              a3g,
                                              (Texture *)(v94 != -1 ? (int)&pIcons_LOD->pTextures[v94] : 0),
                                              (Texture *)v96,
                                              (signed __int64)(v97 * 0.1),
                                              v174,
                                              v187);
                                            goto LABEL_258;
                                          }
                                        }
                                        v173 = "sptext01";
                                        goto LABEL_226;
                                      }
                                      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;
LABEL_231:
                                        v100->_4A6776(v163, v175, v188);
                                        goto LABEL_256;
                                      }
                                      if ( *(char *)(v242 + 516) & 1 )
                                      {
                                        v101 = (Texture *)(v98 != 0 ? (int)v99 : 0);
                                        v189 = v101;
                                        v176 = a3g;
                                        v164 = a2g;
LABEL_234:
                                        pRenderer->DrawTextureTransparent(v164, v176, v189);
                                        goto LABEL_256;
                                      }
                                      v101 = (Texture *)(v98 != 0 ? (int)v99 : 0);
                                      v190 = v101;
                                      v177 = a3g;
                                      v165 = a2g;
                                      goto LABEL_255;
                                    }
                                    v102 = 17 * v239 + v90;
                                    v94 = paperdoll_array_511290[0][v102][1];
                                    if ( v94 == pIcons_LOD->FindTextureByName("pending") )
                                    {
LABEL_258:
                                      v68 = v217;
                                      goto LABEL_259;
                                    }
                                    v103 = papredoll_4E4C28 + dword_4E5050[2 * v102];
                                    v104 = paperdoll_4E4C2C + dword_4E5050[2 * v102 + 1];
                                    v224 = *(int *)(v242 + 516);
                                    v105 = *(int *)(v242 + 516) & 0xF0;
                                    a2g = papredoll_4E4C28 + dword_4E5050[2 * v102];
                                    a3g = paperdoll_4E4C2C + dword_4E5050[2 * 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;
                                        goto LABEL_231;
                                      }
                                      if ( v224 & 1 )
                                      {
                                        v101 = (Texture *)(v109 != 0 ? (int)v110 : 0);
                                        v189 = v101;
                                        v176 = v104;
                                        v164 = v103;
                                        v100 = pRenderer;
                                        goto LABEL_234;
                                      }
                                      v101 = (Texture *)(v109 != 0 ? (int)v110 : 0);
                                      v190 = v101;
                                      v177 = v104;
                                      v165 = v103;
                                      v100 = pRenderer;
LABEL_255:
                                      pRenderer->DrawTransparentGreenShade(v165, v177, v190);
LABEL_256:
                                      if ( !bRingsShownInCharScreen )
                                        pRenderer->_4A612A(a2g, a3g, v101, v235);
                                      goto LABEL_258;
                                    }
                                    v106 = v105 - 16;
                                    if ( v106 )
                                    {
                                      v107 = v106 - 16;
                                      if ( !v107 )
                                      {
                                        v178 = "sp28a";
                                        goto LABEL_246;
                                      }
                                      v108 = v107 - 32;
                                      if ( !v108 )
                                      {
                                        v178 = "sp30a";
                                        goto LABEL_246;
                                      }
                                      if ( v108 == 64 )
                                      {
                                        v178 = "sp91a";
LABEL_246:
                                        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();
                                        goto LABEL_249;
                                      }
                                    }
                                    v178 = "sptext01";
                                    goto LABEL_246;
                                  }
                                  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";
                              goto LABEL_145;
                            }
                            if ( (*(int *)(v57 + 20) & 0xF0) == 64 )
                            {
                              v171 = "sp30a";
                              goto LABEL_145;
                            }
                            if ( (*(int *)(v57 + 20) & 0xF0) == 128 )
                            {
                              v171 = "sp91a";
LABEL_145:
                              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";
                          goto LABEL_145;
                        }
                        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";
LABEL_117:
                                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;
                              }
LABEL_116:
                              v170 = "sptext01";
                              goto LABEL_117;
                            }
                            v170 = "sp30a";
                          }
                          v50 = pIcons_LOD;
                          goto LABEL_117;
                        }
                        v50 = pIcons_LOD;
                        goto LABEL_116;
                      }
                      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";
LABEL_85:
                      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;
                    }
LABEL_84:
                    v169 = "sptext01";
                    goto LABEL_85;
                  }
                  v169 = "sp30a";
                }
                v38 = pIcons_LOD;
                goto LABEL_85;
              }
              v38 = pIcons_LOD;
              goto LABEL_84;
            }
            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";
LABEL_49:
            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;
          }
LABEL_48:
          v168 = "sptext01";
          goto LABEL_49;
        }
        v168 = "sp30a";
      }
      v26 = pIcons_LOD;
      goto LABEL_49;
    }
    v26 = pIcons_LOD;
    goto LABEL_48;
  }
  a3 = paperdoll_4E4C2C;
  a2 = papredoll_4E4C28;
  v240 = 4 * uPlayerID_ - 4;
  pRenderer->DrawTextureTransparent(
    papredoll_4E4C28,
    paperdoll_4E4C2C,
    (Texture *)(*(unsigned int *)((char *)papredoll_dbods + v240) != -1 ? (int)&pIcons_LOD->pTextures[*(unsigned int *)((char *)papredoll_dbods + v240)] : 0));
    //(Texture *)(*(unsigned int *)((char *)papredoll_dbods + v240) != -1 ? 72
    //                                                                    * *(unsigned int *)((char *)papredoll_dbods
    //                                                                                      + v240)
    //                                                                    + 7145548 : 0));
  if ( !bRingsShownInCharScreen )
    pRenderer->_4A612A(
      a2,
      a3,
      //(Texture *)(*(unsigned int *)((char *)papredoll_dbods + v240) != -1 ? 72
      //                                                                    * *(unsigned int *)((char *)papredoll_dbods
      //                                                                                      + v240)
      //                                                                    + 7145548 : 0),
      (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 * v5;
  v6 = pPlayer->pEquipment.uMainHand;
  if ( !v6
    || (v7 = *(int *)&pPlayer->spellbook.pDarkSpellbook.bIsSpellAvailable[36 * v6 + 5], pItemsTable->pItems[v7].uEquipType != 1)
    && (pItemsTable->pItems[v7].uSkillType != 4 || pPlayer->pEquipment.uOffHand) )
    pRenderer->DrawTextureTransparent(
      papredoll_4E4C28 + dword_4E5AE0[2 * v5],
      paperdoll_4E4C2C + dword_4E5AE0[2 * v5 + 1],
      (Texture *)(*(unsigned int *)((char *)papredoll_dlads + v240) != -1 ? (int)&pIcons_LOD->pTextures[*(unsigned int *)((char *)papredoll_dlads + v240)] : 0));
      //(Texture *)(*(unsigned int *)((char *)papredoll_dlads + v240) != -1 ? 72
      //                                                                    * *(unsigned int *)((char *)papredoll_dlads
      //                                                                                      + v240)
      //                                                                    + 7145548 : 0));
  v8 = pPlayer->pEquipment.uMainHand;
  if ( v8 )
  {
    v229 = pPlayer->pEquipment.uMainHand;
    v9 = (int)&v217->spellbook.pDarkSpellbook.bIsSpellAvailable[36 * v8 + 5];
    v10 = v5 << 7;
    v218 = v9;
    v11 = *(int *)v9;
    v12 = *(int *)v9;
    v13 = papredoll_4E4C28 + array_4E4C30[v5].field_8 - pItemsTable->pItems[v12].uEquipX;
    a2a = v13;
    a3a = paperdoll_4E4C2C + *(int *)((char *)&array_4E4C30[0].field_C + v10) - 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";
          goto LABEL_27;
        }
        if ( (*(int *)(v218 + 20) & 0xF0) == 64 )
        {
          v167 = "sp30a";
          goto LABEL_27;
        }
        if ( (*(int *)(v218 + 20) & 0xF0) == 128 )
        {
          v167 = "sp91a";
LABEL_27:
          //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";
      goto LABEL_27;
    }
    v18 = v14 + 1;
    v19 = (char *)&pIcons_LOD->pTextures[v14];
    if ( v15 & 2 )
    {
      v20 = (Texture *)(v18 != 0 ? (int)v19 : 0);
      pRenderer->_4A6776(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(
    papredoll_4E4C28 + pPaperdollRightHand[uPlayerID_a],
    paperdoll_4E4C2C + pPaperdollRightHand[uPlayerID_a + 1],
    (Texture *)(*(unsigned int *)((char *)papredoll_drhs + v240) != -1 ? (int)&pIcons_LOD->pTextures[*(unsigned int *)((char *)papredoll_drhs + v240)] : 0));
    //(Texture *)(*(unsigned int *)((char *)papredoll_drhs + v240) != -1 ? 72
    //                                                                   * *(unsigned int *)((char *)papredoll_drhs + v240)
    //                                                                   + 7145548 : 0));
  v161 = v217->pEquipment.uMainHand;
  if ( v161 )
  {
    v162 = *(int *)&v217->spellbook.pDarkSpellbook.bIsSpellAvailable[36 * v161 + 5];
    if ( pItemsTable->pItems[v162].uEquipType == 1
      || pItemsTable->pItems[v162].uSkillType == 4 && !v217->pEquipment.uOffHand )
      pRenderer->DrawTextureTransparent(
        papredoll_4E4C28 + pPaperdollLeftHand[uPlayerID_a],
        paperdoll_4E4C2C + pPaperdollLeftHand[uPlayerID_a + 1],
        (Texture *)(*(unsigned int *)((char *)papredoll_dlhus + v240) != -1 ? (int)&pIcons_LOD->pTextures[*(unsigned int *)((char *)papredoll_dlhus + v240)] : 0));
        //(Texture *)(*(unsigned int *)((char *)papredoll_dlhus + v240) != -1 ? 72
        //                                                                    * *(unsigned int *)((char *)papredoll_dlhus
        //                                                                                      + v240)
        //                                                                    + 7145548 : 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
  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(
    ptr_507694->uX,
    ptr_507694->uY,
    (Texture *)(uTextureID_5118C8 != -1 ? &pIcons_LOD->pTextures[uTextureID_5118C8] : 0));
  v3 = 0;
  v46 = (int)&pPlayer->pEquipment.field_28;
  v48 = 0;
  do
  {
    if ( !*(int *)v46 )
      goto LABEL_24;
    v39 = *(int *)v46;
    v4 = (int)&pPlayer->spellbook.pDarkSpellbook.bIsSpellAvailable[36 * *(int *)v46 + 5];
    a3 = *(int *)((char *)dword_4E5C34 + v3);
    a2 = *(int *)((char *)dword_4E5C1C + v3);
    v5 = pIcons_LOD->LoadTexture(pItemsTable->pItems[*(int *)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->_4A6776(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->spellbook.pDarkSpellbook.bIsSpellAvailable[36 * v15 + 5];
  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->_4A6776(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->spellbook.pDarkSpellbook.bIsSpellAvailable[36 * v26 + 5];
  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->_4A6776(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 _this)
{
  unsigned int v1; // ebp@1
  Player **v2; // ebx@1
  Player *v3; // esi@2
  enum CHARACTER_RACE v4; // edi@2
  bool result; // eax@2
  char v6; // zf@7

  v1 = _this;
  v2 = &pPlayers[1];
  while ( 1 )
  {
    v3 = *v2;
    v4 = v3->GetRace();
    result = v3->GetSexByVoice();
    if ( !v4 )
      break;
    if ( v4 == 1 || v4 == 2 )
      break;
    if ( !result && v1 == 2 )
      goto LABEL_15;
    v6 = v1 == 3;
LABEL_11:
    if ( v6 )
      goto LABEL_15;
    ++v2;
    if ( (signed int)v2 >= (signed int)&qword_A750D8 )
    {
      LOBYTE(result) = 0;
      return result;
    }
  }
  if ( result || v1 )
  {
    v6 = v1 == 1;
    goto LABEL_11;
  }
LABEL_15:
  LOBYTE(result) = 1;
  return result;
}
// 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->spellbook.pDarkSpellbook.bIsSpellAvailable[36 * *v5 + 5] == 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 stru170::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->some_x, a1->some_y, a1->some_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) == 4 )
        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) == 3 && ai_array_4F7DB0_actor_ids[v20] == v8->uPackedID >> 3 )
            break;
          ++v18;
          ++v8;
        }
        while ( v18 < v1->uActorQueueSize );
        v2 = 0;
      }
      if ( v18 == v1->uActorQueueSize )
      {
        v9 = ai_array_4F7DB0_actor_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) == 4 )
    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) != 4 )
    {
      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::_403F58(v2->uPackedID >> 3, dword_4F6E08[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) != 4 )
      {
        v10 = v9->uPackedID >> 3;
        v11 = pActors[v10].uAIState;
        if ( v11 != 5 )
        {
          if ( v11 != 4 && v11 != 11 && v11 != 19 )
          {
            if ( v11 != 17 )
            {
              v12 = dword_4F6E08[v10];
              v9->uActionLength = v3;
              Actor::_403F58(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) == 4 )
    {
      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) == 4 )
  {
    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) == 4 )
    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) == 4 )
          return;
        v2 = &pActors[*((int *)v1 - 1) >> 3];
        v3 = v2->uAIState;
        if ( !v3 || v3 == 9 || v3 == 7 )
        {
          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) --------------------------------------------------------
__int16 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) != 4) ? (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) == 4 || *(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
      LOWORD(v2) = v1->_406648(v5++);
    while ( (signed int)v5 < v1->uActorQueueSize );
  }
  return v2;
}

//----- (00406648) --------------------------------------------------------
__int16 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) != 4 )
  {
    v4 = v3 >> 3;                               // turn based only stuff
    a2a = dword_4F6E08[v3 >> 3];
    memcpy(&a3, Actor::GetDirectionInfo(v1->uPackedID, dword_4F6E08[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) )
                      {
                        LOWORD(v3) = Actor::_402F87(v4, a2a, &a4);
                        return v3;
                      }
                      v21 = 64;
LABEL_26:
                      LOWORD(v3) = Actor::_403EB6(v15, v16, v21, v23);
                      return v3;
                    }
LABEL_21:
                    v5->uCurrentActionTime = 0;
                    v5->uCurrentActionLength = 0;
                    v5->uAIState = Dead;
                    return pActors[v4].UpdateAnimation();
                  }
                  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;
          }
        }
      }
    }
  }
  return v3;
}
// 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 *)&dword_4F6E08[(int)v4];
        Actor::_401221((unsigned int)v4, &dword_4F6E08[(int)v4], 1u);
        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) == 3 )
          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::_403EB6(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) == 3 )
      {
        v8 = dword_4F6E08[v5 >> 3];
        memcpy(&v7, Actor::GetDirectionInfo(v5, v8, &a3, v2), sizeof(v7));
        if ( !v1->_406D10(a2) )
          Actor::_403EB6(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) == 3 )
      {
        v3 = v2->uPackedID >> 3;
        v8 = v3;
        if ( pActors[v3].CanAct() )
        {
          v4 = v2->uPackedID;
          v9 = dword_4F6E08[v3];
          memcpy(&v6, Actor::GetDirectionInfo(v4, v9, &a3, 0), sizeof(v6));
          Actor::_403EB6(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) != 4 )
      {
        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 = dword_4F6E08[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::_403EB6(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) == 4 )
    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 = &dword_4F6E08[v3];
  v7 = &pTurnEngine->pQueue[a2];
  v8 = *v6;
  v29 = &pTurnEngine->pQueue[a2];
  a2a = v8;
  Actor::_401221(v3, &dword_4F6E08[v3], 1u);
  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::_403EB6(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::_403EB6(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) != 4 )
      {
        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 *)&dword_4F6E08[v4];
                a2 = *v7;
                v8 = a2;
                Actor::_401221(v4, (int *)v7, 1u);
                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::_403EB6(uActorID, a2, 0x40u, &a4);
                  else
                    Actor::_402F87(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 = pLayingItems[v10].vPosition.x;
    v64 = pLayingItems[v10].vPosition.y;
    v11 = pLayingItems[v10].vPosition.z;
    v7 = pLayingItems[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 = pLayingItems[v22].vPosition.x;
    v17 = pLayingItems[v22].vPosition.z;
    v60 = pLayingItems[v22].vPosition.y;
    v19 = pLayingItems[v22].uSectorID;
  }
  v62 = v19;
  v23 = v18 - v63;
  v50 = v17 - v65;
  v24 = sub_452A9E(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 = sub_452A9E(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->field_C + v61)
                    + 2 * *(__int16 *)((char *)&pIndoor->pSectors->uNumFloors + v61);
            ++sDepthb )
      {
        v62 = &pIndoor->pFaces[(*(unsigned __int16 **)((char *)&v60->pWalls + v61))[sDepthb]];
        if ( v62->uAttributes & 1
          || 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 = sub_452A9E(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->field_C + 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->uAttributes & 1
        || 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->field_C + 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 = sub_452A9E(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 = sub_452A9E(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) --------------------------------------------------------
char __cdecl UpdateActors()
{
  unsigned int v0; // edi@1
  __int16 v1; // ax@7
  char *v2; // esi@10
  char v3; // zf@13
  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

  v0 = 0;
  v8 = 0;
  v6 = 0;
  v7 = 0;
  v5 = 0;
  if ( !_strcmpi(pCurrentMapName, "d25.blv") )
    v8 = 1;
  if ( !_strcmpi(pCurrentMapName, "d26.blv") )
    v6 = 1;
  if ( (unsigned __int16)_449B57_test_bit(pParty->_award_bits, 99) )
    v7 = 1;
  v1 = _449B57_test_bit(pParty->_award_bits, 100);
  if ( v1 )
    v5 = 1;
  if ( (signed int)uNumActors > 0 )
  {
    v2 = (char *)&pActors[0].vPosition;
    do
    {
      if ( ((Actor *)(v2 - 142))->CanAct() || *((short *)v2 + 17) == 19 )
      {
        v3 = *((short *)v2 + 17) == 19;
        *(short *)v2 = *((short *)v2 + 10);
        *((short *)v2 + 1) = *((short *)v2 + 11);
        *((short *)v2 + 2) = *((short *)v2 + 12);
        *((short *)v2 - 51) = *((short *)v2 - 17);
        if ( !v3 )
          Actor::_403EB6(v0, dword_4F6E08[v0], *(int *)(v2 - 18), 0);
      }
      *(v2 - 81) = 0;
      LOBYTE(v1) = 0;
      if ( !v8 || v7 )
      {
        if ( !v6 || v5 )
        {
          LOBYTE(v1) = ((Actor *)(v2 - 142))->_438B9B();
          if ( (char)v1 )
            *(v2 - 104) &= 0xF7u;
        }
      }
      *(v2 - 104) &= 0x7Fu;
      if ( *(v2 - 104) & 0x40 )
        LOBYTE(v1) = Actor::_4031C1_update_job(v0, pParty->uCurrentHour, 1);
      ++v0;
      v2 += 836;
    }
    while ( (signed int)v0 < (signed int)uNumActors );
  }
  return v1;
}

//----- (00408896) --------------------------------------------------------
void UpdateLayingItems()
{
  unsigned int v0; // edi@1
  char *v1; // esi@1
  char *result; // eax@7

  v0 = 0;
  v1 = (char *)&pLayingItems[0].uObjectDescID;
  do
  {
    if ( *(short *)v1 && (v1[24] & 8 || pObjectList->pObjects[*(short *)v1].uFlags & 0x10) )
      LayingItem::_42F933(v0);
    v1 += 112;
    ++v0;
  }
  while ( (signed int)v1 < (signed int)((char *)&pObjectList->uNumObjects + 2) );

  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 = sub_452A9E(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->IsAlive() == 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
  char *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 = (char *)&pActors[0].pMonsterInfo.uID;
    do
    {
      v5 = *((int *)v4 - 15);                // actor::attributes
      if ( (v5 & 0x100000) == v8 )
      {
        if ( *(short *)v4 - 1 == v7 )
        {
          ++*v2;
          if ( ((Actor *)(v4 - 96))->IsAlive() == 1 )
            ++v9;
        }
      }
      ++v3;
      v4 += 836;
    }
    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
  char *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 = (char *)&pActors[0].uGroup;
    do
    {
      v5 = *((int *)v4 - 168);
      if ( (v5 & 0x100000) == v8 )
      {
        if ( *(int *)v4 == v7 )
        {
          ++*v2;
          if ( ((Actor *)(v4 - 708))->IsAlive() == 1 )
            ++v9;
        }
      }
      ++v3;
      v4 += 836;
    }
    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].IsAlive() == 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 = ptr_507BC0->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 pGUIWindow0_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 pGUIWindow0->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 ? 72 * uTextureId + 0x6D084C : 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(void *_this)
{
  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
  void *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 = _this;
  v2 = &pSpellStats->pInfos[(signed int)((char *)_this + 11 * v1->pNumSpellBookPage) + 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[431]);
  v13 = pFontSmallnum->GetLineWidth(pGlobalTXT_LocalizationStrings[433]);
  v12 = pFontSmallnum->GetLineWidth(pGlobalTXT_LocalizationStrings[432]);
  v4 = pFontSmallnum->GetLineWidth(pGlobalTXT_LocalizationStrings[96]);
  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[431],
    v5 + 3,
    v5 + 10,
    v2->pBasicSkillDesc,
    pGlobalTXT_LocalizationStrings[433],
    v5 + 3,
    v5 + 10,
    v2->pExpertSkillDesc,
    pGlobalTXT_LocalizationStrings[432],
    v5 + 3,
    v5 + 10,
    v2->pMasterSkillDesc,
    pGlobalTXT_LocalizationStrings[96],
    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.DrawText2(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.DrawText2(pFontComic, 0xCu, 0x4Bu, 0, pSkillNames[v1->pNumSpellBookPage + 12], 3u);
  sprintf(
    pTmpBuf,
    "%s\n%d",
    pGlobalTXT_LocalizationStrings[522],
    *(&pSpellDatas[0].field_14
    + ((unsigned int)LOBYTE(v1->pActiveSkills[v1->pNumSpellBookPage + 12]) >> 6)
    + 10 * (int)((char *)v10 + 11 * v1->pNumSpellBookPage)));
  a1.DrawText2(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.DrawText2(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.DrawText2(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.DrawText2(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;
    }
  }
  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 *)(uTextureID_506438 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_506438] : 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->_award_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.DrawText2(pBook2Font, 0, 22u, 0, pGlobalTXT_LocalizationStrings[10], 3u);
  if ( v3 == 1 )
  {
    v4 = 206;
LABEL_30:
    if ( (unsigned __int16)_449B57_test_bit(pParty->_award_bits, v4) )
      goto LABEL_31;
    return v6.DrawText2(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.DrawText2(pBook2Font, 0, 22u, 0, pGlobalTXT_LocalizationStrings[10], 3u);
}
// 4E1D3A: using guessed type __int16 word_4E1D3A[];

//----- (00411300) --------------------------------------------------------
Texture *__fastcall LoadSpellbook(unsigned int uID)
{
  unsigned int v1; // esi@1
  Player *pPlayer; // ecx@1
  char v3; // al@1
  int v4; // edi@5
  Texture *result; // eax@6
  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 == v1 )
    dword_50654C = (unsigned __int8)v3 - 11 * v1;
  else
    dword_50654C = 0;
  v4 = 1;
  v12 = 1;
  v11 = (Texture *)&pPlayer->field_152[11 * v1 + 63];
  do
  {
    result = v11;
    if ( v11->pName[v4] )
    {
      v6 = &byte_4E2430[12 * v1] + v4;
      sprintf(pContainer, "SB%sS%02d", spellbook_texture_filename_suffices[v1], (unsigned __int8)*v6);
      v7 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE);
      dword_506408[v12] = 72 * v7 + 7145548;
      sprintf(pContainer, "SB%sC%02d", spellbook_texture_filename_suffices[v1], (unsigned __int8)*v6);
      result = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE)];
      dword_5063D8[v12] = result;
    }
    v4 = v12 + 1;
    v9 = __OFSUB__(v12 + 1, 12);
    v8 = v12++ - 11 < 0;
  }
  while ( v8 ^ v9 );
  return result;
}
// 4E1D18: using guessed type char *spellbook_texture_filename_suffices[8];
// 506408: using guessed type int dword_506408[];
// 50654C: using guessed type int dword_50654C;
// 506550: using guessed type char byte_506550;

//----- (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_506404[v0]->Release();
    dword_506434[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 = (Texture *)*((int *)v0 - 1);
    *v1 = 0;
    v2->Release();
    v3 = *(Texture **)v0;
    *((int *)v0 - 1) = 0;
    v3->Release();
    *(int *)v0 = 0;
    ++v1;
    v0 += 8;
  }
  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 = *((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 sub_412B58()
{
  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 *v16; // 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
  int v23[2]; // [sp+10h] [bp-10h]@5
  POINT a2; // [sp+18h] [bp-8h]@13

  sub_412AF9();
  v0 = pPlayers[uActiveCharacter];
  v1 = 11 * v0->pNumSpellBookPage;
  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->field_152[v1 + 63] + v4) )
      {
        v5 = (Texture *)dword_506408[v4];
        if ( v5 != v3 )
        {
          if ( dword_50654C == v4 )
          {
            v6 = dword_5063D8[v4];
            v23[0] = (int)dword_5063D8[v4];
          }
          else
          {
            v23[0] = dword_506408[v4];
            v6 = v5;
          }
          if ( v6->pLevelOfDetail0 )
          {
            v7 = 2 * (12 * v0->pNumSpellBookPage + (unsigned __int8)*(&byte_4E2430[12 * v0->pNumSpellBookPage + v4]));
            v19 = pViewport->uViewportY + dword_4E20D0[v7 + 1];
            v17 = pViewport->uViewportX + dword_4E20D0[v7];
            if ( BYTE1(v6->pBits) & 2 )
              pRenderer->DrawTextureTransparent(v17, v19, v6);
            else
              pRenderer->DrawTextureIndexed(v17, v19, v6);
            v8 = 2 * (12 * v0->pNumSpellBookPage + (unsigned __int8)*(&byte_4E2430[12 * v0->pNumSpellBookPage] + v4));
            pRenderer->_4A612A(dword_4E20D0[v8], dword_4E20D0[v8 + 1], (Texture *)v23[0], v4);
          }
        }
      }
      ++v4;
    }
    while ( v4 + v1 - 1 < v1 + 11 );
  }
  v9 = pMouse->GetCursorPos(&a2);
  v10 = pRenderer->pActiveZBuffer[v9->x + pSRZBufferLineOffsets[pMouse->GetCursorPos((POINT *)v23)->y]] & 0xFFFF;
  if ( v10 )
  {
    v11 = dword_5063D8[v10];
    if ( v11->pLevelOfDetail0 )
    {
      v21 = dword_5063D8[v10];
      v12 = 2 * (12 * v0->pNumSpellBookPage + (unsigned __int8)*(&byte_4E2430[12 * v0->pNumSpellBookPage] + v10));
      v20 = pViewport->uViewportY + dword_4E20D0[v12 + 1];
      v18 = pViewport->uViewportX + dword_4E20D0[v12];
      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];
  v23[0] = 0;
  do
  {
    if ( *(short *)a2.x )
    {
      if ( v0->pNumSpellBookPage == v13 )
      {
        v16 = 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
      {
        v16 = 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, v16);
      v13 = v23[0];
    }
    a2.x += 2;
    ++v13;
    v23[0] = v13;
  }
  while ( v13 < 9 );
}
// 506408: using guessed type int dword_506408[];
// 50654C: using guessed type int dword_50654C;

//----- (00412E85) --------------------------------------------------------
char __cdecl sub_412E85()
{
  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 + dword_506520 >= dword_506524 )
  {
    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 = pStru179->field_0[dword_506528];
    a1.uFrameWidth = 460;
    a1.uFrameX = 8;
    a1.uFrameY = 8;
    a1.uFrameHeight = 344;
    v3 = (const char *)pStorylineText->field_4[3 * v2];
    a1.uFrameZ = 467;
    a1.uFrameW = 351;
    if ( v3 )
      a1.DrawText2(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 + dword_506520 < dword_506524 )
  {
    pAudioPlayer->PlaySound((SoundID)230, 0, 0, -1, 0, 0, 0, 0);
    v5 = dword_50651C++;
    dword_506528 += dword_506520;
    byte_506130[v5] = dword_506520;
  }
  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 ( !dword_506520 || dword_506528 < 1 )
  {
    dword_506528 = 0;
    dword_50651C = 0;
  }
  dword_506544 = 0;
  v6 = pStru179->field_0[dword_506528];
  dword_506548 = 0;
  dword_506520 = 0;
  v7 = *(&pStorylineText->field_0 + 3 * v6);
  v8 = sub_495461(
         *((char **)&pStorylineText->field_0 + 3 * v6),
         uActiveCharacter - 1,
         0,
         0,
         0,
         (__int64 *)&pParty->field_3C.field_440[2 * v6 + 42]);
  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);
    ++dword_506520;
  }
  return (char)v8;
}


//----- (00413126) --------------------------------------------------------
void __cdecl DrawSpellbook_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 + dword_506520 >= dword_506524 )
  {
    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.DrawText2(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 + dword_506520 < dword_506524 )
  {
    pAudioPlayer->PlaySound((SoundID)230, 0, 0, -1, 0, 0, 0, 0);
    v2 = dword_50651C++;
    dword_506528 += dword_506520;
    byte_506130[v2] = dword_506520;
  }
  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 ( !dword_506520 || (v3 = dword_506528, dword_506528 < 1) )
  {
    v3 = 0;
    dword_50651C = 0;
    dword_506528 = 0;
  }
  dword_506544 = 0;
  dword_506548 = 0;
  dword_506520 = 0;
  while ( v3 < dword_506524 )
  {
    v4 = pStru179->field_0[v3];
    ++dword_506520;
    v5 = (&dword_722F10)[4 * v4];
    a1.DrawText(pAutonoteFont, 1, 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(0x64u, v7 + 12, pTextures_5064A0[10]);
    ++v3;
    a1.uFrameY = v7 + 24;
  }
}


//----- (0041338E) --------------------------------------------------------
void __cdecl DrawSpellbook_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 + dword_506520 >= dword_506524 )
  {
    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((SoundID)75, 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((SoundID)75, 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((SoundID)75, 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((SoundID)75, 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((SoundID)75, 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((SoundID)75, 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.DrawText2(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 )
  {
    dword_506524 = 0;
    dword_506528 = 0;
    dword_50651C = 0;
    dword_506520 = 0;
    v8 = 0;
    do
    {
      if ( dword_72371C[2 * v8] == dword_506568 )
      {
        v32 = (&dword_723718_autonote_related)[8 * (signed __int16)v8];
        if ( (short)v8 )
        {
          if ( (unsigned __int16)_449B57_test_bit(pParty->_autonote_bits, v8) && v32 )
          {
            v9 = dword_506520++;
            pStru179->field_0[v9] = (signed __int16)v8;
          }
        }
      }
      ++v8;
    }
    while ( v8 < 196 );
    dword_506524 = dword_506520;
  }
  else
  {
    if ( dword_506544 )
    {
      v10 = dword_506520 + dword_506528;
      if ( dword_506520 + dword_506528 < dword_506524 )
      {
        v11 = dword_50651C++;
        byte_506130[v11] = dword_506520;
        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 ( !dword_506520 || dword_506528 < 1 )
    {
      dword_506528 = 0;
      dword_50651C = 0;
    }
  }
  v12 = dword_506528;
  dword_50652C = 0;
  dword_506544 = 0;
  dword_506548 = 0;
  dword_506520 = 0;
  dword_506530 = 0;
  dword_506534 = 0;
  dword_506538 = 0;
  dword_50653C = 0;
  dword_506540 = 0;
  while ( v12 < dword_506524 )
  {
    v13 = pStru179->field_0[v12];
    ++dword_506520;
    v14 = (&dword_723718_autonote_related)[8 * v13];
    a1.DrawText(pAutonoteFont, 1, 0, 0, (&dword_723718_autonote_related)[8 * v13], 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 DrawSpellbook_Map()
{
  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 | v6 )
    pAudioPlayer->PlaySound((SoundID)75, 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;
  DrawSpellbook_Map_sub(0x61u, 0x31u, 0x169u, 313, 0);
  pRenderer->DrawTextureTransparent(0x4Bu, 0x16u, 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.DrawText2(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.DrawText2(pFontComic, 0, 0x140u, 0, Str, 0);
}


//----- (00413CC6) --------------------------------------------------------
void __thiscall DrawSpellbook(unsigned int uBook)
{
  unsigned int v1; // esi@1

  v1 = uBook;
  pRenderer->DrawTextureIndexed(
    471u,
    445u,
    (Texture *)(uTextureID_506438 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_506438] : 0));
  switch ( v1 )
  {
    case 0xB1u:
      DrawLloydBeaconsScreen();
      break;
    case 0xC3u:
      DrawTownPortalScreen();
      break;
    case 0xC8u:
      DrawSpellbook_Quests();
      break;
    case 0xC9u:
      DrawSpellbook_Autonotes();
      break;
    case 0xCAu:
      DrawSpellbook_Map();
      break;
    case 0xCBu:
      DrawSpellbook_Calendar();
      break;
    case 0xE0u:
      sub_412E85();
      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 DrawSpellbook_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.DrawText2(pBook2Font, 0, 0x16u, 0, pGlobalTXT_LocalizationStrings[186], 3u);
  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 = 22;
  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;
  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(word_506E6C, 0, 0x1Cu);
    v4 = 0;
    do
    {
      v5 = 0;
      do
      {
        if ( v4 != v5 && pPrevVirtualCidesMapping[v4] == pPrevVirtualCidesMapping[v5] )
        {
          *((char *)word_506E6C + v4) = 1;
          *((char *)word_506E6C + v5) = 1;
        }
        ++v5;
      }
      while ( v5 < 28 );
      ++v4;
    }
    while ( v4 < 28 );
    dword_506E68 = -1;
    v3->field_40 = 0;
  }
  pRenderer->DrawTextureIndexed(
    8u,
    8u,
    (Texture *)(uTextureID_507BF4 != -1 ? &pIcons_LOD->pTextures[uTextureID_507BF4] : 0));
  if ( dword_506F08 == 1 )
  {
    pRenderer->DrawTextureIndexed(
      0x13u,
      0x12Eu,
      (Texture *)(uTextureID_507C00 != -1 ? &pIcons_LOD->pTextures[uTextureID_507C00] : 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(
      0x7Fu,
      0x12Eu,
      (Texture *)(uTextureID_507C04 != -1 ? &pIcons_LOD->pTextures[uTextureID_507C04] : 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 ( *((char *)word_506E6C + 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.DrawText2(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 & 0x20 )
    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 sub_414F82_DrawGameOptions()
{
  signed int v0; // eax@1

  pRenderer->DrawTextureIndexed(
    8u,
    8u,
    (Texture *)(uTextureID_507944 != -1 ? &pIcons_LOD->pTextures[uTextureID_507944] : 0));
  pRenderer->DrawTextureIndexed(
    8u,
    0x84u,
    (Texture *)(uTextureID_507C60 != -1 ? &pIcons_LOD->pTextures[uTextureID_507C60] : 0));
  v0 = 0;
  if ( uTurnSpeed == 128 )
  {
    v0 = 2;
  }
  else
  {
    if ( uTurnSpeed == 64 )
      v0 = 1;
  }
  pRenderer->DrawTextureIndexed(
    dword_4E2910[v0],
    0x10Eu,
    (Texture *)(uTextureID_507C64[v0] != -1 ? &pIcons_LOD->pTextures[uTextureID_507C64[v0]] : 0));
  if ( bWalkSound )
    pRenderer->DrawTextureIndexed(
      0x14u,
      0x12Fu,
      (Texture *)(uTextureID_507CB4 != -1 ? &pIcons_LOD->pTextures[uTextureID_507CB4] : 0));
  if ( bShowDamage )
    pRenderer->DrawTextureIndexed(
      0x80u,
      0x12Fu,
      (Texture *)(uTextureID_507CB8 != -1 ? &pIcons_LOD->pTextures[uTextureID_507CB8] : 0));
  if ( bFlipOnExit )
    pRenderer->DrawTextureIndexed(
      0x80u,
      0x145u,
      (Texture *)(uTextureID_507C84 != -1 ? &pIcons_LOD->pTextures[uTextureID_507C84] : 0));
  if ( bAlwaysRun )
    pRenderer->DrawTextureIndexed(
      0x14u,
      0x145u,
      (Texture *)(uTextureID_507CB0 != -1 ? &pIcons_LOD->pTextures[uTextureID_507CB0] : 0));
  pRenderer->DrawTextureIndexed(
    17 * (char)uSoundVolumeMultiplier + 265,
    0xA2u,
    (Texture *)(pTextureIDs_SoundLevels[(char)uSoundVolumeMultiplier] != -1 ? &pIcons_LOD->pTextures[pTextureIDs_SoundLevels[(char)uSoundVolumeMultiplier]] : 0));
  pRenderer->DrawTextureIndexed(
    17 * (char)uMusicVolimeMultiplier + 265,
    0xD8u,
    (Texture *)(pTextureIDs_SoundLevels[(char)uMusicVolimeMultiplier] != -1 ? &pIcons_LOD->pTextures[pTextureIDs_SoundLevels[(char)uMusicVolimeMultiplier]] : 0));
  pRenderer->DrawTextureIndexed(
    17 * (char)uVoicesVolumeMultiplier + 265,
    0x10Eu,
    (Texture *)(pTextureIDs_SoundLevels[(char)uVoicesVolumeMultiplier] != -1 ? &pIcons_LOD->pTextures[pTextureIDs_SoundLevels[(char)uVoicesVolumeMultiplier]] : 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) --------------------------------------------------------
char *__cdecl 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;
  return Dst.DrawText2(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 *v21; // edx@66
  GUIButton *v22; // ebp@79
  char *v23; // edx@80
  char v24; // zf@81
  unsigned int v25; // eax@91
  int v26; // eax@98
  unsigned int v27; // ebp@106
  GUIWindow *v28; // ecx@109
  unsigned int v29; // eax@111
  GUIFont *v30; // 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 v41; // eax@142
  GUIButton *v42; // ebp@146
  char *v43; // edx@146
  unsigned int v44; // [sp-1Ch] [bp-124h]@17
  unsigned int v45; // [sp-18h] [bp-120h]@17
  Texture *v46; // [sp-14h] [bp-11Ch]@17
  Texture *v47; // [sp-14h] [bp-11Ch]@86
  int i; // [sp+0h] [bp-108h]@3
  ItemGen _this; // [sp+4h] [bp-104h]@98
  GUIButton Dst; // [sp+28h] [bp-E0h]@133
  ItemGen v51; // [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();
        continue;

      case WINDOW_5E: // window that initiates savegame loading
      {
        if (pWindow->Hint != (char *)1)
          pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0);
        auto v20 = (GUIButton *)pWindow->ptr_1C;
        pRenderer->DrawTextureIndexed(pWindow->uFrameX, pWindow->uFrameY, v20->pTextures[0]);
        v21 = pWindow->Hint;
        viewparams->bRedrawGameUI = 1;
        if ( v21 && v21 != (char *)1 )
          v20->DrawLabel(v21, pFontCreate, 0, 0);
        pWindow->Release();
        if (pCurrentScreen == 11)
          pMessageQueue_50CBD0->SendMessage(UIMSG_SaveGame, 0, 0);
        else
          pMessageQueue_50CBD0->SendMessage(UIMSG_LoadGame, 0, 0);
      }
      continue;
    }


    if ( (signed int)pWindowType > 70 )
    {
      if ( (signed int)pWindowType > 95 )
      {
        v33 = pWindowType - 96;
        if ( !v33 )
        {
          if ( pWindow->Hint != (char *)1 )
            pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0);
          v42 = (GUIButton *)pWindow->ptr_1C;
          pRenderer->DrawTextureIndexed(pWindow->uFrameX, pWindow->uFrameY, v42->pTextures[0]);
          v43 = pWindow->Hint;
          viewparams->bRedrawGameUI = 1;
          if ( v43 && v43 != (char *)1 )
            v42->DrawLabel(v43, pFontCreate, 0, 0);
          pWindow->Release();
          if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 )
            continue;
          v41 = pMessageQueue_50CBD0->uNumMessages;
LABEL_151:
          pMessageQueue_50CBD0->pMessages[v41].eType = (UIMessageType)113;
LABEL_152:
          pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0;
          *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0;
          ++pMessageQueue_50CBD0->uNumMessages;
          continue;
        }
        v34 = v33 - 1;
        if ( v34 )
        {
          v35 = v34 - 1;
          if ( v35 )
          {
            v36 = v35 - 1;
            if ( v36 )
            {
              v37 = v36 - 4;
              if ( v37 )
              {
                v38 = v37 - 2;
                if ( v38 )
                {
                  if ( v38 == 1 )
                    GameMenuUI_DrawVideoOptions();
                }
                else
                {
                  GameMenuUI_DrawKeyBindings();
                }
              }
              else
              {
                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 )
                {
                  v51.Reset();
                  pWindow->Release();
                  pEventTimer->Resume();
                  pCurrentScreen = 0;
                  viewparams->bRedrawGameUI = 1;
                  v39 = atoi((const char *)pKeyActionMap->pPressedKeysBuffer);
                  if ( v39 > 0 )
                  {
                    if ( v39 < 800 )
                      SpawnActor(v39);
                  }
                }
              }
              continue;
            }
            v46 = (Texture *)*((_DWORD *)pWindow->ptr_1C + 15);
            v45 = pWindow->uFrameY;
            v44 = pWindow->uFrameX;
LABEL_18:
            pRenderer->DrawTextureIndexed(v44, v45, v46);
LABEL_114:
            viewparams->bRedrawGameUI = 1;
            continue;
          }
          memset(&Dst, 0, 0xBCu);
          Dst.uZ = 197;
          Dst.uW = 197;
          Dst.uX = 27;
          Dst.uY = 161;
          Dst.uWidth = 171;
          Dst.uHeight = 37;
          Dst.pParent = pButton_RestUI_WaitUntilDawn->pParent;
          pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0);
          pRenderer->DrawTextureIndexed(pWindow->uFrameX, pWindow->uFrameY, *((Texture **)pWindow->ptr_1C + 15));
          viewparams->bRedrawGameUI = 1;
          Dst.DrawLabel(pGlobalTXT_LocalizationStrings[183], pFontCreate, 0, 0);
          Dst.pParent = 0;
          goto LABEL_134;
        }
        if ( pWindow->Hint != (char *)1 )
          pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0);
        v32 = pWindow->ptr_1C;
        pRenderer->DrawTextureIndexed(pWindow->uFrameX, pWindow->uFrameY, *((Texture **)v32 + 16));
        goto LABEL_138;
      }
      if ( pWindowType == 95 )
      {
        if ( pWindow->Hint != (char *)1 )
          pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0);
        v32 = pWindow->ptr_1C;
        pRenderer->DrawTextureTransparent(pWindow->uFrameX, pWindow->uFrameY, *((Texture **)v32 + 15));
LABEL_138:
        v40 = pWindow->Hint;
        viewparams->bRedrawGameUI = 1;
        if ( v40 && v40 != (char *)1 )
          ((GUIButton *)v32)->DrawLabel(v40, pFontCreate, 0, 0);
        pWindow->Release();
LABEL_142:
        v41 = pMessageQueue_50CBD0->uNumMessages;
        if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 )
          goto LABEL_151;
        continue;
      }
      v14 = pWindowType - 80;
      if ( v14 )
      {
        v15 = v14 - 9;
        if ( !v15 )
        {
          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 )
          {
            _this.Reset();
            pWindow->Release();
            pEventTimer->Resume();
            pCurrentScreen = 0;
            viewparams->bRedrawGameUI = 1;
            v26 = atoi((const char *)pKeyActionMap->pPressedKeysBuffer);
            if ( v26 > 0 )
            {
              if ( v26 < 800 )
              {
                _this.uAttributes |= 1u;
                _this.uItemID = v26;
                if ( pItemsTable->pItems[v26].uEquipType == 12 )
                {
                  _this.uNumCharges = rand() % 6 + pItemsTable->pItems[_this.uItemID].uDamageMod + 1;
                  _this.uMaxCharges = LOBYTE(_this.uNumCharges);
                }
                else
                {
                  if ( v26 >= 221 && v26 < 271 )
                    _this._bonus_type = rand() % 10 + 1;
                }
                pItemsTable->SetSpecialBonus(&_this);
                pParty->SetHoldingItem(&_this);
              }
            }
          }
          continue;
        }
        v16 = v15 - 1;
        if ( !v16 )
        {
          if ( pWindow->Hint != (char *)1 )
            pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0);
          v22 = (GUIButton *)pWindow->ptr_1C;
          if ( (v22->uX & 0x80000000u) == 0 )
          {
            if ( (signed int)v22->uX <= 640 )
            {
              v25 = v22->uY;
              if ( (v25 & 0x80000000u) == 0 )
              {
                if ( (signed int)v25 <= 480 )
                {
                  v47 = v22->pTextures[0];
                  goto LABEL_94;
                }
              }
            }
          }
          v23 = pWindow->Hint;
          viewparams->bRedrawGameUI = 1;
          if ( v23 )
          {
            v24 = v23 == (char *)1;
            goto LABEL_82;
          }
LABEL_134:
          v28 = pWindow;
          goto LABEL_110;
        }
        v17 = v16 - 1;
        if ( !v17 )
        {
          if ( pWindow->Hint != (char *)1 )
            pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0);
          v22 = (GUIButton *)pWindow->ptr_1C;
          v47 = v22->pTextures[1];
LABEL_94:
          pRenderer->DrawTextureIndexed(pWindow->uFrameX, pWindow->uFrameY, v47);
LABEL_80:
          v23 = pWindow->Hint;
          viewparams->bRedrawGameUI = 1;
          if ( v23 )
          {
            v24 = v23 == (char *)1;
LABEL_82:
            if ( !v24 )
              v22->DrawLabel(v23, pFontCreate, 0, 0);
          }
          goto LABEL_134;
        }
        v18 = v17 - 1;
        if ( !v18 )
        {
          if ( pWindow->Hint != (char *)1 )
            pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0);
          v22 = (GUIButton *)pWindow->ptr_1C;
          pRenderer->DrawTextureTransparent(pWindow->uFrameX, pWindow->uFrameY, v22->pTextures[0]);
          goto LABEL_80;
        }
        v19 = v18 - 1;
        if ( !v19 )
        {
          if ( pWindow->Hint != (char *)1 )
            pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0);
          pRenderer->DrawTextureTransparent(pWindow->uFrameX, pWindow->uFrameY, *((Texture **)pWindow->ptr_1C + 16));
          viewparams->bRedrawGameUI = 1;
          goto LABEL_134;
        }
      }
      else
      {
        v27 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu);
        if ( ptr_507BD0->field_40 == 1 )
        {
          ptr_507BD0->DrawMessageBox(0);
          ptr_507BD0->DrawText(
            pFontCreate,
            30,
            40,
            v27,
            (const char *)pKeyActionMap->pPressedKeysBuffer,
            0,
            0,
            0);
          v30 = pFontCreate;
          v31 = pFontCreate->GetLineWidth((const char *)pKeyActionMap->pPressedKeysBuffer);
          ptr_507BD0->DrawFlashingInputCursor(v31 + 30, 40, v30);
          continue;
        }
        if ( ptr_507BD0->field_40 == 2 )
        {
          v29 = pMessageQueue_50CBD0->uNumMessages;
          pWindow->field_40 = 0;
          if ( (signed int)v29 < 40 )
          {
            pMessageQueue_50CBD0->pMessages[v29].eType = (UIMessageType)(int)ptr_507BD0->ptr_1C;
            pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0;
            *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0;
            ++pMessageQueue_50CBD0->uNumMessages;
          }
          pEventTimer->Resume();
          ptr_507BD0->Release();
          pCurrentScreen = 0;
          goto LABEL_114;
        }
        if ( ptr_507BD0->field_40 == 3 )
        {
          pWindow->field_40 = 0;
          pEventTimer->Resume();
          v28 = ptr_507BD0;
LABEL_110:
          v28->Release();
          continue;
        }
      }
    }
    else
    {
      if ( pWindowType == 70 )
      {
        sub_41420D_press_esc();
        continue;
      }
      if ( (signed int)pWindowType > 18 )
      {
        if ( (signed int)pWindowType > 25 )
        {
          v12 = pWindowType - 26;
          if ( v12 )
          {
            v13 = v12 - 4;
            if ( v13 )
            {
              if ( v13 == 1 )
              {
                pRenderer->ClearZBuffer(0, 479);
                draw_leather();
                CharacterUI_InventoryTab_Draw(uActiveCharacter, 1);
                CharacterUI_DrawPaperdoll(uActiveCharacter);
                pRenderer->DrawTextureTransparent(
                  ptr_5076F4->uX,
                  ptr_5076F4->uY,
                  (Texture *)(uTextureID_x_x_u != -1 ? &pIcons_LOD->pTextures[uTextureID_x_x_u] : 0));
              }
            }
            else
            {
              sub_467FB6();
            }
          }
          else
          {
            TransitionUI_Draw();
          }
          continue;
        }
        if ( pWindowType != 25 )
        {
          v7 = pWindowType - 19;
          if ( v7 )
          {
            v8 = v7 - 1;
            if ( v8 )
            {
              v9 = v8 - 3;
              if ( v9 )
              {
                //if ( v9 == 1 )
                //  sub_4606F7();
              }
              else
              {
                sub_4606FE();
              }
            }
            else
            {
              if ( pCurrentScreen == 10 )
              {
                Chest::DrawChestUI((unsigned int)pWindow->ptr_1C);
              }
              else
              {
                if ( pCurrentScreen == 15 )
                {
                  pRenderer->ClearZBuffer(0, 479);
                  draw_leather();
                  CharacterUI_InventoryTab_Draw(uActiveCharacter, 1);
                  pRenderer->DrawTextureIndexed(
                    ptr_5076F4->uX,
                    ptr_5076F4->uY,
                    (Texture *)(uTextureID_506438 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_506438] : 0));
                }
              }
            }
          }
          else
          {
            DrawBranchlessDialogueUI();
          }
          continue;
        }
        pWindowList[pVisibleWindowsIdxs[i] - 1]._4B3157();
        if ( !ptr_507BC0 )
          continue;
        v10 = ptr_507BC0->ptr_1C;
        if ( (signed int)v10 >= 53 )
          continue;
        v11 = pParty->field_3C._shop_ban_times[2 * (_DWORD)v10 + 1];
        if ( !__PAIR__(v11, pParty->field_3C._shop_ban_times[2 * (_DWORD)v10])
          || v11 < SHIDWORD(pParty->uTimePlayed)
          || v11 <= SHIDWORD(pParty->uTimePlayed)
          && (unsigned int)pParty->field_3C._shop_ban_times[2 * (_DWORD)v10] <= LODWORD(pParty->uTimePlayed) )
        {
          if ( (signed int)v10 < 53 )
          {
            pParty->field_3C._shop_ban_times[2 * (_DWORD)v10] = 0;
            pParty->field_3C._shop_ban_times[2 * (_DWORD)v10 + 1] = 0;
          }
          continue;
        }
        goto LABEL_142;
      }
      if ( pWindowType == 18 )
      {
        sub_412B58();
      }
      else
      {
        if ( (signed int)pWindowType > 10 )
        {
          v5 = pWindowType - 12;
          if ( v5 )
          {
            v6 = v5 - 4;
            if ( v6 )
            {
              if ( v6 == 1 )
                TravelUI_Draw();
            }
            else
            {
              RestUI_Draw();
            }
          }
          else
          {
            QuickRefDraw();
          }
          continue;
        }
        if ( pWindowType != 10 )
        {
          v2 = pWindowType - 3;
          if ( v2 )
          {
            v3 = v2 - 1;
            if ( v3 )
            {
              v4 = v3 - 2;
              if ( v4 )
              {
                if ( v4 == 3 )
                  DrawSpellbook((unsigned int)pWindow->ptr_1C);
              }
              else
              {
                sub_414F82_DrawGameOptions();
              }
            }
            else
            {
              CharacterUI_CharacterScreen_Draw(uActiveCharacter);
            }
            continue;
          }
          v46 = (Texture *)(uTextureID_507944 != -1 ? &pIcons_LOD->pTextures[uTextureID_507944] : 0);
          v45 = pViewport->uViewportY;
          v44 = pViewport->uViewportX;
          goto LABEL_18;
        }
        DrawDialogueUI();
      }
    }
  }
  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._bonus_type);
      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->uAdditionalValue
              || v27->_bonus_type
              || 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->uAdditionalValue = 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->uAdditionalValue
              || v27->_bonus_type
              || v51 && v51 != 1 && v51 != 2
              || (signed int)v30 >= 500 )
              goto LABEL_92;
            a2.y = (int)v29 << 7;
            v27->uAdditionalValue = 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._bonus_type) * 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);
      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]._bonus_type = (pParty->pPickedItem._bonus_type
                                                       + v0->pInventoryItems[pOut.z]._bonus_type)
                                                      / 2;
              v0->SetVariable(VAR_AutoNotes, *(short *)&pItemsTable->field_10168[2 * v20 + 388]);
LABEL_74:
              v22 = (int)((char *)v0 + 36 * pOut.z);
              if ( !BYTE2(pItemsTable->pItems[*(int *)(v22 + 532) + 1].uItemID) )
                *(int *)(v22 + 552) |= 1u;
              if ( !dword_4E455C )
                goto LABEL_92;
              v0->PlaySound(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._bonus_type;
              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);
      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(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(16, 0);
    dword_4E455C = 0;
  }
}


//----- (00416B01) --------------------------------------------------------
void __thiscall sub_416B01(void *_this)
{
  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 );
    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 );
    }
    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->field_13A5C + 5 * v5->uProfession);
        lpsz = v7;
        if ( !v7 )
        {
          lpsz = (LPCSTR)*(&pNPCStats->field_13A64 + 5 * v6->uProfession);
          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;
          sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[429], v10, aNPCProfessionNames[v9]);
        }
        else
        {
          v12 = v6->pName;
          v11 = pTmpBuf;
          strcpy(pTmpBuf, v12);
        }
        v13 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu);
        a1.DrawText2(pFontArrus, 0, 0xCu, v13, v11, 3u);
        a1.uFrameWidth -= 24;
        a1.uFrameZ = a1.uFrameX + a1.uFrameWidth - 1;
        v14 = sub_495461((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 v1; // 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 *v12; // esi@84
  unsigned int v13; // ecx@85
  char *v14; // edi@85
  signed int v15; // eax@92
  int v16; // eax@95
  int v17; // eax@96
  enum PLAYER_SKILL_TYPE v18; // eax@98
  char *v19; // eax@99
  unsigned int v20; // eax@108
  unsigned int v21; // eax@109
  const char *v22; // eax@111
  char *v23; // ebx@112
  char *v24; // edx@113
  unsigned int v25; // eax@113
  GUIWindow a1; // [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 == 16 )
    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
    {
      if ( (signed int)pX > word_4E2930[v1]
        && (signed int)pX < word_4E2938[v1]
        && (signed int)pY > 375
        && (signed int)pY < 466 )
      {
        pPlayers[uActiveCharacter]->UseItem_DrinkPotion_etc(v1 + 1, 1);
        return;
      }
      ++v1;
    }
    while ( v1 < 4 );
  }
  pEventTimer->Pause();
  if ( pCurrentScreen <= 10 )
  {
    if ( pCurrentScreen == 10 )
    {
      __debugbreak();
      if ( !pPlayers[uActiveCharacter]->CanAct() )
      {
        sprintf(
          pTmpBuf,
          pGlobalTXT_LocalizationStrings[427],
          pPlayers[uActiveCharacter]->pName,
          pGlobalTXT_LocalizationStrings[541]);
        a1.Hint = pTmpBuf;
        a1.uFrameWidth = 384;
        a1.uFrameHeight = 180;
        a1.uFrameY = 40;
        if ( (signed int)pX <= 320 )
          v10 = pX + 30;
        else
          v10 = pX - 414;
        a1.uFrameX = v10;
        goto LABEL_42;
      }
      v9 = pX + pSRZBufferLineOffsets[pY];
      if ( !(pRenderer->pActiveZBuffer[v9] & 0xFFFF) )
        goto LABEL_132;
      v8 = (ItemGen *)(&pOtherOverlayList->pOverlays[49].field_4
                     + 2662 * (unsigned int)ptr_507BB8->ptr_1C
                     + 18
                     * *((short *)&pChests[0].mm7__vector_pItems[139].uExpireTime
                       + (pRenderer->pActiveZBuffer[v9] & 0xFFFF)
                       + 2662 * (unsigned int)ptr_507BB8->ptr_1C
                       + 3));
    }
    else
    {
      if ( pCurrentScreen )
      {
        if ( pCurrentScreen != 3 )
        {
          if ( pCurrentScreen != 7 )
          {
            if ( pCurrentScreen == 8 )
            {
              if ( dword_507B00_spell_info_to_draw_in_popup )
                DrawSpellDescriptionPopup((void *)(dword_507B00_spell_info_to_draw_in_popup - 1));
            }
            goto LABEL_132;
          }
LABEL_119:
          if ( (signed int)pX > 467
            && pCurrentScreen != 14 )
          {
LABEL_126:
            identify_item();
            goto LABEL_132;
          }
          if ( (signed int)pY >= 345 )
            goto LABEL_132;
          if ( pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] == 100 )
          {
            CharacterUI_StatsTab_ShowHint();
            goto LABEL_132;
          }
          if ( pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] == 101 )
          {
            CharacterUI_SkillsTab_ShowHint();
            goto LABEL_132;
          }
          v11 = pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] == 103;
LABEL_125:
          if ( !v11 )
            goto LABEL_132;
          goto LABEL_126;
        }
        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(), (a1.Hint = v2) == 0) )
          goto LABEL_132;
        v30 = (double)(pFontArrus->GetLineWidth(v2) + 32);
        v27 = v30 + 6.7553994e15;
        v29 = (char *)LODWORD(v27);
        a1.uFrameWidth = LODWORD(v27);
        a1.uFrameX = pX + 5;
        a1.uFrameY = pY + 5;
        goto LABEL_41;
      }
      if (GetCurrentMenuID() > 0)
        goto LABEL_132;

      if ( (signed int)pY > (signed int)pViewport->uViewportW )
      {
        a1.ptr_1C = (void *)((signed int)pX / 118);
        if ( (signed int)pX / 118 < 4 )
        {
          a1.Hint = 0;
          a1.uFrameWidth = 400;
          a1.uFrameHeight = 200;
          a1.uFrameX = 38;
          a1.uFrameY = 60;
          pAudioPlayer->StopChannels(-1, -1);
          a1.DrawQuickCharRecord();
        }
        goto LABEL_132;
      }
      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 )
          {
            a1.Hint = 0;
            a1.uFrameWidth = 400;
            a1.uFrameHeight = 200;
            a1.uFrameX = 38;
            a1.uFrameY = 60;
            pAudioPlayer->StopChannels(-1, -1);
            a1._41D73D_draw_buff_tooltip();
            goto LABEL_132;
          }
          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 )
              goto LABEL_132;
            pAudioPlayer->StopChannels(-1, -1);
            v3 = (void *)1;
          }
          else
          {
            pAudioPlayer->StopChannels(-1, -1);
            v3 = 0;
          }
          sub_416B01(v3);
          goto LABEL_132;
        }
        a1.Hint = _4443D5_GetMinimapRightClickText();
        a1.uFrameWidth = 256;
        a1.uFrameX = 130;
        a1.uFrameY = 140;
LABEL_41:
        a1.uFrameHeight = 64;
        pAudioPlayer->StopChannels(-1, -1);
LABEL_42:
        a1.DrawMessageBox(0);
        goto LABEL_132;
      }
      a1.Hint = 0;
      a1.uFrameWidth = 320;
      a1.uFrameHeight = 320;
      v4 = pX - 350;
      if ( (signed int)pX <= 320 )
        v4 = pX + 30;
      a1.uFrameX = v4;
      a1.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) != 2 )
      {
        if ( (v6 & 7) == 3 )
        {
          if ( pRenderer->uNumSceneBegins )
          {
            a1.DrawMessageBox(1);
            MonsterPopup_Draw(v6 >> 3, &a1);
          }
          else
          {
            pRenderer->BeginScene();
            a1.DrawMessageBox(1);
            MonsterPopup_Draw(v6 >> 3, &a1);
            pRenderer->EndScene();
          }
        }
        goto LABEL_132;
      }
      v7 = v6 >> 3;
      if ( pObjectList->pObjects[pLayingItems[v7].uObjectDescID].uFlags & 0x10 )
        goto LABEL_132;
      v8 = &pLayingItems[v7].stru_24;
    }
    GameUI_DrawItemInfo(v8);
    goto LABEL_132;
  }
  if ( pCurrentScreen == 13 )
  {
    if ( (signed int)pY < 345 && (signed int)pX < 469 )
      sub_4B1A2D();
    goto LABEL_132;
  }
  if ( pCurrentScreen <= 13 )
    goto LABEL_132;
  if ( pCurrentScreen <= 15 )
    goto LABEL_119;
  if ( pCurrentScreen != 21 )
  {
    v11 = pCurrentScreen == 23;
    goto LABEL_125;
  }
  a1.Hint = 0;
  v12 = pGUIWindow_CurrentMenu->pControlsHead;
  if ( !v12 )
    goto LABEL_132;
  v13 = pY;
  v14 = v29;
  while ( 1 )
  {
    if ( v12->uButtonType != 1 && v12->uButtonType != 3
      || (signed int)pX < (signed int)v12->uX
      || (signed int)pX > (signed int)v12->uZ
      || (signed int)v13 < (signed int)v12->uY
      || (signed int)v13 > (signed int)v12->uW )
      goto LABEL_117;
    v15 = v12->uControlID;
    if ( v15 <= 65 )
    {
      if ( v15 == 65 )
      {
        a1.Hint = pClassDescriptions[v12->uControlParam];
        v14 = pClassNames[v12->uControlParam];
      }
      else
      {
        if ( v15 )
        {
          v16 = v15 - 62;
          if ( v16 )
          {
            v17 = v16 - 1;
            if ( v17 )
            {
              if ( v17 == 1 )
              {
                v18 = pParty->pPlayers[uPlayerCreationUI_SelectedCharacter].GetSkillIdxByOrder(
                        v12->uControlParam + 4);
                v14 = pSkillNames[v18];
                a1.Hint = pSkillDesc[v18];
                v13 = pY;
              }
              goto LABEL_117;
            }
            v14 = pGlobalTXT_LocalizationStrings[668];
            v19 = pGlobalTXT_LocalizationStrings[669];
          }
          else
          {
            v14 = pGlobalTXT_LocalizationStrings[670];
            v19 = pGlobalTXT_LocalizationStrings[671];
          }
          goto LABEL_116;
        }
        a1.Hint = pAttributeDescriptions[(signed int)v12->uControlParam % 7];
        v14 = aAttributeNames[(signed int)v12->uControlParam % 7];
      }
      goto LABEL_117;
    }
    if ( v15 == 66 )
    {
      v19 = pGlobalTXT_LocalizationStrings[664];
      v14 = pGlobalTXT_LocalizationStrings[665];
      goto LABEL_116;
    }
    if ( v15 == 67 )
    {
      v19 = pGlobalTXT_LocalizationStrings[666];
      v14 = pGlobalTXT_LocalizationStrings[667];
      goto LABEL_116;
    }
    if ( v15 > 71 )
      break;
LABEL_117:
    v12 = v12->pNext;
    if ( !v12 )
      goto LABEL_112;
  }
  if ( v15 > 75 )
  {
    if ( v15 == 118 )
    {
      v20 = v12->uControlParam;
      v14 = pParty->pPlayers[v20].pName;
      v19 = pClassDescriptions[pParty->pPlayers[v20].uClass];
LABEL_116:
      a1.Hint = v19;
      goto LABEL_117;
    }
    goto LABEL_117;
  }
  v21 = pParty->pPlayers[v12->uControlParam].GetSkillIdxByOrder(v15 - 72);
  v13 = v21;
  pY = v21;
  if ( (v21 & 0x80000000u) != 0 || (signed int)v21 >= 37 )
    goto LABEL_117;
  v22 = CharacterUI_GetSkillDescText(v12->uControlParam, (enum PLAYER_SKILL_TYPE)v21);
  strcpy(pTmpBuf2, v22);
  a1.Hint = pTmpBuf2;
  v14 = pSkillNames[pY];
LABEL_112:
  v23 = a1.Hint;
  if ( a1.Hint )
  {
    v24 = a1.Hint;
    a1.Hint = 0;
    a1.uFrameWidth = 384;
    a1.uFrameHeight = 256;
    a1.uFrameX = 128;
    a1.uFrameY = 40;
    a1.uFrameHeight = pFontSmallnum->CalcTextHeight(v24, &a1, 24, 0)
                    + 2 * LOBYTE(pFontLucida->uFontHeight)
                    + 24;
    a1.uFrameZ = a1.uFrameX + a1.uFrameWidth - 1;
    a1.uFrameW = a1.uFrameY + a1.uFrameHeight - 1;
    a1.DrawMessageBox(0);
    a1.uFrameX += 12;
    a1.uFrameWidth -= 24;
    a1.uFrameY += 12;
    a1.uFrameHeight -= 12;
    a1.uFrameZ = a1.uFrameX + a1.uFrameWidth - 1;
    a1.uFrameW = a1.uFrameY + a1.uFrameHeight - 1;
    v25 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0x9Bu);
    sprintf(pTmpBuf, format_4E2D80, v25, v14);
    a1.DrawText2(pFontCreate, 0, 0, 0, pTmpBuf, 3u);
    a1.DrawText(pFontSmallnum, 1, LOBYTE(pFontLucida->uFontHeight), 0, v23, 0, 0, 0);
  }
LABEL_132:
  dword_507BF0_is_there_popup_onscreen = 1;
  viewparams->bRedrawGameUI = 1;
}


//----- (004175C0) --------------------------------------------------------
void __thiscall 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 == 16
    || 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
    || !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 = 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->SendMessage((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) == 3
    && 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;
    }
    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.DrawText2(pFontCreate, 0, 0, 0, pTmpBuf, 3u);
  return Dst.DrawText(pFontSmallnum, 1, LOBYTE(pFontLucida->uFontHeight), 0, v2, 0, 0, 0);
}

//----- (00417AD4) --------------------------------------------------------
unsigned int __fastcall sub_417AD4(unsigned int uPlayerClass, enum PLAYER_SKILL_TYPE uPlayerSkillType, signed int a3)
{
  enum PLAYER_SKILL_TYPE v3; // ebx@1
  signed int v4; // edi@1
  unsigned int v5; // ecx@1
  int v6; // edx@1
  int v7; // eax@7
  int v8; // eax@10
  unsigned __int8 v9; // sf@10
  unsigned __int8 v10; // of@10
  int v11; // eax@11
  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

  v3 = uPlayerSkillType;
  v4 = uPlayerClass;
  white = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu);
  red = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0, 0);
  yellow = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0);
  v5 = 0;
  v6 = v4 % 4;
  if ( !(v4 % 4) )
  {
    v11 = 37 * v4 + v3;
    if ( byte_4ED970_skill_learn_ability_by_class_table[0][v11] >= a3 )
      goto LABEL_8;
    if ( byte_4ED970_skill_learn_ability_by_class_table[1][v11] < a3
      && byte_4ED970_skill_learn_ability_by_class_table[2][v11] < a3 )
    {
      v12 = byte_4ED970_skill_learn_ability_by_class_table[3][v11];
      v10 = __OFSUB__(v12, a3);
      v9 = v12 - a3 < 0;
LABEL_15:
      v5 = red;
      if ( v9 ^ v10 )
        return v5;
    }
    return yellow;
  }
  if ( v6 == 1 )
  {
    v7 = 37 * v4 + v3;
    if ( byte_4ED970_skill_learn_ability_by_class_table[0][v7] >= a3 )
      goto LABEL_8;
    if ( byte_4ED970_skill_learn_ability_by_class_table[1][v7] < a3 )
    {
      v8 = byte_4ED970_skill_learn_ability_by_class_table[2][v7];
      v10 = __OFSUB__(v8, a3);
      v9 = v8 - a3 < 0;
      goto LABEL_15;
    }
    return yellow;
  }
  if ( v6 > 1 && v6 <= 3 )
  {
    if ( byte_4ED970_skill_learn_ability_by_class_table[v4][v3] < a3 )
      return red;
LABEL_8:
    v5 = white;
  }
  return v5;
}

//----- (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[v3];
  v33 = &pPlayer->pActiveSkills[v2];
  v7 = pPlayer->GetActualSkillLevel(v2);
  v8 = LOBYTE(pPlayer->pActiveSkills[v2]);
  a2[0] = 0;
  Source[0] = 0;
  if ( (v8 & 0x3F) == (v7 & 0x3F) )
  {
    strcpy(a2, "%s\n\n");
    v24 = sub_417AD4(pPlayer->uClass, v2, 1);
    sprintf(Source, format_4E2DC8, v24);
    strcat(a2, Source);
    strcat(a2, "%s\t%03d:\t%03d%s\t000\n");
    v25 = sub_417AD4(pPlayer->uClass, v36, 2);
    sprintf(Source, format_4E2DC8, v25);
    strcat(a2, Source);
    strcat(a2, "%s\t%03d:\t%03d%s\t000\n");
    v26 = sub_417AD4(pPlayer->uClass, v36, 3);
    sprintf(Source, format_4E2DC8, v26);
    strcat(a2, Source);
    strcat(a2, "%s\t%03d:\t%03d%s\t000\n");
    v27 = pPlayer->uClass;
    v28 = v36;
    v29 = sub_417AD4(v27, v36, 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 = sub_417AD4(pPlayer->uClass, v2, 1);
    sprintf(Source, format_4E2DC8, v9);
    strcat(a2, Source);
    strcat(a2, "%s\t%03d:\t%03d%s\t000\n");
    v10 = sub_417AD4(pPlayer->uClass, v36, 2);
    sprintf(Source, format_4E2DC8, v10);
    strcat(a2, Source);
    strcat(a2, "%s\t%03d:\t%03d%s\t000\n");
    v11 = sub_417AD4(pPlayer->uClass, v36, 3);
    sprintf(Source, format_4E2DC8, v11);
    strcat(a2, Source);
    strcat(a2, "%s\t%03d:\t%03d%s\t000\n");
    v12 = v36;
    v13 = sub_417AD4(pPlayer->uClass, v36, 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(v36);
    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]->uClass);
      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 = (Player *)&stru_AA1058[3].pSounds[6972 * uPlayerID + 40552];
  v2 = pIcons_LOD->LoadTexture("fr_stats", TEXTURE_16BIT_PALETTE);
  pRenderer->DrawTextureIndexed(8u, 8u, (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->uClass]);
  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);
  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", pGlobalTXT_LocalizationStrings[144], v9, v6, v5);
  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", pGlobalTXT_LocalizationStrings[116], v15, v12, v11);
  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", 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", 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", 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", 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", pGlobalTXT_LocalizationStrings[136], v45, v42, v41);
  pGUIWindow_CurrentMenu->DrawText(pFontArrus, 26, v40, 0, pTmpBuf, 0, 0, 0);
  a2 = "%s";
  v46 = v40 + 2 * LOBYTE(pFontArrus->uFontHeight) + 5;
  if ( pPlayer->GetMaxHealth() >= 1000 )
    a2 = (const char *)&unk_4E2EB8;
  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";
  uY = LOBYTE(pFontArrus->uFontHeight) + v46 - 2;
  if ( pPlayer->GetMaxMana() >= 1000 )
    a2a = (const char *)&unk_4E2EB8;
  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", 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: ", 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", pGlobalTXT_LocalizationStrings[5], v72, v69, v68);
  pGUIWindow_CurrentMenu->DrawText(pFontArrus, 266, 50, 0, pTmpBuf, 0, 0, 0);
  a2b = "%s";
  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", 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->uClass == 35 && 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->uClass == 35 && 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) --------------------------------------------------------
int __cdecl sub_419100()
{
  Player *v0; // esi@1
  int v1; // ebx@1
  unsigned __int8 *v2; // esi@1
  int v3; // eax@4
  int result; // eax@6
  int v5; // esi@6
  unsigned __int8 v6; // zf@6
  unsigned __int8 v7; // sf@6
  int v8; // edx@7
  int v9; // ecx@7
  unsigned __int8 v10; // of@7
  stru179 *v11; // edi@9
  int v12; // edx@11
  int v13; // [sp+Ch] [bp-8h]@2
  signed int v14; // [sp+Ch] [bp-8h]@9
  int i; // [sp+10h] [bp-4h]@10

  v0 = pPlayers[uActiveCharacter];
  memset(&pStru179, 0, 0xFA0u);
  memset(pTmpBuf2, 0, 0x7D0u);
  v1 = 0;
  dword_506544 = 0;
  dword_506548 = 0;
  dword_506520 = 0;
  dword_50651C = 0;
  dword_506528 = 0;
  v2 = (unsigned __int8 *)v0->field_152;
  do
  {
    v13 = dword_723E80_award_related[2 * v1];
    if ( (unsigned __int16)_449B57_test_bit(v2, v1) && v13 )
    {
      v3 = dword_506520++;
      pStru179->field_0[v3] = v1;
    }
    ++v1;
  }
  while ( v1 < 105 );
  result = dword_506520;
  v5 = 0;
  v6 = dword_506520 == 0;
  v7 = dword_506520 < 0;
  dword_506524 = dword_506520;
  dword_506520 = 0;
  if ( !(v7 | v6) )
  {
    do
    {
      v8 = rand() % 16;
      result = dword_506524;
      v9 = dword_506524 + v5++;
      v10 = __OFSUB__(v5, dword_506524);
      v7 = v5 - dword_506524 < 0;
      pStru179->field_0[v9] = v8;
    }
    while ( v7 ^ v10 );
    if ( result > 0 )
    {
      v14 = 1;
      v11 = pStru179;
      do
      {
        for ( i = v14; i < result; ++i )
        {
          v12 = pStru179->field_0[i];
          if ( dword_723E84[2 * v12] < dword_723E84[2 * v11->field_0[0]] )
          {
            pStru179->field_0[i] = v11->field_0[0];
            v11->field_0[0] = v12;
          }
        }
        ++v14;
        v11 = (stru179 *)((char *)v11 + 4);
      }
      while ( v14 - 1 < result );
    }
  }
  return result;
}


//----- (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;
      }
    }
    ptr_507B9C = 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);
    ptr_507BA0 = 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(ptr_507B9C);
    GUIButton::_41D0D8(ptr_507BA0);
    ptr_507BA0 = 0;
    ptr_507B9C = 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 sub_419401()
{
  unsigned int v0; // ecx@3
  GUIButton *i; // 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
  unsigned int *v14; // [sp+18h] [bp-Ch]@8
  unsigned int *v15; // [sp+18h] [bp-Ch]@14
  unsigned int *v16; // [sp+18h] [bp-Ch]@19
  unsigned int *v17; // [sp+18h] [bp-Ch]@25
  char *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 ( 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;
      v0 = uActiveCharacter;
    }
  }
  v12 = 0;
  a5 = pGUIWindow_CurrentMenu->uNumControls;
  v18 = &stru_AA1058[3].pSounds[6972 * v0 + 40552];
  v2 = pFontLucida;
  v14 = (unsigned int *)dword_4E2A2C;
  v3 = 2 * LOBYTE(pFontLucida->uFontHeight) + 13;
  do
  {
    if ( v18[2 * *v14 + 264] & 0x3F )
    {
      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);
      v2 = pFontLucida;
    }
    ++v14;
  }
  while ( (signed int)v14 < (signed int)dword_4E2A50 );
  if ( !v12 )
    v3 = v3 + LOBYTE(v2->uFontHeight) - 3;
  v15 = (unsigned int *)_4E2A80_skills;
  v5 = v3 + 2 * LOBYTE(v2->uFontHeight) - 6;
  do
  {
    if ( v18[2 * *v15 + 264] & 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);
      v2 = pFontLucida;
    }
    ++v15;
  }
  while ( (signed int)v15 < (signed int)pAwardsTextColors );
  v13 = 0;
  v16 = (unsigned int *)dword_4E2A18;
  v7 = 2 * LOBYTE(v2->uFontHeight) + 13;
  do
  {
    if ( v18[2 * *v16 + 264] & 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);
      v2 = pFontLucida;
    }
    ++v16;
  }
  while ( (signed int)v16 < (signed int)dword_4E2A2C );
  if ( !v13 )
    v7 = v7 + LOBYTE(v2->uFontHeight) - 3;
  v17 = (unsigned int *)dword_4E2A50;
  v9 = v7 + 2 * LOBYTE(v2->uFontHeight) - 6;
  do
  {
    if ( v18[2 * *v17 + 264] & 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);
      v2 = pFontLucida;
    }
    ++v17;
  }
  while ( (signed int)v17 < (signed int)_4E2A80_skills );
  if ( a2 )
    pGUIWindow_CurrentMenu->_41D08F(a2, 1, 0, a5);
}