diff Game/MainMenu.cpp @ 2541:a902abdfc7f2

1. Renamed class Game to class Engine. 2. Separated game logic as state of FSM from game logic as engine. 3. Found out that many UI screen initializers were optimized away, intially they all returned newly created window as separate object like it is done in CharacterUI_Initialize.
author a.parshin
date Sun, 10 May 2015 01:29:11 +0200
parents
children c674d547cc7c
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Game/MainMenu.cpp	Sun May 10 01:29:11 2015 +0200
@@ -0,0 +1,475 @@
+#include "Engine/Engine.h"
+#include "Engine/Timer.h"
+#include "Engine/Party.h"
+#include "Engine/LOD.h"
+#include "Engine/SaveLoad.h"
+#include "Engine/Graphics/IRender.h"
+#include "Engine/Graphics/Viewport.h"
+
+#include "IO/Mouse.h"
+#include "IO/Keyboard.h"
+
+#include "GUI/GUIWindow.h"
+#include "GUI/GUIButton.h"
+#include "GUI/UI/UIPartyCreation.h"
+
+#include "Media/Audio/AudioPlayer.h"
+
+#include "Game/MainMenu.h"
+
+
+//----- (00435748) --------------------------------------------------------
+void MainMenu_EventLoop()
+{
+    Player *pPlayer; // ebx@2
+    void *v3; // edi@21
+    signed int v4; // eax@29
+    //  int v5; // ecx@29
+    //  PLAYER_SKILL_TYPE v6; // edi@37
+    GUIWindow *pWindow; // eax@56
+    GUIButton *pButton; // eax@59
+    int v15; // edi@70
+    char v20; // dl@116
+    unsigned int v21; // eax@116
+    unsigned int v25; // eax@120
+    unsigned int v26; // ecx@127
+    //  SoundID pSoundID; // [sp-2Ch] [bp-3Ch]@36
+    //  signed int v41; // [sp-10h] [bp-20h]@29
+    int pParam; // [sp+4h] [bp-Ch]@3
+    UIMessageType pUIMessageType; // [sp+8h] [bp-8h]@3
+    int pSex; // [sp+Ch] [bp-4h]@3
+
+    if (pMessageQueue_50CBD0->uNumMessages)
+    {
+        pPlayer = pParty->pPlayers.data();
+        do
+        {
+            int param2;
+            pMessageQueue_50CBD0->PopMessage(&pUIMessageType, &pParam, &param2);
+            //auto player = &pParty->pPlayers[pParam];
+
+            switch (pUIMessageType) // For buttons of window MainMenu
+            {
+            case UIMSG_MainMenu_ShowPartyCreationWnd:
+                GUIWindow::Create(495, 172, 0, 0, WINDOW_PressedButton2, (int)pMainMenu_BtnNew, 0);
+                SetCurrentMenuID(MENU_NEWGAME);
+                break;
+            case UIMSG_MainMenu_ShowLoadWindow:
+                GUIWindow::Create(495, 227, 0, 0, WINDOW_PressedButton2, (int)pMainMenu_BtnLoad, 0);
+                SetCurrentMenuID(MENU_SAVELOAD);
+                break;
+            case UIMSG_ShowCredits:
+                GUIWindow::Create(495, 282, 0, 0, WINDOW_PressedButton2, (int)pMainMenu_BtnCredits, 0);
+                SetCurrentMenuID(MENU_CREDITS);
+                break;
+            case UIMSG_ExitToWindows:
+                GUIWindow::Create(495, 337, 0, 0, WINDOW_PressedButton2, (int)pMainMenu_BtnExit, 0);
+                SetCurrentMenuID(MENU_EXIT_GAME);
+                break;
+            case UIMSG_PlayerCreation_SelectAttribute:
+                pGUIWindow_CurrentMenu->pCurrentPosActiveItem = (pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem)
+                    % 7 + pGUIWindow_CurrentMenu->pStartingPosActiveItem + 7 * pParam;
+                uPlayerCreationUI_SelectedCharacter = pParam;
+                pAudioPlayer->PlaySound(SOUND_SelectingANewCharacter, 0, 0, -1, 0, 0, 0, 0);
+                break;
+            case UIMSG_PlayerCreation_VoicePrev:
+                pSex = pParty->pPlayers[pParam].GetSexByVoice();
+                do
+                {
+                    if (pParty->pPlayers[pParam].uVoiceID == 0)
+                        pParty->pPlayers[pParam].uVoiceID = 19;
+                    else --pParty->pPlayers[pParam].uVoiceID;
+                } while (pParty->pPlayers[pParam].GetSexByVoice() != pSex);
+                pButton = pCreationUI_BtnPressLeft2[pParam];
+                GUIWindow::Create(pButton->uX, pButton->uY, 0, 0, WINDOW_PressedButton, (int)pButton, (char *)1);
+                pAudioPlayer->PlaySound(SOUND_SelectingANewCharacter, 0, 0, -1, 0, 0, 0, 0);
+                pParty->pPlayers[pParam].PlaySound(SPEECH_PickMe, 0);
+                break;
+            case UIMSG_PlayerCreation_VoiceNext:
+                pSex = pParty->pPlayers[pParam].GetSexByVoice();
+                do
+                {
+                    pParty->pPlayers[pParam].uVoiceID = (pParty->pPlayers[pParam].uVoiceID + 1) % 20;
+                } while (pParty->pPlayers[pParam].GetSexByVoice() != pSex);
+                pButton = pCreationUI_BtnPressRight2[pParam];
+                GUIWindow::Create(pButton->uX, pButton->uY, 0, 0, WINDOW_PressedButton, (int)pButton, (char *)1);
+                pAudioPlayer->PlaySound(SOUND_SelectingANewCharacter, 0, 0, -1, 0, 0, 0, 0);
+                pParty->pPlayers[pParam].PlaySound(SPEECH_PickMe, 0);
+                break;
+            case UIMSG_PlayerCreation_FacePrev:
+                //pPlayer = &pParty->pPlayers[pParam];
+                if (!pParty->pPlayers[pParam].uCurrentFace)
+                    pParty->pPlayers[pParam].uCurrentFace = 19;
+                else
+                    pParty->pPlayers[pParam].uCurrentFace -= 1;
+                pParty->pPlayers[pParam].uVoiceID = pParty->pPlayers[pParam].uCurrentFace;
+                pParty->pPlayers[pParam].SetInitialStats();
+                pParty->pPlayers[pParam].SetSexByVoice();
+                pParty->pPlayers[pParam].RandomizeName();
+                v25 = pParam;
+                pGUIWindow_CurrentMenu->pCurrentPosActiveItem = (pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem)
+                    % 7 + pGUIWindow_CurrentMenu->pStartingPosActiveItem + 7 * pParam;
+                uPlayerCreationUI_SelectedCharacter = v25;
+                GUIWindow::Create(pCreationUI_BtnPressLeft[v25]->uX, pCreationUI_BtnPressLeft[v25]->uY, 0, 0, WINDOW_PressedButton, (int)pCreationUI_BtnPressLeft[v25], (char *)1);
+                pAudioPlayer->PlaySound(SOUND_SelectingANewCharacter, 0, 0, -1, 0, 0, 0.0, 0);
+                pParty->pPlayers[pParam].PlaySound(SPEECH_PickMe, 0);
+                break;
+            case UIMSG_PlayerCreation_FaceNext:
+                //pPlayer = &pParty->pPlayers[pParam];
+                v20 = (char)((int)pParty->pPlayers[pParam].uCurrentFace + 1) % 20;
+                pParty->pPlayers[pParam].uCurrentFace = v20;
+                pParty->pPlayers[pParam].uVoiceID = v20;
+                pParty->pPlayers[pParam].SetInitialStats();
+                pParty->pPlayers[pParam].SetSexByVoice();
+                pParty->pPlayers[pParam].RandomizeName();
+                v21 = pParam;
+                pGUIWindow_CurrentMenu->pCurrentPosActiveItem = (pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem)
+                    % 7 + pGUIWindow_CurrentMenu->pStartingPosActiveItem + 7 * pParam;
+                uPlayerCreationUI_SelectedCharacter = v21;
+                GUIWindow::Create(pCreationUI_BtnPressRight[v21]->uX, pCreationUI_BtnPressRight[v21]->uY, 0, 0, WINDOW_PressedButton, (int)pCreationUI_BtnPressRight[v21], (char *)1);
+                pAudioPlayer->PlaySound(SOUND_SelectingANewCharacter, 0, 0, -1, 0, 0, 0, 0);
+                pParty->pPlayers[pParam].PlaySound(SPEECH_PickMe, 0);
+                break;
+            case UIMSG_PlayerCreationClickPlus:
+                GUIWindow::Create(613, 393, 0, 0, WINDOW_PressedButton2, (int)pPlayerCreationUI_BtnPlus, (char *)1);
+                pPlayer[uPlayerCreationUI_SelectedCharacter].IncreaseAttribute((pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem) % 7);
+                pAudioPlayer->PlaySound(SOUND_ClickMinus, 0, 0, -1, 0, 0, 0, 0);
+                break;
+            case UIMSG_PlayerCreationClickMinus:
+                GUIWindow::Create(523, 393, 0, 0, WINDOW_PressedButton2, (int)pPlayerCreationUI_BtnMinus, (char *)1);
+                pPlayer[uPlayerCreationUI_SelectedCharacter].DecreaseAttribute((pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem) % 7);
+                pAudioPlayer->PlaySound(SOUND_ClickPlus, 0, 0, -1, 0, 0, 0, 0);
+                break;
+            case UIMSG_PlayerCreationSelectActiveSkill:
+                if (pPlayer[uPlayerCreationUI_SelectedCharacter].GetSkillIdxByOrder(3) == 37)
+                    pParty->pPlayers[uPlayerCreationUI_SelectedCharacter].pActiveSkills[pPlayer[uPlayerCreationUI_SelectedCharacter].GetSkillIdxByOrder(pParam + 4)] = 1;
+                pAudioPlayer->PlaySound(SOUND_ClickSkill, 0, 0, -1, 0, 0, 0, 0);
+                break;
+            case UIMSG_PlayerCreationSelectClass:
+                pPlayer[uPlayerCreationUI_SelectedCharacter].Reset((PLAYER_CLASS_TYPE)pParam);
+                pAudioPlayer->PlaySound(SOUND_SelectingANewCharacter, 0, 0, -1, 0, 0, 0, 0);
+                break;
+            case UIMSG_PlayerCreationClickOK:
+                GUIWindow::Create(580, 431, 0, 0, WINDOW_PressedButton2, (int)pPlayerCreationUI_BtnOK, 0);
+                if (PlayerCreation_GetUnspentAttributePointCount() || !PlayerCreation_Choose4Skills())
+                    GameUI_Footer_TimeLeft = GetTickCount() + 4000;
+                else
+                    uGameState = GAME_STATE_STARTING_NEW_GAME;
+                break;
+            case UIMSG_PlayerCreationClickReset:
+                GUIWindow::Create(527, 431, 0, 0, WINDOW_PressedButton2, (int)pPlayerCreationUI_BtnReset, 0);
+                pParty->Reset();
+                break;
+            case UIMSG_PlayerCreationRemoveUpSkill:
+                v4 = pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem;
+                pGUIWindow_CurrentMenu->pCurrentPosActiveItem = v4 % 7 + pGUIWindow_CurrentMenu->pStartingPosActiveItem + 7 * pParam;
+                if (pPlayer[pParam].GetSkillIdxByOrder(2) != 37)//37 - None(Нет)
+                    pParty->pPlayers[pParam].pActiveSkills[pPlayer[pParam].GetSkillIdxByOrder(2)] = 0;
+                break;
+            case UIMSG_PlayerCreationRemoveDownSkill:
+                v4 = pGUIWindow_CurrentMenu->pCurrentPosActiveItem - pGUIWindow_CurrentMenu->pStartingPosActiveItem;
+                pGUIWindow_CurrentMenu->pCurrentPosActiveItem = v4 % 7 + pGUIWindow_CurrentMenu->pStartingPosActiveItem + 7 * pParam;
+                if (pPlayer[pParam].GetSkillIdxByOrder(3) != 37)//37 - None(Нет)
+                    pParty->pPlayers[pParam].pActiveSkills[pPlayer[pParam].GetSkillIdxByOrder(3)] = 0;
+                break;
+            case UIMSG_PlayerCreationChangeName:
+                pAudioPlayer->PlaySound(SOUND_ClickSkill, 0, 0, -1, 0, 0, 0, 0);
+                v3 = (void *)pParam;
+                uPlayerCreationUI_SelectedCharacter = pParam;
+                pKeyActionMap->EnterText(0, 15, pGUIWindow_CurrentMenu);
+                pGUIWindow_CurrentMenu->ptr_1C = v3;
+                break;
+            case UIMSG_ChangeGameState:
+                uGameState = GAME_FINISHED;
+                break;
+            case UIMSG_ChangeCursor:
+                pMouse->SetCursorBitmap("MICON2");
+                break;
+            case UIMSG_3A:
+                SetCurrentMenuID(MENU_DebugBLVLevel);
+                break;
+            case UIMSG_LoadGame:
+                if (!pSavegameUsedSlots[uLoadGameUI_SelectedSlot])
+                    break;
+                SetCurrentMenuID(MENU_LoadingProcInMainMenu);
+                break;
+            case UIMSG_SelectLoadSlot:
+                //main menu save/load wnd   clicking on savegame lines
+                if (pGUIWindow_CurrentMenu->receives_keyboard_input_2 == WINDOW_INPUT_IN_PROGRESS)
+                    pKeyActionMap->SetWindowInputStatus(WINDOW_INPUT_NONE);
+                if (current_screen_type != SCREEN_SAVEGAME || uLoadGameUI_SelectedSlot != pParam + pSaveListPosition)
+                {
+                    //load clicked line
+                    v26 = pParam + pSaveListPosition;
+                    if (dword_6BE138 == pParam + pSaveListPosition)
+                    {
+                        pMessageQueue_50CBD0->AddGUIMessage(UIMSG_SaveLoadBtn, 0, 0);
+                        pMessageQueue_50CBD0->AddGUIMessage(UIMSG_LoadGame, 0, 0);
+                    }
+                    uLoadGameUI_SelectedSlot = v26;
+                    dword_6BE138 = v26;
+                }
+                else
+                {
+                    //typing in the line
+                    pKeyActionMap->EnterText(0, 19, pGUIWindow_CurrentMenu);
+                    strcpy(pKeyActionMap->pPressedKeysBuffer, pSavegameHeader[uLoadGameUI_SelectedSlot].pName);
+                    pKeyActionMap->uNumKeysPressed = strlen(pKeyActionMap->pPressedKeysBuffer);
+                }
+                break;
+            case UIMSG_SaveLoadBtn:
+                GUIWindow::Create(pGUIWindow_CurrentMenu->uFrameX + 241, pGUIWindow_CurrentMenu->uFrameY + 302, 61, 28, WINDOW_SaveLoadBtn, (int)pBtnLoadSlot, 0);
+                break;
+            case UIMSG_DownArrow:
+                ++pSaveListPosition;
+                if (pSaveListPosition >= pParam)
+                    pSaveListPosition = pParam - 1;
+                if (pSaveListPosition < 1)
+                    pSaveListPosition = 0;
+                pWindow = pGUIWindow_CurrentMenu;
+                GUIWindow::Create(pWindow->uFrameX + 215, pGUIWindow_CurrentMenu->uFrameY + 323, 0, 0, WINDOW_PressedButton2, (int)pBtnDownArrow, 0);
+                break;
+            case UIMSG_Cancel:
+                GUIWindow::Create(pGUIWindow_CurrentMenu->uFrameX + 350, pGUIWindow_CurrentMenu->uFrameY + 302, 61, 28, WINDOW_LoadGame_CancelBtn, (int)pBtnCancel, 0);
+                break;
+            case UIMSG_ArrowUp:
+                --pSaveListPosition;
+                if (pSaveListPosition < 0)
+                    pSaveListPosition = 0;
+                pWindow = pGUIWindow_CurrentMenu;
+                GUIWindow::Create(pWindow->uFrameX + 215, pGUIWindow_CurrentMenu->uFrameY + 197, 0, 0, WINDOW_PressedButton2, (int)pBtnArrowUp, 0);
+                break;
+            case UIMSG_AD:
+                GUIWindow::Create(pMainMenu_BtnNew->uX, pMainMenu_BtnNew->uY, 0, 0, WINDOW_PressedButton2, (int)pMainMenu_BtnNew, 0);
+                SetCurrentMenuID(MENU_LoadingProcInMainMenu);
+                break;
+            case UIMSG_AE:
+                GUIWindow::Create(pMainMenu_BtnExit->uX, pMainMenu_BtnExit->uY, 0, 0, WINDOW_PressedButton2, (int)pMainMenu_BtnExit, 0);
+                SetCurrentMenuID(MENU_DebugBLVLevel);
+                break;
+            case UIMSG_Escape:
+                if (pModalWindow)
+                {
+                    ModalWindow_Release();
+                    break;
+                }
+                if (!(dword_6BE364_game_settings_1 & GAME_SETTINGS_4000))
+                    break;
+                v15 = 1;
+                pMediaPlayer->bStopBeforeSchedule = 1;
+                viewparams->bRedrawGameUI = 1;
+                viewparams->field_48 = 1;
+                if (GetCurrentMenuID() == MENU_MAIN || GetCurrentMenuID() == MENU_MMT_MAIN_MENU
+                    || GetCurrentMenuID() == MENU_CREATEPARTY || GetCurrentMenuID() == MENU_NAMEPANELESC)
+                {
+                    //if ( current_screen_type == SCREEN_VIDEO )
+                    //pVideoPlayer->FastForwardToFrame(pVideoPlayer->pResetflag);			  
+                    if (GetCurrentMenuID() == MENU_NAMEPANELESC)  //из панели изменения имени
+                    {
+                        SetCurrentMenuID(MENU_CREATEPARTY);//в окно создания группы
+                        break;
+                    }
+                    if (GetCurrentMenuID() == MENU_CREDITSPROC)	//из окна Создатели
+                    {
+                        SetCurrentMenuID(MENU_CREDITSCLOSE);//в закрытие Создатели
+                        break;
+                    }
+                    pMessageQueue_50CBD0->AddGUIMessage(UIMSG_ChangeGameState, 0, 0);
+                    break;
+                }
+                if (GetCurrentMenuID() == MENU_CREDITSPROC && !current_screen_type)
+                {
+                    //if ( current_screen_type == SCREEN_VIDEO )
+                    //pVideoPlayer->FastForwardToFrame(pVideoPlayer->pResetflag);
+                    if (GetCurrentMenuID() == MENU_NAMEPANELESC)
+                    {
+                        SetCurrentMenuID(MENU_CREATEPARTY);
+                        break;
+                    }
+                    if (GetCurrentMenuID() == MENU_CREDITSPROC)
+                    {
+                        SetCurrentMenuID(MENU_CREDITSCLOSE);
+                        break;
+                    }
+                    pMessageQueue_50CBD0->AddGUIMessage(UIMSG_ChangeGameState, 0, 0);
+                    break;
+                }
+                if (current_screen_type == SCREEN_LOADGAME)
+                {
+                    pIcons_LOD->RemoveTexturesPackFromTextureList();
+                    //crt_deconstruct_ptr_6A0118();
+                    pTexture_PCX.Release();
+                    pTexture_PCX.Load("title.pcx", 0);
+                    SetCurrentMenuID(MENU_MAIN);
+                    v15 = 1;
+                    pGUIWindow_CurrentMenu->Release();
+                    pGUIWindow2->Release();
+                    pGUIWindow2 = 0;
+                    pEventTimer->Resume();
+                    current_screen_type = SCREEN_GAME;
+                    viewparams->bRedrawGameUI = v15;
+                    break;
+                }
+                if (current_screen_type == SCREEN_VIDEO)
+                {
+                    //pVideoPlayer->Unload();
+                }
+                else
+                {
+                    if (current_screen_type != SCREEN_1B)
+                    {
+                        pGUIWindow_CurrentMenu->Release();
+                        pGUIWindow2->Release();
+                        pGUIWindow2 = 0;
+                        pEventTimer->Resume();
+                        current_screen_type = SCREEN_GAME;
+                        viewparams->bRedrawGameUI = v15;
+                        break;
+                    }
+                    //VideoPlayer::dtor();
+                }
+                break;
+            default:
+                break;
+            }
+        } while (pMessageQueue_50CBD0->uNumMessages);
+    }
+}
+
+
+//----- (004627B7) --------------------------------------------------------
+void MainMenu_Loop()
+{
+    GUIButton *pButton; // eax@27
+    unsigned int pControlParam; // ecx@35
+    unsigned int pY; // [sp-18h] [bp-54h]@39
+    Texture *pTexture; // [sp-14h] [bp-50h]@39
+    GUIWindow *pWindow; // [sp+4h] [bp-38h]@11
+    MSG msg;
+
+    current_screen_type = SCREEN_GAME;
+
+    pGUIWindow2 = 0;
+    pAudioPlayer->StopChannels(-1, -1);
+    pMouse->RemoveHoldingItem();
+
+    pIcons_LOD->_inlined_sub2();
+
+    pWindow_MainMenu = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_MainMenu, 0, 0);
+    Texture* pNew = pIcons_LOD->LoadTexturePtr("title_new", TEXTURE_16BIT_PALETTE);
+    Texture* pLoad = pIcons_LOD->LoadTexturePtr("title_load", TEXTURE_16BIT_PALETTE);
+    Texture* pCredits = pIcons_LOD->LoadTexturePtr("title_cred", TEXTURE_16BIT_PALETTE);
+    Texture* pExit = pIcons_LOD->LoadTexturePtr("title_exit", TEXTURE_16BIT_PALETTE);
+
+    pMainMenu_BtnNew = pWindow_MainMenu->CreateButton(495, 172, pNew->uTextureWidth, pNew->uTextureHeight, 1, 0, UIMSG_MainMenu_ShowPartyCreationWnd, 0, 'N', "", pNew, 0);
+    pMainMenu_BtnLoad = pWindow_MainMenu->CreateButton(495, 227, pLoad->uTextureWidth, pLoad->uTextureHeight, 1, 0, UIMSG_MainMenu_ShowLoadWindow, 1, 'L', "", pLoad, 0);
+    pMainMenu_BtnCredits = pWindow_MainMenu->CreateButton(495, 282, pCredits->uTextureWidth, pCredits->uTextureHeight, 1, 0, UIMSG_ShowCredits, 2, 'C', "", pCredits, 0);
+    pMainMenu_BtnExit = pWindow_MainMenu->CreateButton(495, 337, pExit->uTextureWidth, pExit->uTextureHeight, 1, 0, UIMSG_ExitToWindows, 3, 0, "", pExit, 0);
+
+    pTexture_PCX.Release();
+    pTexture_PCX.Load("title.pcx", 0);
+    SetCurrentMenuID(MENU_MAIN);
+    SetForegroundWindow(window->GetApiHandle());
+    SendMessageW(window->GetApiHandle(), WM_ACTIVATEAPP, 1, 0);
+    while (GetCurrentMenuID() == MENU_MAIN || GetCurrentMenuID() == MENU_SAVELOAD)
+    {
+        POINT pt;
+        pMouse->GetCursorPos(&pt);
+        pWindow = pWindow_MainMenu;
+        if (GetCurrentMenuID() == MENU_SAVELOAD)
+        {
+            if (current_screen_type != SCREEN_LOADGAME)
+            {
+                pTexture_PCX.Release();
+                pTexture_PCX.Load("lsave640.pcx", 0);
+                pGUIWindow2 = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_MainMenu, 0, 0);
+                current_screen_type = SCREEN_LOADGAME;
+                LoadUI_Load(0);
+            }
+            pWindow = pGUIWindow_CurrentMenu;
+        }
+
+        while (PeekMessageW(&msg, 0, 0, 0, PM_REMOVE))
+        {
+            if (msg.message == WM_QUIT)
+                Engine_DeinitializeAndTerminate(0);
+            TranslateMessage(&msg);
+            DispatchMessageW(&msg);
+        }
+
+        if (dword_6BE364_game_settings_1 & GAME_SETTINGS_APP_INACTIVE)
+        {
+            WaitMessage();
+            continue;
+        }
+
+        pRenderer->BeginScene();
+        pRenderer->DrawTextureNew(0, 0, &pTexture_PCX);
+
+        MainMenu_EventLoop();
+        GUI_UpdateWindows();
+
+        if (GetCurrentMenuID() != MENU_MAIN)
+        {
+            if (GetCurrentMenuID() == MENU_LoadingProcInMainMenu)
+            {
+                pIcons_LOD->RemoveTexturesPackFromTextureList();
+                pGUIWindow_CurrentMenu->Release();
+                pGUIWindow_CurrentMenu = 0;
+                current_screen_type = SCREEN_GAME;
+                viewparams->bRedrawGameUI = 1;
+            }
+        }
+        else
+        {
+            if (!pModalWindow)// ???
+            {
+                pButton = pWindow->pControlsHead;
+                for (pButton = pWindow->pControlsHead; pButton; pButton = pButton->pNext)
+                {
+                    if (pt.x >= (signed int)pButton->uX && pt.x <= (signed int)pButton->uZ
+                        && pt.y >= (signed int)pButton->uY && pt.y <= (signed int)pButton->uW
+                        && pWindow == pWindow_MainMenu)
+                    {
+                        pControlParam = pButton->msg_param;
+                        switch (pControlParam) // backlight for buttons
+                        {
+                        case 0:
+                            pTexture = pNew;
+                            pY = 172;
+                            break;
+                        case 1:
+                            pTexture = pLoad;
+                            pY = 227;
+                            break;
+                        case 2:
+                            pTexture = pCredits;
+                            pY = 282;
+                            break;
+                        case 3:
+                            pTexture = pExit;
+                            pY = 337;
+                            break;
+                        }
+                        pRenderer->DrawTextureIndexed(495, pY, pTexture);
+                    }
+                }
+            }
+        }
+        pRenderer->EndScene();
+        pRenderer->Present();
+    }
+    MainMenu_EventLoop();
+    pRenderer->BeginScene();
+    GUI_UpdateWindows();
+    pRenderer->EndScene();
+    pRenderer->Present();
+    pTexture_PCX.Release();
+    if (pGUIWindow2)
+    {
+        pGUIWindow2->Release();
+        pGUIWindow2 = 0;
+    }
+    pWindow_MainMenu->Release();
+    pIcons_LOD->RemoveTexturesPackFromTextureList();
+}
\ No newline at end of file