Mercurial > mm7
diff Engine/Game.cpp @ 2499:68cdef6879a0
engine folder
author | Ritor1 |
---|---|
date | Fri, 19 Sep 2014 02:57:42 +0600 |
parents | |
children | 0ff6a9e9bf7f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Engine/Game.cpp Fri Sep 19 02:57:42 2014 +0600 @@ -0,0 +1,7496 @@ +#define _CRTDBG_MAP_ALLOC +#include <stdlib.h> +#include <crtdbg.h> + +#define _CRT_SECURE_NO_WARNINGS +#include "Arcomage\Arcomage.h" + +#include "Engine/Graphics/Vis.h" +#include "Engine/Graphics/Weather.h" +#include "Engine/Graphics/LightmapBuilder.h" +#include "Engine/Graphics/DecalBuilder.h" +#include "Engine/Graphics/ParticleEngine.h" +#include "Mouse.h" +#include "Keyboard.h" +#include "Engine/Graphics/GammaControl.h" +#include "stru6.h" +#include "Engine/Graphics/stru9.h" +#include "Engine/Graphics/stru10.h" +#include "Engine/ErrorHandling.h" + +#include "Game.h" +#include "Party.h" +#include "Engine/Graphics/Viewport.h" +#include "Timer.h" +#include "Engine/Graphics/Outdoor.h" +#include "Engine/Graphics/Overlays.h" +#include "AudioPlayer.h" +#include "LOD.h" +#include "GUIWindow.h" +#include "Engine/TurnEngine/TurnEngine.h" +#include "Bink_Smacker.h" +#include "Engine/Events.h" +#include "texts.h" +#include "GUIFont.h" +#include "Log.h" +#include "Engine/Graphics/Lights.h" +#include "Engine/Spells/CastSpellInfo.h" +#include "Engine/Tables/FrameTableInc.h" +#include "Engine/Objects/Actor.h" +#include "GUIProgressBar.h" +#include "Engine/Objects/ObjectList.h" +#include "Engine/Graphics/Level/Decoration.h" +#include "Engine/Graphics/PaletteManager.h" +#include "UI\UIHouses.h" +#include "UI\UIShops.h" +#include "UI\UIPartyCreation.h" +#include "SaveLoad.h" +#include "Engine/Objects/SpriteObject.h" +#include "mm7.h" +#include "Engine/Graphics/Sprites.h" +#include "Registry.h" +#include "Engine/Objects/Chest.h" + +#include "UI\UIGame.h" + +#include "Engine/Graphics/DecorationList.h" +#include "Engine/Tables/IconFrameTable.h" +#include "Engine/Tables/PlayerFrameTable.h" +#include "MapsLongTimer.h" +#include "Engine/Tables/StorylineTextTable.h" +#include "Engine/Tables/FactionTable.h" +#include "stru123.h" +#include "LuaVM.h" +#include "Engine/Graphics/RenderD3D11.h" +#include "MMT.h" +#include "NewUI\MainMenu.h" +#include <direct.h> + + + + + +Game *pGame; + + + + + +//----- (00435694) -------------------------------------------------------- +void Game::ToggleFlags2(unsigned int uFlag) +{ + unsigned int v2; // eax@1 + + v2 = this->uFlags2; + if ( v2 & uFlag ) + this->uFlags2 = v2 & ~uFlag; + else + this->uFlags2 = uFlag | v2; +} + +//----- (0044103C) -------------------------------------------------------- +void Game::Draw() +{ + int v4; // edi@26 + + uFlags2 &= ~0x02; + if ( pParty->_497FC5_check_party_perception_against_level() ) + uFlags2 |= 2; + + pGame->pIndoorCameraD3D->sRotationX = pParty->sRotationX; + pGame->pIndoorCameraD3D->sRotationY = pParty->sRotationY; + pGame->pIndoorCameraD3D->vPartyPos.x = pParty->vPosition.x - pParty->y_rotation_granularity * cosf(2 * 3.141592653589 * pParty->sRotationY / 2048.0); + pGame->pIndoorCameraD3D->vPartyPos.y = pParty->vPosition.y - pParty->y_rotation_granularity * sinf(2 * 3.141592653589 * pParty->sRotationY / 2048.0); + pGame->pIndoorCameraD3D->vPartyPos.z = pParty->vPosition.z + pParty->sEyelevel;//193, but real 353 + + //pIndoorCamera->Initialize2(); + pIndoorCameraD3D->CalculateRotations(pParty->sRotationX, pParty->sRotationY); + pIndoorCameraD3D->CreateWorldMatrixAndSomeStuff(); + pIndoorCameraD3D->_4374E8_ProllyBuildFrustrum(); + + if ( pMovie_Track ) + { + /*if ( !pRenderer->pRenderD3D ) + { + pRenderer->BeginSceneD3D(); + pMouse->DrawCursorToTarget(); + pRenderer->DrawBillboards_And_MaybeRenderSpecialEffects_And_EndScene(); + }*/ + } + else + { + if ( pParty->vPosition.x != pParty->vPrevPosition.x || pParty->sRotationY != pParty->sPrevRotationY || pParty->vPosition.y != pParty->vPrevPosition.y + || pParty->sRotationX != pParty->sPrevRotationX || pParty->vPosition.z != pParty->vPrevPosition.z || pParty->sEyelevel != pParty->sPrevEyelevel ) + pParty->uFlags |= 2u; + pParty->vPrevPosition.x = pParty->vPosition.x; + pParty->vPrevPosition.y = pParty->vPosition.y; + pParty->vPrevPosition.z = pParty->vPosition.z; + //v0 = &pRenderer; + pParty->sPrevRotationY = pParty->sRotationY; + pParty->sPrevRotationX = pParty->sRotationX; + + pParty->sPrevEyelevel = pParty->sEyelevel; + pRenderer->BeginSceneD3D(); + + //if ( !pRenderer->pRenderD3D ) + //pMouse->DrawCursorToTarget(); + if ( !PauseGameDrawing() || viewparams->field_48 == 1 ) + { + //if ( pRenderer->pRenderD3D ) + { + float v2 = (double)(((signed int)pMiscTimer->uTotalGameTimeElapsed >> 2) & 0x1F) * 0.032258064 * 6.0; + //v3 = v2 + 6.7553994e15; + //pRenderer->field_1036A8_bitmapid = LODWORD(v3); + pRenderer->hd_water_current_frame = floorf(v2 + 0.5f); + } + + if (uCurrentlyLoadedLevelType == LEVEL_Indoor) + pIndoor->Draw(); + else if (uCurrentlyLoadedLevelType == LEVEL_Outdoor) + pOutdoor->Draw(); + else + Error("Invalid level type: %u", uCurrentlyLoadedLevelType); + + //if (pRenderer->pRenderD3D) + { + pDecalBuilder->DrawBloodsplats(); + pGame->pLightmapBuilder->DrawLightmapsType(2); + } + } + pRenderer->DrawBillboards_And_MaybeRenderSpecialEffects_And_EndScene(); + } + + //DEBUG: force redraw gui + viewparams->bRedrawGameUI = true; + + + pRenderer->BeginScene(); + //if (pRenderer->pRenderD3D) + pMouse->DrawCursorToTarget(); + if (pOtherOverlayList->bRedraw) + viewparams->bRedrawGameUI = true; + v4 = viewparams->bRedrawGameUI; + GameUI_Footer(); + if (!viewparams->bRedrawGameUI) + GameUI_DrawRightPanelItems(); + else + { + GameUI_DrawRightPanelFrames(); + GameUI_Footer_2(); + viewparams->bRedrawGameUI = false; + } + if (!pMovie_Track)//!pVideoPlayer->pSmackerMovie) + { + GameUI_DrawMinimap(488, 16, 625, 133, viewparams->uMinimapZoom, true);//redraw = pParty->uFlags & 2); + if (v4) + { + if ( !PauseGameDrawing() /*&& pRenderer->pRenderD3D*/) // clear game viewport with transparent color + pRenderer->FillRectFast(pViewport->uViewportTL_X, pViewport->uViewportTL_Y, pViewport->uViewportBR_X - pViewport->uViewportTL_X, + pViewport->uViewportBR_Y - pViewport->uViewportTL_Y + 1, + 0x7FF); + viewparams->field_48 = 0; + } + } + + viewparams->bRedrawGameUI = pOtherOverlayList->bRedraw; + pOtherOverlayList->bRedraw = 0; + + GameUI_DrawPartySpells(); + if (v4 || pParty->pHirelings[0].evt_C || pParty->pHirelings[1].evt_C ) + GameUI_DrawHiredNPCs(); + GameUI_DrawPortraits(v4); + GameUI_DrawLifeManaBars(); + GameUI_DrawCharacterSelectionFrame(); + if ( _44100D_should_alter_right_panel() ) + GameUI_DrawRightPanel(); + if ( !pMovie_Track ) + { + pStru6Instance->DrawPlayerBuffAnims(); + pOtherOverlayList->DrawTurnBasedIcon(v4); + GameUI_DrawTorchlightAndWizardEye(); + } + + + static bool render_framerate = false; + static float framerate = 0.0f; + static uint frames_this_second = 0; + static uint last_frame_time = GetTickCount(); + static uint framerate_time_elapsed = 0; + + if ( pCurrentScreen == SCREEN_GAME && uCurrentlyLoadedLevelType == LEVEL_Outdoor) + pWeather->Draw();//Ritor1: my include + + //while(GetTickCount() - last_frame_time < 33 );//FPS control + uint frame_dt = GetTickCount() - last_frame_time; + last_frame_time = GetTickCount(); + + framerate_time_elapsed += frame_dt; + if (framerate_time_elapsed >= 1000) + { + framerate = frames_this_second * (1000.0f / framerate_time_elapsed); + + framerate_time_elapsed = 0; + frames_this_second = 0; + render_framerate = true; + } + + ++frames_this_second; + + if ( debug_information ) + { + if (render_framerate) + { + sprintf(pTmpBuf.data(), "FPS: % .4f", framerate); + pPrimaryWindow->DrawText(pFontArrus, 494, 0, Color16(0, 0, 0), pTmpBuf.data(), 0, 0, 0); + } + + if (uCurrentlyLoadedLevelType == LEVEL_Indoor) + { + int sector_id = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z); + sprintf(pTmpBuf.data(), "Party Sector ID: %u/%u\n", sector_id, pIndoor->uNumSectors); + pPrimaryWindow->DrawText(pFontArrus, 16, 16, Color16(255, 255, 255), pTmpBuf.data(), 0, 0, -1); + } + sprintf(pTmpBuf.data(), "Party Position: % d % d % d", pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z); + pPrimaryWindow->DrawText(pFontArrus, 16, 16 + 16, Color16(255, 255, 255), pTmpBuf.data(), 0, 0, -1); + + if (uCurrentlyLoadedLevelType == LEVEL_Indoor) + { + uint uFaceID; + int sector_id = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z); + int floor_level = BLV_GetFloorLevel(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z + 40, sector_id, &uFaceID); + sprintf(pTmpBuf.data(), "BLV_GetFloorLevel: %d face_id %d\n", floor_level, uFaceID); + } + else + { + int on_water, _a6; + int floor_level = ODM_GetFloorLevel(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z, 0, &on_water, &_a6, false); + sprintf(pTmpBuf.data(), "ODM_GetFloorLevel: %d on_water: %s a6 = %d\n", floor_level, on_water ? "true" : "false", _a6); + } + pPrimaryWindow->DrawText(pFontArrus, 16, 16 + 16 + 16, Color16(255, 255, 255), pTmpBuf.data(), 0, 0, -1); + } + + GUI_UpdateWindows(); + pParty->UpdatePlayersAndHirelingsEmotions(); + + _unused_5B5924_is_travel_ui_drawn = false; + if (v4) + pMouse->bRedraw = true; + pMouse->ReadCursorWithItem(); + pMouse->DrawCursor(); + pMouse->Activate(); + pRenderer->EndScene(); + pRenderer->Present(); + pParty->uFlags &= ~2; +} + +//----- (0047A815) -------------------------------------------------------- +void Game::DrawParticles() +{ + pParticleEngine->Draw(); +} + +//----- (00463149) -------------------------------------------------------- +void Game::Loop() +{ + const char *pLocationName; // [sp-4h] [bp-68h]@74 + bool bLoading; // [sp+10h] [bp-54h]@1 + signed int v16; // [sp+14h] [bp-50h]@8 + MSG Msg; // [sp+28h] [bp-3Ch]@20 + char Source[64]; // [sp+44h] [bp-20h]@76 + + bLoading = sCurrentMenuID == MENU_LoadingProcInMainMenu; + SetCurrentMenuID((MENU_STATE)-1); + if (bLoading) + { + pParty->Reset(); + uGameState = GAME_STATE_PLAYING; + LoadGame(uLoadGameUI_SelectedSlot); + } + + for (uint i = 1; i < 5; ++i) + for (uint j = 1; j < 6; ++j) + { + sprintf(pTmpBuf.data(), "data\\lloyd%d%d.pcx", i, j); + remove(pTmpBuf.data()); + } + + LoadPlayerPortraintsAndVoices(); + pIcons_LOD->_inlined_sub1(); + pAudioPlayer->SetMusicVolume(pSoundVolumeLevels[uMusicVolimeMultiplier] * 64.0f); + + while ( 2 ) + { + v16 = 1; + pMessageQueue_50CBD0->Flush(); + + pPartyActionQueue->uNumActions = 0; + if (pParty->bTurnBasedModeOn) + { + pTurnEngine->End(false); + pParty->bTurnBasedModeOn = false; + } + DoPrepareWorld(bLoading, 1); + pEventTimer->Resume(); + dword_6BE364_game_settings_1 |= GAME_SETTINGS_0080_SKIP_USER_INPUT_THIS_FRAME; + // uGame_if_0_else_ui_id__11_save__else_load__8_drawSpellInfoPopup__22_final_window__26_keymapOptions__2_options__28_videoOptions = 0; + pCurrentScreen = SCREEN_GAME; + + //if ( pRenderer->pRenderD3D ) + pGame->pVisInstance->_4C1A02(); + + bool game_finished = false; + do + { + while ( PeekMessageA(&Msg, 0, 0, 0, PM_REMOVE) ) + { + if ( Msg.message == WM_QUIT ) + Game_DeinitializeAndTerminate(0); + TranslateMessage(&Msg); + DispatchMessageA(&Msg); + } + if (dword_6BE364_game_settings_1 & GAME_SETTINGS_APP_INACTIVE) + { + WaitMessage(); + continue; + } + pGame->_44EEA7(); + GameUI_WritePointedObjectStatusString(); + Keyboard::ProcessInputActions(); + GameUI_MsgProc(); + if ( pArcomageGame->bGameInProgress ) + { + ArcomageGame::Loop(); + pRenderer->Present(); + continue; + } + + pMediaPlayer->HouseMovieLoop(); + + pEventTimer->Update(); + pMiscTimer->Update(); + + OnTimer(0); + GameUI_StatusBar_UpdateTimedString(0); + if ( pMiscTimer->bPaused && !pEventTimer->bPaused ) + pMiscTimer->Resume(); + if ( pEventTimer->bTackGameTime && !pParty->bTurnBasedModeOn ) + pEventTimer->bTackGameTime = 0; + if ( !pEventTimer->bPaused && uGameState == GAME_STATE_PLAYING) + { + if ( !pEventTimer->bTackGameTime ) + _494035_timed_effects__water_walking_damage__etc(); + + if (dword_6BE364_game_settings_1 & GAME_SETTINGS_0001) + dword_6BE364_game_settings_1 &= ~GAME_SETTINGS_0001; + else + { + Actor::UpdateActorAI(); + UpdateUserInput_and_MapSpecificStuff(); + } + } + if ( v16 ) + { + v16 = 0; + viewparams->bRedrawGameUI = true; + } + pAudioPlayer->UpdateSounds(); + if ( (signed int)uGameState == GAME_STATE_PLAYING ) + { + pGame->Draw(); + continue; + } + if (uGameState == GAME_FINISHED) + { + game_finished = true; + continue; + } + if (uGameState == GAME_STATE_CHANGE_LOCATION)// смена локации + { + pAudioPlayer->StopChannels(-1, -1); + PrepareWorld(0); + uGameState = GAME_STATE_PLAYING; + continue; + } + if ( (signed int)uGameState <= GAME_STATE_5 || uGameState == GAME_STATE_GAME_QUITTING_TO_MAIN_MENU )//GAME_STATE_NEWGAME_OUT_GAMEMENU, GAME_STATE_LOADING_GAME + { + game_finished = true; + continue; + } + if ( uGameState == GAME_STATE_FINAL_WINDOW ) + { + pRenderer->BeginScene(); + GUI_UpdateWindows(); + pRenderer->EndScene(); + pRenderer->Present(); + continue; + } + if ( uGameState != GAME_STATE_PARTY_DIED ) + { + pGame->Draw(); + continue; + } + if ( uGameState == GAME_STATE_PARTY_DIED ) + { + pAudioPlayer->StopChannels(-1, -1); + memset(&pParty->pHirelings[0], 0, 0x4Cu); + memset(&pParty->pHirelings[1], 0, 0x4Cu); + for ( int i = 0; i < (signed int)pNPCStats->uNumNewNPCs; ++i ) + { + if ( pNPCStats->pNewNPCData[i].field_24 ) + pNPCStats->pNewNPCData[i].uFlags &= 0xFFFFFF7Fu; + } + pMediaPlayer->bStopBeforeSchedule = 0; + pMediaPlayer->PlayFullscreenMovie(MOVIE_Death, true); + if ( pMovie_Track ) + pMediaPlayer->Unload(); + SaveGame(0, 0); + ++pParty->uNumDeaths; + for ( uint i = 0; i < 4; ++i ) + pParty->pPlayers[i].SetVariable(VAR_Award, 85); + pParty->days_played_without_rest = 0; + pParty->uTimePlayed += 0x276000ui64; + LOWORD(pParty->uFlags) &= ~0x204; + pParty->SetGold(0); + pOtherOverlayList->Reset(); + memset(pParty->pPartyBuffs.data(), 0, 0x140u); + + if ( pParty->bTurnBasedModeOn == 1 ) + { + pTurnEngine->End(true); + pParty->bTurnBasedModeOn = 0; + } + for( int i = 0; i < 4; ++i) + { + memset(pParty->pPlayers[i].pConditions.data(), 0, 0xA0u);//(pConditions, 0, 160) + memset(pParty->pPlayers[i].pPlayerBuffs.data(), 0, 0x180u);//(pPlayerBuffs[0], 0, 384) + pParty->pPlayers[i].sHealth = 1; + uActiveCharacter = 1; + } + if (_449B57_test_bit(pParty->_quest_bits, PARTY_QUEST_FINISHED_EMERALD_ISLE)) + { + pParty->vPosition.x = -17331; // respawn in harmondale + pParty->vPosition.y = 12547; + pParty->vPosition.z = 465; + pParty->sRotationY = 0; + pLocationName = "out02.odm"; + } + else + { + pParty->vPosition.x = 12552; // respawn on emerald isle + pParty->vPosition.y = 1816; + pParty->vPosition.z = 0; + pParty->sRotationY = 512; + pLocationName = "out01.odm"; + } + strcpy(Source, pLocationName); + pParty->uFallStartY = pParty->vPosition.z; + pParty->sRotationX = 0; + pParty->uFallSpeed = 0; + pParty->field_6E4 = 0; + pParty->field_6E0 = 0; + if ( _stricmp(Source, pCurrentMapName) ) + { + strcpy(pCurrentMapName, Source); + _5B65A8_npcdata_uflags_or_other = pParty->vPosition.x; + _5B65AC_npcdata_fame_or_other = pParty->vPosition.y; + _5B65B0_npcdata_rep_or_other = pParty->vPosition.z; + _5B65B4_npcdata_loword_house_or_other = pParty->sRotationY; + _5B65B8_npcdata_hiword_house_or_other = pParty->sRotationX; + dword_5B65C0 = 1; + PrepareWorld(1); + } + Actor::InitializeActors(); + + int num_conscious_players = 0; + int conscious_players_ids[4] = {-1, -1, -1, -1}; + for (int i = 0; i < 4; ++i) + { + if (pParty->pPlayers[i].CanAct()) + conscious_players_ids[num_conscious_players++] = i; + } + if (num_conscious_players) + { + int idx = conscious_players_ids[rand() % num_conscious_players]; + Assert(idx >= 0); + pParty->pPlayers[idx].PlaySound(SPEECH_99, 0); + } + + ShowStatusBarString(pGlobalTXT_LocalizationStrings[524], 2);// "Once again you've cheated death!.." "Вы снова обхитрили смерть! …" + uGameState = GAME_STATE_PLAYING; + } + } + while (!game_finished); + + pEventTimer->Pause(); + ResetCursor_Palettes_LODs_Level_Audio_SFT_Windows(); + if ( uGameState == GAME_STATE_LOADING_GAME ) + { + sub_491E3A(); + LoadPlayerPortraintsAndVoices(); + uGameState = GAME_STATE_PLAYING; + pIcons_LOD->dword_11B84 = pIcons_LOD->uNumLoadedFiles; + bLoading = true; + continue; + } + break; + } + pCurrentScreen = SCREEN_VIDEO; + sub_491E3A(); +} + + +//----- (0044F192) -------------------------------------------------------- +void Game::PrepareBloodsplats() +{ + for (uint i = 0; i < uNumBloodsplats; ++i) + { + pBloodsplatContainer->AddBloodsplat(pBloodsplats[i].x, pBloodsplats[i].y, pBloodsplats[i].z, + pBloodsplats[i].radius, pBloodsplats[i].r, pBloodsplats[i].g, pBloodsplats[i].b); + } +} + + +//----- (0044F120) -------------------------------------------------------- +void Game::PushStationaryLights(int a2) +{ + Game__StationaryLight* pLight; + + for( int i=0; i<uNumStationaryLights; ++i ) + { + pLight=&pStationaryLights[i]; + pStationaryLightsStack->AddLight(pLight->vPosition.x, pLight->vPosition.y, pLight->vPosition.z, + pLight->flt_18, pLight->vRGBColor.x, pLight->vRGBColor.y, pLight->vRGBColor.z, _4E94D0_light_type); + } +} +// 4E94D0: using guessed type char _4E94D0_light_type; + +//----- (0044F0FD) -------------------------------------------------------- +void Game::_44F0FD() +{ + ToggleFlags(0x40u); + + if ( !(uFlags & 0x40) ) + { + uNumBloodsplats = 0; + field_E0C = 0; + } +} + +//----- (0044F0D8) -------------------------------------------------------- +void Game::ToggleFlags(uint uMask) +{ + if (uFlags & uMask) + uFlags &= ~uMask; + else + uFlags |= uMask; +} + + +//----- (0044F07B) -------------------------------------------------------- +bool Game::_44F07B() +{ + if (!pKeyboardInstance->IsKeyBeingHeld(VK_SHIFT) && !pKeyboardInstance->IsKeyBeingHeld(VK_LSHIFT) && + !pKeyboardInstance->IsKeyBeingHeld(VK_LSHIFT) || (pKeyboardInstance->WasKeyPressed(VK_F11) == 0 && + pKeyboardInstance->WasKeyPressed(VK_F11))) + return true; + return false; +} + +//----- (0044EEA7) -------------------------------------------------------- +bool Game::_44EEA7() +{ + //Game *v1; // esi@1 + //double v2; // st7@2 + float depth; // ST00_4@9 + //bool result; // eax@9 + //unsigned int v5; // eax@14 + __int64 v6; // kr00_8@21 + //unsigned int y; // [sp+4h] [bp-24h]@2 + //unsigned int x; // [sp+8h] [bp-20h]@2 + Vis_SelectionFilter *v10; // [sp+10h] [bp-18h]@2 + Vis_SelectionFilter *v11; // [sp+14h] [bp-14h]@2 + POINT cursor; // [sp+20h] [bp-8h]@1 + + //v1 = this; + ++qword_5C6DF0; + pParticleEngine->UpdateParticles(); + pMouseInstance->GetCursorPos(&cursor); + + //x = cursor.y; + //y = cursor.x; + if ( sub_4637E0_is_there_popup_onscreen() ) + { + v11 = &vis_face_filter; + v10 = &vis_sprite_filter_2; + depth = pGame->pIndoorCameraD3D->GetPickDepth(); + } + else + { + if ( uFlags2 & GAME_FLAGS_2_TARGETING_MODE ) + { + v11 = &vis_face_filter; + v10 = &vis_sprite_filter_1; + } + else + { + v11 = &vis_face_filter; + v10 = &vis_sprite_filter_4; + } + depth = 5120.0; + } + //depth = v2; + + PickMouse(depth, cursor.x, cursor.y, false, v10, v11); + pLightmapBuilder->std__vector_000004_size = 0; + pLightmapBuilder->std__vector_183808_size = 0; + pDecalBuilder->std__vector_pDecals_size = 0; + pDecalBuilder->field_308008 = 0; + if (!_44F07B()) + return false; + + if ( uFlags & GAME_FLAGS_1_DRAW_BLV_DEBUGS) + pStru10Instance->bDoNotDrawPortalFrustum = false; + if ( /*pRenderer->pRenderD3D &&*/ uCurrentlyLoadedLevelType == LEVEL_Outdoor) + pRenderer->uFogColor = GetLevelFogColor() & 0xFFFFFF; + if (uFlags & 0x0400) + uFlags2 |= 0x01; + /*if ( !pRenderer->pRenderD3D && uCurrentlyLoadedLevelType == LEVEL_Outdoor && pMobileLightsStack->uNumLightsActive ) + { + uFlags2 |= 0x01; + field_E10 = qword_5C6DF0; + }*/ + v6 = qword_5C6DF0 - field_E10; + if ( qword_5C6DF0 - field_E10 == 1 ) + uFlags2 |= v6; + if (uNumStationaryLights_in_pStationaryLightsStack != pStationaryLightsStack->uNumLightsActive ) + { + uFlags2 |= 1; + uNumStationaryLights_in_pStationaryLightsStack = pStationaryLightsStack->uNumLightsActive; + } + _44E904(); + return true; +} + + +//----- (0044EDE4) -------------------------------------------------------- +bool Game::AlterGamma_BLV(BLVFace *pFace, signed int *pColor) +{ + if (uFlags2 & GAME_FLAGS_2_SATURATE_LIGHTMAPS && + pFace->uAttributes & FACE_CAN_SATURATE_COLOR) + { + *pColor = ReplaceHSV(*pColor, 1.0, fSaturation, -1.0); + return true; + } + else + return false; +} + +//----- (0044EE30) -------------------------------------------------------- +bool Game::AlterGamma_ODM(ODMFace *pFace, signed int *pColor) +{ + if (uFlags2 & GAME_FLAGS_2_SATURATE_LIGHTMAPS && + pFace->uAttributes & FACE_CAN_SATURATE_COLOR) + { + *pColor = ReplaceHSV(*pColor, 1.0, fSaturation, -1.0); + return true; + } + else + return false; +} + + +//----- (004645FA) -------------------------------------------------------- +void Game::Deinitialize() +{ + WriteWindowsRegistryInt("startinwindow", 1);//pRenderer->bWindowMode); + //if (pRenderer->bWindowMode) + { + WriteWindowsRegistryInt("window X", window->GetX()); + WriteWindowsRegistryInt("window Y", window->GetY()); + } + WriteWindowsRegistryInt("valAlwaysRun", bAlwaysRun); + pItemsTable->Release(); + pNPCStats->Release(); + + if (pMouse) + pMouse->Deactivate(); + + delete pRenderer; + pAudioPlayer->Release();//error + pNew_LOD->FreeSubIndexAndIO(); + pGames_LOD->FreeSubIndexAndIO(); + ClipCursor(0); + Game::Destroy(); + delete pEventTimer; +} + +//----- (0044EE7C) -------------------------------------------------------- +bool Game::draw_debug_outlines() +{ + if (uFlags & 0x04) + { + pLightmapBuilder->DrawDebugOutlines(-1); + pDecalBuilder->DrawDecalDebugOutlines(); + } + return true; +} + +//----- (0044EC23) -------------------------------------------------------- +int Game::_44EC23(struct Polygon *a2, int *a3, signed int a4) +{ + double v4; // st7@4 + //double v5; // ST00_8@4 + signed int v6; // eax@5 + //double v7; // ST00_8@6 + signed int result; // eax@8 + //double v9; // ST00_8@9 + //double v10; // ST00_8@11 + float a2a; // [sp+14h] [bp+8h]@4 + float a3a; // [sp+18h] [bp+Ch]@4 + float a3b; // [sp+18h] [bp+Ch]@6 + float a4a; // [sp+1Ch] [bp+10h]@9 + float a4b; // [sp+1Ch] [bp+10h]@11 + + if ( this->uFlags2 & 2 && a2->field_59 == 5 && a2->pODMFace->uAttributes & 2 ) + { + v4 = (double)a4; + a2a = v4; + *a3 |= 2u; + a3a = (1.0 - this->fSaturation) * v4; + //v5 = a3a + 6.7553994e15; + //if ( SLODWORD(v5) >= 0 ) + if (floorf(a3a + 0.5f) >= 0 ) + { + a3b = (1.0 - this->fSaturation) * a2a; + //v7 = a3b + 6.7553994e15; + //v6 = LODWORD(v7); + v6 = floorf(a3b + 0.5f); + } + else + v6 = 0; + if ( a4 >= v6 ) + { + a4a = (1.0 - fSaturation) * a2a; + //v9 = a4a + 6.7553994e15; + //if ( SLODWORD(v9) >= 0 ) + if (floorf(a4a + 0.5f) >= 0) + { + a4b = (1.0 - fSaturation) * a2a; + //v10 = a4b + 6.7553994e15; + //result = LODWORD(v10); + result = floorf(a4b + 0.5f); + } + else + result = 0; + } + else + result = a4; + } + else + result = -1; + return result; +} + + + +//----- (00465C8B) -------------------------------------------------------- +Game *Game::Create() +{ + return new Game; +} + +//----- (00465CF3) -------------------------------------------------------- +void Game::Destroy() +{ + delete pGame; + pGame = nullptr; +} + +//----- (0044ED0A) -------------------------------------------------------- +signed int Game::_44ED0A(BLVFace *a2, int *a3, signed int a4) +{ + double v4; // st7@3 + //double v5; // ST00_8@3 + signed int v6; // eax@4 + //double v7; // ST00_8@5 + signed int result; // eax@7 + //double v9; // ST00_8@8 + //double v10; // ST00_8@10 + float v11; // [sp+14h] [bp+8h]@3 + float v12; // [sp+18h] [bp+Ch]@3 + float v13; // [sp+18h] [bp+Ch]@5 + float v14; // [sp+1Ch] [bp+10h]@8 + float v15; // [sp+1Ch] [bp+10h]@10 + + if ( this->uFlags2 & 2 && a2->uAttributes & 2 ) + { + v4 = (double)a4; + v11 = v4; + *a3 |= 2u; + v12 = (1.0 - this->fSaturation) * v4; + //v5 = v12 + 6.7553994e15; + if (floorf(v12 + 0.5f)/* SLODWORD(v5)*/ >= 0 ) + { + v13 = (1.0 - this->fSaturation) * v11; + //v7 = v13 + 6.7553994e15; + //v6 = LODWORD(v7); + v6 = floorf(v13 + 0.5f); + } + else + v6 = 0; + if ( a4 >= v6 ) + { + v14 = (1.0 - fSaturation) * v11; + //v9 = v14 + 6.7553994e15; + if (floorf(v14 + 0.5f)/* SLODWORD(v9)*/ >= 0 ) + { + v15 = (1.0 - fSaturation) * v11; + //v10 = v15 + 6.7553994e15; + //result = LODWORD(v10); + result = floorf(v15 + 0.5f); + } + else + result = 0; + } + else + result = a4; + } + else + result = -1; + return result; +} + + +//----- (0044E4B7) -------------------------------------------------------- +Game::Game() +{ + uNumStationaryLights = 0; + uNumBloodsplats = 0; + field_E0C = 0; + field_E10 = 0; + uNumStationaryLights_in_pStationaryLightsStack = 0; + bGammaControlInitialized = false; + uFlags = 0; + uFlags2 = 0; + uSomeGammaStartTime = 0; + uSomeGammaDeltaTime = 0; + + //pThreadWardInstance = new ThreadWard; + pThreadWardInstance = nullptr; + pParticleEngine = new ParticleEngine; + pMouse = pMouseInstance = new Mouse; + pLightmapBuilder = new LightmapBuilder; + pVisInstance = new Vis; + pStru6Instance = new stru6; + pIndoorCameraD3D = new IndoorCameraD3D; + pStru9Instance = new stru9; + pStru10Instance = new stru10; + //pStru11Instance = new stru11; + pStru11Instance = nullptr; + //pStru12Instance = new stru12(pStru11Instance); + pStru12Instance = nullptr; + //pCShow = new CShow; + pCShow = nullptr; + pKeyboardInstance = new Keyboard; + pGammaController = new GammaController; + + uFlags |= 0x0800; + uFlags2 |= 0x24; + + _44F0FD(); +} + +//----- (0044E7F3) -------------------------------------------------------- +Game::~Game() +{ + delete pGammaController; + delete pKeyboardInstance; +/*delete pCShow; + delete pStru12Instance; + delete pStru11Instance;*/ + delete pStru10Instance; + delete pStru9Instance; + delete pIndoorCameraD3D; + delete pStru6Instance; + delete pVisInstance; + delete pLightmapBuilder; + delete pMouseInstance; + delete pParticleEngine; +//delete pThreadWardInstance; +} + +//----- (0044E904) -------------------------------------------------------- +void Game::_44E904() +{ + //Game *v1; // esi@1 + unsigned __int64 v2; // qax@1 + unsigned int v3; // ecx@1 + int v4; // edi@1 + unsigned __int8 v5; // cf@7 + double v6; // st7@13 + double v7; // st7@15 + signed __int64 v8; // [sp+Ch] [bp-8h]@1 + + //v1 = this; + v2 = pEventTimer->Time(); + v4 = (v2 - uSomeGammaStartTime) >> 32; + v3 = v2 - LODWORD(uSomeGammaStartTime); + v8 = v2 - uSomeGammaStartTime; + if ( v4 < 0 + || SHIDWORD(v2) < ((unsigned int)v2 < LODWORD(uSomeGammaStartTime)) + HIDWORD(uSomeGammaStartTime) | v4 == 0 + && v3 <= 0x80 ) + { + if ( v4 < 0 ) + { + v3 = 0; + v4 = 0; + uSomeGammaStartTime = v2; + v8 = __PAIR__(v4, v3); + } + } + else + { + if ( uSomeGammaDeltaTime ) + { + LODWORD(uSomeGammaDeltaTime) = 0; + HIDWORD(uSomeGammaDeltaTime) = 0; + } + else + { + LODWORD(uSomeGammaDeltaTime) = v3; + HIDWORD(uSomeGammaDeltaTime) = v4; + } + v5 = __CFADD__(v3, -128); + v3 -= 128; + v4 = v5 + v4 - 1; + uSomeGammaStartTime = v2; + v8 = __PAIR__(v4, v3); + } + if ( uSomeGammaDeltaTime ) + v6 = (double)(signed __int64)(uSomeGammaDeltaTime - __PAIR__(v4, v3)); + else + v6 = (double)v8; + v7 = v6 * 0.0078125; + if ( v7 < 0.0 || v7 <= 1.0 ) + { + if ( v7 < 0.0 ) + v7 = 0.0; + } + else + v7 = 1.0; + //if ( pRenderer->pRenderD3D ) + fSaturation = v7; + //else + // fSaturation = (1.0 - 0.5) * v7 + 0.5; +} + +//----- (0044EA17) -------------------------------------------------------- +bool Game::InitializeGammaController() +{ + //if (pVersion->pVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT || + //pVersion->pVersionInfo.dwMajorVersion != 4 ) + pGammaController->InitializeFromSurface(pRenderer->pFrontBuffer4); + + bGammaControlInitialized = true; + uSomeGammaStartTime = pEventTimer->Time(); + return true; +} + +//----- (0044EA5E) -------------------------------------------------------- +bool Game::PickMouse(float fPickDepth, unsigned int uMouseX, unsigned int uMouseY, bool bOutline, Vis_SelectionFilter *sprite_filter, Vis_SelectionFilter *face_filter) +{ + /*if (pCurrentScreen != SCREEN_GAME|| !pRenderer->pRenderD3D) + return false;*/ + + if (!pVisInstance) + { + MessageBoxW(nullptr, L"The 'Vis' object pointer has not been instatiated, but CGame::Pick() is trying to call through it.", nullptr, 0); + return false; + } + + if (uMouseX >= (signed int)pViewport->uScreen_TL_X && + uMouseX <= (signed int)pViewport->uScreen_BR_X && + uMouseY >= (signed int)pViewport->uScreen_TL_Y && + uMouseY <= (signed int)pViewport->uScreen_BR_Y) + { + pVisInstance->PickMouse(fPickDepth, uMouseX, uMouseY, sprite_filter, face_filter); + + if (bOutline) + OutlineSelection(); + } + + return true; +} +// 4E28F8: using guessed type int pCurrentScreen; + +//----- (0044EB12) -------------------------------------------------------- +bool Game::PickKeyboard(bool bOutline, Vis_SelectionFilter *sprite_filter, Vis_SelectionFilter *face_filter) +{ + if (pCurrentScreen == SCREEN_GAME && pVisInstance /*&& pRenderer->pRenderD3D*/) + { + bool r = pVisInstance->PickKeyboard(&pVisInstance->default_list, sprite_filter, face_filter); + + if (bOutline) + OutlineSelection(); + return r; + } + return false; +} +/* +Result::Code Game::PickKeyboard(bool bOutline, struct unnamed_F93E6C *a3, struct unnamed_F93E6C *a4) +{ + if (dword_4E28F8_PartyCantJumpIfTrue) + return Result::Generic; + + pVis->PickKeyboard(a3, a4); + if (bOutline) + Game_outline_selection((int)this); + return Result::Success; +} +*/ +// 4E28F8: using guessed type int pCurrentScreen; + +//----- (0044EB5A) -------------------------------------------------------- +void Game::OutlineSelection() +{ + if (!pVisInstance) + return; + + if (!pVisInstance->default_list.uNumPointers) + return; + + Vis_ObjectInfo* object_info = pVisInstance->default_list.object_pointers[0]; + if (object_info) + switch (object_info->object_type) + { + case VisObjectType_Sprite: + { + Log::Warning(L"Sprite outline currently unsupported"); + return; + } + + case VisObjectType_Face: + { + if (uCurrentlyLoadedLevelType == LEVEL_Outdoor) + { + ODMFace* face = (ODMFace *)object_info->object; + if (face->uAttributes & FACE_OUTLINED) + face->uAttributes &= ~FACE_OUTLINED; + else + face->uAttributes |= FACE_OUTLINED; + } + else if (uCurrentlyLoadedLevelType == LEVEL_Indoor) + { + BLVFace* face = (BLVFace *)object_info->object; + if (face->uAttributes & FACE_OUTLINED) + face->uAttributes &= ~FACE_OUTLINED; + else + face->uAttributes |= FACE_OUTLINED; + } + else + Error("Invalid level type", uCurrentlyLoadedLevelType); + } + break; + + default: + { + MessageBoxW(nullptr, L"Undefined CObjectInfo type requested in CGame::outline_selection()", nullptr, 0); + ExitProcess(0); + } + } +} +//----- (004304E7) -------------------------------------------------------- +void GameUI_MsgProc() +{ + unsigned int v2; // edx@7 + Actor *pActor; // ecx@13 + int v4; // ecx@18 + unsigned int v10; // ecx@73 + int v14; // eax@98 + int v18; // eax@106 + float v19; // ST64_4@121 + float v21; // ST64_4@126 + float v22; // ST64_4@127 + unsigned int v24; // ecx@149 + GUIWindow *pWindow2; // ecx@248 + bool pKeyBindingFlag; // eax@269 + unsigned int v33; // eax@277 + int v37; // eax@341 + int v38; // eax@358 + SHORT v39; // ax@365 + char *v41; // eax@380 + int v42; // eax@396 + signed int v44; // eax@398 + int v45; // edx@398 + signed int v46; // ecx@398 + char v47; // zf@399 + char v48; // zf@405 + BLVFace *pBLVFace; // ecx@410 + ODMFace *pODMFace; // ecx@412 + CastSpellInfo *pSpellInfo; // ecx@415 + __int16 v53; // ax@431 + int v54; // eax@432 + int v55; // ecx@432 + int v56; // edx@432 + int v57; // eax@432 + Player *pPlayer; // edx@442 + unsigned int pMapNum; // eax@445 + signed int v60; // ST64_4@459 + __int16 v63; // dx@479 + unsigned int v64; // eax@486 + int v65; // ecx@486 + int v66; // eax@488 + char *v67; // eax@489 + __int16 v68; // dx@498 + char *v69; // eax@512 + int v70; // eax@525 + int v71; // edi@527 + NPCData *pNPCData3; // esi@527 + char *v73; // ecx@533 + signed int v74; // edi@535 + int v75; // eax@535 + int v76; // esi@535 + int v77; // eax@537 + Player *pPlayer2; // ecx@549 + signed int v81; // eax@552 + signed int v83; // ecx@554 + signed int v84; // ecx@554 + GUIButton *pButton; // eax@578 + unsigned int v86; // eax@583 + const char *v87; // ecx@595 + const char *v88; // ecx@596 + unsigned int v90; // eax@602 + int v91; // edx@605 + int v92; // eax@605 + int v93; // edx@605 + int pPlayerNum; // edx@611 + int v95; // eax@611 + unsigned int v97; // eax@624 + int v98; // eax@636 + int v103; // eax@671 + Player *pPlayer4; // ecx@718 + int v105; // eax@718 + Player *pPlayer5; // ST78_4@758 + unsigned int v107; // eax@758 + unsigned int v108; // eax@758 + unsigned int v115; // eax@764 + int v116; // eax@776 + unsigned int v118; // eax@785 + unsigned int v119; // ecx@786 + unsigned int v121; // [sp-28h] [bp-624h]@711 + unsigned int v123; // [sp-24h] [bp-620h]@711 + unsigned int v125; // [sp-20h] [bp-61Ch]@711 + int v127; // [sp-1Ch] [bp-618h]@107 + unsigned int v128; // [sp-1Ch] [bp-618h]@711 + GUIButton *pButton2; // [sp-4h] [bp-600h]@59 + const char *v161; // [sp-4h] [bp-600h]@637 + KeyToggleType pKeyToggleType; // [sp+0h] [bp-5FCh]@287 + char *v173; // [sp+0h] [bp-5FCh]@444 + char *v174; // [sp+0h] [bp-5FCh]@449 + const char *v177; // [sp+0h] [bp-5FCh]@629 + char *v178; // [sp+0h] [bp-5FCh]@637 + signed int thisb; // [sp+14h] [bp-5E8h]@272 + Player *pPlayer7; // [sp+14h] [bp-5E8h]@373 + Player *pPlayer8; // [sp+14h] [bp-5E8h]@377 + char *pMapName; // [sp+14h] [bp-5E8h]@445 + Player *pPlayer9; // [sp+14h] [bp-5E8h]@455 + int thisg; // [sp+14h] [bp-5E8h]@467 + int thish; // [sp+14h] [bp-5E8h]@528 + signed int thisi; // [sp+14h] [bp-5E8h]@535 + MapInfo *pMapInfo; // [sp+14h] [bp-5E8h]@604 + Player *pPlayer10; // [sp+14h] [bp-5E8h]@641 + int uMessageParam; // [sp+18h] [bp-5E4h]@7 + int uAction; // [sp+1Ch] [bp-5E0h]@18 + NPCData *pNPCData4; // [sp+20h] [bp-5DCh]@23 + unsigned int uNumSeconds; // [sp+24h] [bp-5D8h]@18 + char v197; // [sp+2Bh] [bp-5D1h]@101 + enum UIMessageType uMessage; // [sp+2Ch] [bp-5D0h]@7 + unsigned int v199; // [sp+30h] [bp-5CCh]@7 + char *v200; // [sp+34h] [bp-5C8h]@518 + POINT v202; // [sp+40h] [bp-5BCh]@141 + POINT a2; // [sp+48h] [bp-5B4h]@127 + POINT v205; // [sp+58h] [bp-5A4h]@171 + POINT v207; // [sp+68h] [bp-594h]@155 + POINT v211; // [sp+88h] [bp-574h]@704 + int v213; // [sp+98h] [bp-564h]@385 + char pLevelName[32]; // [sp+9Ch] [bp-560h]@380 + char pOut[32]; // [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 + int currHour; + + 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.sNPC_ID = bDialogueUI_InitializeActor_NPC_ID; + GameUI_InitializeDialogue(&actor, false); + bDialogueUI_InitializeActor_NPC_ID = 0; + } + if ( pMessageQueue_50CBD0->uNumMessages ) + { + //v1 = ""; + while ( 2 ) + { + if ( !pMessageQueue_50CBD0->uNumMessages ) + break; + + pMessageQueue_50CBD0->PopMessage(&uMessage, &uMessageParam, (int *)&v199); + switch ( uMessage ) + { + case UIMSG_ChangeGameState: + uGameState = GAME_FINISHED; + continue; + case UIMSG_PlayArcomage: + BackToHouseMenu(); + pArcomageGame->bGameInProgress = 1; + ArcomageGame::PrepareArcomage(); + continue; + case UIMSG_StartNPCDialogue: + if ( !uActiveCharacter ) + continue; + viewparams->field_48 = 1; + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + dword_5B65D0_dialogue_actor_npc_id = pActors[uMessageParam].sNPC_ID; + pActor = &pActors[uMessageParam]; + //goto _actor_init_dlg; + GameUI_InitializeDialogue(pActor, true); + continue; + case UIMSG_StartHireling1Dialogue: + case UIMSG_StartHireling2Dialogue: + { + if (bNoNPCHiring || pCurrentScreen) + continue; + + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + uAction = 0; + int hireling_idx = uMessage - UIMSG_StartHireling1Dialogue; + v4 = 0; + + for (uint i = 0; i < 2; ++i) + //pNPCData0 = pParty->pHirelings; + //do + { + if (pParty->pHirelings[i].pName) + //{ + //v6 = uAction++; + pTmpBuf[uAction++] = i; + //} + //++pNPCData0; + //++v4; + } + //while ( (signed int)pNPCData0 < (signed int)&pParty->pPickedItem ); + + //_this = 0; + for (uint i = 0; i < pNPCStats->uNumNewNPCs; ++i) + { + NPCData* npc = &pNPCStats->pNewNPCData[i]; + //do + //{ + if (npc->Hired() && + (!pParty->pHirelings[0].pName || strcmp(npc->pName, pParty->pHirelings[0].pName)) && + (!pParty->pHirelings[1].pName || strcmp(npc->pName, pParty->pHirelings[1].pName)) ) + { + //v7 =; + pTmpBuf[uAction++] = i + 2; + } + //++_this; + //++pNPCData4; + //} + //while ( _this < (signed int)pNPCStats->uNumNewNPCs ); + } + + if ( (signed int)(hireling_idx + pParty->hirelingScrollPosition) < uAction ) + { + //Actor::Actor(&actor); + memset(&actor, 0, 0x344u); + actor.sNPC_ID += -1 - pParty->hirelingScrollPosition - hireling_idx; + pActor = &actor; + GameUI_InitializeDialogue(&actor, true); + } + } + continue; + + case UIMSG_BuyInShop_Identify_Repair: + UIShop_Buy_Identify_Repair(); + continue; + case UIMSG_ClickNPCTopic: + ClickNPCTopic(uMessageParam); + continue; + case UIMSG_SelectShopDialogueOption: + OnSelectShopDialogueOption(uMessageParam); + continue; + case UIMSG_SelectNPCDialogueOption: + OnSelectNPCDialogueOption((DIALOGUE_TYPE)uMessageParam); + continue; + case UIMSG_ClickHouseNPCPortrait: + _4B4224_UpdateNPCTopics(uMessageParam); + continue; + case UIMSG_StartNewGame: + if ( dword_6BE138 == 124 || uMessageParam ) + { + pIcons_LOD->SyncLoadedFilesCount(); + pIcons_LOD->RemoveTexturesPackFromTextureList(); + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + pGUIWindow_CurrentMenu->Release(); + uGameState = GAME_STATE_NEWGAME_OUT_GAMEMENU; + pCurrentScreen = SCREEN_GAME; + viewparams->bRedrawGameUI = 1; + } + else + { + ShowStatusBarString(pGlobalTXT_LocalizationStrings[201], 2);// "Are you sure? Click again to start a New Game" + pAudioPlayer->PlaySound(SOUND_20001, 0, 0, -1, 0, 0, 0, 0); + dword_6BE138 = 124; + } + stru_506E40.Release(); + continue; + case UIMSG_Game_OpenLoadGameDialog: + pIcons_LOD->SyncLoadedFilesCount(); + pIcons_LOD->RemoveTexturesPackFromTextureList(); + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + pGUIWindow_CurrentMenu->Release(); + pCurrentScreen = SCREEN_LOADGAME; + LoadUI_Load(1); + continue; + case UIMSG_Quit: + if ( dword_6BE138 == 132 || uMessageParam ) + { + pIcons_LOD->SyncLoadedFilesCount(); + pIcons_LOD->RemoveTexturesPackFromTextureList(); + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + pGUIWindow_CurrentMenu->Release(); + pCurrentScreen = SCREEN_GAME; + viewparams->bRedrawGameUI = 1; + if ( !uMessageParam ) + pAudioPlayer->PlaySound((SoundID)(SOUND_EnteringAHouse|0x1), 0, 0, -1, 0, 0, 0, 0); + uGameState = GAME_STATE_GAME_QUITTING_TO_MAIN_MENU; + } + else + { + ShowStatusBarString(pGlobalTXT_LocalizationStrings[82], 2);// "Are you sure? Click again to quit" + pAudioPlayer->PlaySound(SOUND_20001, 0, 0, -1, 0, 0, 0, 0); + dword_6BE138 = 132; + } + stru_506E40.Release(); + continue; + case UIMSG_80: + __debugbreak(); + pIcons_LOD->SyncLoadedFilesCount(); + pIcons_LOD->RemoveTexturesPackFromTextureList(); + pGUIWindow_CurrentMenu->Release(); + pCurrentScreen = SCREEN_OPTIONS; + pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_8, 0, 0); + continue; + case UIMSG_ArrowUp: + --pSaveListPosition; + if ( pSaveListPosition < 0 ) + pSaveListPosition = 0; + GUIWindow::Create(215, 199, 17, 17, WINDOW_PressedButton2, (int)pBtnArrowUp, 0); + continue; + case UIMSG_DownArrow: + ++pSaveListPosition; + if ( pSaveListPosition >= uMessageParam ) + pSaveListPosition = uMessageParam - 1; + GUIWindow::Create(215, 323, 17, 17, WINDOW_PressedButton2, (int)pBtnDownArrow, 0); + continue; + case UIMSG_Cancel: + GUIWindow::Create(350, 302, 106, 42, WINDOW_CloseRestWindowBtn, (int)pBtnCancel, 0); + continue; + case UIMSG_SaveLoadBtn: + GUIWindow::Create(241, 302, 106, 42, WINDOW_SaveLoadBtn, (int)pBtnLoadSlot, 0); + continue; + case UIMSG_SelectLoadSlot: + if ( pGUIWindow_CurrentMenu->receives_keyboard_input_2 == WINDOW_INPUT_IN_PROGRESS) + pKeyActionMap->SetWindowInputStatus(WINDOW_INPUT_NONE); + if ( pCurrentScreen != SCREEN_SAVEGAME || uLoadGameUI_SelectedSlot != pSaveListPosition + uMessageParam ) + { + v10 = pSaveListPosition + uMessageParam; + if ( dword_6BE138 == pSaveListPosition + uMessageParam ) + { + pMessageQueue_50CBD0->AddGUIMessage(UIMSG_SaveLoadBtn, 0, 0); + pMessageQueue_50CBD0->AddGUIMessage(UIMSG_LoadGame, 0, 0); + } + uLoadGameUI_SelectedSlot = v10; + dword_6BE138 = v10; + } + else + { + pKeyActionMap->EnterText(0, 19, pGUIWindow_CurrentMenu); + if ( strcmp(pSavegameHeader[uLoadGameUI_SelectedSlot].pName, pGlobalTXT_LocalizationStrings[72]) )// "Empty" + strcpy(pKeyActionMap->pPressedKeysBuffer, pSavegameHeader[uLoadGameUI_SelectedSlot].pName); + pKeyActionMap->uNumKeysPressed = strlen(pKeyActionMap->pPressedKeysBuffer); + } + continue; + case UIMSG_LoadGame: + if ( pSavegameUsedSlots[uLoadGameUI_SelectedSlot] ) + { + LoadGame(uLoadGameUI_SelectedSlot); + uGameState = GAME_STATE_LOADING_GAME; + } + stru_506E40.Release(); + continue; + case UIMSG_SaveGame: + if ( pGUIWindow_CurrentMenu->receives_keyboard_input_2 == WINDOW_INPUT_IN_PROGRESS) + { + pKeyActionMap->SetWindowInputStatus(WINDOW_INPUT_NONE); + strcpy((char *)&pSavegameHeader[uLoadGameUI_SelectedSlot], pKeyActionMap->pPressedKeysBuffer); + } + DoSavegame(uLoadGameUI_SelectedSlot); + stru_506E40.Release(); + continue; + case UIMSG_Game_OpenSaveGameDialog: + pGUIWindow_CurrentMenu->Release(); + pCurrentScreen = SCREEN_SAVEGAME; + SaveUI_Load(); + continue; + case UIMSG_Game_OpenOptionsDialog://Open + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + pGUIWindow_CurrentMenu->Release(); + viewparams->field_48 = 1; + pCurrentScreen = SCREEN_OPTIONS; + + options_menu_skin.uTextureID_Background = pIcons_LOD->LoadTexture("ControlBG", TEXTURE_16BIT_PALETTE); + options_menu_skin.uTextureID_TurnSpeed[2] = pIcons_LOD->LoadTexture("con_16x", TEXTURE_16BIT_PALETTE); + options_menu_skin.uTextureID_TurnSpeed[1] = pIcons_LOD->LoadTexture("con_32x", TEXTURE_16BIT_PALETTE); + options_menu_skin.uTextureID_TurnSpeed[0] = pIcons_LOD->LoadTexture("con_Smoo", TEXTURE_16BIT_PALETTE); + options_menu_skin.uTextureID_ArrowLeft = pIcons_LOD->LoadTexture("con_ArrL", TEXTURE_16BIT_PALETTE); + options_menu_skin.uTextureID_ArrowRight = pIcons_LOD->LoadTexture("con_ArrR", TEXTURE_16BIT_PALETTE); + options_menu_skin.uTextureID_SoundLevels[0] = pIcons_LOD->LoadTexture("convol10", TEXTURE_16BIT_PALETTE); + options_menu_skin.uTextureID_SoundLevels[1] = pIcons_LOD->LoadTexture("convol20", TEXTURE_16BIT_PALETTE); + options_menu_skin.uTextureID_SoundLevels[2] = pIcons_LOD->LoadTexture("convol30", TEXTURE_16BIT_PALETTE); + options_menu_skin.uTextureID_SoundLevels[3] = pIcons_LOD->LoadTexture("convol40", TEXTURE_16BIT_PALETTE); + options_menu_skin.uTextureID_SoundLevels[4] = pIcons_LOD->LoadTexture("convol50", TEXTURE_16BIT_PALETTE); + options_menu_skin.uTextureID_SoundLevels[5] = pIcons_LOD->LoadTexture("convol60", TEXTURE_16BIT_PALETTE); + options_menu_skin.uTextureID_SoundLevels[6] = pIcons_LOD->LoadTexture("convol70", TEXTURE_16BIT_PALETTE); + options_menu_skin.uTextureID_SoundLevels[7] = pIcons_LOD->LoadTexture("convol80", TEXTURE_16BIT_PALETTE); + options_menu_skin.uTextureID_SoundLevels[8] = pIcons_LOD->LoadTexture("convol90", TEXTURE_16BIT_PALETTE); + options_menu_skin.uTextureID_SoundLevels[9] = pIcons_LOD->LoadTexture("convol00", TEXTURE_16BIT_PALETTE); + options_menu_skin.uTextureID_FlipOnExit = pIcons_LOD->LoadTexture("option04", TEXTURE_16BIT_PALETTE); + options_menu_skin.uTextureID_AlwaysRun = pIcons_LOD->LoadTexture("option03", TEXTURE_16BIT_PALETTE); + options_menu_skin.uTextureID_ShowDamage = pIcons_LOD->LoadTexture("option02", TEXTURE_16BIT_PALETTE); + options_menu_skin.uTextureID_WalkSound = pIcons_LOD->LoadTexture("option01", TEXTURE_16BIT_PALETTE); + + pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_Options, 0, 0); + pGUIWindow_CurrentMenu->CreateButton(22, 270, + pIcons_LOD->GetTexture(options_menu_skin.uTextureID_TurnSpeed[2])->uTextureWidth, + pIcons_LOD->GetTexture(options_menu_skin.uTextureID_TurnSpeed[2])->uTextureHeight, + 1, 0, UIMSG_SetTurnSpeed, 0x80, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(93, 270, + pIcons_LOD->GetTexture(options_menu_skin.uTextureID_TurnSpeed[1])->uTextureWidth, + pIcons_LOD->GetTexture(options_menu_skin.uTextureID_TurnSpeed[1])->uTextureHeight, + 1, 0, UIMSG_SetTurnSpeed, 0x40u, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(164, 270, + pIcons_LOD->GetTexture(options_menu_skin.uTextureID_TurnSpeed[0])->uTextureWidth, + pIcons_LOD->GetTexture(options_menu_skin.uTextureID_TurnSpeed[0])->uTextureHeight, + 1, 0, UIMSG_SetTurnSpeed, 0, 0, "", 0); + + pGUIWindow_CurrentMenu->CreateButton(20, 303, + pIcons_LOD->GetTexture(options_menu_skin.uTextureID_WalkSound)->uTextureWidth, + pIcons_LOD->GetTexture(options_menu_skin.uTextureID_WalkSound)->uTextureHeight, + 1, 0, UIMSG_ToggleWalkSound, 0, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(128, 303, + pIcons_LOD->GetTexture(options_menu_skin.uTextureID_ShowDamage)->uTextureWidth, + pIcons_LOD->GetTexture(options_menu_skin.uTextureID_ShowDamage)->uTextureHeight, + 1, 0, UIMSG_ToggleShowDamage, 0, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(20, 325, + pIcons_LOD->GetTexture(options_menu_skin.uTextureID_AlwaysRun)->uTextureWidth, + pIcons_LOD->GetTexture(options_menu_skin.uTextureID_AlwaysRun)->uTextureHeight, + 1, 0, UIMSG_ToggleAlwaysRun, 0, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(128, 325, + pIcons_LOD->GetTexture(options_menu_skin.uTextureID_FlipOnExit)->uTextureWidth, + pIcons_LOD->GetTexture(options_menu_skin.uTextureID_FlipOnExit)->uTextureHeight, + 1, 0, UIMSG_ToggleFlipOnExit, 0, 0, "", 0); + + pBtn_SliderLeft = pGUIWindow_CurrentMenu->CreateButton(243, 162, 16, 16, 1, 0, UIMSG_ChangeSoundVolume, 4, 0, "", pIcons_LOD->GetTexture(options_menu_skin.uTextureID_ArrowLeft), 0); + pBtn_SliderRight = pGUIWindow_CurrentMenu->CreateButton(435, 162, 16, 16, 1, 0, UIMSG_ChangeSoundVolume, 5, 0, "", pIcons_LOD->GetTexture(options_menu_skin.uTextureID_ArrowRight), 0); + pGUIWindow_CurrentMenu->CreateButton(263, 162, 172, 17, 1, 0, UIMSG_ChangeSoundVolume, 0, 0, "", 0); + + pBtn_SliderLeft = pGUIWindow_CurrentMenu->CreateButton(243, 216, 16, 16, 1, 0, UIMSG_ChangeMusicVolume, 4, 0, "", pIcons_LOD->GetTexture(options_menu_skin.uTextureID_ArrowLeft), 0); + pBtn_SliderRight = pGUIWindow_CurrentMenu->CreateButton(435, 216, 16, 16, 1, 0, UIMSG_ChangeMusicVolume, 5, 0, "", pIcons_LOD->GetTexture(options_menu_skin.uTextureID_ArrowRight), 0); + pGUIWindow_CurrentMenu->CreateButton(263, 216, 172, 17, 1, 0, UIMSG_ChangeMusicVolume, 0, 0, "", 0); + + pBtn_SliderLeft = pGUIWindow_CurrentMenu->CreateButton(243, 270, 16, 16, 1, 0, UIMSG_ChangeVoiceVolume, 4, 0, "", pIcons_LOD->GetTexture(options_menu_skin.uTextureID_ArrowLeft), 0); + pBtn_SliderRight = pGUIWindow_CurrentMenu->CreateButton(435, 270, 16, 16, 1, 0, UIMSG_ChangeVoiceVolume, 5, 0, "", pIcons_LOD->GetTexture(options_menu_skin.uTextureID_ArrowRight), 0); + pGUIWindow_CurrentMenu->CreateButton(263, 270, 172, 17, 1, 0, UIMSG_ChangeVoiceVolume, 0, 0, "", 0); + + pGUIWindow_CurrentMenu->CreateButton(241, 302, 214, 40, 1, 0, UIMSG_Escape, 0, 0, pGlobalTXT_LocalizationStrings[619], 0); // "Return to Game" + pGUIWindow_CurrentMenu->CreateButton( 19, 140, 214, 40, 1, 0, UIMSG_OpenKeyMappingOptions, 0, 0x4Bu, "", 0); + pGUIWindow_CurrentMenu->CreateButton( 19, 194, 214, 40, 1, 0, UIMSG_OpenVideoOptions, 0, 86, "", 0); + continue; + + case UIMSG_OpenKeyMappingOptions://Open + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + pGUIWindow_CurrentMenu->Release(); + viewparams->field_48 = 1; + pCurrentScreen = SCREEN_KEYBOARD_OPTIONS; + uTextureID_Optkb[0] = pIcons_LOD->LoadTexture("optkb", TEXTURE_16BIT_PALETTE); + uTextureID_Optkb[1] = pIcons_LOD->LoadTexture("optkb_h", TEXTURE_16BIT_PALETTE); + uTextureID_Optkb[2] = pIcons_LOD->LoadTexture("resume1", TEXTURE_16BIT_PALETTE); + uTextureID_Optkb[3] = pIcons_LOD->LoadTexture("optkb_1", TEXTURE_16BIT_PALETTE); + uTextureID_Optkb[4] = pIcons_LOD->LoadTexture("optkb_2", TEXTURE_16BIT_PALETTE); + pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_KeyMappingOptions, 0, 0); + + pGUIWindow_CurrentMenu->CreateButton(241, 302, 214, 40, 1, 0, UIMSG_Escape, 0, 0, "", 0); + + pGUIWindow_CurrentMenu->CreateButton(19, 302, 108, 20, 1, 0, UIMSG_SelectKeyPage1, 0, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(127, 302, 108, 20, 1, 0, UIMSG_SelectKeyPage2, 0, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(127, 324, 108, 20, 1, 0, UIMSG_ResetKeyMapping, 0, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(19, 324, 108, 20, 1, 0, UIMSG_Game_OpenOptionsDialog, 0, 0, "", 0); + + pGUIWindow_CurrentMenu->CreateButton(129, 148, 70, 19, 1, 0, UIMSG_ChangeKeyButton, 0, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(129, 167, 70, 19, 1, 0, UIMSG_ChangeKeyButton, 1, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(129, 186, 70, 19, 1, 0, UIMSG_ChangeKeyButton, 2, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(129, 205, 70, 19, 1, 0, UIMSG_ChangeKeyButton, 3, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(129, 224, 70, 19, 1, 0, UIMSG_ChangeKeyButton, 4, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(129, 243, 70, 19, 1, 0, UIMSG_ChangeKeyButton, 5, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(129, 262, 70, 19, 1, 0, UIMSG_ChangeKeyButton, 6, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(350, 148, 70, 19, 1, 0, UIMSG_ChangeKeyButton, 7, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(350, 167, 70, 19, 1, 0, UIMSG_ChangeKeyButton, 8, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(350, 186, 70, 19, 1, 0, UIMSG_ChangeKeyButton, 9, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(350, 205, 70, 19, 1, 0, UIMSG_ChangeKeyButton, 10, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(350, 224, 70, 19, 1, 0, UIMSG_ChangeKeyButton, 11, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(350, 243, 70, 19, 1, 0, UIMSG_ChangeKeyButton, 12, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(350, 262, 70, 19, 1, 0, UIMSG_ChangeKeyButton, 13, 0, "", 0); + + uGameMenuUI_CurentlySelectedKeyIdx = -1; + KeyboardPageNum = 1; + memset(GameMenuUI_InvaligKeyBindingsFlags.data(), 0, sizeof(GameMenuUI_InvaligKeyBindingsFlags)); + //*(_WORD *)KeyButtonArray[28] = 0; + memcpy(pPrevVirtualCidesMapping.data(), pKeyActionMap->pVirtualKeyCodesMapping, 0x78u); + continue; + case UIMSG_ChangeKeyButton: + if ( uGameMenuUI_CurentlySelectedKeyIdx != -1 ) + { + pAudioPlayer->PlaySound((SoundID)27, 0, 0, -1, 0, 0, 0, 0); + continue; + } + v14 = uMessageParam; + if ( KeyboardPageNum != 1 ) + v14 = uMessageParam + 14; + uGameMenuUI_CurentlySelectedKeyIdx = v14; + pKeyActionMap->EnterText(0, 1, pGUIWindow_CurrentMenu); + continue; + case UIMSG_ResetKeyMapping: + v197 = 1; + pKeyActionMap->SetDefaultMapping(); + for ( uint i = 0; i < 28; i++ ) + { + if ( pKeyActionMap->GetActionVKey((enum InputAction)i) != pPrevVirtualCidesMapping[i] ) + { + if ( v197 ) + { + GUI_ReplaceHotkey(LOBYTE(pPrevVirtualCidesMapping[i]), pKeyActionMap->GetActionVKey((enum InputAction)i), 1); + v197 = 0; + } + else + GUI_ReplaceHotkey(LOBYTE(pPrevVirtualCidesMapping[i]), pKeyActionMap->GetActionVKey((enum InputAction)i), 0); + } + pPrevVirtualCidesMapping[i] = pKeyActionMap->GetActionVKey((enum InputAction)i); + GameMenuUI_InvaligKeyBindingsFlags[i] = false; + } + pAudioPlayer->PlaySound((SoundID)219, 0, 0, -1, 0, 0, 0, 0); + continue; + case UIMSG_SelectKeyPage1: + KeyboardPageNum = 1; + continue; + case UIMSG_SelectKeyPage2: + KeyboardPageNum = 2; + continue; + case UIMSG_OpenVideoOptions: + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + pGUIWindow_CurrentMenu->Release(); + viewparams->field_48 = 1; + pCurrentScreen = SCREEN_VIDEO_OPTIONS; + optvid_base_texture_id = pIcons_LOD->LoadTexture("optvid", TEXTURE_16BIT_PALETTE); + bloodsplats_texture_id = pIcons_LOD->LoadTexture("opvdH-bs", TEXTURE_16BIT_PALETTE); + us_colored_lights_texture_id = pIcons_LOD->LoadTexture("opvdH-cl", TEXTURE_16BIT_PALETTE); + tinting_texture_id = 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); + not_available_bloodsplats_texture_id = pIcons_LOD->LoadTexture("opvdG-bs", TEXTURE_16BIT_PALETTE); + not_available_us_colored_lights_texture_id = pIcons_LOD->LoadTexture("opvdG-cl", TEXTURE_16BIT_PALETTE); + not_available_tinting_texture_id = pIcons_LOD->LoadTexture("opvdG-tn", TEXTURE_16BIT_PALETTE); + pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_VideoOptions, 0, 0); + pGUIWindow_CurrentMenu->CreateButton(0xF1u, 0x12Eu, 0xD6u, 0x28u, 1, 0, UIMSG_Escape, 0, 0, "", 0); + //if ( pRenderer->pRenderD3D ) + { + pGUIWindow_CurrentMenu->CreateButton(0x13u, 0x118u, 0xD6u, 0x12u, 1, 0, UIMSG_ToggleBloodsplats, 0, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(0x13u, 0x12Eu, 0xD6u, 0x12u, 1, 0, UIMSG_ToggleColoredLights, 0, 0, "", 0); + pGUIWindow_CurrentMenu->CreateButton(0x13u, 0x144u, 0xD6u, 0x12u, 1, 0, UIMSG_ToggleTint, 0, 0, "", 0); + } + /*if ( !pRenderer->bWindowMode ) + { + //v0 = 1; + if ( pRenderer->IsGammaSupported() ) + { + pBtn_SliderLeft = pGUIWindow_CurrentMenu->CreateButton(0x15u, 0xA1u, 0x10u, 0x10u, 1, 0, UIMSG_1A9, 4u, 0, "", pIcons_LOD->GetTexture(uTextureID_507C20), 0); + pBtn_SliderRight = pGUIWindow_CurrentMenu->CreateButton(0xD5u, 0xA1u, 0x10u, 0x10u, 1, 0, UIMSG_1A9, 5u, 0, "", pIcons_LOD->GetTexture(uTextureID_507C24), 0); + pGUIWindow_CurrentMenu->CreateButton(42, 162, 170, 18, 1, 0, UIMSG_1A9, 0, 0, "", 0); + } + }*/ + continue; + case UIMSG_1A9: + __debugbreak(); + if ( uMessageParam == 4 ) + { + //--uGammaPos; + if ( (uGammaPos -- -1) < 0 ) + { + uGammaPos = 0; + pAudioPlayer->PlaySound((SoundID)21, 0, 0, -1, 0, 0, 0, 0); + continue; + } + v19 = (double)(signed int)uGammaPos * 0.1 + 0.6; + pGame->pGammaController->Initialize(v19); + GUIWindow::Create(21, 161, 0, 0, WINDOW_PressedButton2, (int)pBtn_SliderLeft, (char *)1); + pAudioPlayer->PlaySound((SoundID)21, 0, 0, -1, 0, 0, 0, 0); + continue; + } + if ( uMessageParam == 5 ) + { + ++uGammaPos; + if ( (signed int)uGammaPos <= 9 ) + { + v21 = (double)(signed int)uGammaPos * 0.1 + 0.6; + pGame->pGammaController->Initialize(v21); + GUIWindow::Create(213, 161, 0, 0, WINDOW_PressedButton2, (int)pBtn_SliderRight, (char *)1); + pAudioPlayer->PlaySound((SoundID)21, 0, 0, -1, 0, 0, 0, 0); + continue; + } + uGammaPos = 9; + } + else + { + uGammaPos = (pMouse->GetCursorPos(&a2)->x - 42) / 17; + v22 = (double)(signed int)uGammaPos * 0.1 + 0.6; + pGame->pGammaController->Initialize(v22); + } + pAudioPlayer->PlaySound((SoundID)21, 0, 0, -1, 0, 0, 0, 0); + continue; + case UIMSG_ToggleBloodsplats: + pGame->ToggleFlags2(0x20u); + continue; + case UIMSG_ToggleColoredLights: + pRenderer->ToggleColoredLights(); + continue; + case UIMSG_ToggleTint: + pRenderer->ToggleTint(); + continue; + case UIMSG_ChangeMusicVolume: + if ( uMessageParam == 4 )//- + { + --uMusicVolimeMultiplier; + if ( (char)uMusicVolimeMultiplier < 1 ) + uMusicVolimeMultiplier = 0; + GUIWindow::Create(243, 216, 0, 0, WINDOW_PressedButton2, (int)pBtn_SliderLeft, (char *)1); + if ( uMusicVolimeMultiplier ) + pAudioPlayer->PlaySound(SOUND_Bell, -1, 0, -1, 0, 0, pSoundVolumeLevels[uMusicVolimeMultiplier] * 64.0f, 0); + pAudioPlayer->SetMusicVolume(pSoundVolumeLevels[uMusicVolimeMultiplier] * 64.0f); + continue; + } + if ( uMessageParam == 5 )//+ + { + ++uMusicVolimeMultiplier; + if ( (char)uMusicVolimeMultiplier > 9 ) + uMusicVolimeMultiplier = 9; + GUIWindow::Create(435, 216, 0, 0, WINDOW_PressedButton2, (int)pBtn_SliderRight, (char *)1); + if ( uMusicVolimeMultiplier ) + pAudioPlayer->PlaySound(SOUND_Bell, -1, 0, -1, 0, 0, pSoundVolumeLevels[uMusicVolimeMultiplier] * 64.0f, 0); + pAudioPlayer->SetMusicVolume(pSoundVolumeLevels[uMusicVolimeMultiplier] * 64.0f); + continue; + } + uMusicVolimeMultiplier = (pMouse->GetCursorPos(&v202)->x - 263) / 17;//for mouse + if ( (char)uMusicVolimeMultiplier > 9 ) + uMusicVolimeMultiplier = 9; + if ( uMusicVolimeMultiplier ) + pAudioPlayer->PlaySound(SOUND_Bell, -1, 0, -1, 0, 0, pSoundVolumeLevels[uMusicVolimeMultiplier] * 64.0f, 0); + pAudioPlayer->SetMusicVolume(pSoundVolumeLevels[uMusicVolimeMultiplier] * 64.0f); + continue; + case UIMSG_ChangeSoundVolume: + if ( uMessageParam == 4 )//reduce sound level button left + { + --uSoundVolumeMultiplier; + if ( (char)uSoundVolumeMultiplier < 1 ) + uSoundVolumeMultiplier = 0; + GUIWindow::Create(243, 162, 0, 0, WINDOW_PressedButton2, (int)pBtn_SliderLeft, (char *)1); + pAudioPlayer->SetMasterVolume(pSoundVolumeLevels[uSoundVolumeMultiplier] * 128.0f); + pAudioPlayer->PlaySound((SoundID)218, -1, 0, -1, 0, 0, 0, 0); + //int v = AIL_redbook_volume(pAudioPlayer->hAILRedbook); + //if (v) + //__debugbreak(); + continue; + } + if ( uMessageParam == 5 )//Increase sound level button right + { + ++uSoundVolumeMultiplier; + if ( (char)uSoundVolumeMultiplier > 8 ) + uSoundVolumeMultiplier = 9; + //v168 = 1; + v24 = 435; + //v154 = (int)pBtn_SliderRight; + GUIWindow::Create(v24, 0xA2u, 0, 0, WINDOW_PressedButton2, (int)pBtn_SliderRight, (char *)1); + pAudioPlayer->SetMasterVolume(pSoundVolumeLevels[uSoundVolumeMultiplier] * 128.0f); + pAudioPlayer->PlaySound((SoundID)218, -1, 0, -1, 0, 0, 0, 0); + continue; + } + uSoundVolumeMultiplier = (pMouse->GetCursorPos(&v207)->x - 263) / 17; + if ( (char)uSoundVolumeMultiplier > 8 ) + uSoundVolumeMultiplier = 9; + pAudioPlayer->SetMasterVolume(pSoundVolumeLevels[uSoundVolumeMultiplier] * 128.0f); + pAudioPlayer->PlaySound((SoundID)218, -1, 0, -1, 0, 0, 0, 0); + continue; + case UIMSG_ToggleFlipOnExit: + bFlipOnExit = bFlipOnExit == 0; + continue; + case UIMSG_ToggleAlwaysRun: + bAlwaysRun = bAlwaysRun == 0; + continue; + case UIMSG_ToggleWalkSound: + bWalkSound = bWalkSound == 0; + continue; + case UIMSG_ToggleShowDamage: + bShowDamage = bShowDamage == 0; + continue; + case UIMSG_ChangeVoiceVolume: + if ( uMessageParam == 4 ) + { + --uVoicesVolumeMultiplier; + if ( (char)uVoicesVolumeMultiplier < 1 ) + uVoicesVolumeMultiplier = 0; + GUIWindow::Create(243, 270, 0, 0, WINDOW_PressedButton2, (int)pBtn_SliderLeft, (char *)1); + if ( !uVoicesVolumeMultiplier ) + continue; + pAudioPlayer->PlaySound((SoundID)5788, -1, 0, -1, 0, 0, pSoundVolumeLevels[uVoicesVolumeMultiplier] * 128.0f, 0); + continue; + } + if ( uMessageParam == 5 ) + { + ++uVoicesVolumeMultiplier; + if ( (char)uVoicesVolumeMultiplier > 8 ) + uVoicesVolumeMultiplier = 9; + GUIWindow::Create(435, 270, 0, 0, WINDOW_PressedButton2, (int)pBtn_SliderRight, (char *)1); + if ( !uVoicesVolumeMultiplier ) + continue; + pAudioPlayer->PlaySound((SoundID)5788, -1, 0, -1, 0, 0, pSoundVolumeLevels[uVoicesVolumeMultiplier] * 128.0f, 0); + continue; + } + uVoicesVolumeMultiplier = (pMouse->GetCursorPos(&v205)->x - 263) / 17; + if ( (char)uVoicesVolumeMultiplier > 8 ) + uVoicesVolumeMultiplier = 9; + if ( !uVoicesVolumeMultiplier ) + continue; + pAudioPlayer->PlaySound((SoundID)5788, -1, 0, -1, 0, 0, pSoundVolumeLevels[uVoicesVolumeMultiplier] * 128.0f, 0); + continue; + case UIMSG_SetTurnSpeed: + if ( uMessageParam ) + pParty->sRotationY = uMessageParam * pParty->sRotationY / uMessageParam; + uTurnSpeed = uMessageParam; + continue; + + case UIMSG_SetGraphicsMode: + /*if ( !bUseLoResSprites ) + { + byte_6BE388_graphicsmode = uMessageParam; + MM7Initialization(); + continue; + } + if ( uMessageParam ) + { + if ( uMessageParam == 1 ) + { + byte_6BE388_graphicsmode = 0; + } + else + { + if ( uMessageParam != 2 ) + continue; + byte_6BE388_graphicsmode = 1; + } + MM7Initialization(); + continue; + }*/ + ModalWindow(pNPCTopics[453].pText, UIMSG_0); + __debugbreak(); // Nomad: graphicsmode as it was now removed + continue; + + case UIMSG_GameMenu_ReturnToGame: + pGUIWindow_CurrentMenu->Release(); + pEventTimer->Resume(); + pCurrentScreen = SCREEN_GAME; + viewparams->bRedrawGameUI = 1; + stru_506E40.Release(); + continue; + case UIMSG_OpenQuestBook: + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + if ( pCurrentScreen ) + pGUIWindow_CurrentMenu->Release(); + pEventTimer->Pause(); + pAudioPlayer->StopChannels(-1, -1); + pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_Book, uMessage, 0); + pBooksWindow = GUIWindow::Create(493u, 355u, 0, 0, WINDOW_BooksWindow, (int)pBtn_Quests, 0); + bFlashQuestBook = 0; + continue; + case UIMSG_OpenAutonotes: + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + if ( pCurrentScreen ) + pGUIWindow_CurrentMenu->Release(); + pEventTimer->Pause(); + pAudioPlayer->StopChannels(-1, -1); + pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_Book, uMessage, 0); + pBooksWindow = GUIWindow::Create(527u, 353u, 0, 0, WINDOW_BooksWindow, (int)pBtn_Autonotes, 0); + bFlashAutonotesBook = 0; + continue; + case UIMSG_OpenMapBook: + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + if ( pCurrentScreen ) + pGUIWindow_CurrentMenu->Release(); + pEventTimer->Pause(); + viewparams->sViewCenterX = pParty->vPosition.x; + viewparams->sViewCenterY = pParty->vPosition.y; + pAudioPlayer->StopChannels(-1, -1); + pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_Book, uMessage, 0); + pBooksWindow = GUIWindow::Create(546, 353, 0, 0, WINDOW_BooksWindow, (int)pBtn_Maps, 0); + continue; + case UIMSG_OpenCalendar: + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + if ( pCurrentScreen ) + pGUIWindow_CurrentMenu->Release(); + pEventTimer->Pause(); + pAudioPlayer->StopChannels(-1, -1); + pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_Book, uMessage, 0); + pBooksWindow = GUIWindow::Create(570, 354, 0, 0, WINDOW_BooksWindow, (int)pBtn_Calendar, 0); + continue; + case UIMSG_OpenHistoryBook: + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + if ( pCurrentScreen ) + pGUIWindow_CurrentMenu->Release(); + pEventTimer->Pause(); + pAudioPlayer->StopChannels(-1, -1); + pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_Book, uMessage, 0); + pBooksWindow = GUIWindow::Create(0x258u, 0x169u, 0, 0, WINDOW_BooksWindow, (int)pBtn_History, 0); + bFlashHistoryBook = 0; + continue; + case UIMSG_Escape:// нажатие Escape and return to game + back_to_game(); + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + switch ( pCurrentScreen ) + { + case SCREEN_E: + __debugbreak(); + case SCREEN_NPC_DIALOGUE: + case SCREEN_CHEST: + case SCREEN_CHEST_INVENTORY: + case SCREEN_CHANGE_LOCATION: + case SCREEN_INPUT_BLV: + case SCREEN_QUICK_REFERENCE: + if ( dword_50CDC8 ) + break; + CloseWindowBackground(); + uMessageParam = 1; + break; + case SCREEN_HOUSE: + if ( !dword_50CDC8 ) + { + CloseWindowBackground(); + uMessageParam = 1; + break; + } + break; + } + if ( !pModalWindow ) + { + pRenderer->ClearZBuffer(0, 479); + viewparams->bRedrawGameUI = 1; + viewparams->field_48 = 1; + if ( pCurrentScreen ) + { + if ( pCurrentScreen > SCREEN_67 ) + { + if ( pCurrentScreen == SCREEN_QUICK_REFERENCE ) + { + pIcons_LOD->RemoveTexturesPackFromTextureList(); + if ( pGUIWindow_Settings ) + { + if ( pCurrentScreen == SCREEN_CHARACTERS ) + pMouse->SetCursorBitmap("MICON2"); + else + { + pGUIWindow_Settings->Release(); + pGUIWindow_Settings = 0; + pMouse->SetCursorBitmap("MICON1"); + GameUI_Footer_TimeLeft = 0; + _50C9A0_IsEnchantingInProgress = 0; + back_to_game(); + } + } + if ( (signed int)uActiveCharacter < 1 || (signed int)uActiveCharacter > 4 ) + uActiveCharacter = pParty->GetNextActiveCharacter(); + pGUIWindow_CurrentMenu->Release(); + if ( pGUIWindow_CurrentMenu == window_SpeakInHouse ) + window_SpeakInHouse = 0; + pGUIWindow_CurrentMenu = 0; + pEventTimer->Resume(); + pCurrentScreen = SCREEN_GAME; + viewparams->bRedrawGameUI = 1; + pIcons_LOD->RemoveTexturesFromTextureList(); + continue; + } + } + else + { + if ( pCurrentScreen < SCREEN_64 ) + { + switch ( pCurrentScreen ) + { + case SCREEN_CASTING: + pIcons_LOD->RemoveTexturesPackFromTextureList(); + if ( some_active_character ) + { + uActiveCharacter = some_active_character; + uActiveCharacter = pParty->GetNextActiveCharacter(); + some_active_character = 0; + if ( pParty->bTurnBasedModeOn ) + pTurnEngine->ApplyPlayerAction(); + _50C9D0_AfterEnchClickEventId = 0; + _50C9D4_AfterEnchClickEventSecondParam = 0; + _50C9D8_AfterEnchClickEventTimeout = 0; + } + if ( ptr_50C9A4_ItemToEnchant && ptr_50C9A4_ItemToEnchant->uItemID ) + { + LOBYTE(ptr_50C9A4_ItemToEnchant->uAttributes) &= 0xFu; + _50C9A8_item_enchantment_timer = 0; + ptr_50C9A4_ItemToEnchant = nullptr; + } + if ( pGUIWindow_Settings ) + { + if ( pCurrentScreen == SCREEN_CHARACTERS ) + pMouse->SetCursorBitmap("MICON2"); + else + { + pGUIWindow_Settings->Release(); + pGUIWindow_Settings = 0; + pMouse->SetCursorBitmap("MICON1"); + GameUI_Footer_TimeLeft = 0; + _50C9A0_IsEnchantingInProgress = 0; + back_to_game(); + } + } + if ( (signed int)uActiveCharacter < 1 || (signed int)uActiveCharacter > 4 ) + uActiveCharacter = pParty->GetNextActiveCharacter(); + pGUIWindow_CurrentMenu->Release(); + if ( pGUIWindow_CurrentMenu == window_SpeakInHouse ) + window_SpeakInHouse = 0; + pGUIWindow_CurrentMenu = 0; + pEventTimer->Resume(); + pCurrentScreen = SCREEN_GAME; + viewparams->bRedrawGameUI = 1; + pIcons_LOD->RemoveTexturesFromTextureList(); + continue; + case SCREEN_BOOKS: + pBooksWindow->Release(); + //crt_deconstruct_ptr_6A0118(); + pBooksWindow = 0; + pEventTimer->Resume(); + if ( pGUIWindow_Settings ) + { + if ( pCurrentScreen == SCREEN_CHARACTERS ) + pMouse->SetCursorBitmap("MICON2"); + else + { + pGUIWindow_Settings->Release(); + pGUIWindow_Settings = 0; + pMouse->SetCursorBitmap("MICON1"); + GameUI_Footer_TimeLeft = 0; + _50C9A0_IsEnchantingInProgress = 0; + back_to_game(); + } + } + if ( (signed int)uActiveCharacter < 1 || (signed int)uActiveCharacter > 4 ) + uActiveCharacter = pParty->GetNextActiveCharacter(); + pGUIWindow_CurrentMenu->Release(); + if ( pGUIWindow_CurrentMenu == window_SpeakInHouse ) + window_SpeakInHouse = 0; + pGUIWindow_CurrentMenu = 0; + pEventTimer->Resume(); + pCurrentScreen = SCREEN_GAME; + viewparams->bRedrawGameUI = 1; + pIcons_LOD->RemoveTexturesFromTextureList(); + continue; + case SCREEN_SAVEGAME: + case SCREEN_LOADGAME: + pIcons_LOD->RemoveTexturesPackFromTextureList(); + //crt_deconstruct_ptr_6A0118(); + stru_506E40.Release(); + break; + case SCREEN_CHEST_INVENTORY: + pCurrentScreen = SCREEN_CHEST; + continue; + case SCREEN_CHEST: + pWindow2 = pChestWindow; + pWindow2->Release(); + pIcons_LOD->RemoveTexturesPackFromTextureList(); + pCurrentScreen = SCREEN_GAME; + viewparams->bRedrawGameUI = 1; + pEventTimer->Resume(); + continue; + case SCREEN_19: + __debugbreak(); + pWindow2 = ptr_507BC8; + pWindow2->Release(); + pIcons_LOD->RemoveTexturesPackFromTextureList(); + pCurrentScreen = SCREEN_GAME; + viewparams->bRedrawGameUI = 1; + pEventTimer->Resume(); + continue; + case SCREEN_OPTIONS://Close + options_menu_skin.Relaease(); + pIcons_LOD->SyncLoadedFilesCount(); + 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 ) + { + WriteWindowsRegistryInt("TurnDelta", 3); + stru_506E40.Release(); + break; + } + if ( uTurnSpeed == 64 ) + { + WriteWindowsRegistryInt("TurnDelta", 2); + stru_506E40.Release(); + break; + } + if ( uTurnSpeed != 128 ) + { + stru_506E40.Release(); + break; + } + WriteWindowsRegistryInt("TurnDelta", 1); + stru_506E40.Release(); + break; + case SCREEN_MENU: + pIcons_LOD->SyncLoadedFilesCount(); + pIcons_LOD->RemoveTexturesPackFromTextureList(); + pIcons_LOD->SyncLoadedFilesCount(); + pIcons_LOD->RemoveTexturesPackFromTextureList(); + stru_506E40.Release(); + break; + case SCREEN_VIDEO_OPTIONS: + //if ( pRenderer->pRenderD3D ) + { + WriteWindowsRegistryInt("Colored Lights", pRenderer->bUseColoredLights); + WriteWindowsRegistryInt("Tinting", pRenderer->bTinting); + WriteWindowsRegistryInt("Bloodsplats", (LOBYTE(pGame->uFlags2) >> 5) & 1); + } + /*if ( !pRenderer->bWindowMode ) + WriteWindowsRegistryInt("GammaPos", uGammaPos);*/ + + stru_506E40.Release(); + break; + + case SCREEN_KEYBOARD_OPTIONS://Return to game + v197 = 1; + pKeyBindingFlag = false; + for ( uint i = 0; i < 28; ++i ) + { + if ( GameMenuUI_InvaligKeyBindingsFlags[i] ) + pKeyBindingFlag = true; + } + if ( !pKeyBindingFlag ) + { + for ( uint i = 0; i < 5; i++ ) + { + if ( uTextureID_Optkb[i] ) + pIcons_LOD->pTextures[uTextureID_Optkb[i]].Release(); + } + memset(&uTextureID_Optkb, 0, 20); + pIcons_LOD->SyncLoadedFilesCount(); + for ( uint i = 0; i < 28; ++i ) + { + if ( pKeyActionMap->GetActionVKey((enum InputAction)i) != pPrevVirtualCidesMapping[i] ) + { + if ( v197 ) + { + GUI_ReplaceHotkey(pKeyActionMap->GetActionVKey((enum InputAction)i), LOBYTE(pPrevVirtualCidesMapping[i]), 1); + v197 = 0; + } + else + GUI_ReplaceHotkey(pKeyActionMap->GetActionVKey((enum InputAction)i), LOBYTE(pPrevVirtualCidesMapping[i]), 0); + } + if ( i > 3 && i != 25 && i != 26 ) + pKeyToggleType = TOGGLE_OneTimePress; + else + pKeyToggleType = TOGGLE_Continuously; + pKeyActionMap->SetKeyMapping(i, pPrevVirtualCidesMapping[i], pKeyToggleType); + } + pKeyActionMap->StoreMappings(); + stru_506E40.Release(); + break; + } + pAudioPlayer->PlaySound((SoundID)27, 0, 0, -1, 0, 0, 0, 0); + break; + case SCREEN_REST://close rest screen + if ( dword_506F14 ) + { + Rest(_506F18_num_minutes_to_sleep); + pParty->pPlayers[3].SetAsleep(false); + pParty->pPlayers[2].SetAsleep(false); + pParty->pPlayers[1].SetAsleep(false); + pParty->pPlayers[0].SetAsleep(false); + } + pTexture_RestUI_CurrentSkyFrame->Release(); + pTexture_RestUI_CurrentHourglassFrame->Release(); + pTexture_RestUI_CurrentHourglassFrame = 0; + pTexture_RestUI_CurrentSkyFrame = 0; + pIcons_LOD->SyncLoadedFilesCount(); + pIcons_LOD->RemoveTexturesPackFromTextureList(); + if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor) + { + pOutdoor->UpdateSunlightVectors(); + pOutdoor->UpdateFog(); + } + _506F18_num_minutes_to_sleep = 0; + dword_506F14 = 0; + if ( pGUIWindow_Settings ) + { + if ( pCurrentScreen == SCREEN_CHARACTERS ) + pMouse->SetCursorBitmap("MICON2"); + else + { + pGUIWindow_Settings->Release(); + pGUIWindow_Settings = 0; + pMouse->SetCursorBitmap("MICON1"); + GameUI_Footer_TimeLeft = 0; + _50C9A0_IsEnchantingInProgress = 0; + back_to_game(); + } + } + if ( (signed int)uActiveCharacter < 1 || (signed int)uActiveCharacter > 4 ) + uActiveCharacter = pParty->GetNextActiveCharacter(); + pGUIWindow_CurrentMenu->Release(); + if ( pGUIWindow_CurrentMenu == window_SpeakInHouse ) + window_SpeakInHouse = 0; + pGUIWindow_CurrentMenu = 0; + pEventTimer->Resume(); + pCurrentScreen = SCREEN_GAME; + viewparams->bRedrawGameUI = 1; + pIcons_LOD->RemoveTexturesFromTextureList(); + continue; + case SCREEN_E: + __debugbreak(); + pGUIWindow_CurrentMenu->Release(); + pCurrentScreen = SCREEN_HOUSE; + pIcons_LOD->RemoveTexturesPackFromTextureList(); + continue; + case SCREEN_HOUSE: + if ( uDialogueType ) + uDialogueType = 0; + if ( uGameState == GAME_STATE_CHANGE_LOCATION ) + { + while ( HouseDialogPressCloseBtn() ) + ; + } + else + { + if ( HouseDialogPressCloseBtn() ) + continue; + } + GetHouseGoodbyeSpeech(); + pAudioPlayer->PlaySound(SOUND_7, 814, 0, -1, 0, 0, 0, 0); + pMediaPlayer->Unload(); + pGUIWindow_CurrentMenu = window_SpeakInHouse; + if ( pGUIWindow_Settings ) + { + if ( pCurrentScreen == SCREEN_CHARACTERS ) + pMouse->SetCursorBitmap("MICON2"); + else + { + pGUIWindow_Settings->Release(); + pGUIWindow_Settings = 0; + pMouse->SetCursorBitmap("MICON1"); + GameUI_Footer_TimeLeft = 0; + _50C9A0_IsEnchantingInProgress = 0; + back_to_game(); + } + } + if ( (signed int)uActiveCharacter < 1 || (signed int)uActiveCharacter > 4 ) + uActiveCharacter = pParty->GetNextActiveCharacter(); + pGUIWindow_CurrentMenu->Release(); + if ( pGUIWindow_CurrentMenu == window_SpeakInHouse ) + window_SpeakInHouse = 0; + pGUIWindow_CurrentMenu = 0; + pEventTimer->Resume(); + pCurrentScreen = SCREEN_GAME; + viewparams->bRedrawGameUI = true; + pIcons_LOD->RemoveTexturesFromTextureList(); + continue; + case SCREEN_INPUT_BLV://click escape + if ( uCurrentHouse_Animation == 153 ) + PlayHouseSound(0x99u, HouseSound_Greeting_2); + pMediaPlayer->Unload(); + if ( npcIdToDismissAfterDialogue ) + { + pParty->hirelingScrollPosition = 0; + LOBYTE(pNPCStats->pNewNPCData[npcIdToDismissAfterDialogue].uFlags) &= 0x7Fu; + pParty->CountHirelings(); + viewparams->bRedrawGameUI = true; + npcIdToDismissAfterDialogue = 0; + } + DialogueEnding(); + pCurrentScreen = SCREEN_GAME; + viewparams->bRedrawGameUI = true; + continue; + case SCREEN_NPC_DIALOGUE://click escape + if ( npcIdToDismissAfterDialogue ) + { + pParty->hirelingScrollPosition = 0; + LOBYTE(pNPCStats->pNewNPCData[npcIdToDismissAfterDialogue].uFlags) &= 0x7Fu; + pParty->CountHirelings(); + viewparams->bRedrawGameUI = true; + npcIdToDismissAfterDialogue = 0; + } + //goto LABEL_317; + DialogueEnding(); + pCurrentScreen = SCREEN_GAME; + viewparams->bRedrawGameUI = true; + continue; + case SCREEN_BRANCHLESS_NPC_DIALOG://click escape + memset(GameUI_Footer_TimedString.data(), 0, 0xC8u); + sub_4452BB(); + DialogueEnding(); + pCurrentScreen = SCREEN_GAME; + viewparams->bRedrawGameUI = true; + continue; + case SCREEN_CHANGE_LOCATION://click escape + 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; + DialogueEnding(); + pCurrentScreen = SCREEN_GAME; + viewparams->bRedrawGameUI = true; + continue; + case SCREEN_VIDEO: + pMediaPlayer->Unload(); + continue; + case SCREEN_CHARACTERS: + CharacterUI_ReleaseButtons(); + ReleaseAwardsScrollBar(); + pIcons_LOD->RemoveTexturesPackFromTextureList(); + if ( pGUIWindow_Settings ) + { + if ( pCurrentScreen == SCREEN_CHARACTERS ) + pMouse->SetCursorBitmap("MICON2"); + else + { + pGUIWindow_Settings->Release(); + pGUIWindow_Settings = 0; + pMouse->SetCursorBitmap("MICON1"); + GameUI_Footer_TimeLeft = 0; + _50C9A0_IsEnchantingInProgress = 0; + back_to_game(); + } + } + if ( (signed int)uActiveCharacter < 1 || (signed int)uActiveCharacter > 4 ) + uActiveCharacter = pParty->GetNextActiveCharacter(); + pGUIWindow_CurrentMenu->Release(); + if ( pGUIWindow_CurrentMenu == window_SpeakInHouse ) + window_SpeakInHouse = 0; + pGUIWindow_CurrentMenu = 0; + pEventTimer->Resume(); + pCurrentScreen = SCREEN_GAME; + viewparams->bRedrawGameUI = true; + pIcons_LOD->RemoveTexturesFromTextureList(); + continue; + default: + if ( pGUIWindow_Settings ) + { + if ( pCurrentScreen == SCREEN_CHARACTERS ) + pMouse->SetCursorBitmap("MICON2"); + else + { + pGUIWindow_Settings->Release(); + pGUIWindow_Settings = 0; + pMouse->SetCursorBitmap("MICON1"); + GameUI_Footer_TimeLeft = 0; + _50C9A0_IsEnchantingInProgress = 0; + back_to_game(); + } + } + if ( (signed int)uActiveCharacter < 1 || (signed int)uActiveCharacter > 4 ) + uActiveCharacter = pParty->GetNextActiveCharacter(); + pGUIWindow_CurrentMenu->Release(); + if ( pGUIWindow_CurrentMenu == window_SpeakInHouse ) + window_SpeakInHouse = 0; + pGUIWindow_CurrentMenu = 0; + pEventTimer->Resume(); + pCurrentScreen = SCREEN_GAME; + viewparams->bRedrawGameUI = 1; + pIcons_LOD->RemoveTexturesFromTextureList(); + continue; + } + if ( pGUIWindow_Settings ) + { + if ( pCurrentScreen == SCREEN_CHARACTERS ) + pMouse->SetCursorBitmap("MICON2"); + else + { + pGUIWindow_Settings->Release(); + pGUIWindow_Settings = 0; + pMouse->SetCursorBitmap("MICON1"); + GameUI_Footer_TimeLeft = 0; + _50C9A0_IsEnchantingInProgress = 0; + back_to_game(); + } + } + if ( (signed int)uActiveCharacter < 1 || (signed int)uActiveCharacter > 4 ) + uActiveCharacter = pParty->GetNextActiveCharacter(); + pGUIWindow_CurrentMenu->Release(); + if ( pGUIWindow_CurrentMenu == window_SpeakInHouse ) + window_SpeakInHouse = 0; + pGUIWindow_CurrentMenu = 0; + pEventTimer->Resume(); + pCurrentScreen = SCREEN_GAME; + viewparams->bRedrawGameUI = true; + pIcons_LOD->RemoveTexturesFromTextureList(); + continue; + } + CharacterUI_ReleaseButtons(); + ReleaseAwardsScrollBar(); + pIcons_LOD->RemoveTexturesPackFromTextureList(); + } + if ( pGUIWindow_Settings ) + { + if ( pCurrentScreen == SCREEN_CHARACTERS ) + pMouse->SetCursorBitmap("MICON2"); + else + { + pGUIWindow_Settings->Release(); + pGUIWindow_Settings = 0; + pMouse->SetCursorBitmap("MICON1"); + GameUI_Footer_TimeLeft = 0; + _50C9A0_IsEnchantingInProgress = 0; + back_to_game(); + } + } + if ( (signed int)uActiveCharacter < 1 || (signed int)uActiveCharacter > 4 ) + uActiveCharacter = pParty->GetNextActiveCharacter(); + pGUIWindow_CurrentMenu->Release(); + if ( pGUIWindow_CurrentMenu == window_SpeakInHouse ) + window_SpeakInHouse = 0; + pGUIWindow_CurrentMenu = 0; + pEventTimer->Resume(); + pCurrentScreen = SCREEN_GAME; + viewparams->bRedrawGameUI = true; + pIcons_LOD->RemoveTexturesFromTextureList(); + continue; + } + if ( !pGUIWindow_Settings )//Draw Menu + { + dword_6BE138 = -1; + GUIWindow::Create(0x25Au, 0x1C2u, 0, 0, WINDOW_PressedButton2, (int)pBtn_GameSettings, (char *)1); + pEventTimer->Pause(); + pAudioPlayer->StopChannels(-1, -1); + pCurrentScreen = SCREEN_MENU; + + ++pIcons_LOD->uTexturePacksCount; + if ( !pIcons_LOD->uNumPrevLoadedFiles ) + pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles; + + pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_OptionsButtons, 0, 0); + uTextureID_Options = pIcons_LOD->LoadTexture("options", TEXTURE_16BIT_PALETTE); + uTextureID_New1 = pIcons_LOD->LoadTexture("new1", TEXTURE_16BIT_PALETTE); + uTextureID_Load1 = pIcons_LOD->LoadTexture("load1", TEXTURE_16BIT_PALETTE); + uTextureID_Save1 = pIcons_LOD->LoadTexture("save1", TEXTURE_16BIT_PALETTE); + uTextureID_Controls1 = pIcons_LOD->LoadTexture("controls1", TEXTURE_16BIT_PALETTE); + uTextureID_Resume1 = pIcons_LOD->LoadTexture("resume1", TEXTURE_16BIT_PALETTE); + uTextureID_Quit1 = pIcons_LOD->LoadTexture("quit1", TEXTURE_16BIT_PALETTE); + pBtn_NewGame = pGUIWindow_CurrentMenu->CreateButton(0x13u, 0x9Bu, 0xD6u, 0x28u, 1, 0, UIMSG_StartNewGame, 0, 0x4Eu, + pGlobalTXT_LocalizationStrings[614],// "New Game" + pIcons_LOD->GetTexture(uTextureID_New1), 0); + pBtn_SaveGame = pGUIWindow_CurrentMenu->CreateButton(0x13u, 0xD1u, 0xD6u, 0x28u, 1, 0, UIMSG_Game_OpenSaveGameDialog, 0, 0x53u, + pGlobalTXT_LocalizationStrings[615],// "Save Game" + pIcons_LOD->GetTexture(uTextureID_Save1), 0); + pBtn_LoadGame = pGUIWindow_CurrentMenu->CreateButton(19, 263, 0xD6u, 0x28u, 1, 0, UIMSG_Game_OpenLoadGameDialog, 0, 0x4Cu, + pGlobalTXT_LocalizationStrings[616],// "Load Game" + pIcons_LOD->GetTexture(uTextureID_Load1), 0); + pBtn_GameControls = pGUIWindow_CurrentMenu->CreateButton(241, 155, 214, 40, 1, 0, UIMSG_Game_OpenOptionsDialog, 0, 0x43u, + pGlobalTXT_LocalizationStrings[617],// ""Sound, Keyboard, Game Options:"" + pIcons_LOD->GetTexture(uTextureID_Controls1), 0); + pBtn_QuitGame = pGUIWindow_CurrentMenu->CreateButton(241, 209, 214, 40, 1, 0, UIMSG_Quit, 0, 0x51u, + pGlobalTXT_LocalizationStrings[618],// "Quit" + pIcons_LOD->GetTexture(uTextureID_Quit1), 0); + pBtn_Resume = pGUIWindow_CurrentMenu->CreateButton(241, 263, 214, 40, 1, 0, UIMSG_GameMenu_ReturnToGame, 0, 0x52u, + pGlobalTXT_LocalizationStrings[619],// "Return to Game" + pIcons_LOD->GetTexture(uTextureID_Resume1), 0); + pGUIWindow_CurrentMenu->_41D08F_set_keyboard_control_group(6, 1, 0, 0); + viewparams->field_48 = 1; + + stru_506E40.Release(); + pRenderer->SaveScreenshot("gamma.pcx", 155, 117); + stru_506E40.LoadPCXFile("gamma.pcx", 0); + + continue; + } + pGUIWindow_Settings->Release(); + pGUIWindow_Settings = 0; + pMouse->SetCursorBitmap("MICON1"); + GameUI_Footer_TimeLeft = 0; + _50C9A0_IsEnchantingInProgress = 0; + back_to_game(); + continue; + } + ModalWindow_Release(); + continue; + case UIMSG_ScrollNPCPanel://Right and Left button for NPCPanel + if ( uMessageParam ) + { + GUIWindow::Create(626, 179, 0, 0, WINDOW_PressedButton2, (int)pBtn_NPCRight, 0); + v37 = (pParty->pHirelings[0].pName != 0) + (pParty->pHirelings[1].pName != 0) + (unsigned __int8)pParty->field_70A - 2; + if ( pParty->hirelingScrollPosition < v37 ) + { + ++pParty->hirelingScrollPosition;//??? maybe number of the first cell??? + if ( pParty->hirelingScrollPosition >= v37 ) + pParty->hirelingScrollPosition = (pParty->pHirelings[0].pName != 0) + (pParty->pHirelings[1].pName != 0) + pParty->field_70A - 2; + } + } + else + { + GUIWindow::Create(469, 179, 0, 0, WINDOW_PressedButton2, (int)pBtn_NPCLeft, 0); + /*if ( pParty->field_709 ) + { + --pParty->field_709; + if ( pParty->field_709 < 1 ) + pParty->field_709 = 0; + }*/ + } + GameUI_DrawHiredNPCs(); + continue; + case UIMSG_TransitionUI_Confirm: + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + dword_50CDC8 = 1; + sub_42FBDD(); + PlayHouseSound(uCurrentHouse_Animation, HouseSound_NotEnoughMoney_TrainingSuccessful); + + if (pMovie_Track) + pMediaPlayer->Unload(); + DialogueEnding(); + viewparams->bRedrawGameUI = true; + 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(); + Transition_StopSound_Autosave(dword_591164_teleport_map_name, MapStartPoint_Party); + } + } + else + EventProcessor(dword_5C3418, 0, 1, dword_5C341C); + if ( !_stricmp(byte_6BE3B0.data(), "d05.blv") ) + pParty->uTimePlayed += 1474560i64; + continue; + case UIMSG_TransitionWindowCloseBtn: + CloseWindowBackground(); + pMediaPlayer->Unload(); + DialogueEnding(); + viewparams->bRedrawGameUI = true; + continue; + case UIMSG_CycleCharacters: + v39 = GetAsyncKeyState(VK_SHIFT); + uActiveCharacter = CycleCharacter(v39); + viewparams->bRedrawGameUI = true; + continue; + case UIMSG_OnTravelByFoot: + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + dword_50CDC8 = 1; + sub_42FBDD(); + //pNPCData4 = (NPCData *)GetTravelTime(); + strcpy(pOutdoor->pLevelFilename, pCurrentMapName); + if ( bUnderwater != 1 && pParty->bFlying + || pOutdoor->GetTravelDestination(pParty->vPosition.x, pParty->vPosition.y, pOut, 20) != 1 ) + { + viewparams->bRedrawGameUI = 1; + CloseWindowBackground(); + if ( pParty->vPosition.x < -22528 ) + pParty->vPosition.x = -22528; + if ( pParty->vPosition.x > 22528 ) + pParty->vPosition.x = 22528; + if ( pParty->vPosition.y < -22528 ) + pParty->vPosition.y = -22528; + if ( pParty->vPosition.y > 22528 ) + pParty->vPosition.y = 22528; + DialogueEnding(); + pCurrentScreen = SCREEN_GAME; + } + else + { + pParty->field_6E4 = 0; + pParty->field_6E0 = 0; + CastSpellInfoHelpers::_427D48(); + DialogueEnding(); + pEventTimer->Pause(); + pGameLoadingUI_ProgressBar->Initialize(GUIProgressBar::TYPE_Box); + ++pGameLoadingUI_ProgressBar->uProgressMax; + SaveGame(1, 0); + pGameLoadingUI_ProgressBar->Progress(); + RestAndHeal(1440 * (signed int)GetTravelTime()); + if ( pParty->uNumFoodRations ) + { + pParty->RestAndHeal(); + if ( ((pParty->uNumFoodRations - (signed int)GetTravelTime()) & 0x80000000u) != 0 ) + { + pPlayer7 = pParty->pPlayers.data(); + do + { + pPlayer7->SetCondition(1, 0); + ++pPlayer7; + } + while ( (signed int)pPlayer7 < (signed int)pParty->pHirelings.data() ); + ++pParty->days_played_without_rest; + } + Party::TakeFood((unsigned int)GetTravelTime()); + } + else + { + pPlayer8 = pParty->pPlayers.data(); + do + { + pPlayer8->SetCondition(1, 0); + ++pPlayer8; + } + while ( (signed int)pPlayer8 < (signed int)pParty->pHirelings.data() ); + ++pParty->days_played_without_rest; + } + 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 ( !_stricmp(pCurrentMapName, "out15.odm") || !_stricmp(pCurrentMapName, "d47.blv") ) + bNoNPCHiring = 1; + PrepareToLoadODM(1u, (ODMRenderParams *)1); + pAudioPlayer->SetMapEAX(); + bDialogueUI_InitializeActor_NPC_ID = 0; + OnMapLoad(); + pOutdoor->SetFog(); + TeleportToStartingPoint(uLevel_StartingPointType); + pParty->vPosition.z = GetTerrainHeightsAroundParty2(pParty->vPosition.x, pParty->vPosition.y, &v213, 0); + pParty->uFallStartY = pParty->vPosition.z; + _461103_load_level_sub(); + pEventTimer->Resume(); + viewparams->bRedrawGameUI = 1; + pCurrentScreen = SCREEN_GAME; + pGameLoadingUI_ProgressBar->Release(); + } + viewparams->bRedrawGameUI = 1; + continue; + case UIMSG_CHANGE_LOCATION_ClickCencelBtn: + CloseWindowBackground(); + if ( pParty->vPosition.x < -22528 ) + pParty->vPosition.x = -22528; + if ( pParty->vPosition.x > 22528 ) + pParty->vPosition.x = 22528; + if ( pParty->vPosition.y < -22528 ) + pParty->vPosition.y = -22528; + if ( pParty->vPosition.y > 22528 ) + pParty->vPosition.y = 22528; + DialogueEnding(); + pCurrentScreen = SCREEN_GAME; + viewparams->bRedrawGameUI = 1; + continue; + case UIMSG_CastSpell_Telekinesis: + //if ( pRenderer->pRenderD3D ) + LOWORD(v42) = pGame->pVisInstance->get_picked_object_zbuf_val(); + /*else + { + uNumSeconds = (unsigned int)pMouse->GetCursorPos(&v210); + pPoint = pMouse->GetCursorPos(&v208); + v42 = pRenderer->pActiveZBuffer[*(int *)uNumSeconds + pSRZBufferLineOffsets[pPoint->y]]; + }*/ + v44 = (unsigned __int16)v42; + v45 = PID_TYPE(v44); + uNumSeconds = v44; + v46 = PID_ID(v44); + if ( v45 == 3 ) + { + v47 = pActors[v46].uAIState == Dead; + if ( !v47 ) + continue; + pSpellInfo = (CastSpellInfo *)pGUIWindow_Settings->ptr_1C; + pSpellInfo->uFlags &= ~0x40u; + pSpellInfo->uPlayerID_2 = uMessageParam; + pSpellInfo->spell_target_pid = v44; + pParty->pPlayers[pSpellInfo->uPlayerID].SetRecoveryTime(300); + pGUIWindow_Settings->Release(); + pGUIWindow_Settings = 0; + pMouse->SetCursorBitmap("MICON1"); + GameUI_Footer_TimeLeft = 0; + _50C9A0_IsEnchantingInProgress = 0; + back_to_game(); + continue; + } + if ( v45 == 2 ) + { + v47 = (pObjectList->pObjects[pSpriteObjects[v46].uObjectDescID].uFlags & 0x10) == 0; + if ( !v47 ) + continue; + pSpellInfo = (CastSpellInfo *)pGUIWindow_Settings->ptr_1C; + pSpellInfo->uFlags &= ~0x40u; + pSpellInfo->uPlayerID_2 = uMessageParam; + pSpellInfo->spell_target_pid = v44; + pParty->pPlayers[pSpellInfo->uPlayerID].SetRecoveryTime(300); + pGUIWindow_Settings->Release(); + pGUIWindow_Settings = 0; + pMouse->SetCursorBitmap("MICON1"); + GameUI_Footer_TimeLeft = 0; + _50C9A0_IsEnchantingInProgress = 0; + back_to_game(); + continue; + } + if ( v45 == 5 ) + { + v48 = pLevelDecorations[v46].uEventID == 0; + } + else + { + if ( v45 != 6 ) + continue; + if ( uCurrentlyLoadedLevelType != 1 ) + { + pODMFace = &pOutdoor->pBModels[v44 >> 9].pFaces[v46 & 0x3F]; + if ( !pODMFace->Clickable() || !pODMFace->sCogTriggeredID ) + continue; + v44 = uNumSeconds; + pSpellInfo = (CastSpellInfo *)pGUIWindow_Settings->ptr_1C; + pSpellInfo->uFlags &= ~0x40u; + pSpellInfo->uPlayerID_2 = uMessageParam; + pSpellInfo->spell_target_pid = v44; + pParty->pPlayers[pSpellInfo->uPlayerID].SetRecoveryTime(300); + pGUIWindow_Settings->Release(); + pGUIWindow_Settings = 0; + pMouse->SetCursorBitmap("MICON1"); + GameUI_Footer_TimeLeft = 0; + _50C9A0_IsEnchantingInProgress = 0; + back_to_game(); + continue; + } + pBLVFace = &pIndoor->pFaces[v46]; + if ( !pBLVFace->Clickable() ) + continue; + v48 = pIndoor->pFaceExtras[pBLVFace->uFaceExtraID].uEventID == 0; + } + if ( v48 ) + continue; + pSpellInfo = (CastSpellInfo *)pGUIWindow_Settings->ptr_1C; + pSpellInfo->uFlags &= ~0x40u; + pSpellInfo->uPlayerID_2 = uMessageParam; + pSpellInfo->spell_target_pid = v44; + pParty->pPlayers[pSpellInfo->uPlayerID].SetRecoveryTime(300); + pGUIWindow_Settings->Release(); + pGUIWindow_Settings = 0; + pMouse->SetCursorBitmap("MICON1"); + GameUI_Footer_TimeLeft = 0; + _50C9A0_IsEnchantingInProgress = 0; + back_to_game(); + continue; + case UIMSG_CastSpell_Character_Big_Improvement://Preservation and blessing, treatment paralysis, hand hammers(individual upgrade) + case UIMSG_CastSpell_Character_Small_Improvement://Fate, cure + case UIMSG_HiredNPC_CastSpell: + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + if ( _50C9A0_IsEnchantingInProgress ) + { + uActiveCharacter = uMessageParam; + viewparams->bRedrawGameUI = 1; + } + else + { + if ( pGUIWindow_Settings ) + { + pSpellInfo = (CastSpellInfo *)pGUIWindow_Settings->ptr_1C; + switch ( uMessage ) + { + case UIMSG_CastSpell_Character_Big_Improvement: + pSpellInfo->uFlags &= ~0x02u; + break; + case UIMSG_CastSpell_Character_Small_Improvement: + pSpellInfo->uFlags &= ~0x0100u; + break; + case UIMSG_HiredNPC_CastSpell: + pSpellInfo->uFlags &= ~0x0200u; + break; + } + pSpellInfo->uPlayerID_2 = uMessageParam; + pParty->pPlayers[pSpellInfo->uPlayerID].SetRecoveryTime(300); + pGUIWindow_Settings->Release(); + pGUIWindow_Settings = 0; + pEventTimer->Resume(); + pMouse->SetCursorBitmap("MICON1"); + GameUI_Footer_TimeLeft = 0; + _50C9A0_IsEnchantingInProgress = 0; + } + } + continue; + case UIMSG_BF: + __debugbreak(); + dword_50CDC8 = 1; + sub_42FBDD(); + SaveGame(1, 0); + strcpy(pCurrentMapName, pMapStats->pInfos[uHouse_ExitPic].pFilename); + dword_6BE364_game_settings_1 |= GAME_SETTINGS_0001; + uGameState = GAME_STATE_CHANGE_LOCATION; + //v53 = p2DEvents_minus1_::30[26 * (unsigned int)ptr_507BC0->ptr_1C]; + v53 = p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1]._quest_related; + if ( v53 < 0 ) + { + v54 = abs(v53) - 1; + _5B65B8_npcdata_hiword_house_or_other = 0; + dword_5B65BC = 0; + v55 = dword_4E4560[v54]; + _5B65AC_npcdata_fame_or_other = dword_4E4578[v54]; + v56 = dword_4E4590[v54]; + v57 = dword_4E45A8[v54]; + _5B65A8_npcdata_uflags_or_other = v55; + _5B65B4_npcdata_loword_house_or_other = v57; + _5B65B0_npcdata_rep_or_other = v56; + dword_5B65C0 = v55 | _5B65AC_npcdata_fame_or_other | v56 | v57; + } + HouseDialogPressCloseBtn(); + //goto LABEL_434; + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + { + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = UIMSG_Escape; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v0; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; + ++pMessageQueue_50CBD0->uNumMessages; + }*/ + pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0); + continue; + + case UIMSG_OnCastTownPortal: + pAudioPlayer->StopChannels(-1, -1); + pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_Book, WINDOW_TownPortal, (char *)uMessageParam); + continue; + + case UIMSG_OnCastLloydsBeacon: + pAudioPlayer->StopChannels(-1, -1); + pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_Book, WINDOW_LloydsBeacon, 0); + continue; + + case UIMSG_LloydsBeacon_FlippingBtn: + bRecallingBeacon = uMessageParam; + v127 = uMessageParam + 204; + pAudioPlayer->PlaySound((SoundID)v127, 0, 0, -1, 0, 0, 0, 0); + continue; + case UIMSG_HintBeaconSlot: + if ( !pGUIWindow_CurrentMenu ) + continue; + pPlayer = pPlayers[_506348_current_lloyd_playerid + 1]; + uNumSeconds = (unsigned int)&pPlayer->pInstalledBeacons[uMessageParam]; + if ( bRecallingBeacon ) + { + if ( !*((int *)&pSavegameThumbnails[10 * uMessageParam].pPixels ) ) + continue; + v173 = pMapStats->pInfos[pMapStats->sub_410D99_get_map_index(pPlayer->pInstalledBeacons[uMessageParam].SaveFileID)].pName; + sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[474], v173);// "Recall to %s" + GameUI_SetFooterString(pTmpBuf.data()); + continue; + } + pMapNum = pMapStats->GetMapInfo(pCurrentMapName); + pMapName = "Not in Map Stats"; + if ( pMapNum ) + pMapName = pMapStats->pInfos[pMapNum].pName; + if ( !*((int *)&pSavegameThumbnails[10 * uMessageParam].pPixels ) || !pMapNum ) + { + sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[476], pMapName);// "Set to %s" + GameUI_SetFooterString(pTmpBuf.data()); + continue; + } + v174 = pMapStats->pInfos[pMapStats->sub_410D99_get_map_index(*(short *)(uNumSeconds + 26))].pName; + sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[475], (unsigned int)pMapName, v174);// "Set %s over %s" + GameUI_SetFooterString(pTmpBuf.data()); + continue; + case UIMSG_CloseAfterInstallBeacon: + dword_50CDC8 = 1; + pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 0, 0); + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) + continue; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = UIMSG_Escape; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; + ++pMessageQueue_50CBD0->uNumMessages;*/ + continue; + case UIMSG_InstallBeacon: + pPlayer9 = pPlayers[_506348_current_lloyd_playerid + 1]; + if ( !pPlayer9->pInstalledBeacons[uMessageParam].uBeaconTime && bRecallingBeacon ) + continue; + byte_506360 = 1; + pPlayer9->CanCastSpell(uRequiredMana); + if ( pParty->bTurnBasedModeOn ) + { + v60 = sRecoveryTime; + pParty->pTurnBasedPlayerRecoveryTimes[_506348_current_lloyd_playerid] = sRecoveryTime; + pPlayer9->SetRecoveryTime(v60); + pTurnEngine->ApplyPlayerAction(); + } + else + { + pPlayer9->SetRecoveryTime((signed __int64)(flt_6BE3A4_debug_recmod1 * (double)sRecoveryTime * 2.133333333333333)); + } + pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[lloyds_beacon_spell_id], 0, 0, -1, 0, lloyds_beacon_sound_id, 0, 0); + if ( bRecallingBeacon ) + { + if ( _stricmp(pCurrentMapName, (const char *)&pGames_LOD->pSubIndices[pPlayer9->pInstalledBeacons[uMessageParam].SaveFileID]) ) + { + SaveGame(1, 0); + OnMapLeave(); + strcpy(pCurrentMapName, (const char *)&pGames_LOD->pSubIndices[pPlayer9->pInstalledBeacons[uMessageParam].SaveFileID]); + dword_6BE364_game_settings_1 |= GAME_SETTINGS_0001; + uGameState = GAME_STATE_CHANGE_LOCATION; + _5B65A8_npcdata_uflags_or_other = pPlayer9->pInstalledBeacons[uMessageParam].PartyPos_X; + _5B65AC_npcdata_fame_or_other = pPlayer9->pInstalledBeacons[uMessageParam].PartyPos_Y; + _5B65B0_npcdata_rep_or_other = pPlayer9->pInstalledBeacons[uMessageParam].PartyPos_Z; + _5B65B4_npcdata_loword_house_or_other = pPlayer9->pInstalledBeacons[uMessageParam].PartyRot_X; + _5B65B8_npcdata_hiword_house_or_other = pPlayer9->pInstalledBeacons[uMessageParam].PartyRot_Y; + dword_5B65C0 = 1; + } + else + { + pParty->vPosition.x = pPlayer9->pInstalledBeacons[uMessageParam].PartyPos_X; + pParty->vPosition.y = pPlayer9->pInstalledBeacons[uMessageParam].PartyPos_Y; + pParty->vPosition.z = pPlayer9->pInstalledBeacons[uMessageParam].PartyPos_Z; + pParty->uFallStartY = pParty->vPosition.z; + pParty->sRotationY = pPlayer9->pInstalledBeacons[uMessageParam].PartyRot_X; + pParty->sRotationX = pPlayer9->pInstalledBeacons[uMessageParam].PartyRot_Y; + } + pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0); + pBooksWindow->Release(); + pGUIWindow_CurrentMenu->Release(); + pBooksWindow = 0; + pGUIWindow_CurrentMenu = 0; + } + else + { + sprintf(a1, "data\\lloyd%d%d.pcx", _506348_current_lloyd_playerid + 1, uMessageParam + 1); + pRenderer->SaveScreenshot(a1, 92, 68); + LoadThumbnailLloydTexture(uMessageParam, _506348_current_lloyd_playerid + 1); + pPlayer9->pInstalledBeacons[uMessageParam].uBeaconTime = pParty->uTimePlayed + (signed __int64)((double)(lloyds_beacon_spell_level << 7) * 0.033333335); + pPlayer9->pInstalledBeacons[uMessageParam].PartyPos_X = pParty->vPosition.x; + pPlayer9->pInstalledBeacons[uMessageParam].PartyPos_Y = pParty->vPosition.y; + pPlayer9->pInstalledBeacons[uMessageParam].PartyPos_Z = pParty->vPosition.z; + pPlayer9->pInstalledBeacons[uMessageParam].PartyRot_X = LOWORD(pParty->sRotationY); + pPlayer9->pInstalledBeacons[uMessageParam].PartyRot_Y = LOWORD(pParty->sRotationX); + if ( (signed int)pGames_LOD->uNumSubDirs / 2 <= 0 ) + continue; + for ( thisg = 0; thisg < (signed int)pGames_LOD->uNumSubDirs / 2; ++thisg ) + { + if ( !_stricmp(pGames_LOD->pSubIndices[thisg].pFilename, pCurrentMapName) ) + pPlayer9->pInstalledBeacons[uMessageParam].SaveFileID = thisg; + } + } + continue; + case UIMSG_ClickTownInTP: + 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(1, 0); + v64 = pMapStats->GetMapInfo(pCurrentMapName); + v65 = uMessageParam; + if ( v64 == TownPortalList[uMessageParam].uMapInfoID ) + { + pParty->vPosition.x = TownPortalList[v65].pos.x; + pParty->vPosition.y = TownPortalList[v65].pos.y; + pParty->vPosition.z = TownPortalList[v65].pos.z; + pParty->uFallStartY = pParty->vPosition.z; + pParty->sRotationY = TownPortalList[v65].rot_y; + pParty->sRotationX = TownPortalList[v65].rot_x; + } + else + { + SaveGame(1, 0); + OnMapLeave(); + dword_6BE364_game_settings_1 |= GAME_SETTINGS_0001; + uGameState = GAME_STATE_CHANGE_LOCATION; + strcpy(pCurrentMapName, pMapStats->pInfos[TownPortalList[uMessageParam].uMapInfoID].pFilename); + dword_5B65C0 = 1; + _5B65A8_npcdata_uflags_or_other = TownPortalList[uMessageParam].pos.x; + _5B65AC_npcdata_fame_or_other = TownPortalList[uMessageParam].pos.y; + _5B65B0_npcdata_rep_or_other = TownPortalList[uMessageParam].pos.z; + v66 = TownPortalList[uMessageParam].rot_x; + _5B65B4_npcdata_loword_house_or_other = TownPortalList[uMessageParam].rot_y; + _5B65B8_npcdata_hiword_house_or_other = v66; + Actor::InitializeActors(); + } + v67 = (char*)pGUIWindow_CurrentMenu->Hint; + if ( v67 ) + *((int *)v67 + 17) = 1; + else + pParty->pPlayers[(unsigned __int8)town_portal_caster_id].CanCastSpell(0x14u); + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + { + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = UIMSG_Escape; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v0; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; + ++pMessageQueue_50CBD0->uNumMessages; + }*/ + pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0); + continue; + } + v63 = 210; + break; + } + } + else + { + v63 = 206; + } + if ( !(unsigned __int16)_449B57_test_bit(pParty->_quest_bits, v63) ) + return; + goto LABEL_486; + case UIMSG_HintTownPortal: + if ( uMessageParam ) + { + switch ( uMessageParam ) + { + case 1: + v68 = 208; + break; + case 2: + v68 = 207; + break; + case 3: + v68 = 211; + break; + case 4: + v68 = 209; + break; + default: + if ( uMessageParam != 5 ) + //goto LABEL_506; + { + if ( uMessageParam ) + { + switch ( uMessageParam ) + { + case 1: + v69 = pMapStats->pInfos[4].pName; + break; + case 2: + v69 = pMapStats->pInfos[3].pName; + break; + case 3: + v69 = pMapStats->pInfos[10].pName; + break; + case 4: + v69 = pMapStats->pInfos[7].pName; + break; + default: + if ( uMessageParam != 5 ) + { + __debugbreak(); // warning C4700: uninitialized local variable 'v200' used + sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[35], v200); + GameUI_SetFooterString(pTmpBuf.data()); + continue; + } + v69 = pMapStats->pInfos[8].pName; + break; + } + } + else + { + v69 = pMapStats->pInfos[21].pName; + } + sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[35], v69); + GameUI_SetFooterString(pTmpBuf.data()); + continue; + } + v68 = 210; + break; + } + } + else + { + v68 = 206; + } + if ( !(unsigned __int16)_449B57_test_bit(pParty->_quest_bits, v68) ) + { + pRenderer->DrawTextureRGB(0, 0x160u, pTexture_StatusBar); + continue; + } +//LABEL_506: + if ( uMessageParam ) + { + switch ( uMessageParam ) + { + case 1: + v69 = pMapStats->pInfos[4].pName; + break; + case 2: + v69 = pMapStats->pInfos[3].pName; + break; + case 3: + v69 = pMapStats->pInfos[10].pName; + break; + case 4: + v69 = pMapStats->pInfos[7].pName; + break; + default: + if ( uMessageParam != 5 ) + //goto LABEL_519; + { + sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[35], v200); + GameUI_SetFooterString(pTmpBuf.data()); + continue; + } + v69 = pMapStats->pInfos[8].pName; + break; + } + } + else + { + v69 = pMapStats->pInfos[21].pName; + } + sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[35], v69); + GameUI_SetFooterString(pTmpBuf.data()); + continue; + case UIMSG_ShowFinalWindow: + sprintfex(pFinalMessage.data(), "%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.data(), UIMSG_OnFinalWindowClose); + uGameState = GAME_STATE_FINAL_WINDOW; + continue; + case UIMSG_OnFinalWindowClose: + __debugbreak(); + uGameState = GAME_STATE_PLAYING; + strcpy((char *)pKeyActionMap->pPressedKeysBuffer, "2"); + __debugbreak(); // missed break/continue? + case UIMSG_DD: + __debugbreak(); + sprintf(pTmpBuf.data(), "%s", pKeyActionMap->pPressedKeysBuffer); + memcpy(&v216, txt_file_frametable_parser(pKeyActionMap->pPressedKeysBuffer, &v218), sizeof(v216)); + if ( v216.uPropCount == 1 ) + { + pNPCData4 = (NPCData *)((signed int)pGames_LOD->uNumSubDirs / 2); + v70 = atoi(v216.pProperties[0]); + if ( v70 <= 0 || v70 >= 77 ) + continue; + v71 = v70; + strcpy(Str2, pMapStats->pInfos[v70].pFilename); + pNPCData3 = 0; + if ( (signed int)pNPCData4 > 0 ) + { + thish = 0; + do + { + if ( !_stricmp(pGames_LOD->pSubIndices[thish].pFilename, Str2) ) + break; + ++thish; + pNPCData3 = (NPCData *)((char *)pNPCData3 + 1); + } + while ( (signed int)pNPCData3 < (signed int)pNPCData4 ); + if ( (signed int)pNPCData3 < (signed int)pNPCData4 ) + { + strcpy(pCurrentMapName, pGames_LOD->pSubIndices[(int)pNPCData3].pFilename); + dword_6BE364_game_settings_1 |= GAME_SETTINGS_0001; + uGameState = GAME_STATE_CHANGE_LOCATION; + OnMapLeave(); + continue; + } + } + sprintf(Str2, "No map found for %s", pMapStats->pInfos[v71].pName); + v73 = Str2; + } + else + { + if ( v216.uPropCount != 3 ) + continue; + v74 = atoi(v216.pProperties[0]); + thisi = atoi(v216.pProperties[1]); + v75 = atoi(v216.pProperties[2]); + v76 = v75; + if ( uCurrentlyLoadedLevelType == LEVEL_Indoor) + { + if ( pIndoor->GetSector(v74, thisi, v75) ) + { + v77 = thisi; + pParty->vPosition.x = v74; + pParty->vPosition.y = v77; + pParty->vPosition.z = v76; + pParty->uFallStartY = v76; + continue; + } + } + else + { + if ( v74 > -32768 ) + { + if ( v74 < 32768 ) + { + v77 = thisi; + if ( thisi > -32768 ) + { + if ( thisi < 32768 && v76 >= 0 && v76 < 10000 ) + { + pParty->vPosition.x = v74; + pParty->vPosition.y = v77; + pParty->vPosition.z = v76; + pParty->uFallStartY = v76; + continue; + } + } + } + } + } + pAudioPlayer->PlaySound(SOUND_error, 0, 0, -1, 0, 0, 0, 0); + v73 = "Can't jump to that location!"; + } + ShowStatusBarString(v73, 6u); + continue; + case UIMSG_CastQuickSpell: + if ( bUnderwater == 1 ) + { + ShowStatusBarString(pGlobalTXT_LocalizationStrings[652], 2);// "You can not do that while you are underwater!" + pAudioPlayer->PlaySound((SoundID)27, 0, 0, -1, 0, 0, 0, 0); + continue; + } + if ( !uActiveCharacter || (pPlayer2 = pPlayers[uActiveCharacter], pPlayer2->uTimeToRecovery) ) + continue; + _42777D_CastSpell_UseWand_ShootArrow(pPlayer2->uQuickSpell, uActiveCharacter - 1, 0, 0, uActiveCharacter); + continue; + case UIMSG_CastSpell_Monster_Improvement: + case UIMSG_CastSpell_Shoot_Monster://FireBlow, Lightning, Ice Lightning, Swarm, + //if ( pRenderer->pRenderD3D ) + { + v81 = pGame->pVisInstance->get_picked_object_zbuf_val(); + } + /*else + { + uNumSeconds = (unsigned int)pMouse->GetCursorPos(&v206); + pPoint2 = pMouse->GetCursorPos(&v201); + v81 = pRenderer->pActiveZBuffer[*(int *)uNumSeconds + pSRZBufferLineOffsets[pPoint2->y]]; + }*/ + v83 = v81; + v44 = (unsigned __int16)v81; + v84 = v83 >> 16; + if ( PID_TYPE(v44) != 3 || v84 >= 5120 ) + continue; + pSpellInfo = (CastSpellInfo *)pGUIWindow_Settings->ptr_1C; + if ( uMessage == UIMSG_CastSpell_Shoot_Monster ) + { + pSpellInfo->uFlags &= ~0x08; + } + else + { + if ( uMessage == UIMSG_CastSpell_Monster_Improvement ) + pSpellInfo->uFlags &= ~0x0100u; + else + pSpellInfo->uFlags &= ~0x0200u; + } + pSpellInfo->uPlayerID_2 = uMessageParam; + pSpellInfo->spell_target_pid = v44; + pParty->pPlayers[pSpellInfo->uPlayerID].SetRecoveryTime(300); + pGUIWindow_Settings->Release(); + pGUIWindow_Settings = 0; + pMouse->SetCursorBitmap("MICON1"); + GameUI_Footer_TimeLeft = 0; + _50C9A0_IsEnchantingInProgress = 0; + back_to_game(); + continue; + case UIMSG_1C: + __debugbreak(); + if ( !uActiveCharacter || pCurrentScreen ) + continue; + ptr_507BC8 = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_68, uMessageParam, 0); + pCurrentScreen = SCREEN_19; + pEventTimer->Pause(); + continue; + case UIMSG_STEALFROMACTOR: + if ( !uActiveCharacter ) + continue; + if ( pParty->bTurnBasedModeOn != 1 ) + { + if ( pActors[uMessageParam].uAIState == 5 ) + pActors[uMessageParam].LootActor(); + else + Actor::StealFrom(uMessageParam); + continue; + } + if ( pTurnEngine->turn_stage == TE_WAIT || pTurnEngine->turn_stage == TE_MOVEMENT ) + continue; + if ( !(pTurnEngine->field_18 & TE_HAVE_PENDING_ACTIONS) ) + { + if ( pActors[uMessageParam].uAIState == 5 ) + pActors[uMessageParam].LootActor(); + else + Actor::StealFrom(uMessageParam); + } + continue; + + case UIMSG_Attack: + if ( !uActiveCharacter ) + continue; + if ( pParty->bTurnBasedModeOn != 1 ) + { + Player::_42ECB5_PlayerAttacksActor(); + continue; + } + if ( pTurnEngine->turn_stage == TE_WAIT || pTurnEngine->turn_stage == TE_MOVEMENT ) + continue; + if ( !(pTurnEngine->field_18 & TE_HAVE_PENDING_ACTIONS) ) + Player::_42ECB5_PlayerAttacksActor(); + continue; + case UIMSG_ExitRest: + GUIWindow::Create(pButton_RestUI_Exit->uX, pButton_RestUI_Exit->uY, 0, 0, WINDOW_CloseRestWindowBtn, (int)pButton_RestUI_Exit, pGlobalTXT_LocalizationStrings[81]);// "Exit Rest" + continue; + case UIMSG_Wait5Minutes: + if ( dword_506F14 == 2 ) + { + ShowStatusBarString(pGlobalTXT_LocalizationStrings[477], 2);// "You are already resting!" + pAudioPlayer->PlaySound((SoundID)27, 0, 0, -1, 0, 0, 0, 0); + continue; + } + GUIWindow::Create(pButton_RestUI_Wait5Minutes->uX, pButton_RestUI_Wait5Minutes->uY, 0, 0, WINDOW_PressedButton2, + (int)pButton_RestUI_Wait5Minutes, pGlobalTXT_LocalizationStrings[238]);// "Wait 5 Minutes" + dword_506F14 = 1; + _506F18_num_minutes_to_sleep = 5; + continue; + case UIMSG_Wait1Hour: + if ( dword_506F14 == 2 ) + { + ShowStatusBarString(pGlobalTXT_LocalizationStrings[477], 2);// "You are already resting!" + pAudioPlayer->PlaySound((SoundID)27, 0, 0, -1, 0, 0, 0, 0); + continue; + } + GUIWindow::Create(pButton_RestUI_Wait1Hour->uX, pButton_RestUI_Wait1Hour->uY, 0, 0, WINDOW_PressedButton2, + (int)pButton_RestUI_Wait1Hour, pGlobalTXT_LocalizationStrings[239]);// "Wait 1 Hour" + dword_506F14 = 1; + _506F18_num_minutes_to_sleep = 60; + continue; + case UIMSG_RentRoom: + dword_506F14 = 2; + RestUI_Load(); + v86 = 60 * (_494820_training_time(pParty->uCurrentHour) + 1) - pParty->uCurrentMinute; + _506F18_num_minutes_to_sleep = v86; + if ( uMessageParam == 111 || uMessageParam == 114 || uMessageParam == 116 ) // 107 = Emerald Isle tavern + _506F18_num_minutes_to_sleep = v86 + 12 * 60; + dword_506F14 = 2; + pParty->RestAndHeal(); + pParty->days_played_without_rest = 0; + pParty->pPlayers[3].SetAsleep(1); + pParty->pPlayers[2].SetAsleep(1); + pParty->pPlayers[1].SetAsleep(1); + pParty->pPlayers[0].SetAsleep(1); + continue; + case UIMSG_RestWindow: + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + if ( pCurrentScreen ) + continue; + if ( CheckActors_proximity() ) + { + if ( pParty->bTurnBasedModeOn == 1 ) + { + ShowStatusBarString(pGlobalTXT_LocalizationStrings[478], 2);// "You can't rest in turn-based mode!" + 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, 2); + if ( !uActiveCharacter ) + continue; + pPlayers[uActiveCharacter]->PlaySound((PlayerSpeech)13, 0); + continue; + } + if ( pParty->bTurnBasedModeOn == 1 ) + { + ShowStatusBarString(pGlobalTXT_LocalizationStrings[478], 2);// "You can't rest in turn-based mode!" + continue; + } + if ( !(pParty->uFlags & 0x88) ) + { + RestUI_Load(); + continue; + } + if ( pParty->bTurnBasedModeOn == 1 ) + { + ShowStatusBarString(pGlobalTXT_LocalizationStrings[478], 2);// "You can't rest in turn-based mode!" + 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); + if ( !uActiveCharacter ) + continue; + pPlayers[uActiveCharacter]->PlaySound((PlayerSpeech)13, 0); + continue; + case UIMSG_Rest8Hour: + if ( dword_506F14 ) + { + ShowStatusBarString(pGlobalTXT_LocalizationStrings[477], 2);// "You are already resting!" + pAudioPlayer->PlaySound((SoundID)27, 0, 0, -1, 0, 0, 0, 0); + continue; + } + if ( pParty->uNumFoodRations < uRestUI_FoodRequiredToRest ) + { + ShowStatusBarString(pGlobalTXT_LocalizationStrings[482], 2u);// "You don't have enough food to rest" + if ( uActiveCharacter && pPlayers[uActiveCharacter]->CanAct() ) + pPlayers[uActiveCharacter]->PlaySound((PlayerSpeech)SPEECH_108, 0); + } + else + { + pParty->pPlayers[3].pConditions[Condition_Sleep] = pParty->uTimePlayed; + pParty->pPlayers[2].pConditions[Condition_Sleep] = pParty->uTimePlayed; + pParty->pPlayers[1].pConditions[Condition_Sleep] = pParty->uTimePlayed; + pParty->pPlayers[0].pConditions[Condition_Sleep] = pParty->uTimePlayed; + v90 = pMapStats->GetMapInfo(pCurrentMapName); + if ( !v90 ) + v90 = rand() % (signed int)pMapStats->uNumMaps + 1; + pMapInfo = &pMapStats->pInfos[v90]; + if ( rand() % 100 + 1 <= pMapInfo->Encounter_percent ) + { + v91 = rand() % 100; + v92 = pMapInfo->EncM1percent; + v93 = v91 + 1; + if ( v93 > v92 ) + pNPCData4 = (NPCData *)((v93 > v92 + pMapInfo->EncM2percent) + 2); + else + pNPCData4 = (NPCData *)1; + if ( !_45063B_spawn_some_monster(pMapInfo, (int)pNPCData4) ) + pNPCData4 = 0; + if ( pNPCData4 ) + { + pPlayerNum = rand() % 4; + pParty->pPlayers[pPlayerNum].pConditions[Condition_Sleep] = 0; + v95 = rand(); + Rest(v95 % 6 + 60); + _506F18_num_minutes_to_sleep = 0; + dword_506F14 = 0; + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + { + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = UIMSG_Escape; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; + ++pMessageQueue_50CBD0->uNumMessages; + }*/ + pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 0, 0); + ShowStatusBarString(pGlobalTXT_LocalizationStrings[481], 2);// "Encounter!" + pAudioPlayer->PlaySound((SoundID)227, 0, 0, -1, 0, 0, 0, 0); + continue; + } + } + Party::TakeFood(uRestUI_FoodRequiredToRest); + _506F18_num_minutes_to_sleep = 480; + dword_506F14 = 2; + pParty->RestAndHeal(); + pParty->days_played_without_rest = 0; + pParty->pPlayers[3].SetAsleep(1); + pParty->pPlayers[2].SetAsleep(1); + pParty->pPlayers[1].SetAsleep(1); + pParty->pPlayers[0].SetAsleep(1); + } + continue; + case UIMSG_AlreadyResting: + if ( dword_506F14 == 2 ) + { + ShowStatusBarString(pGlobalTXT_LocalizationStrings[477], 2);// "You are already resting!" + pAudioPlayer->PlaySound((SoundID)27, 0, 0, -1, 0, 0, 0, 0); + continue; + } + GUIWindow::Create(pButton_RestUI_WaitUntilDawn->uX, pButton_RestUI_WaitUntilDawn->uY, 0, 0, WINDOW_PressedButton2, + (int)pButton_RestUI_WaitUntilDawn, pGlobalTXT_LocalizationStrings[237]);// "Wait until Dawn" + v97 = _494820_training_time(pParty->uCurrentHour); + dword_506F14 = 1; + _506F18_num_minutes_to_sleep = 60 * v97 - pParty->uCurrentMinute; + continue; + case UIMSG_HintSelectRemoveQuickSpellBtn: + if ( quick_spell_at_page && byte_506550 ) + { + v173 = pSpellStats->pInfos[quick_spell_at_page + 11 * pPlayers[uActiveCharacter]->lastOpenedSpellbookPage].pName; + sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[483], 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.data(), v177); + } + GameUI_SetFooterString(pTmpBuf.data()); + continue; + case UIMSG_SPellbook_ShowHightlightedSpellInfo: + if ( !uActiveCharacter || (uNumSeconds = (unsigned int)pPlayers[uActiveCharacter], + !*(char *)(uNumSeconds + 11 * *(char *)(uNumSeconds + 6734) + uMessageParam + 402)) ) + continue; + if ( sub_4637E0_is_there_popup_onscreen() ) + dword_507B00_spell_info_to_draw_in_popup = uMessageParam + 1; + v98 = *(char *)(uNumSeconds + 6734); + if ( quick_spell_at_page - 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]; + } + sprintfex(pTmpBuf.data(), v161, v178); + GameUI_SetFooterString(pTmpBuf.data()); + continue; + case UIMSG_ClickInstallRemoveQuickSpellBtn: + GUIWindow::Create(pBtn_InstallRemoveSpell->uX, pBtn_InstallRemoveSpell->uY, 0, 0, WINDOW_PressedButton2, (int)pBtn_InstallRemoveSpell, 0); + if ( !uActiveCharacter ) + continue; + pPlayer10 = pPlayers[uActiveCharacter]; + if ( !byte_506550 || !quick_spell_at_page ) + { + pPlayer10->uQuickSpell = 0; + quick_spell_at_page = 0; + pAudioPlayer->PlaySound((SoundID)203, 0, 0, -1, 0, 0, 0, 0); + continue; + } + pPlayers[uActiveCharacter]->uQuickSpell = quick_spell_at_page + 11 * pPlayers[uActiveCharacter]->lastOpenedSpellbookPage; + AA1058_PartyQuickSpellSound[uActiveCharacter - 1].AddPartySpellSound(pPlayers[uActiveCharacter]->uQuickSpell, uActiveCharacter); + if ( uActiveCharacter ) + pPlayer10->PlaySound(SPEECH_12, 0); + byte_506550 = 0; + continue; + case UIMSG_SpellBook_PressTab://перелистывание страниц клавишей Tab + { + if ( !uActiveCharacter ) + continue; + int skill_count = 0; + uAction = 0; + for ( uint i = 0; i < 9; i++ ) + { + if ( pPlayers[uActiveCharacter]->pActiveSkills[PLAYER_SKILL_FIRE + i] ) + { + if ( pPlayers[uActiveCharacter]->lastOpenedSpellbookPage == i ) + uAction = skill_count; + v217[skill_count++] = i; + } + } + if ( !skill_count )//нет скиллов + pAudioPlayer->PlaySound((SoundID)(rand() % 2 + 204), 0, 0, -1, 0, 0, 0, 0); + else + { + if ( GetAsyncKeyState(VK_SHIFT) ) + { + --uAction; + if ( uAction < 0 ) + uAction = skill_count - 1; + } + else + { + ++uAction; + if ( uAction >= skill_count ) + uAction = 0; + } + OnCloseSpellBookPage(); + pPlayers[uActiveCharacter]->lastOpenedSpellbookPage = LOBYTE(v217[uAction]); + pGUIWindow_CurrentMenu->OpenSpellBook(); + pAudioPlayer->PlaySound((SoundID)(rand() % 2 + 204), 0, 0, -1, 0, 0, 0, 0); + } + continue; + } + case UIMSG_OpenSpellbookPage: + if ( pTurnEngine->turn_stage == TE_MOVEMENT || !uActiveCharacter || uMessageParam == pPlayers[uActiveCharacter]->lastOpenedSpellbookPage ) + continue; + OnCloseSpellBookPage(); + pPlayers[uActiveCharacter]->lastOpenedSpellbookPage = uMessageParam; + pGUIWindow_CurrentMenu->OpenSpellBook(); + pAudioPlayer->PlaySound((SoundID)(rand() % 2 + 204), 0, 0, -1, 0, 0, 0, 0); + continue; + case UIMSG_SelectSpell: + { + if (pTurnEngine->turn_stage == TE_MOVEMENT) + continue; + if (!uActiveCharacter) + continue; + + // uNumSeconds = (unsigned int)pPlayers[uActiveCharacter]; + Player* player = pPlayers[uActiveCharacter]; + if (player->spellbook.pChapters[player->lastOpenedSpellbookPage].bIsSpellAvailable[uMessageParam]) + //if ( *(char *)(uNumSeconds + 11 * *(char *)(uNumSeconds + &lastOpenedSpellbookPage) + uMessageParam + 402) ) + { + if ( quick_spell_at_page - 1 == uMessageParam ) + { + pGUIWindow_CurrentMenu->Release(); + pEventTimer->Resume(); + viewparams->bRedrawGameUI = 1; + pCurrentScreen = SCREEN_GAME; + pIcons_LOD->RemoveTexturesPackFromTextureList(); + v103 = quick_spell_at_page + 11 * player->lastOpenedSpellbookPage; + /*if ( dword_50C9E8 < 40 ) + { + dword_50C9EC[3 * dword_50C9E8] = UIMSG_CastSpellFromBook; + dword_50C9EC[3 * dword_50C9E8 + 1] = v103; + dword_50C9EC[3 * dword_50C9E8 + 2] = uActiveCharacter - 1; + ++dword_50C9E8; + }*/ + pMessageQueue_50C9E8->AddGUIMessage(UIMSG_CastSpellFromBook, v103, uActiveCharacter - 1); + // pMessageQueue_50CBD0->AddGUIMessage(UIMSG_CastSpellFromBook, v103, uActiveCharacter - 1); + } + else + { + byte_506550 = 1; + quick_spell_at_page = uMessageParam + 1; + } + } + } + continue; + + case UIMSG_CastSpellFromBook: + if ( pTurnEngine->turn_stage != TE_MOVEMENT ) + _42777D_CastSpell_UseWand_ShootArrow(uMessageParam, v199, 0, 0, 0); + continue; + + case UIMSG_SpellScrollUse: + __debugbreak(); + if ( pTurnEngine->turn_stage != TE_MOVEMENT ) + _42777D_CastSpell_UseWand_ShootArrow(uMessageParam, v199, 133, 1, 0); + continue; + case UIMSG_SpellBookWindow: + if ( pTurnEngine->turn_stage == TE_MOVEMENT ) + continue; + if ( bUnderwater == true ) + { + ShowStatusBarString(pGlobalTXT_LocalizationStrings[652], 2);// "You can not do that while you are underwater!" + pAudioPlayer->PlaySound((SoundID)27, 0, 0, -1, 0, 0, 0, 0); + } + else + { + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + if ( uActiveCharacter && !pPlayers[uActiveCharacter]->uTimeToRecovery ) + { + if ( pCurrentScreen == SCREEN_GAME ) + { + GUIWindow::Create(476, 450, 0, 0, WINDOW_PressedButton2, (int)pBtn_CastSpell, 0); + pCurrentScreen = SCREEN_SPELL_BOOK; + pEventTimer->Pause(); + pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_SpellBook, 0, 0); + pAudioPlayer->PlaySound((SoundID)48, 0, 0, -1, 0, 0, 0, 0); + viewparams->field_48 = 1; + continue; + } + if ( pCurrentScreen != SCREEN_REST && pCurrentScreen != SCREEN_CHARACTERS + && (pCurrentScreen <= SCREEN_63 || pCurrentScreen > SCREEN_67) ) + { + pGUIWindow_CurrentMenu->Release(); + GUIWindow::Create(476, 450, 0, 0, WINDOW_PressedButton2, (int)pBtn_CastSpell, 0); + pCurrentScreen = SCREEN_SPELL_BOOK; + pEventTimer->Pause(); + pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_SpellBook, 0, 0); + pAudioPlayer->PlaySound((SoundID)48, 0, 0, -1, 0, 0, 0, 0); + viewparams->field_48 = 1; + continue; + } + } + } + continue; + case UIMSG_QuickReference: + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + if ( pCurrentScreen ) + pGUIWindow_CurrentMenu->Release(); + ++pIcons_LOD->uTexturePacksCount; + if ( !pIcons_LOD->uNumPrevLoadedFiles ) + pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles; + GUIWindow::Create(0x230u, 0x1C2u, 0, 0, WINDOW_PressedButton2, (int)pBtn_QuickReference, 0); + viewparams->bRedrawGameUI = 1; + pEventTimer->Pause(); + pAudioPlayer->StopChannels(-1, -1); + pCurrentScreen = SCREEN_QUICK_REFERENCE; + pGUIWindow_CurrentMenu = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_QuickReference, 5, 0); + papredoll_dbrds[2] = pIcons_LOD->LoadTexture("BUTTEXI1", TEXTURE_16BIT_PALETTE); + pBtn_ExitCancel = pGUIWindow_CurrentMenu->CreateButton(0x187u, 0x13Cu, 0x4Bu, 0x21u, 1, 0, UIMSG_Escape, 0, 0, + pGlobalTXT_LocalizationStrings[79],// "Exit" + pIcons_LOD->GetTexture(uTextureID_BUTTDESC2), 0); //, v179); + continue; + case UIMSG_GameMenuButton: + if ( pCurrentScreen ) + { + pGUIWindow_CurrentMenu->Release(); + pEventTimer->Resume(); + pCurrentScreen = SCREEN_GAME; + viewparams->bRedrawGameUI = 1; + } + + stru_506E40.Release(); + pRenderer->SaveScreenshot("gamma.pcx", 155, 117); + stru_506E40.LoadPCXFile("gamma.pcx", 0); + + GUIWindow::Create(0x25Au, 0x1C2u, 0, 0, WINDOW_PressedButton, (int)pBtn_GameSettings, 0); +//LABEL_453: + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) + continue; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = UIMSG_Escape; + //goto LABEL_770; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; + ++pMessageQueue_50CBD0->uNumMessages;*/ + pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 0, 0); + continue; + case UIMSG_ClickAwardScrollBar: + books_page_number = 1; + if ( pMouse->GetCursorPos(&v211)->y > 178 ) + books_page_number = -1; + continue; + case UIMSG_ClickAwardsUpBtn: + GUIWindow::Create(pBtn_Up->uX, pBtn_Up->uY, 0, 0, WINDOW_CharactersPressedButton, (int)pBtn_Up, 0); + BtnUp_flag = 1; + continue; + case UIMSG_ClickAwardsDownBtn: + GUIWindow::Create(pBtn_Down->uX, pBtn_Down->uY, 0, 0, WINDOW_CharactersPressedButton, (int)pBtn_Down, 0); + BtnDown_flag = 1; + continue; + case UIMSG_ChangeDetaliz: + bRingsShownInCharScreen ^= 1; + pCharacterScreen_DetalizBtn->Release(); + pCharacterScreen_DollBtn->Release(); + if ( bRingsShownInCharScreen ) + { + v128 = pIcons_LOD->GetTexture(uTextureID_detaliz_close_button)->uTextureHeight; + v125 = pIcons_LOD->GetTexture(uTextureID_detaliz_close_button)->uTextureWidth; + v123 = 445; + v121 = 470; + } + else + { + v128 = 30; + v125 = 30; + v123 = 300; + v121 = 600; + } + pCharacterScreen_DetalizBtn = pGUIWindow_CurrentMenu->CreateButton(v121, v123, v125, v128, 1, 0, UIMSG_ChangeDetaliz, 0, 0, + pGlobalTXT_LocalizationStrings[64],// "Detail Toggle" + 0); + pCharacterScreen_DollBtn = pGUIWindow_CurrentMenu->CreateButton(0x1DCu, 0, 0xA4u, 0x159u, 1, 0, UIMSG_ClickPaperdoll, 0, 0, "", 0); + viewparams->bRedrawGameUI = 1; + continue; + case UIMSG_ClickPaperdoll: + OnPaperdollLeftClick(); + continue; + case UIMSG_ClickStatsBtn: + pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 100; + CharacterUI_ReleaseButtons(); + ReleaseAwardsScrollBar(); + GUIWindow::Create(pCharacterScreen_StatsBtn->uX, pCharacterScreen_StatsBtn->uY, 0, 0, WINDOW_CharactersPressedButton, (int)pCharacterScreen_StatsBtn, 0); + continue; + case UIMSG_ClickSkillsBtn: + pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 101; + CharacterUI_ReleaseButtons(); + ReleaseAwardsScrollBar(); + CharacterUI_SkillsTab_CreateButtons(); + GUIWindow::Create(pCharacterScreen_SkillsBtn->uX, pCharacterScreen_SkillsBtn->uY, 0, 0, WINDOW_CharactersPressedButton, (int)pCharacterScreen_SkillsBtn, 0); + continue; + case UIMSG_SkillUp: + pPlayer4 = pPlayers[uActiveCharacter]; + v105 = (int)&pPlayer4->pActiveSkills[uMessageParam]; + LOWORD(v2) = *(short *)v105; + uNumSeconds = v2; + if ( pPlayer4->uSkillPoints < (v2 & 0x3F) + 1 ) + { + v87 = pGlobalTXT_LocalizationStrings[488];// "You don't have enough skill points!" + } + else + { + if ( (uNumSeconds & 0x3F) < 0x3C ) + { + *(short *)v105 = uNumSeconds + 1; + pPlayer4->uSkillPoints -= pPlayer4->pActiveSkills[uMessageParam] & 0x3F; + pPlayer4->PlaySound(SPEECH_14, 0); + pAudioPlayer->PlaySound((SoundID)20001, 0, 0, -1, 0, 0, 0, 0); + continue; + } + v87 = pGlobalTXT_LocalizationStrings[487];// "You have already mastered this skill!" + } + ShowStatusBarString(v87, 2); + continue; + case UIMSG_ClickInventoryBtn: + pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 103; + ReleaseAwardsScrollBar(); + CharacterUI_ReleaseButtons(); + GUIWindow::Create(pCharacterScreen_InventoryBtn->uX, pCharacterScreen_InventoryBtn->uY, 0, 0, WINDOW_CharactersPressedButton, (int)pCharacterScreen_InventoryBtn, 0); + continue; + case UIMSG_ClickExitCharacterWindowBtn: + GUIWindow::Create(pCharacterScreen_ExitBtn->uX, pCharacterScreen_ExitBtn->uY, 0, 0, WINDOW_ExitCharacterWindow, (int)pCharacterScreen_ExitBtn, 0); + continue; + case UIMSG_ClickAwardsBtn: + ReleaseAwardsScrollBar(); + CharacterUI_ReleaseButtons(); + CreateAwardsScrollBar(); + pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 102; + GUIWindow::Create(pCharacterScreen_AwardsBtn->uX, pCharacterScreen_AwardsBtn->uY, 0, 0, WINDOW_CharactersPressedButton, (int)pCharacterScreen_AwardsBtn, 0); + FillAwardsData(); + continue; + case UIMSG_ClickBooksBtn: + switch ( uMessageParam ) + { + case 11://Page UP + BtnUp_flag = 1; + pButton = pBtn_Book_2; + break; + case 10://Page DOWN + BtnDown_flag = 1; + pButton = pBtn_Book_1; + break; + case 0://Zoom plus + pButton = pBtn_Book_1; + BtnDown_flag = 1; + break; + case 1://Zoom minus + pButton = pBtn_Book_2; + BtnUp_flag = 1; + break; + case 2://Potions + Book_PageBtn3_flag = 1; + if ( dword_506364 ) + continue; + pButton = pBtn_Book_3; + break; + case 3://fountains + Book_PageBtn4_flag = 1; + if ( dword_506364 ) + continue; + pButton = pBtn_Book_4; + break; + case 4://obelisks + Book_PageBtn5_flag = 1;//Autonotes_Obelisks_page_flag + if ( dword_506364 ) + continue; + pButton = pBtn_Book_5; + break; + case 5://seer + Book_PageBtn6_flag = 1;//Autonotes_Seer_page_flag + if ( dword_506364 ) + continue; + pButton = pBtn_Book_6; + break; + case 6://misc + pButton = pBtn_Autonotes_Misc; + Autonotes_Misc_page_flag = 1; + break; + case 7://Instructors + pButton = pBtn_Autonotes_Instructors; + Autonotes_Instructors_page_flag = 1; + break; + default: + continue; + } + GUIWindow::Create(pButton->uX, pButton->uY, 0, 0, WINDOW_PressedButton, (int)pButton, (char *)1); + continue; + case UIMSG_SelectCharacter: + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + GameUI_OnPlayerPortraitLeftClick(uMessageParam); + continue; + case UIMSG_ShowStatus_Funds: + v174 = (char *)pParty->uNumGoldInBank; + //v158 = pParty->uNumGold + pParty->uNumGoldInBank; + sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[489], pParty->uNumGold + pParty->uNumGoldInBank, v174);// "You have %d total gold, %d in the Bank" + GameUI_SetFooterString(pTmpBuf.data()); + continue; + case UIMSG_ShowStatus_DateTime: + currHour = pParty->uCurrentHour; + uNumSeconds = 1; + if (pParty->uCurrentHour > 12 ) + { + if (pParty->uCurrentHour >= 24) + uNumSeconds = 0; + currHour = (currHour - 12); + } + else + { + if (pParty->uCurrentHour < 12) // 12:00 is PM + uNumSeconds = 0; + if (pParty->uCurrentHour == 0) + currHour = 12; + } + sprintf(pTmpBuf.data(), "%d:%02d%s %s %d %s %d", currHour, pParty->uCurrentMinute, aAMPMNames[uNumSeconds], aDayNames[pParty->uDaysPlayed % 7], + 7 * pParty->uCurrentMonthWeek + pParty->uDaysPlayed % 7 + 1, aMonthNames[pParty->uCurrentMonth], pParty->uCurrentYear); + GameUI_SetFooterString(pTmpBuf.data()); + continue; + case UIMSG_ShowStatus_Food: + sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[501], pParty->uNumFoodRations); // "You have %lu food" + GameUI_SetFooterString(pTmpBuf.data()); + continue; + case UIMSG_ShowStatus_Player: + pPlayer5 = pPlayers[uMessageParam]; + sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[429], pPlayer5->pName, pClassNames[pPlayer5->classType]);// "%s the %s" + strcat(pTmpBuf.data(), ": "); + v107 = pPlayer5->GetMajorConditionIdx(); + strcat(pTmpBuf.data(), aCharacterConditionNames[v107]); + GameUI_SetFooterString(pTmpBuf.data()); + v108 = 8 * uMessageParam - 8; + LOBYTE(v108) = v108 | 4; + pMouse->uPointingObjectID = PID(OBJECT_Player,v108); + continue; + case UIMSG_ShowStatus_ManaHP: + sprintf(pTmpBuf.data(), "%d / %d %s %d / %d %s", pPlayers[uMessageParam]->sHealth, pPlayers[uMessageParam]->GetMaxHealth(), + pGlobalTXT_LocalizationStrings[108], pPlayers[uMessageParam]->sMana, pPlayers[uMessageParam]->GetMaxMana(), + pGlobalTXT_LocalizationStrings[212]); + GameUI_SetFooterString(pTmpBuf.data()); + continue; + case UIMSG_CHEST_ClickItem: + if ( pCurrentScreen == SCREEN_CHEST_INVENTORY ) + { + pPlayers[uActiveCharacter]->OnInventoryLeftClick(); + continue; + } + Chest::OnChestLeftClick(); + continue; + case UIMSG_InventoryLeftClick: + pPlayers[uActiveCharacter]->OnInventoryLeftClick(); + continue; + case UIMSG_MouseLeftClickInGame: + /*if ( !pRenderer->pRenderD3D ) + { + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + OnGameViewportClick(); + continue; + }*/ + v115 = pMessageQueue_50CBD0->uNumMessages; + if ( !pMessageQueue_50CBD0->uNumMessages ) + { + pMessageQueue_50CBD0->AddGUIMessage(UIMSG_MouseLeftClickInScreen, 0, 0); + /*if ( (signed int)v115 < 40 ) + //goto LABEL_769; + { + pMessageQueue_50CBD0->pMessages[v115].eType = UIMSG_MouseLeftClickInScreen; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; + ++pMessageQueue_50CBD0->uNumMessages; + continue; + }*/ + continue; + } + if ( pMessageQueue_50CBD0->pMessages[0].field_8 ) + { + pMessageQueue_50CBD0->uNumMessages = 1; + pMessageQueue_50CBD0->AddGUIMessage(UIMSG_MouseLeftClickInScreen, 0, 0); + /*v115 = v0; + pMessageQueue_50CBD0->uNumMessages = v0; + pMessageQueue_50CBD0->pMessages[v115].eType = UIMSG_MouseLeftClickInScreen; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; + //goto LABEL_771; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; + ++pMessageQueue_50CBD0->uNumMessages;*/ + continue; + } + v115 = 0; + pMessageQueue_50CBD0->uNumMessages = 0; + pMessageQueue_50CBD0->AddGUIMessage(UIMSG_MouseLeftClickInScreen, 0, 0); + /*if ( (signed int)v115 < 40 ) + //goto LABEL_769; + { + pMessageQueue_50CBD0->pMessages[v115].eType = UIMSG_MouseLeftClickInScreen; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; + ++pMessageQueue_50CBD0->uNumMessages; + continue; + }*/ + continue; + case UIMSG_MouseLeftClickInScreen://срабатывает при нажатии на правую кнопку мыши после UIMSG_MouseLeftClickInGame + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + OnGameViewportClick(); + continue; + case UIMSG_F: + __debugbreak(); + //if ( pRenderer->pRenderD3D ) + { + LOWORD(v116) = pGame->pVisInstance->get_picked_object_zbuf_val(); + } + /*else + { + uNumSeconds = (unsigned int)pMouse->GetCursorPos(&v209); + pPoint3 = pMouse->GetCursorPos(&v204); + v116 = pRenderer->pActiveZBuffer[*(int *)uNumSeconds + pSRZBufferLineOffsets[pPoint3->y]]; + }*/ + pButton2 = (GUIButton *)(unsigned __int16)v116; + GUIWindow::Create(0, 0, 0, 0, WINDOW_F, (int)pButton2, 0); + continue; + case UIMSG_54: + __debugbreak(); + pButton2 = (GUIButton *)uMessageParam; + GUIWindow::Create(0, 0, 0, 0, WINDOW_22, (int)pButton2, 0); + continue; + case UIMSG_Game_Action: + if ( pMessageQueue_50CBD0->uNumMessages ) + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + OnPressSpace(); + continue; + case UIMSG_ClickZoomOutBtn: + if ( pCurrentScreen ) + continue; + pParty->uFlags |= 2u; + GUIWindow::Create(519, 136, 0, 0, WINDOW_PressedButton2, (int)pBtn_ZoomOut, 0); + uNumSeconds = 131072; + v118 = 2 * viewparams->uMinimapZoom; + ++viewparams->field_28; + viewparams->uMinimapZoom *= 2; + if ( uCurrentlyLoadedLevelType != LEVEL_Outdoor) + { + if ( (signed int)v118 > 4096 ) + { + viewparams->uMinimapZoom = 4096; + viewparams->field_28 = 12; + } + continue; + } + v119 = 2048; + if ( (signed int)v118 <= 2048 ) + { + _576E2C_current_minimap_zoom = v118; + dword_576E28 = viewparams->field_28; + break; + } + viewparams->field_28 = 11; + viewparams->uMinimapZoom = v119; + _576E2C_current_minimap_zoom = v119; + dword_576E28 = viewparams->field_28; + break; + case UIMSG_ClickZoomInBtn: + if ( pCurrentScreen ) + continue; + pParty->uFlags |= 2u; + GUIWindow::Create(574, 136, 0, 0, WINDOW_PressedButton2, (int)pBtn_ZoomIn, 0); + uNumSeconds = 32768; + v118 = (unsigned __int64)((signed __int64)(signed int)viewparams->uMinimapZoom << 15) >> 16; + --viewparams->field_28; + viewparams->uMinimapZoom = (unsigned __int64)((signed __int64)(signed int)viewparams->uMinimapZoom << 15) >> 16; + if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor) + { + v119 = 512; + if ( (signed int)v118 < 512 ) + { + viewparams->field_28 = 9; + v118 = v119; + viewparams->uMinimapZoom = v119; + } + _576E2C_current_minimap_zoom = v118; + dword_576E28 = viewparams->field_28; + } + else + { + if ( (signed int)v118 < 256 ) + { + viewparams->uMinimapZoom = 256; + viewparams->field_28 = 8; + } + } + default: + continue; + } + } + } + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50C9E8->uNumMessages;//dword_50C9E8; + memcpy(pMessageQueue_50CBD0->pMessages, pMessageQueue_50C9E8->pMessages, sizeof(GUIMessage) * pMessageQueue_50C9E8->uNumMessages); + //memcpy(pMessageQueue_50CBD0->pMessages, dword_50C9EC, 12 * dword_50C9E8); + //dword_50C9E8 = 0; + + + pMessageQueue_50C9E8->uNumMessages=0; + if ( dword_50C9DC ) + { + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + { + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)dword_50C9DC; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = (int)ptr_50C9E0; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; + ++pMessageQueue_50CBD0->uNumMessages; + }*/ + pMessageQueue_50CBD0->AddGUIMessage((UIMessageType)dword_50C9DC, (int)ptr_50C9E0, 0); + dword_50C9DC = 0; + } + else + { + if ( _50C9D0_AfterEnchClickEventId > 0 ) + { + _50C9D8_AfterEnchClickEventTimeout -= pEventTimer->uTimeElapsed; + if ( _50C9D8_AfterEnchClickEventTimeout <= 0 ) + { + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + { + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)dword_50C9D0; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = dword_50C9D4; + *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; + ++pMessageQueue_50CBD0->uNumMessages; + }*/ + pMessageQueue_50CBD0->AddGUIMessage((UIMessageType)_50C9D0_AfterEnchClickEventId, _50C9D4_AfterEnchClickEventSecondParam, 0); + _50C9D0_AfterEnchClickEventId = 0; + _50C9D4_AfterEnchClickEventSecondParam = 0; + _50C9D8_AfterEnchClickEventTimeout = 0; + } + } + } + CastSpellInfoHelpers::_427E01_cast_spell(); +} +//----- (00435748) -------------------------------------------------------- +void GUI_MainMenuMessageProc() +{ + 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, ¶m2); + //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_Button, 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_Button, 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_Button, 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_Button, 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_Button, 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((SoundID)20, 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((SoundID)23, 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_24, 0, 0, -1, 0, 0, 0, 0); + break; + case UIMSG_PlayerCreationSelectClass: + pPlayer[uPlayerCreationUI_SelectedCharacter].Reset((PLAYER_CLASS_TYPE)pParam); + pAudioPlayer->PlaySound(SOUND_Button, 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((SoundID)24, 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 ( pCurrentScreen != 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 ( pCurrentScreen == 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 && !pCurrentScreen ) + { + //if ( pCurrentScreen == 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 ( pCurrentScreen == 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(); + pCurrentScreen = SCREEN_GAME; + viewparams->bRedrawGameUI = v15; + break; + } + if ( pCurrentScreen == SCREEN_VIDEO ) + { + //pVideoPlayer->Unload(); + } + else + { + if ( pCurrentScreen != SCREEN_1B ) + { + pGUIWindow_CurrentMenu->Release(); + pGUIWindow2->Release(); + pGUIWindow2 = 0; + pEventTimer->Resume(); + pCurrentScreen = SCREEN_GAME; + viewparams->bRedrawGameUI = v15; + break; + } + //VideoPlayer::dtor(); + } + break; + default: + break; + } + } + while ( pMessageQueue_50CBD0->uNumMessages ); + } +} + + + +//----- (0042FBDD) -------------------------------------------------------- +void sub_42FBDD() +{ + pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); + pRenderer->DrawTextureTransparent(pBtn_YES->uX, pBtn_YES->uY, pBtn_YES->pTextures[0]); + pRenderer->Present(); +} + +//----- (0042FC15) -------------------------------------------------------- +void CloseWindowBackground() +{ + pAudioPlayer->PlaySound(SOUND_Button2, -2, 0, -1, 0, 0, 0, 0); + pRenderer->DrawTextureTransparent(pBtn_ExitCancel->uX, pBtn_ExitCancel->uY, pBtn_ExitCancel->pTextures[0]); + pRenderer->Present(); +} + + +//----- (0046BDC0) -------------------------------------------------------- +void UpdateUserInput_and_MapSpecificStuff() +{ + if (dword_6BE364_game_settings_1 & GAME_SETTINGS_0080_SKIP_USER_INPUT_THIS_FRAME) + { + dword_6BE364_game_settings_1 &= ~GAME_SETTINGS_0080_SKIP_USER_INPUT_THIS_FRAME; + return; + } + + if (uCurrentlyLoadedLevelType == LEVEL_Indoor) + BLV_UpdateUserInputAndOther(); + else if (uCurrentlyLoadedLevelType == LEVEL_Outdoor) + ODM_UpdateUserInputAndOther(); + + area_of_effect__damage_evaluate(); +} + +//----- (004646F0) -------------------------------------------------------- +void PrepareWorld(unsigned int _0_box_loading_1_fullscreen) +{ + //if ( pRenderer->pRenderD3D ) + pGame->pVisInstance->_4C1A02(); + pEventTimer->Pause(); + pMiscTimer->Pause(); + pParty->uFlags = 2; + CastSpellInfoHelpers::_427D48(); + ResetCursor_Palettes_LODs_Level_Audio_SFT_Windows(); + DoPrepareWorld(0, (_0_box_loading_1_fullscreen == 0) + 1); + pMiscTimer->Resume(); + pEventTimer->Resume(); +} + +//----- (00464866) -------------------------------------------------------- +void DoPrepareWorld(unsigned int bLoading, int _1_fullscreen_loading_2_box) +{ + char *v3; // eax@1 + unsigned int v5; // eax@3 + char Str1[20]; // [sp+Ch] [bp-18h]@1 + unsigned int v9; // [sp+20h] [bp-4h]@1 + + v9 = bLoading; + ResetCursor_Palettes_LODs_Level_Audio_SFT_Windows(); + pDecalBuilder->Reset(0); + pGameLoadingUI_ProgressBar->Initialize(_1_fullscreen_loading_2_box == 1 ? GUIProgressBar::TYPE_Fullscreen : + GUIProgressBar::TYPE_Box); + strcpy(Str1, pCurrentMapName); + v3 = strtok(Str1, "."); + strcpy(Str1, v3); + Level_LoadEvtAndStr(Str1); + LoadLevel_InitializeLevelEvt(); + strcpy(Str1, pCurrentMapName); + _strrev(Str1); + strtok(Str1, "."); + _strrev(Str1); + + for (uint i = 0; i < 1000; ++i) + pSpriteObjects[i].uObjectDescID = 0; + + v5 = pMapStats->GetMapInfo(pCurrentMapName); + bUnderwater = false; + uLevelMapStatsID = v5; + pGame->uFlags2 &= 0xFFFFFFF7u; + if (!_stricmp(pCurrentMapName, "out15.odm")) + { + bUnderwater = true; + pGame->uFlags2 |= GAME_FLAGS_2_ALTER_GRAVITY; + } + pParty->floor_face_pid = 0; + if (_stricmp(Str1, "blv")) + PrepareToLoadODM(v9, 0); + else + PrepareToLoadBLV(v9); + pAudioPlayer->SetMapEAX(); + _461103_load_level_sub(); + if (!_stricmp(pCurrentMapName, "d11.blv") || !_stricmp(pCurrentMapName, "d10.blv")) + { + //spawning grounds & walls of mist - no loot & exp from monsters + + for (uint i = 0; i < uNumActors; ++i) + { + pActors[i].pMonsterInfo.uTreasureType = 0; + pActors[i].pMonsterInfo.uTreasureDiceRolls = 0; + pActors[i].pMonsterInfo.uExp = 0; + } + } + bDialogueUI_InitializeActor_NPC_ID = 0; + OnMapLoad(); + pGameLoadingUI_ProgressBar->Progress(); + memset(&pRenderer->pBillboardRenderListD3D, 0, sizeof(pRenderer->pBillboardRenderListD3D)); + pGameLoadingUI_ProgressBar->Release(); + _flushall(); +} + +void IntegrityTest() +{ + static_assert(sizeof(MovieHeader) == 44, "Wrong type size"); + static_assert(sizeof(SoundDesc_mm6) == 112, "Wrong type size"); + static_assert(sizeof(SoundDesc) == 120, "Wrong type size"); + static_assert(sizeof(OverlayDesc) == 8, "Wrong type size"); + static_assert(sizeof(ChestDesc) == 36, "Wrong type size"); + static_assert(sizeof(ObjectDesc_mm6) == 52, "Wrong type size"); + static_assert(sizeof(ObjectDesc) == 56, "Wrong type size"); + static_assert(sizeof(DecorationDesc) == 84, "Wrong type size"); + static_assert(sizeof(IconFrame) == 32, "Wrong type size"); + static_assert(sizeof(PlayerFrame) == 10, "Wrong type size"); + static_assert(sizeof(TextureFrame) == 20, "Wrong type size"); + static_assert(sizeof(SpriteFrame) == 60, "Wrong type size"); + static_assert(sizeof(RenderVertexSoft) == 0x30, "Wrong type size"); + static_assert(sizeof(RenderBillboard) == 0x34, "Wrong type size"); + static_assert(sizeof(Texture) == 0x48, "Wrong type size"); + static_assert(sizeof(RGBTexture) == 0x28, "Wrong type size"); + //static_assert(sizeof(LODFile_IconsBitmaps) == 0x11BB8 + 4, "Wrong type size"); // + virtual dtor ptr + static_assert(sizeof(AudioPlayer) == 0xC84, "Wrong type size"); + static_assert(sizeof(SoundDesc) == 0x78, "Wrong type size"); + static_assert(sizeof(stru339_spell_sound) == 0xAFD8, "Wrong type size"); + //static_assert(sizeof(VideoPlayer) == 0x108 + 4, "Wrong type size"); + static_assert(sizeof(MovieHeader) == 0x2C, "Wrong type size"); + static_assert(sizeof(DecorationDesc) == 0x54, "Wrong type size"); + static_assert(sizeof(ObjectDesc) == 0x38, "Wrong type size"); + static_assert(sizeof(OverlayDesc) == 0x8, "Wrong type size"); + static_assert(sizeof(ChestDesc) == 0x24, "Wrong type size"); + static_assert(sizeof(TileDesc) == 0x1A, "Wrong type size"); + static_assert(sizeof(MonsterDesc_mm6) == 148, "Wrong type size"); + static_assert(sizeof(MonsterDesc) == 152, "Wrong type size"); + static_assert(sizeof(Timer) == 0x28, "Wrong type size"); + static_assert(sizeof(OtherOverlay) == 0x14, "Wrong type size"); + static_assert(sizeof(ItemGen) == 0x24, "Wrong type size"); + static_assert(sizeof(SpriteObject) == 0x70, "Wrong type size"); + static_assert(sizeof(ItemDesc) == 0x30, "Wrong type size"); + static_assert(sizeof(ItemsTable) == 0x117A0, "Wrong type size"); + static_assert(sizeof(Chest) == 0x14CC, "Wrong type size"); + static_assert(sizeof(MapInfo) == 0x44, "Wrong type size"); + static_assert(sizeof(SpellInfo) == 0x24, "Wrong type size"); + static_assert(sizeof(SpellData) == 0x14, "Wrong type size"); + static_assert(sizeof(SpellBuff) == 0x10, "Wrong type size"); + static_assert(sizeof(AIDirection) == 0x1C, "Wrong type size"); + static_assert(sizeof(ActorJob) == 0xC, "Wrong type size"); + static_assert(sizeof(Actor) == 0x344, "Wrong type size"); + static_assert(sizeof(LevelDecoration) == 0x20, "Wrong type size"); + static_assert(sizeof(KeyboardActionMapping) == 0x20C, "Wrong type size"); + static_assert(sizeof(UIAnimation) == 0xD, "Wrong type size"); + static_assert(sizeof(SpawnPointMM7) == 0x18, "Wrong type size"); + static_assert(sizeof(ODMFace) == 0x134, "Wrong type size"); + static_assert(sizeof(BSPNode) == 0x8, "Wrong type size"); + static_assert(sizeof(BSPModel) == 0xBC, "Wrong type size"); + static_assert(sizeof(OutdoorLocation) == 0x1C28C, "Wrong type size"); + static_assert(sizeof(BLVFace) == 0x60, "Wrong type size"); + static_assert(sizeof(BLVFaceExtra) == 0x24, "Wrong type size"); + static_assert(sizeof(BLVSector) == 0x74, "Wrong type size"); + static_assert(sizeof(BLVLightMM7) == 0x10, "Wrong type size"); + static_assert(sizeof(BLVDoor) == 0x50, "Wrong type size"); + static_assert(sizeof(IndoorLocation) == 0x690, "Wrong type size"); + //static_assert(sizeof(ODMRenderParams) == 0x74, "Wrong type size"); + static_assert(sizeof(Mouse) == 0x114, "Wrong type size"); + static_assert(sizeof(Particle_sw) == 0x68, "Wrong type size"); + static_assert(sizeof(Particle) == 0x68, "Wrong type size"); + static_assert(sizeof(ParticleEngine) == 0xE430, "Wrong type size"); + static_assert(sizeof(Lightmap) == 0xC1C, "Wrong type size"); + static_assert(sizeof(LightmapBuilder) == 0x3CBC38, "Wrong type size"); + static_assert(sizeof(Vis_SelectionList) == 0x2008, "Wrong type size"); + static_assert(sizeof(Vis) == 0x20D0, "Wrong type size"); + static_assert(sizeof(PlayerBuffAnim) == 0x10, "Wrong type size"); + static_assert(sizeof(ProjectileAnim) == 0x1C, "Wrong type size"); + static_assert(sizeof(stru6) == 0x5F8, "Wrong type size"); + static_assert(sizeof(IndoorCameraD3D_Vec3) == 0x10, "Wrong type size"); + static_assert(sizeof(IndoorCameraD3D_Vec4) == 0x18, "Wrong type size"); //should be 14 (10 vec3 + 4 vdtor) but 18 coz of his +4 from own vdtor, but it is odd since vdtor already present from vec3 + //static_assert(sizeof(IndoorCameraD3D) == 0x1A1384, "Wrong type size"); + static_assert(sizeof(StationaryLight) == 0xC, "Wrong type size"); + static_assert(sizeof(LightsStack_StationaryLight_) == 0x12C8, "Wrong type size"); + static_assert(sizeof(MobileLight) == 0x12, "Wrong type size"); + static_assert(sizeof(LightsStack_MobileLight_) == 0x1C28, "Wrong type size"); + static_assert(sizeof(Game) == 0xE78, "Wrong type size"); + static_assert(sizeof(stru141_actor_collision_object) == 0xA8, "Wrong type size"); + static_assert(sizeof(ActionQueue) == 0x7C, "Wrong type size"); + static_assert(sizeof(NPCData) == 0x4C, "Wrong type size"); + static_assert(sizeof(NPCStats) == 0x17FFC, "Wrong type size"); + static_assert(sizeof(BspRenderer) == 0x53740, "Wrong type size"); + static_assert(sizeof(PaletteManager) == 0x267AF0, "Wrong type size"); + static_assert(sizeof(ViewingParams) == 0x26C, "Wrong type size"); + //static_assert(sizeof(IndoorCamera) == 0x50, "Wrong type size"); + static_assert(sizeof(Bloodsplat) == 0x28, "Wrong type size"); + static_assert(sizeof(BloodsplatContainer) == 0xA0C, "Wrong type size"); + static_assert(sizeof(TrailParticle) == 0x18, "Wrong type size"); + static_assert(sizeof(EventIndex) == 0xC, "Wrong type size"); + static_assert(sizeof(_2devent) == 0x34, "Wrong type size"); + static_assert(sizeof(MapsLongTimer) == 0x20, "Wrong type size"); + static_assert(sizeof(SavegameHeader) == 0x64, "Wrong type size"); + static_assert(sizeof(SavegameList) == 0x3138, "Wrong type size"); + static_assert(sizeof(StorylineText) == 0x160, "Wrong type size"); + static_assert(sizeof(FactionTable) == 0x1EF1, "Wrong type size"); + static_assert(sizeof(Decal) == 0xC20, "Wrong type size"); + static_assert(sizeof(DecalBuilder) == 0x30C038, "Wrong type size"); + static_assert(sizeof(MonsterInfo) == 0x58, "Wrong type size"); + static_assert(sizeof(MonsterStats) == 0x5BA0, "Wrong type size"); + static_assert(sizeof(RenderD3D) == 0x148, "Wrong type size"); + // static_assert(sizeof(Render) == 0x129844, "Wrong type size"); + static_assert(sizeof(Player) == 0x1B3C, "Wrong type size"); + static_assert(sizeof(PartyTimeStruct) == 0x678, "Wrong type size"); + static_assert(sizeof(Party) == 0x16238, "Wrong type size"); + static_assert(sizeof(GUIButton) == 0xBC, "Wrong type size"); + static_assert(sizeof(GUIWindow) == 0x54, "Wrong type size"); + static_assert(sizeof(GUIProgressBar) == 0x1B8, "Wrong type size"); + static_assert(sizeof(GUIFont) == 0x1020, "Wrong type size"); + // static_assert(sizeof(stru262_TurnBased) == 0x40, "Wrong type size"); + static_assert(sizeof(ArcomageGame) == 0xFB, "Wrong type size"); + static_assert(sizeof(CastSpellInfo) == 0x14, "Wrong type size"); + static_assert(sizeof(ArcomageCard) == 0x6C, "Wrong type size"); + static_assert(sizeof(stru320) == 0x3FC, "Wrong type size"); + static_assert(sizeof(TravelInfo) == 0x20, "Wrong type size"); + static_assert(sizeof(stru336) == 0x798, "Wrong type size"); + static_assert(sizeof(Vec3_short_) == 6, "Wrong type size"); + static_assert(sizeof(BLVFace) == 96, "Wrong type size"); + static_assert(sizeof(BLVFaceExtra) == 36, "Wrong type size"); + static_assert(sizeof(BLVSector) == 116, "Wrong type size"); + static_assert(sizeof(LevelDecoration) == 32, "Wrong type size"); + static_assert(sizeof(BLVLightMM7) == 16, "Wrong type size"); + static_assert(sizeof(BSPNode) == 8, "Wrong type size"); + static_assert(sizeof(SpawnPointMM7) == 24, "Wrong type size"); + static_assert(sizeof(DDM_DLV_Header) == 40, "Wrong type size"); + static_assert(sizeof(Actor) == 836, "Wrong type size"); + static_assert(sizeof(SpriteObject) == 112, "Wrong type size"); + static_assert(sizeof(Chest) == 5324, "Wrong type size"); + static_assert(sizeof(stru123) == 0xC8, "Wrong type size"); + static_assert(sizeof(BLVMapOutline) == 12, "Wrong type size"); + static_assert(sizeof(LODSprite) == 0x28, "Wrong type size"); +} + + +//----- (00464761) -------------------------------------------------------- +void Game_DeinitializeAndTerminate(int exitCode) +{ + SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS); + ResetCursor_Palettes_LODs_Level_Audio_SFT_Windows(); + pGame->Deinitialize(); + pRenderer->Release(); + delete window; + //if ( !DestroyWindow(hWnd) ) + // GetLastError(); + exit(exitCode); +} + +//----- (004647AB) -------------------------------------------------------- +void FinalInitialization() +{ + pViewport->SetScreen(viewparams->uSomeX, viewparams->uSomeY, viewparams->uSomeZ, viewparams->uSomeW); + pViewport->SetFOV(flt_6BE3A0 * 65536.0f); + + //pIndoorCamera = new IndoorCamera; + //pIndoorCamera->Initialize(65, viewparams->uScreen_BttmR_X - viewparams->uScreen_topL_X + 1, + // viewparams->uScreen_BttmR_Y - viewparams->uScreen_topL_Y + 1); + + InitializeTurnBasedAnimations(&stru_50C198); + pBitmaps_LOD->_inlined_sub1(); + pSprites_LOD->_inlined_sub1(); + pIcons_LOD->_inlined_sub1(); +} +// 6BE3A0: using guessed type float flt_6BE3A0; + + + +//----- (00464E17) -------------------------------------------------------- +bool __fastcall CheckMM7CD(char c) +{ + char DstBuf[256] = { 0 }; + char strCommand[256] = { 0 }; // [sp+10Ch] [bp-118h]@1 + char Filename[20] = { 0 }; // [sp+20Ch] [bp-18h]@1 + + wchar_t pMagicPath[1024]; + swprintf(pMagicPath, wcslen(L"%C:\\anims\\magic7.vid"), L"%C:\\anims\\magic7.vid", c); + if (GetFileAttributesW(pMagicPath) == -1) + return false; + + wsprintfA(strCommand, "open %c: type cdaudio alias CD", c); + if (!mciSendStringA(strCommand, DstBuf, 255, 0))//Uninitialized memory access + + { + wsprintfA(strCommand, "info CD UPC wait"); + mciSendStringA(strCommand, DstBuf, 255, 0); + wsprintfA(strCommand, "close CD"); + mciSendStringA(strCommand, DstBuf, 255, 0); + } + + memcpy(Filename, "X:\\anims\\magic7.vid", sizeof(Filename)); + *Filename = c; + + FILE* f = fopen(Filename, "rb"); + if (!f) + return false; + + if (!fseek(f, 0, SEEK_END)) + { + if (!fseek(f, -100, SEEK_CUR)) + fread(DstBuf, 1, 0x64u, f); + + fclose(f); + return true; + } + fclose(f); + return false; +} + +//----- (00464F1B) -------------------------------------------------------- +signed int __stdcall InsertMM7CDDialogFunc(HWND hDlg, int a2, __int16 a3, int a4) +{ + char v4; // zf@3 + int v6; // eax@10 + int v7; // eax@11 + int v8; // eax@12 + int v9; // eax@13 + BOOL(__stdcall *v10)(HWND, int, LPCSTR); // edi@15 + const CHAR *v11; // [sp-Ch] [bp-Ch]@15 + INT_PTR v12; // [sp-4h] [bp-4h]@5 + + if (a2 == 272) + { + hInsertCDWindow = hDlg; + v6 = (GetUserDefaultLangID() & 0x3FF) - 7; + if (v6) + { + v7 = v6 - 3; + if (v7) + { + v8 = v7 - 2; + if (v8) + { + v9 = v8 - 4; + if (v9) + { + if (v9 != 5) + return 0; + SetWindowTextA(hDlg, "Wloz CD-ROM numer 2"); + v10 = SetDlgItemTextA; + SetDlgItemTextA(hDlg, 1010, "Wloz CD-ROM numer 2 Might and Magic® VII."); + v11 = "Odwolaj"; + } + else + { + SetWindowTextA(hDlg, "Inserire il secondo CD"); + v10 = SetDlgItemTextA; + SetDlgItemTextA(hDlg, 1010, "Inserire il secondo CD di Might and Magic® VII."); + v11 = "Annulla"; + } + } + else + { + SetWindowTextA(hDlg, "Insйrez le CD 2"); + v10 = SetDlgItemTextA; + SetDlgItemTextA(hDlg, 1010, "Insйrez Might & Magic® VII CD 2."); + v11 = "Supprimer"; + } + } + else + { + SetWindowTextA(hDlg, "Por favor, inserte disco 2"); + v10 = SetDlgItemTextA; + SetDlgItemTextA(hDlg, 1010, "Por favor, inserte disco 2 de Might & Magic® VII."); + v11 = "Cancelar"; + } + } + else + { + SetWindowTextA(hDlg, "Bitte CD 2 einlegen"); + v10 = SetDlgItemTextA; + SetDlgItemTextA(hDlg, 1010, "Bitte CD 2 von Might and Magic® VII einlegen."); + v11 = "Abbrechen"; + } + v10(hDlg, 2, v11); + return 0; + } + if (a2 == 273) + { + if (a3 == 2) + { + v12 = 0; + EndDialog(hDlg, v12); + return 1; + } + v4 = a3 == 1; + } + else + { + v4 = a2 == 1025; + } + if (v4) + { + v12 = 1; + EndDialog(hDlg, v12); + return 1; + } + return 0; +} + +//----- (00465061) -------------------------------------------------------- +bool __fastcall FindMM7CD(HWND hWnd, char *pCDDrive) +{ + char drive[4] = { 'X', ':', '\\', 0 }; + + bool bGotCDFromRegistry = false; + + HKEY hSoftware = nullptr, + hNWC = nullptr, + hMM7 = nullptr, + hVersion = nullptr; + if (!RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE", 0, KEY_READ|KEY_WOW64_32KEY, &hSoftware)) + { + if (!RegOpenKeyExA(hSoftware, "New World Computing", 0, KEY_READ|KEY_WOW64_32KEY, &hNWC)) + { + if (!RegOpenKeyExA(hNWC, "Might and Magic VII", 0, KEY_READ|KEY_WOW64_32KEY, &hMM7)) + { + if (!RegOpenKeyExA(hMM7, "1.0", 0, KEY_READ|KEY_WOW64_32KEY, &hVersion)) + { + DWORD cbData = 3; + if (!RegQueryValueExA(hVersion, "CDDrive", 0, 0, (BYTE *)drive, &cbData)) + bGotCDFromRegistry = true; + } + RegCloseKey(hVersion); + } + RegCloseKey(hMM7); + } + RegCloseKey(hNWC); + } + RegCloseKey(hSoftware); + + if (bGotCDFromRegistry) + if (CheckMM7CD(*drive)) + { + cMM7GameCDDriveLetter = *drive; + return true; + } + + while (true) + { + for (uint i = 0; i < 26; ++i) + { + drive[0] = 'A' + i; + + if (GetDriveTypeA(drive) == DRIVE_CDROM) + if (CheckMM7CD(*drive)) + { + cMM7GameCDDriveLetter = *drive; + WriteWindowsRegistryString("CDDrive", drive); + return true; + } + } + + if (DialogBoxParamA(GetModuleHandleW(nullptr), "InsertCD", hWnd, (DLGPROC)InsertMM7CDDialogFunc, 0)) + continue; + return false; + } +} + +//----- (004651F4) -------------------------------------------------------- +bool MM7_Initialize(int game_width, int game_height) +{ + wchar_t pCurrentDir[1024]; + _wgetcwd(pCurrentDir, 1024); + + wchar_t pMM6IniFile[1024]; + wsprintfW(pMM6IniFile, L"%s\\mm6.ini", pCurrentDir); + + bCanLoadFromCD = GetPrivateProfileIntW(L"settings", L"use_cd", 1, pMM6IniFile); + if (bNoCD) + bCanLoadFromCD = false; + if (bCanLoadFromCD) + { + Log::Warning(L"Checking for CD..."); + if (!FindMM7CD(nullptr, &cMM7GameCDDriveLetter)) + return false; + Log::Warning(L"...done."); + } + + + srand(GetTickCount()); + + pEventTimer = Timer::Create(); + pEventTimer->Initialize(); + window = OSWindow::Create(L"Might and Magic® Trilogy", game_width, game_height);//Create game window + + bool use_d3d11 = false; + if (use_d3d11) + pRenderer = RenderD3D11::Create(); + else + pRenderer = Render::Create();//Create DirectX + if (!pRenderer) + { + Log::Warning(L"Render creation failed"); + return false; + } + else + { + //bool bWindowMode = ReadWindowsRegistryInt("startinwindow", false); + //uint uDefaultDevice = ReadWindowsRegistryInt("D3D Device", 1); + + if (!pRenderer->Initialize(window/*, bColoredLights, uLevelOfDetail, bTinting*/)) + { + Log::Warning(L"Render failed to initialize"); + return false; + } + } + + game_starting_year = 1168; + + pParty = new Party; + memset(&pParty->pHirelings, 0, sizeof(pParty->pHirelings)); + pParty->uWalkSpeed = GetPrivateProfileIntW(L"debug", L"walkspeed", 384, pMM6IniFile); + pParty->uDefaultEyelevel = GetPrivateProfileIntW(L"party", L"eyelevel", 160, pMM6IniFile); + pParty->sEyelevel = pParty->uDefaultEyelevel; + pParty->uDefaultPartyHeight = GetPrivateProfileIntW(L"party", L"height", 192, pMM6IniFile); + pParty->uPartyHeight = pParty->uDefaultPartyHeight; + + MM6_Initialize(pMM6IniFile); + + pKeyActionMap = new KeyboardActionMapping; + + OnTimer(1); + GameUI_StatusBar_UpdateTimedString(1); + pGame = Game::Create(); + pMouse = pGame->pMouseInstance; + + + pIcons_LOD = new LODFile_IconsBitmaps; + if (!pIcons_LOD->Load("data\\icons.lod", "icons")) + { + MessageBoxW(nullptr, L"Some files are missing\n\nPlease Reinstall.", + L"Files Missing", MB_ICONEXCLAMATION); + return false; + } + pIcons_LOD->dword_011BA4 = 0; + + pEvents_LOD = new LODFile_IconsBitmaps; + if (!pEvents_LOD->Load("data\\events.lod", "icons")) + { + MessageBoxW(nullptr, L"Some files are missing\n\nPlease Reinstall.", + L"Files Missing", MB_ICONEXCLAMATION); + return false; + } + + InitializeGameText(); + + pBitmaps_LOD = new LODFile_IconsBitmaps; + if (!pBitmaps_LOD->Load("data\\bitmaps.lod", "bitmaps")) + { + MessageBoxA(nullptr, pGlobalTXT_LocalizationStrings[63], + pGlobalTXT_LocalizationStrings[184], MB_ICONEXCLAMATION); + return false; + } + + pSprites_LOD = new LODFile_Sprites; + if (!pSprites_LOD->LoadSprites("data\\sprites.lod")) + { + MessageBoxA(nullptr, + pGlobalTXT_LocalizationStrings[63], + pGlobalTXT_LocalizationStrings[184], MB_ICONEXCLAMATION); + return false; + } + + +#if 0 + if (_access("../MM_VI/data/icons.lod", 0) == 0) + { + pIcons_LOD_mm6 = new LODFile_IconsBitmaps; + if (!pIcons_LOD_mm6->Load("../MM_VI/data/icons.lod", "icons")) + { + delete pIcons_LOD_mm6; + pIcons_LOD_mm6 = nullptr; + Log::Warning(L"Unable to load mm6:icons.lod"); + } + } + else + Log::Warning(L"Unable to find mm6:icons.lod"); + + if (_access("../MM_VI/data/bitmaps.lod", 0) == 0) + { + pBitmaps_LOD_mm6 = new LODFile_IconsBitmaps; + if (!pBitmaps_LOD_mm6->Load("../MM_VI/data/bitmaps.lod", "bitmaps")) + { + delete pBitmaps_LOD_mm6; + pBitmaps_LOD_mm6 = nullptr; + Log::Warning(L"Unable to load mm6:bitmaps.lod"); + } + } + else + Log::Warning(L"Unable to find mm6:bitmaps.lod"); + + auto mm6_sprite_container_name = bUseLoResSprites ? "../MM_VI/data/spriteLO.lod" + : "../MM_VI/data/sprites.lod"; + if (_access(mm6_sprite_container_name, 0) == 0) + { + pSprites_LOD_mm6 = new LODFile_Sprites; + if (!pSprites_LOD_mm6->LoadSprites(mm6_sprite_container_name)) + { + delete pSprites_LOD_mm6; + pSprites_LOD_mm6 = nullptr; + Log::Warning(L"Unable to load mm6:sprites.lod"); + } + } + else + Log::Warning(L"Unable to find mm6:sprites.lod"); + + + if (_access("../mm8/data/icons.lod", 0) == 0) + { + pIcons_LOD_mm8 = new LODFile_IconsBitmaps; + if (!pIcons_LOD_mm8->Load("../mm8/data/icons.lod", "icons")) + { + delete pIcons_LOD_mm8; + pIcons_LOD_mm8 = nullptr; + Log::Warning(L"Unable to load mm8:icons.lod"); + } + } + else + Log::Warning(L"Unable to find mm8:icons.lod"); + + + if (_access("../mm8/data/bitmaps.lod", 0) == 0) + { + pBitmaps_LOD_mm8 = new LODFile_IconsBitmaps; + if (!pBitmaps_LOD_mm8->Load("../mm8/data/bitmaps.lod", "bitmaps")) + { + delete pBitmaps_LOD_mm8; + pBitmaps_LOD_mm8 = nullptr; + Log::Warning(L"Unable to load mm8:bitmaps.lod"); + } + } + else + Log::Warning(L"Unable to find mm8:bitmaps.lod"); + + + if (_access("../mm8/data/sprites.lod", 0) == 0) + { + pSprites_LOD_mm8 = new LODFile_Sprites; + if (!pSprites_LOD_mm8->LoadSprites("../mm8/data/sprites.lod")) + { + delete pSprites_LOD_mm8; + pSprites_LOD_mm8 = nullptr; + Log::Warning(L"Unable to load mm8:sprites.lod"); + } + } + else + Log::Warning(L"Unable to find mm8:sprites.lod"); +#endif + + { + void *sft_mm6 = pIcons_LOD_mm6 ? pIcons_LOD_mm6->LoadRaw("dsft.bin", 1) : nullptr, + *sft_mm8 = nullptr; + void *sft_mm7 = pEvents_LOD->LoadRaw("dsft.bin", 1); + pSpriteFrameTable = new SpriteFrameTable; + pSpriteFrameTable->FromFile(sft_mm6, sft_mm7, sft_mm8); + free(sft_mm6); + free(sft_mm7); + free(sft_mm8); + + void *tft_mm6 = pIcons_LOD_mm6 ? pIcons_LOD_mm6->LoadRaw("dtft.bin", 1) : nullptr, + *tft_mm8 = nullptr; + void *tft_mm7 = pEvents_LOD->LoadRaw("dtft.bin", 1); + pTextureFrameTable = new TextureFrameTable; + pTextureFrameTable->FromFile(tft_mm6, tft_mm7, tft_mm8); + free(tft_mm6); + free(tft_mm7); + free(tft_mm8); + + void *tiles_mm6 = pIcons_LOD_mm6 ? pIcons_LOD_mm6->LoadRaw("dtile.bin", 1) : nullptr, + *tiles_mm8 = nullptr; + void *tiles_mm7 = pEvents_LOD->LoadRaw("dtile.bin", 1); + pTileTable = new TileTable; + pTileTable->FromFile(tiles_mm6, tiles_mm7, tiles_mm8); + free(tiles_mm6); + free(tiles_mm7); + free(tiles_mm8); + + void *pft_mm6 = pIcons_LOD_mm6 ? pIcons_LOD_mm6->LoadRaw("dpft.bin", 1) : nullptr, + *pft_mm8 = nullptr; + void *pft_mm7 = pEvents_LOD->LoadRaw("dpft.bin", 1); + pPlayerFrameTable = new PlayerFrameTable; + pPlayerFrameTable->FromFile(pft_mm6, pft_mm7, pft_mm8); + free(pft_mm6); + free(pft_mm7); + free(pft_mm8); + + void *ift_mm6 = pIcons_LOD_mm6 ? pIcons_LOD_mm6->LoadRaw("dift.bin", 1) : nullptr, + *ift_mm8 = nullptr; + void *ift_mm7 = pEvents_LOD->LoadRaw("dift.bin", 1); + pIconsFrameTable = new IconFrameTable; + pIconsFrameTable->FromFile(ift_mm6, ift_mm7, ift_mm8); + free(ift_mm6); + free(ift_mm7); + free(ift_mm8); + + void *decs_mm6 = pIcons_LOD_mm6 ? pIcons_LOD_mm6->LoadRaw("ddeclist.bin", 1) : nullptr, + *decs_mm8 = nullptr; + void *decs_mm7 = pEvents_LOD->LoadRaw("ddeclist.bin", 1); + pDecorationList = new DecorationList; + pDecorationList->FromFile(decs_mm6, decs_mm7, decs_mm8); + free(decs_mm6); + free(decs_mm7); + free(decs_mm8); + + void *objs_mm6 = pIcons_LOD_mm6 ? pIcons_LOD_mm6->LoadRaw("dobjlist.bin", 1) : nullptr, + *objs_mm8 = nullptr; + void *objs_mm7 = pEvents_LOD->LoadRaw("dobjlist.bin", 1); + pObjectList = new ObjectList; + pObjectList->FromFile(objs_mm6, objs_mm7, objs_mm8); + free(objs_mm6); + free(objs_mm7); + free(objs_mm8); + + void *mons_mm6 = pIcons_LOD_mm6 ? pIcons_LOD_mm6->LoadRaw("dmonlist.bin", 1) : nullptr, + *mons_mm8 = nullptr; + void *mons_mm7 = pEvents_LOD->LoadRaw("dmonlist.bin", 1); + pMonsterList = new MonsterList; + pMonsterList->FromFile(mons_mm6, mons_mm7, mons_mm8); + free(mons_mm6); + free(mons_mm7); + free(mons_mm8); + + void *chests_mm6 = pIcons_LOD_mm6 ? pIcons_LOD_mm6->LoadRaw("dchest.bin", 1) : nullptr, + *chests_mm8 = nullptr; + void *chests_mm7 = pEvents_LOD->LoadRaw("dchest.bin", 1); + pChestList = new ChestList; + pChestList->FromFile(chests_mm6, chests_mm7, chests_mm8); + free(chests_mm6); + free(chests_mm7); + free(chests_mm8); + + void *overlays_mm6 = pIcons_LOD_mm6 ? pIcons_LOD_mm6->LoadRaw("doverlay.bin", 1) : nullptr, + *overlays_mm8 = nullptr; + void *overlays_mm7 = pEvents_LOD->LoadRaw("doverlay.bin", 1); + pOverlayList = new OverlayList; + pOverlayList->FromFile(overlays_mm6, overlays_mm7, overlays_mm8); + free(overlays_mm6); + free(overlays_mm7); + free(overlays_mm8); + + void *sounds_mm6 = pIcons_LOD_mm6 ? pIcons_LOD_mm6->LoadRaw("dsounds.bin", 1) : nullptr, + *sounds_mm8 = nullptr; + void *sounds_mm7 = pEvents_LOD->LoadRaw("dsounds.bin", 1); + pSoundList = new SoundList; + pSoundList->FromFile(sounds_mm6, sounds_mm7, sounds_mm8); + free(sounds_mm6); + free(sounds_mm7); + free(sounds_mm8); + } + + + + + if (dword_6BE368_debug_settings_2 & DEBUG_SETTINGS_RUN_IN_WIDOW) + { + //window->SetWindowedMode(game_width, game_height); + pRenderer->SwitchToWindow(); + } + else + { + __debugbreak(); // Nomad + window->SetFullscreenMode(); + pRenderer->InitializeFullscreen(); + } + + uSoundVolumeMultiplier = min(9, ReadWindowsRegistryInt("soundflag", 9)); + uMusicVolimeMultiplier = min(9, ReadWindowsRegistryInt("musicflag", 9)); + uVoicesVolumeMultiplier = min(9, ReadWindowsRegistryInt("CharVoices", 9)); + bShowDamage = ReadWindowsRegistryInt("ShowDamage", 1) != 0; + + uGammaPos = min(4, ReadWindowsRegistryInt("GammaPos", 4)); + pGame->pGammaController->Initialize(uGammaPos * 0.1 + 0.6); + + if (ReadWindowsRegistryInt("Bloodsplats", 1)) + pGame->uFlags2 |= GAME_FLAGS_2_DRAW_BLOODSPLATS; + else + pGame->uFlags2 &= ~GAME_FLAGS_2_DRAW_BLOODSPLATS; + + uTurnSpeed = ReadWindowsRegistryInt("TurnDelta", 3); + + if (!bNoSound) + pAudioPlayer->Initialize(); + + pMediaPlayer = new Media::MPlayer(); + pMediaPlayer->Initialize(window); + + dword_6BE364_game_settings_1 |= GAME_SETTINGS_4000; + + switch (uTurnSpeed) + { + case 0: // undefined turn option + __debugbreak(); // really shouldn't use this mode + uTurnSpeed = (unsigned int)uCPUSpeed < 199 ? 128 : 64; // adjust turn speed to estimated fps + break; + + case 1: // 16x + Log::Warning(L"x16 Turn Speed"); // really shouldn't use this mode + uTurnSpeed = 128; + break; + + case 2: // 32x + Log::Warning(L"x32 Turn Speed"); // really shouldn't use this mode + uTurnSpeed = 64; + break; + + case 3: // smooth + uTurnSpeed = 0; + break; + } + + return true; +} + +//----- (00465D0B) -------------------------------------------------------- +void SecondaryInitialization() +{ + pMouse->Initialize(window); + + pItemsTable = new ItemsTable; + pItemsTable->Initialize(); + + //pBitmaps_LOD->can_load_hardware_sprites = 1; + //pBitmaps_LOD->SetupPalettes(pRenderer->uTargetRBits, pRenderer->uTargetGBits, pRenderer->uTargetBBits); + pBitmaps_LOD->SetupPalettes(5, 6, 5); + //pIcons_LOD->SetupPalettes(pRenderer->uTargetRBits, pRenderer->uTargetGBits, pRenderer->uTargetBBits); + pIcons_LOD->SetupPalettes(5, 6, 5); + //pPaletteManager->SetColorChannelInfo(pRenderer->uTargetRBits, pRenderer->uTargetGBits, pRenderer->uTargetBBits); + pPaletteManager->SetColorChannelInfo(5, 6, 5); + + pPaletteManager->SetMistColor(128, 128, 128); + pPaletteManager->RecalculateAll(); + //pSprites_LOD->can_load_hardware_sprites = 1; + pObjectList->InitializeSprites(); + pOverlayList->InitializeSprites(); + + if (!bNoSound) + pSoundList->Initialize(); + + + for (uint i = 0; i < 4; ++i) + { + static const char *pUIAnimNames[4] = + { + "glow03", "glow05", + "torchA", "wizeyeA" + }; + static unsigned short _4E98D0[4][4] = + { + { 479, 0, 329, 0 }, + { 585, 0, 332, 0 }, + { 468, 0, 0, 0 }, + { 606, 0, 0, 0 } + }; + + pUIAnims[i]->uIconID = pIconsFrameTable->FindIcon(pUIAnimNames[i]); + pIconsFrameTable->InitializeAnimation(pUIAnims[i]->uIconID); + + pUIAnims[i]->uAnimLength = 0; + pUIAnims[i]->uAnimTime = 0; + pUIAnims[i]->x = _4E98D0[i][0]; + pUIAnims[i]->y = _4E98D0[i][2]; + } + + for (unsigned int i = 0; i < pObjectList->uNumObjects; ++i) + { + pObjectList->pObjects[i].uParticleTrailColor = pObjectList->pObjects[i].uParticleTrailColorB | + ((unsigned int)pObjectList->pObjects[i].uParticleTrailColorG << 8) | + ((unsigned int)pObjectList->pObjects[i].uParticleTrailColorR << 16); + } + + MainMenuUI_Create(); + pGame->pStru6Instance->LoadAnimations(); + + for (uint i = 0; i < 7; ++i) + { + char container_name[64]; + sprintf(container_name, "HDWTR%03u", i); + pRenderer->pHDWaterBitmapIDs[i] = pBitmaps_LOD->LoadTexture(container_name); + } + + pNPCStats = new NPCStats; + memset(pNPCStats->pNPCData, 0, 0x94BCu); + pNPCStats->Initialize(); + + Initialize_GlobalEVT(); + pBitmaps_LOD->_inlined_sub0(); + pSprites_LOD->_inlined_sub0(); + pPaletteManager->LockAll(); + + _mkdir("Saves"); + for (uint i = 0; i < 5; ++i) + for (uint j = 0; j < 6; ++j) + { + sprintf(pTmpBuf.data(), "data\\lloyd%d%d.pcx", i, j); + remove(pTmpBuf.data()); + } + + Initialize_GamesLOD_NewLOD(); + _576E2C_current_minimap_zoom = 512; + dword_576E28 = 9; +} + +bool new_sky = false; //new sky(need texture) +int max_flight_height = 4000; //maximum altitude +bool use_MMT = false; +bool for_refactoring = false; + +//----- (00462C94) -------------------------------------------------------- +bool MM_Main(const wchar_t *pCmdLine) +{ + IntegrityTest(); + + char test[1024]; + sprintfex(test, "^Pi[%s]: знахар^R[ь;ка;]", "Золтан"); + + lua = new LuaVM; + lua->Initialize(); + + bool bNoMargareth = false; + if (pCmdLine && *pCmdLine) + { + //if (wcsstr(pCmdLine, L"-usedefs")) + // bDebugResouces = 1; + if (wcsstr(pCmdLine, L"-window")) + dword_6BE368_debug_settings_2 |= DEBUG_SETTINGS_RUN_IN_WIDOW; + + if (wcsstr(pCmdLine, L"-nointro")) + bNoIntro = true;//dword_6BE364_game_settings_1 |= 4; + if (wcsstr(pCmdLine, L"-nologo")) + bNoLogo = true;//dword_6BE364_game_settings_1 |= 8; + if (wcsstr(pCmdLine, L"-nosound")) + bNoSound = true; //dword_6BE364_game_settings_1 |= 0x10; + + bWalkSound = ReadWindowsRegistryInt("WalkSound", 1) != 0; + if (wcsstr(pCmdLine, L"-nowalksound")) + bWalkSound = false;//dword_6BE364_game_settings_1 |= 0x20; + if (wcsstr(pCmdLine, L"-novideo")) + { + dword_6BE364_game_settings_1 |= GAME_SETTINGS_NO_HOUSE_ANIM; + bNoVideo = true; + } + if (wcsstr(pCmdLine, L"-nocd")) + bNoCD = true; + if (wcsstr(pCmdLine, L"-new_sky")) + new_sky = true; + if (wcsstr(pCmdLine, L"-nomarg")) + bNoMargareth = true; + } + + /*v8 = _4AC1C9_get_cpu_speed(0, (Vec4_int_ *)a2); + Rect.left = *(int *)v8; + Rect.top = *(int *)(v8 + 4); + Rect.right = *(int *)(v8 + 8); + Rect.bottom = *(int *)(v8 + 12); + uCPUSpeed = Rect.bottom;*/ + uCPUSpeed = 2048; // about 2GHz + + //_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF );//Ritor1: for memory test + + if (!MM7_Initialize(640, 480)) + { + Log::Warning(L"MM init: failed"); + pGame->Deinitialize(); + return 1; + } + + pEventTimer->Pause(); + + SetUserInterface(PartyAlignment_Neutral, false); + + ShowLogoVideo(); + //ShowIntroVideo_and_LoadingScreen(); + WriteWindowsRegistryInt("Ran once", 1); + dword_6BE364_game_settings_1 |= GAME_SETTINGS_4000; + pGame->InitializeGammaController(); + SecondaryInitialization(); + pRenderer->SetRasterClipRect(0, 0, window->GetWidth() - 1, window->GetHeight() - 1); + FinalInitialization(); + + //Ritor1: include + if (use_MMT) + MMT_MainMenu_Loop(); + + Log::Warning(L"MM: entering main loop"); + while (1) + { + MainMenuWindow* main_menu_window = MainMenuWindow::Create(); + window->AddControl(main_menu_window); + MainMenu_Loop(); + uGameState = GAME_STATE_PLAYING; + while (1) + { + if (uGameState == GAME_FINISHED || GetCurrentMenuID() == MENU_EXIT_GAME) + { + pGame->Deinitialize(); + return true; + } + + if (GetCurrentMenuID() == MENU_NEWGAME) + { + if (pAudioPlayer->hAILRedbook) + AIL_redbook_stop(pAudioPlayer->hAILRedbook); + pParty->Reset(); + pOtherOverlayList->Reset(); + strcpy(pCurrentMapName, pStartingMapName); + pParty->CreateDefaultParty(0); + PlayerCreationUI_Initialize(); + if (PlayerCreationUI_Loop()) + { + DeleteCCharFont(); + break; + } + DeleteCCharFont(); + bFlashQuestBook = true; + pMediaPlayer->PlayFullscreenMovie(MOVIE_Emerald, true); + SaveNewGame(); + if (bNoMargareth) + _449B7E_toggle_bit(pParty->_quest_bits, PARTY_QUEST_EMERALD_MARGARETH_OFF, 1); + pGame->Loop(); + if (uGameState == GAME_STATE_NEWGAME_OUT_GAMEMENU) + { + SetCurrentMenuID(MENU_NEWGAME); + uGameState = GAME_STATE_PLAYING; + continue; + } + else if (uGameState == GAME_STATE_GAME_QUITTING_TO_MAIN_MENU) + break; + assert(false && "Invalid game state"); + } + if (GetCurrentMenuID() == MENU_CREDITS) + { + if (pAudioPlayer->hAILRedbook) + AIL_redbook_stop(pAudioPlayer->hAILRedbook); + MainMenuUI_Credits_Loop(); + break; + } + if (GetCurrentMenuID() == MENU_5 || GetCurrentMenuID() == MENU_LoadingProcInMainMenu) + { + uGameState = GAME_STATE_PLAYING; + pGame->Loop(); + } + else + { + if (GetCurrentMenuID() == MENU_DebugBLVLevel) + { + pMouse->ChangeActivation(0); + pParty->Reset(); + pParty->CreateDefaultParty(1); + + __debugbreak(); + /*extern void CreateDefaultBLVLevel(); + CreateDefaultBLVLevel(); + + OPENFILENAMEA ofn; + if ( !GetOpenFileNameA((LPOPENFILENAMEA)&ofn) ) + { + pMouse->ChangeActivation(1); + break; + } + _chdir("..\\"); + strcpy(pCurrentMapName, ofn.lpstrFileTitle);*/ + pMouse->ChangeActivation(1); + pGame->Loop(); + } + } + if (uGameState == GAME_STATE_LOADING_GAME) + { + SetCurrentMenuID(MENU_5); + uGameState = GAME_STATE_PLAYING; + continue; + } + if (uGameState == GAME_STATE_NEWGAME_OUT_GAMEMENU) + { + SetCurrentMenuID(MENU_NEWGAME); + uGameState = GAME_STATE_PLAYING; + continue; + } + if (uGameState == GAME_STATE_GAME_QUITTING_TO_MAIN_MENU)// from the loaded game + { + pAudioPlayer->StopChannels(-1, -1); + uGameState = GAME_STATE_PLAYING; + break; + } + } + if (!bNoSound && pAudioPlayer->hAILRedbook) + { + pAudioPlayer->SetMusicVolume(pSoundVolumeLevels[uMusicVolimeMultiplier] * 64.0f); + AIL_redbook_stop(pAudioPlayer->hAILRedbook); + unsigned int startms, end_ms; + AIL_redbook_track_info(pAudioPlayer->hAILRedbook, 14, &startms, &end_ms); + AIL_redbook_play(pAudioPlayer->hAILRedbook, startms + 1, end_ms); + } + } + //lua_close(L); + pGame->Deinitialize(); + return 1; +} + + + +//----- (00466082) -------------------------------------------------------- +void MM6_Initialize(const wchar_t *pIniFilename) +{ + size_t v2; // eax@31 + size_t v3; // ebx@32 + size_t v4; // edi@36 + char pDefaultGroundTexture[16]; // [sp+FCh] [bp-8Ch]@32 + unsigned int v9; // [sp+184h] [bp-4h]@28 + + //_getcwd(v5, 120); + //sprintfex(pIniFilename, "%s\\mm6.ini", v5); + viewparams = new ViewingParams; + game_viewport_x = viewparams->uScreen_topL_X = GetPrivateProfileIntW(L"screen", L"vx1", 8, pIniFilename); + game_viewport_y = viewparams->uScreen_topL_Y = GetPrivateProfileIntW(L"screen", L"vy1", 8, pIniFilename); + game_viewport_z = viewparams->uScreen_BttmR_X = GetPrivateProfileIntW(L"screen", L"vx2", 468, pIniFilename); + game_viewport_w = viewparams->uScreen_BttmR_Y = GetPrivateProfileIntW(L"screen", L"vy2", 351, pIniFilename); + game_viewport_width = game_viewport_z - game_viewport_x; + game_viewport_height = game_viewport_w - game_viewport_y + 1; + + + pAudioPlayer = new AudioPlayer; + pAudioPlayer->uMixerChannels = GetPrivateProfileIntW(L"settings", L"mixerchannels", 16, pIniFilename); + if (pAudioPlayer->uMixerChannels > 16) + pAudioPlayer->uMixerChannels = 16; + + + if (GetPrivateProfileIntW(L"debug", L"nomonster", 0, pIniFilename)) + dword_6BE368_debug_settings_2 |= DEBUG_SETTINGS_NO_ACTORS; + if (ReadWindowsRegistryInt("startinwindow", 0)) + dword_6BE368_debug_settings_2 |= DEBUG_SETTINGS_RUN_IN_WIDOW; + if (GetPrivateProfileIntW(L"debug", L"showFR", 0, pIniFilename)) + dword_6BE368_debug_settings_2 |= DEBUG_SETTINGS_0002_SHOW_FR; + if (GetPrivateProfileIntW(L"debug", L"nodamage", 0, pIniFilename)) + dword_6BE368_debug_settings_2 |= DEBUG_SETTINGS_NO_DAMAGE; + if (GetPrivateProfileIntW(L"debug", L"nodecoration", 0, pIniFilename)) + dword_6BE368_debug_settings_2 |= DEBUG_SETTINGS_NO_DECORATIONS; + + wchar_t pStartingMapNameW[1024]; + GetPrivateProfileStringW(L"file", L"startmap", L"out01.odm", pStartingMapNameW, 0x20u, pIniFilename); + sprintf(pStartingMapName, "%S", pStartingMapNameW); + + v9 = 0; + if (strlen(pStartingMapName)) + { + do + { + if (pStartingMapName[v9] == ' ') + pStartingMapName[v9] = 0; + ++v9; + v2 = strlen(pStartingMapName); + } while (v9 < v2); + } + + pODMRenderParams = new ODMRenderParams; + pODMRenderParams->outdoor_no_mist = GetPrivateProfileIntW(L"debug", L"noMist", 0, pIniFilename); + pODMRenderParams->bNoSky = GetPrivateProfileIntW(L"outdoor", L"nosky", 0, pIniFilename); + pODMRenderParams->bDoNotRenderDecorations = GetPrivateProfileIntW(L"render", L"nodecorations", 0, pIniFilename); + pODMRenderParams->outdoor_no_wavy_water = GetPrivateProfileIntW(L"outdoor", L"nowavywater", 0, pIniFilename); + outdoor_grid_band_1 = GetPrivateProfileIntW(L"outdoor", L"gridband1", 10, pIniFilename); + outdoor_grid_band_2 = GetPrivateProfileIntW(L"outdoor", L"gridband2", 15, pIniFilename); + outdoor_grid_band_3 = GetPrivateProfileIntW(L"outdoor", L"gridband3", 25, pIniFilename); + pODMRenderParams->terrain_gamma = GetPrivateProfileIntW(L"outdoor", L"ter_gamma", 0, pIniFilename); + pODMRenderParams->building_gamme = GetPrivateProfileIntW(L"outdoor", L"bld_gamma", 0, pIniFilename); + pODMRenderParams->shading_dist_shade = GetPrivateProfileIntW(L"shading", L"dist_shade", 2048, pIniFilename); + pODMRenderParams->shading_dist_shademist = GetPrivateProfileIntW(L"shading", L"dist_shademist", 4096, pIniFilename); + + pODMRenderParams->shading_dist_mist = GetPrivateProfileIntW(L"shading", L"dist_mist", 0x2000, pIniFilename);//drawing dist 0x2000 + + wchar_t pDefaultSkyTextureW[1024]; + GetPrivateProfileStringW(L"textures", L"sky", L"plansky1", pDefaultSkyTextureW, 0x10u, pIniFilename); + sprintf(pDefaultSkyTexture.data(), "%S", pDefaultSkyTextureW); + + wchar_t pDefaultGroundTextureW[1024]; + GetPrivateProfileStringW(L"textures", L"default", L"dirt", pDefaultGroundTextureW, 0x10u, pIniFilename); + sprintf(pDefaultGroundTexture, "%S", pDefaultGroundTextureW); + + wchar_t pFloat[1024]; + GetPrivateProfileStringW(L"debug", L"recmod1", L"1.0", pFloat, 0x10u, pIniFilename); + swscanf(pFloat, L"%f", &flt_6BE3A4_debug_recmod1); + + GetPrivateProfileStringW(L"debug", L"recmod2", L"1.0", pFloat, 0x10u, pIniFilename); + swscanf(pFloat, L"%f", &flt_6BE3A8_debug_recmod2); + + flt_6BE3AC_debug_recmod1_x_1_6 = flt_6BE3A4_debug_recmod1 * 1.666666666666667; + + v3 = 0; + if (strlen(pDefaultSkyTexture.data())) + { + do + { + if (pDefaultSkyTexture[v3] == ' ') + pDefaultSkyTexture[v3] = 0; + ++v3; + } while (v3 < strlen(pDefaultSkyTexture.data())); + } + v4 = 0; + if (strlen(pDefaultGroundTexture)) + { + do + { + if (pDefaultGroundTexture[v4] == ' ') + pDefaultGroundTexture[v4] = 0; + ++v4; + } while (v4 < strlen(pDefaultGroundTexture)); + } + + MM7Initialization(); +} + +//----- (004666D5) -------------------------------------------------------- +void MM7Initialization() +{ + if (uCurrentlyLoadedLevelType == LEVEL_Outdoor) + { + /*if (byte_6BE388_graphicsmode == 0) + { + outdoor_grid_band_1 = 10; + outdoor_grid_band_2 = 15; + outdoor_grid_band_3 = 20; + pODMRenderParams->shading_dist_mist = 8192; + pODMRenderParams->bNoSky = false; + LOBYTE(viewparams->field_20) = 0; + }*/ + pODMRenderParams->shading_dist_shade = 2048; + pODMRenderParams->terrain_gamma = 0; + pODMRenderParams->building_gamme = 0; + pODMRenderParams->shading_dist_shademist = 4096; + pODMRenderParams->outdoor_no_wavy_water = 0; + //_47F4D3_initialize_terrain_bezier_stuff(outdoor_grid_band_1, outdoor_grid_band_2, outdoor_grid_band_3); + { + pODMRenderParams->outdoor_grid_band_3 = outdoor_grid_band_3; + pODMRenderParams->uPickDepth = outdoor_grid_band_3 * 512; + } + } + else + LOBYTE(viewparams->field_20) = 0; + pParty->uFlags |= 2; + viewparams->uSomeY = viewparams->uScreen_topL_Y; + viewparams->uSomeX = viewparams->uScreen_topL_X; + viewparams->uSomeZ = viewparams->uScreen_BttmR_X; + viewparams->uSomeW = viewparams->uScreen_BttmR_Y; + + pViewport->SetScreen(viewparams->uScreen_topL_X, viewparams->uScreen_topL_Y, viewparams->uScreen_BttmR_X, viewparams->uScreen_BttmR_Y); + if (uCurrentlyLoadedLevelType == LEVEL_Outdoor) + pODMRenderParams->Initialize(); +} + +//----- (004610AA) -------------------------------------------------------- +void __fastcall PrepareToLoadODM(unsigned int bLoading, ODMRenderParams *a2) +{ + pGameLoadingUI_ProgressBar->Reset(27); + pSoundList->_4A9D79(0); + uCurrentlyLoadedLevelType = LEVEL_Outdoor; + ODM_LoadAndInitialize(pCurrentMapName, a2); + if (!bLoading) + TeleportToStartingPoint(uLevel_StartingPointType); + viewparams->_443365(); + PlayLevelMusic(); +} +// 6BE35C: using guessed type int uLevel_StartingPointType; + + +//----- (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; + + pCurrentScreen = 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 (pCurrentScreen != SCREEN_LOADGAME) + { + pTexture_PCX.Release(); + pTexture_PCX.Load("lsave640.pcx", 0); + pGUIWindow2 = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_MainMenu, 0, 0); + pCurrentScreen = SCREEN_LOADGAME; + LoadUI_Load(0); + } + pWindow = pGUIWindow_CurrentMenu; + } + + while (PeekMessageW(&msg, 0, 0, 0, PM_REMOVE)) + { + if (msg.message == WM_QUIT) + Game_DeinitializeAndTerminate(0); + TranslateMessage(&msg); + DispatchMessageW(&msg); + } + + if (dword_6BE364_game_settings_1 & GAME_SETTINGS_APP_INACTIVE) + { + WaitMessage(); + continue; + } + + pRenderer->BeginScene(); + pRenderer->DrawTextureRGB(0, 0, &pTexture_PCX); + + GUI_MainMenuMessageProc(); + GUI_UpdateWindows(); + + if (GetCurrentMenuID() != MENU_MAIN) + { + if (GetCurrentMenuID() == MENU_LoadingProcInMainMenu) + { + pIcons_LOD->RemoveTexturesPackFromTextureList(); + pGUIWindow_CurrentMenu->Release(); + pGUIWindow_CurrentMenu = 0; + pCurrentScreen = 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(); + } + GUI_MainMenuMessageProc(); + pRenderer->BeginScene(); + GUI_UpdateWindows(); + pRenderer->EndScene(); + pRenderer->Present(); + pTexture_PCX.Release(); + if (pGUIWindow2) + { + pGUIWindow2->Release(); + pGUIWindow2 = 0; + } + pWindow_MainMenu->Release(); + pIcons_LOD->RemoveTexturesPackFromTextureList(); +} + +//----- (004BF91E) -------------------------------------------------------- +unsigned int GameOverMenu(void *ecx0) +{ + const char *v1; // eax@2 + unsigned int result; // eax@3 + const char *v6; // eax@10 + const char *v7; // edx@10 + const char *v8; // ecx@12 + const char *v9; // eax@14 + unsigned int v10; // eax@25 + GUIWindow pWindow; // [sp+34h] [bp-9Ch]@1 + unsigned int v14; // [sp+A4h] [bp-2Ch]@5 + void *v15; // [sp+A8h] [bp-28h]@1 + const char *pInString; // [sp+ACh] [bp-24h]@5 + unsigned int v17; // [sp+B0h] [bp-20h]@5 + unsigned int v18; // [sp+B4h] [bp-1Ch]@5 + unsigned int v19; // [sp+B8h] [bp-18h]@5 + int v20; // [sp+BCh] [bp-14h]@7 + GUIFont *pFont; // [sp+C4h] [bp-Ch]@1 + unsigned __int64 v23; // [sp+C8h] [bp-8h]@5 + MSG msg; + + v15 = ecx0; + + RGBTexture _this; // [sp+Ch] [bp-C4h]@1 + //RGBTexture::RGBTexture(&this); + + dword_6BE364_game_settings_1 &= ~GAME_SETTINGS_4000; + bGameoverLoop = 1; + pMediaPlayer->bStopBeforeSchedule = 0; + pAudioPlayer->StopChannels(-1, -1); + pRenderer->BeginScene(); + pRenderer->ClearBlack(); + pRenderer->EndScene(); + pRenderer->Present(); + //pMediaPlayer->pResetflag = 0; + _449B57_test_bit(pParty->_quest_bits, 99); + _this.Load("winbg.pcx", 2); + pRenderer->BeginScene(); + pRenderer->DrawTextureRGB(0, 0, &_this); + pRenderer->EndScene(); + free(_this.pPixels); + _this.pPixels = 0; + window_SpeakInHouse = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_MainMenu, 0, 0); + pWindow.uFrameX = 75; + pWindow.uFrameY = 60; + pWindow.uFrameWidth = 469; + pWindow.uFrameHeight = 338; + pWindow.uFrameZ = 543; + pWindow.uFrameW = 397; + pFont = LoadFont("endgame.fnt", "FONTPAL", NULL); + if (pParty->IsPartyGood()) + v1 = pGlobalTXT_LocalizationStrings[675];//"Splendid job! With the activation of the Gate, a thousand worlds lie at your feet. Perhaps on one of them you will find the Ancients themselves, and return with the fruits their great civilization has to offer your world and your kingdom." + else + { + result = pParty->IsPartyEvil(); + if (!(short)result) + return result; + v1 = pGlobalTXT_LocalizationStrings[676];//"Brilliant! The completion of the Heavenly Forge has provided enough Ancient weapons to crush all resistance to your plans. Soon the world will bow to your every whim! Still, you can't help but wonder what was beyond the Gate the other side was trying so hard to build." + } + pInString = v1; + v23 = pParty->uTimePlayed - 138240; + v19 = (unsigned int)((signed __int64)((double)(pParty->uTimePlayed - 138240) * 0.234375) / 60 / 60) / 24; + v14 = (unsigned int)((signed __int64)((double)(pParty->uTimePlayed - 138240) * 0.234375) / 60 / 60) / 24 / 0x1C / 0xC; + v18 = (unsigned int)((signed __int64)((double)(pParty->uTimePlayed - 138240) * 0.234375) / 60 / 60) / 24 / 0x1C % 0xC; + v17 = v19 % 0x1C; + if (!v19) + v19 = 1; + pRenderer->BeginScene(); + pWindow.DrawTitleText(pFont, 1, 0x23, 1, pGlobalTXT_LocalizationStrings[9], 3);//Congratulations! + v23 = 0i64; + v20 = 0; + for (uint i = 0; i < 4; i++) + { + sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[129], pParty->pPlayers[i].pName, pParty->pPlayers[i].GetBaseLevel(), pClassNames[pParty->pPlayers[i].classType]);//%s the Level %u %s + pWindow.DrawTitleText(pFont, 1, i * (LOBYTE(pFont->uFontHeight) - 2) + LOBYTE(pFont->uFontHeight) + 46, 1, pTmpBuf.data(), 3); + v23 += pParty->pPlayers[i].uExperience;//__PAIR__(*(int *)(i - 4), *(int *)(i - 8)); + } + v23 = (signed __int64)v23 / v19; + v6 = FitTextInAWindow(pInString, pFont, &pWindow, 0xC, 0); + pWindow.DrawTitleText(pFont, 1, 5 * (LOBYTE(pFont->uFontHeight) + 11), 1, v6, 0); + strcpy(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[37]);//Total Time: + + v7 = pGlobalTXT_LocalizationStrings[56]; + if (v17 != 1) + v7 = pGlobalTXT_LocalizationStrings[57]; + + v8 = pGlobalTXT_LocalizationStrings[146];//Month + if (v18 != 1) + v8 = pGlobalTXT_LocalizationStrings[148];//Months + + v9 = pGlobalTXT_LocalizationStrings[245]; + if (v14 != 1) + v9 = pGlobalTXT_LocalizationStrings[132]; + + sprintf(pTmpBuf2.data(), " %lu %s, %lu %s, %lu %s ", v14, v9, v18, v8, v17, v7); + strcat(pTmpBuf.data(), pTmpBuf2.data()); + pWindow.DrawTitleText(pFont, 1, pWindow.uFrameHeight - 2 * LOBYTE(pFont->uFontHeight) - 5, 1, pTmpBuf.data(), 3); + sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[94], v23); + pWindow.DrawTitleText(pFont, 1, pWindow.uFrameHeight, 1, pTmpBuf.data(), 3); + dword_6BE364_game_settings_1 |= GAME_SETTINGS_4000; + pRenderer->EndScene(); + pRenderer->Present(); + //if ( pRenderer->pRenderD3D ) + pRenderer->pBeforePresentFunction(); + pRenderer->SaveWinnersCertificate("MM7_Win.Pcx"); + free(pFont); + window_SpeakInHouse->Release(); + window_SpeakInHouse = 0; + if (v15 == (void *)2) + result = pMessageQueue_50CBD0->uNumMessages; + else + { + LODWORD(v23) = GetTickCount() + 5000; + while ((unsigned int)v23 > GetTickCount()) + ; + while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) + { + if (msg.message == WM_QUIT) + Game_DeinitializeAndTerminate(0); + TranslateMessage(&msg); + DispatchMessage(&msg); + } + if (pMessageQueue_50CBD0->uNumMessages) + { + LOBYTE(v10) = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + pMessageQueue_50CBD0->uNumMessages = v10; + } + pKeyActionMap->ResetKeys(); + pKeyActionMap->uLastKeyPressed = 0; + do + { + while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) + { + if (msg.message == WM_QUIT) + Game_DeinitializeAndTerminate(0); + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } while (!pKeyActionMap->uLastKeyPressed); + result = pMessageQueue_50CBD0->uNumMessages; + if (pMessageQueue_50CBD0->uNumMessages) + { + result = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; + } + } + if (v15) + { + /*if ( (signed int)result < 40 ) + { + pMessageQueue_50CBD0->pMessages[result].eType = UIMSG_Quit; + }*/ + pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Quit, 1, 0); + } + else + { + pMessageQueue_50CBD0->AddGUIMessage(UIMSG_ShowFinalWindow, 1, 0); + /*if ( (signed int)result < 40 ) + { + pMessageQueue_50CBD0->pMessages[result].eType = UIMSG_C5; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1; + result = 3 * pMessageQueue_50CBD0->uNumMessages + 3; + *(&pMessageQueue_50CBD0->uNumMessages + result) = 0; + ++pMessageQueue_50CBD0->uNumMessages; + }*/ + } + bGameoverLoop = 0; + return result; +} + +//----- (00464479) -------------------------------------------------------- +void ResetCursor_Palettes_LODs_Level_Audio_SFT_Windows() +{ + int v0; // esi@9 + + if (pMouse) + pMouse->SetCursorBitmap("MICON1"); + + pPaletteManager->ResetNonLocked(); + pBitmaps_LOD->ReleaseAll2(); + pSprites_LOD->DeleteSomeOtherSprites(); + pIcons_LOD->ReleaseAll2(); + + if (uCurrentlyLoadedLevelType == LEVEL_Indoor) + pIndoor->Release(); + else if (uCurrentlyLoadedLevelType == LEVEL_Outdoor) + pOutdoor->Release(); + + pAudioPlayer->StopChannels(-1, -1); + pSoundList->_4A9D79(0); + uCurrentlyLoadedLevelType = LEVEL_null; + pSpriteFrameTable->ResetSomeSpriteFlags(); + v0 = uNumVisibleWindows; + pParty->armageddon_timer = 0; + while (v0 > 0) + pWindowList[pVisibleWindowsIdxs[v0--] - 1].Release(); +} + +//----- (00461103) -------------------------------------------------------- +void _461103_load_level_sub() +{ + int v4; // edx@8 + signed int v6; // esi@14 + signed int v8; // ecx@16 + int v12; // esi@25 + int v13; // eax@26 + __int16 v14; // ax@41 + signed int v17; // [sp+14h] [bp-48h]@3 + signed int v18; // [sp+14h] [bp-48h]@23 + int v19; // [sp+18h] [bp-44h]@1 + signed int v20; // [sp+18h] [bp-44h]@14 + int v21[16]; // [sp+1Ch] [bp-40h]@17 + + GenerateItemsInChest(); + pGameLoadingUI_ProgressBar->Progress(); + pParty->uFlags |= 2; + pParty->field_7B5_in_arena_quest = 0; + dword_5C6DF8 = 1; + pNPCStats->uNewlNPCBufPos = 0; + v19 = pMapStats->GetMapInfo(pCurrentMapName); + + //v15 = 0; + for (uint i = 0; i < uNumActors; ++i) + //if ( (signed int)uNumActors > 0 ) + { + //Actor* pActor = &pActors[i]; + //v2 = (char *)&pActors[0].uNPC_ID; + //do + //{ + //v3 = pActors[i].pMonsterInfo.uID; + v17 = 0; + if (pActors[i].pMonsterInfo.uID >= 115 && pActors[i].pMonsterInfo.uID <= 186 + || pActors[i].pMonsterInfo.uID >= 232 && pActors[i].pMonsterInfo.uID <= 249) + v17 = 1; + //v1 = 0; + v4 = (pActors[i].pMonsterInfo.uID - 1) % 3; + if (2 == v4) + { + if (pActors[i].sNPC_ID && pActors[i].sNPC_ID < 5000) + continue; + } + else + { + if (v4 != 1) + { + if (v4 == 0 && pActors[i].sNPC_ID == 0) + pActors[i].sNPC_ID = 0; + continue; + } + } + if (pActors[i].sNPC_ID > 0 && pActors[i].sNPC_ID < 5000) + continue; + if (v17) + { + pNPCStats->InitializeAdditionalNPCs(&pNPCStats->pAdditionalNPC[pNPCStats->uNewlNPCBufPos], pActors[i].pMonsterInfo.uID, 0, v19); + v14 = LOWORD(pNPCStats->uNewlNPCBufPos) + 5000; + ++pNPCStats->uNewlNPCBufPos; + pActors[i].sNPC_ID = v14; + continue; + } + pActors[i].sNPC_ID = 0; + //++v15; + //v2 += 836; + //} + //while ( v15 < (signed int)uNumActors ); + } + + pGameLoadingUI_ProgressBar->Progress(); + + //v5 = uNumActors; + v6 = 0; + v20 = 0; + //v16 = v1; + + for (uint i = 0; i < uNumActors; ++i) + { + //v7 = (char *)&pActors[0].pMonsterInfo; + //do + //{ + for (v8 = 0; v8 < v6; ++v8) + { + if (v21[v8] == pActors[i].pMonsterInfo.uID - 1) + break; + } + + if (v8 == v6) + { + v21[v6++] = pActors[i].pMonsterInfo.uID - 1; + v20 = v6; + if (v6 == 16) + break; + } + //++v16; + //v7 += 836; + //} + //while ( v16 < (signed int)v5 ); + } + + pGameLoadingUI_ProgressBar->Progress(); + + for (int _v0 = 0; _v0 < v6; ++_v0) + { + for (v18 = 4; v18; --v18) + pSoundList->LoadSound(pMonsterList->pMonsters[v21[_v0]].pSoundSampleIDs[4 - v18], 0); + v12 = 0; + do + v13 = pSoundList->LoadSound(v12++ + word_4EE088_sound_ids[pMonsterStats->pInfos[v21[_v0] + 1].uSpell1ID], 1); + while (v13); + } + //v0 = pGameLoadingUI_ProgressBar; + //v1 = 0; + + pGameLoadingUI_ProgressBar->Progress(); + + if (dword_6BE368_debug_settings_2 & DEBUG_SETTINGS_NO_ACTORS) + uNumActors = 0; + if (dword_6BE368_debug_settings_2 & DEBUG_SETTINGS_NO_DECORATIONS) + uNumLevelDecorations = 0; + init_event_triggers(); + + pGameLoadingUI_ProgressBar->Progress(); + + pGame->pIndoorCameraD3D->vPartyPos.x = 0; + pGame->pIndoorCameraD3D->vPartyPos.y = 0; + pGame->pIndoorCameraD3D->vPartyPos.z = 100; + pGame->pIndoorCameraD3D->sRotationX = 0; + pGame->pIndoorCameraD3D->sRotationY = 0; + viewparams->bRedrawGameUI = true; + uLevel_StartingPointType = MapStartPoint_Party; + pSprites_LOD->_461397(); + pPaletteManager->LockTestAll(); + if (pParty->pPickedItem.uItemID != 0) + pMouse->SetCursorBitmapFromItemID(pParty->pPickedItem.uItemID); +} + +//----- (0042F3D6) -------------------------------------------------------- +void InitializeTurnBasedAnimations(void *_this) +{ + for (unsigned int i = 0; i < pIconIDs_Turn.size(); ++i) + { + char icon_name[32]; + sprintf(icon_name, "turn%u", i); + pIconIDs_Turn[i] = pIconsFrameTable->FindIcon(icon_name); + pIconsFrameTable->InitializeAnimation(pIconIDs_Turn[i]); + } + + uIconID_TurnStop = pIconsFrameTable->FindIcon("turnstop"); + uIconID_TurnHour = pIconsFrameTable->FindIcon("turnhour"); + uIconID_TurnStart = pIconsFrameTable->FindIcon("turnstart"); + uIconID_CharacterFrame = pIconsFrameTable->FindIcon("aframe1"); + uSpriteID_Spell11 = pSpriteFrameTable->FastFindSprite("spell11"); + + pIconsFrameTable->InitializeAnimation(uIconID_TurnHour); + pIconsFrameTable->InitializeAnimation(uIconID_TurnStop); + pIconsFrameTable->InitializeAnimation(uIconID_TurnStart); + pIconsFrameTable->InitializeAnimation(uIconID_CharacterFrame); +} + +//----- (00466C40) -------------------------------------------------------- +const wchar_t *MENU_STATE_to_string(MENU_STATE m) +{ + switch (m) + { + case -1: return L"-1"; + case MENU_MAIN: return L"MENU_MAIN"; + case MENU_NEWGAME: return L"MENU_NEWGAME"; + case MENU_CREDITS: return L"MENU_CREDITS"; + case MENU_SAVELOAD: return L"MENU_SAVELOAD"; + case MENU_EXIT_GAME: return L"MENU_EXIT_GAME"; + case MENU_5: return L"MENU_5"; + case MENU_CREATEPARTY: return L"MENU_CREATEPARTY"; + case MENU_NAMEPANELESC: return L"MENU_NAMEPANELESC"; + case MENU_CREDITSPROC: return L"MENU_CREDITSPROC"; + case MENU_LoadingProcInMainMenu: return L"MENU_LoadingProcInMainMenu"; + case MENU_DebugBLVLevel: return L"MENU_DebugBLVLevel"; + case MENU_CREDITSCLOSE: return L"MENU_CREDITSCLOSE"; + case MENU_MMT_MAIN_MENU: return L"MENU_MMT_MAIN_MENU"; + default: return L"unk"; + }; +}; +void SetCurrentMenuID(MENU_STATE uMenu) +{ + sCurrentMenuID = uMenu; + + Log::Warning(L"CurrentMenu = %s \n", MENU_STATE_to_string(uMenu)); +} + +//----- (00466CA0) -------------------------------------------------------- +MENU_STATE GetCurrentMenuID() +{ + return sCurrentMenuID; +} + +//----- (0046BDA8) -------------------------------------------------------- +unsigned int GetGravityStrength() +{ + int v0; // eax@1 + + v0 = ~LOBYTE(pGame->uFlags2) & 8; + LOBYTE(v0) = v0 | 2; + return (unsigned int)v0 >> 1; +} + +//----- (00448B45) -------------------------------------------------------- +void GameUI_StatusBar_UpdateTimedString(unsigned int bForceHide) +{ + if (bForceHide || GameUI_Footer_TimeLeft && GetTickCount() >= GameUI_Footer_TimeLeft) + GameUI_Footer_TimeLeft = 0; +} + +//----- (0044861E) -------------------------------------------------------- +void __fastcall sub_44861E_set_texture(unsigned int uFaceCog, const char *pFilename) +{ + unsigned int texture; // eax@2 + + if (uFaceCog) + { + texture = pBitmaps_LOD->LoadTexture(pFilename); + if (texture != -1 ? (int)&pBitmaps_LOD->pTextures[texture] : 0) + { + pBitmaps_LOD->pTextures[texture].palette_id2 = pPaletteManager->LoadPalette(pBitmaps_LOD->pTextures[texture].palette_id1); + + if (uCurrentlyLoadedLevelType == 1) + { + if ((signed int)pIndoor->uNumFaceExtras > 1) + { + for (uint i = 1; i < (signed int)pIndoor->uNumFaceExtras; ++i) + { + if (pIndoor->pFaceExtras[i].sCogNumber == uFaceCog) + { + if (pIndoor->pFaces[pIndoor->pFaceExtras[i].field_C].uAttributes & FACE_TEXTURE_FRAME) + { + pIndoor->pFaces[pIndoor->pFaceExtras[i].field_C].uBitmapID = pTextureFrameTable->FindTextureByName(pFilename); + if (pIndoor->pFaces[pIndoor->pFaceExtras[i].field_C].uBitmapID) + { + pTextureFrameTable->LoadAnimationSequenceAndPalettes(pIndoor->pFaces[pIndoor->pFaceExtras[i].field_C].uBitmapID); + } + else + { + pIndoor->pFaces[pIndoor->pFaceExtras[i].field_C].uBitmapID = texture; + pIndoor->pFaces[pIndoor->pFaceExtras[i].field_C].uAttributes &= 0xFFFFBFFF; + } + } + else + { + pIndoor->pFaces[pIndoor->pFaceExtras[i].field_C].uBitmapID = texture; + } + } + } + } + pParty->uFlags |= 2; + } + else + { + for (uint j = 0; j < (unsigned int)pOutdoor->uNumBModels; ++j) + { + for (uint i = 0; i < pOutdoor->pBModels[j].uNumFaces; ++i) + { + if (pOutdoor->pBModels[j].pFaces[i].sCogNumber == uFaceCog) + { + if (pOutdoor->pBModels[j].pFaces[i].uAttributes & FACE_TEXTURE_FRAME) + { + pOutdoor->pBModels[j].pFaces[i].uTextureID = pTextureFrameTable->FindTextureByName(pFilename); + if (pOutdoor->pBModels[j].pFaces[i].uTextureID) + pTextureFrameTable->LoadAnimationSequenceAndPalettes(pOutdoor->pBModels[j].pFaces[i].uTextureID); + else + { + pOutdoor->pBModels[j].pFaces[i].uTextureID = texture; + pOutdoor->pBModels[j].pFaces[i].uAttributes &= 0xFFFFBFFF; + } + } + else + pOutdoor->pBModels[j].pFaces[i].uTextureID = texture; + } + } + } + } + pParty->uFlags |= 2; + } + } +} + +//----- (0044892E) -------------------------------------------------------- +void __fastcall sub_44892E_set_faces_bit(int sCogNumber, int bit, int on) +{ + if (sCogNumber) + { + if (uCurrentlyLoadedLevelType == 1) + { + for (uint i = 1; i < (unsigned int)pIndoor->uNumFaceExtras; ++i) + { + if (pIndoor->pFaceExtras[i].sCogNumber == sCogNumber) + { + if (on) + pIndoor->pFaces[pIndoor->pFaceExtras[i].field_C].uAttributes |= bit; + else + pIndoor->pFaces[pIndoor->pFaceExtras[i].field_C].uAttributes &= ~bit; + } + } + pParty->uFlags |= 2; + } + else + { + for (uint j = 0; j < (unsigned int)pOutdoor->uNumBModels; ++j) + { + for (uint i = 0; i < (unsigned int)pOutdoor->pBModels[j].uNumFaces; ++i) + { + if (pOutdoor->pBModels[j].pFaces[i].sCogNumber == sCogNumber) + { + if (on) + pOutdoor->pBModels[j].pFaces[i].uAttributes |= bit; + else + pOutdoor->pBModels[j].pFaces[i].uAttributes &= ~bit; + } + } + } + } + pParty->uFlags |= 2; + } +} + +//----- (0044882F) -------------------------------------------------------- +void __fastcall SetDecorationSprite(uint16_t uCog, bool bHide, const char *pFileName) +{ + for (size_t i = 0; i < uNumLevelDecorations; i++) + { + if (pLevelDecorations[i].uCog == uCog) + { + if (pFileName && strcmp(pFileName, "0")) + { + pLevelDecorations[i].uDecorationDescID = pDecorationList->GetDecorIdByName(pFileName); + pDecorationList->InitializeDecorationSprite(pLevelDecorations[i].uDecorationDescID); + } + + if (bHide) + pLevelDecorations[i].uFlags &= ~LEVEL_DECORATION_INVISIBLE; + else + pLevelDecorations[i].uFlags |= LEVEL_DECORATION_INVISIBLE; + + pParty->uFlags |= 2; + } + } +} + +//----- (004356FF) -------------------------------------------------------- +void back_to_game() +{ + dword_507BF0_is_there_popup_onscreen = 0; + dword_4E455C = 1; + + extern int no_rightlick_in_inventory; + no_rightlick_in_inventory = false; + + if (pGUIWindow_ScrollWindow) + free_book_subwindow(); + if (!pCurrentScreen && !pGUIWindow_Settings) + pEventTimer->Resume(); + viewparams->bRedrawGameUI = 1; +} + +//----- (00494035) -------------------------------------------------------- +void _494035_timed_effects__water_walking_damage__etc() +{ + signed __int64 v0; // qax@1 + unsigned int v4; // edi@1 + // signed int v12; // edi@29 + int v24; // ecx@60 + int v26; // ecx@64 + int v28; // ecx@68 + int v30; // ecx@72 + int v32; // ecx@76 + int v34; // ecx@80 + int v36; // ecx@84 + int v38; // ecx@88 + int v40; // ecx@92 + int v42; // ecx@96 + bool v43; // ebx@102 + bool v46; // edi@111 + // unsigned int v56; // [sp-8h] [bp-38h]@55 + // int v59; // [sp-4h] [bp-34h]@55 + // unsigned int v61; // [sp+14h] [bp-1Ch]@1 + signed int a2a; // [sp+18h] [bp-18h]@47 + signed int old_day; // [sp+1Ch] [bp-14h]@47 + signed int old_hour; + + old_day = pParty->uDaysPlayed; + old_hour = pParty->uCurrentHour; + //auto prev_time = pEventTimer->uTimeElapsed; + pParty->uTimePlayed += pEventTimer->uTimeElapsed; + v0 = ((signed __int64)(pParty->uTimePlayed * 0.234375) / 60) / 60i64; + v4 = (unsigned int)(((unsigned int)v0 / 24) / 7) >> 2; + pParty->uCurrentTimeSecond = (signed __int64)((double)(signed __int64)pParty->uTimePlayed * 0.234375) % 60; + pParty->uCurrentMinute = ((signed __int64)(pParty->uTimePlayed * 0.234375) / 60) % 60; + pParty->uCurrentHour = v0 % 24; + pParty->uCurrentMonthWeek = ((unsigned int)v0 / 24) / 7 & 3; + pParty->uDaysPlayed = (unsigned int)((unsigned int)v0 / 24) % 28; + pParty->uCurrentMonth = v4 % 12; + pParty->uCurrentYear = v4 / 0xC + game_starting_year; + if (pParty->uCurrentHour >= 3 && (old_hour < 3 || pParty->uDaysPlayed > old_day)) // new day dawns + { + pParty->pHirelings[0].bHasUsedTheAbility = false; + pParty->pHirelings[1].bHasUsedTheAbility = false; + + for (uint i = 0; i < pNPCStats->uNumNewNPCs; ++i) + pNPCStats->pNewNPCData[i].bHasUsedTheAbility = false; + + ++pParty->days_played_without_rest; + if (pParty->days_played_without_rest > 1) + { + for (uint i = 0; i < 4; ++i) + pParty->pPlayers[i].SetCondWeakWithBlockCheck(0); + + if (pParty->uNumFoodRations) + Party::TakeFood(1); + else + for (uint i = 0; i < 4; ++i) + pParty->pPlayers[i].sHealth = pParty->pPlayers[i].sHealth / (pParty->days_played_without_rest + 1) + 1; + + if (pParty->days_played_without_rest > 3) + for (uint i = 0; i < 4; ++i) + { + pParty->pPlayers[i].Zero(); + if (!pParty->pPlayers[i].IsPertified() && !pParty->pPlayers[i].IsEradicated() + && !pParty->pPlayers[i].IsDead()) + { + if (rand() % 100 < 5 * pParty->days_played_without_rest) + pParty->pPlayers[i].SetCondDeadWithBlockCheck(0); + if (rand() % 100 < 10 * pParty->days_played_without_rest) + pParty->pPlayers[i].SetCondInsaneWithBlockCheck(0); + } + } + } + if (uCurrentlyLoadedLevelType == LEVEL_Outdoor) + pOutdoor->SetFog(); + + for (uint i = 0; i < 4; ++i) + pParty->pPlayers[i].uNumDivineInterventionCastsThisDay = 0; + } + + if (pParty->uFlags & 4 && pParty->field_6FC < (signed __int64)pParty->uTimePlayed)//water damage + { + pParty->field_6FC = (signed __int64)pParty->uTimePlayed + 128; + viewparams->bRedrawGameUI = true; + for (uint pl = 1; pl <= 4; ++pl) + { + if (pPlayers[pl]->WearsItem(ITEM_RELIC_HARECS_LEATHER, EQUIP_ARMOUR) + || pPlayers[pl]->HasEnchantedItemEquipped(71) + || pPlayers[pl]->pPlayerBuffs[PLAYER_BUFF_WATER_WALK].uExpireTime > 0) + pPlayers[pl]->PlayEmotion(CHARACTER_EXPRESSION_37, 0); + else + { + if (!pPlayers[pl]->HasUnderwaterSuitEquipped()) + { + pPlayers[pl]->ReceiveDamage((signed __int64)pPlayers[pl]->GetMaxHealth() * 0.1, DMGT_FIRE); + if (pParty->uFlags & 4) + { + strcpy(GameUI_Footer_TimedString.data(), pGlobalTXT_LocalizationStrings[660]);// Вы тонете! + GameUI_Footer_TimeLeft = 128; + } + } + else + pPlayers[pl]->PlayEmotion(CHARACTER_EXPRESSION_37, 0); + } + } + } + if (pParty->uFlags & 0x200 && pParty->field_6FC < (signed __int64)pParty->uTimePlayed) //lava damage + { + viewparams->bRedrawGameUI = true; + pParty->field_6FC = (signed __int64)pParty->uTimePlayed + 128; + + for (uint pl = 1; pl <= 4; pl++) + { + pPlayers[pl]->ReceiveDamage((signed __int64)pPlayers[pl]->GetMaxHealth() * 0.1, DMGT_FIRE); + if (pParty->uFlags & 0x200) + { + strcpy(GameUI_Footer_TimedString.data(), pGlobalTXT_LocalizationStrings[661]); //Вы горите! + GameUI_Footer_TimeLeft = 128; + } + } + } + _493938_regenerate(); + uint party_condition_flag = 4; + a2a = pEventTimer->uTimeElapsed; + if (pParty->uFlags2 & PARTY_FLAGS_2_RUNNING)//замедление восстановления при беге + { + a2a *= 0.5f; + if (a2a < 1) + a2a = 1; + } + + for (uint pl = 1; pl <= 4; pl++) + { + if (pPlayers[pl]->uTimeToRecovery) + pPlayers[pl]->Recover(a2a);//восстановление активности + if (pPlayers[pl]->GetItemsBonus(CHARACTER_ATTRIBUTE_ENDURANCE) + pPlayers[pl]->sHealth + pPlayers[pl]->uEndurance >= 1 + || (signed __int64)pPlayers[pl]->pPlayerBuffs[PLAYER_BUFF_PRESERVATION].uExpireTime > 0) + { + if (pPlayers[pl]->sHealth < 1) + pPlayers[pl]->SetCondition(Condition_Unconcious, 0); + } + else + pPlayers[pl]->SetCondition(Condition_Dead, 0); + if (pPlayers[pl]->field_E0) + { + v24 = pPlayers[pl]->field_E0 - pEventTimer->uTimeElapsed; + if (v24 > 0) + pPlayers[pl]->field_E0 = v24; + else + { + pPlayers[pl]->field_E0 = 0; + viewparams->bRedrawGameUI = true; + } + } + if (pPlayers[pl]->field_E4) + { + v26 = pPlayers[pl]->field_E4 - pEventTimer->uTimeElapsed; + if (v26 > 0) + pPlayers[pl]->field_E4 = v26; + else + { + pPlayers[pl]->field_E4 = 0; + viewparams->bRedrawGameUI = true; + } + } + if (pPlayers[pl]->field_E8) + { + v28 = pPlayers[pl]->field_E8 - pEventTimer->uTimeElapsed; + if (v28 > 0) + pPlayers[pl]->field_E8 = v28; + else + { + pPlayers[pl]->field_E8 = 0; + viewparams->bRedrawGameUI = true; + } + } + if (pPlayers[pl]->field_EC) + { + v30 = pPlayers[pl]->field_EC - pEventTimer->uTimeElapsed; + if (v30 > 0) + pPlayers[pl]->field_EC = v30; + else + { + pPlayers[pl]->field_EC = 0; + viewparams->bRedrawGameUI = true; + } + } + if (pPlayers[pl]->field_F0) + { + v32 = pPlayers[pl]->field_F0 - pEventTimer->uTimeElapsed; + if (v32 > 0) + pPlayers[pl]->field_F0 = v32; + else + { + pPlayers[pl]->field_F0 = 0; + viewparams->bRedrawGameUI = true; + } + } + if (pPlayers[pl]->field_F4) + { + v34 = pPlayers[pl]->field_F4 - pEventTimer->uTimeElapsed; + if (v34 > 0) + pPlayers[pl]->field_F4 = v34; + else + { + pPlayers[pl]->field_F4 = 0; + viewparams->bRedrawGameUI = true; + } + } + if (pPlayers[pl]->field_F8) + { + v36 = pPlayers[pl]->field_F8 - pEventTimer->uTimeElapsed; + if (v36 > 0) + pPlayers[pl]->field_F8 = v36; + else + { + pPlayers[pl]->field_F8 = 0; + viewparams->bRedrawGameUI = true; + } + } + if (pPlayers[pl]->field_FC) + { + v38 = pPlayers[pl]->field_FC - pEventTimer->uTimeElapsed; + if (v38 > 0) + pPlayers[pl]->field_FC = v38; + else + { + pPlayers[pl]->field_FC = 0; + viewparams->bRedrawGameUI = true; + } + } + if (pPlayers[pl]->field_100) + { + v40 = pPlayers[pl]->field_100 - pEventTimer->uTimeElapsed; + if (v40 > 0) + pPlayers[pl]->field_100 = v40; + else + { + pPlayers[pl]->field_100 = 0; + viewparams->bRedrawGameUI = true; + } + } + if (pPlayers[pl]->field_104) + { + v42 = pPlayers[pl]->field_104 - pEventTimer->uTimeElapsed; + if (v42 > 0) + pPlayers[pl]->field_104 = v42; + else + { + pPlayers[pl]->field_104 = 0; + viewparams->bRedrawGameUI = true; + } + } + if (pPlayers[pl]->pConditions[Condition_Sleep] | pPlayers[pl]->pConditions[Condition_Paralyzed] + | pPlayers[pl]->pConditions[Condition_Unconcious] | pPlayers[pl]->pConditions[Condition_Dead] + | pPlayers[pl]->pConditions[Condition_Pertified] | pPlayers[pl]->pConditions[Condition_Eradicated]) + --party_condition_flag; + v43 = (signed __int64)pPlayers[pl]->pPlayerBuffs[PLAYER_BUFF_HASTE].uExpireTime > 0; //спешка + + for (uint k = 0; k < 24; ++k) + pPlayers[pl]->pPlayerBuffs[k].IsBuffExpiredToTime(pParty->uTimePlayed); + + if (v43 && (signed __int64)pPlayers[pl]->pPlayerBuffs[7].uExpireTime <= 0) + pPlayers[pl]->SetCondition(Condition_Weak, 0); + } + + v46 = (signed __int64)pParty->pPartyBuffs[PARTY_BUFF_HASTE].uExpireTime > 0; + + for (uint i = 0; i < 20; ++i) + { + if (pParty->pPartyBuffs[i].IsBuffExpiredToTime(pParty->uTimePlayed) == 1) + viewparams->bRedrawGameUI = true; + } + + if (v46 && (signed __int64)pParty->pPartyBuffs[PARTY_BUFF_HASTE].uExpireTime <= 0) + { + for (uint i = 0; i < 4; ++i) + pParty->pPlayers[i].SetCondition(1, 0); + } + + for (uint i = 0; i < 2; ++i)//Проверка в сознании ли перс сделавший закл на полёт и хождение по воде + { + SpellBuff* pBuf = &pParty->pPartyBuffs[Party_Spec_Motion_status_ids[i]]; + if (pBuf->uExpireTime == 0) + continue; + + if (!(pBuf->uFlags & 1)) + { + if (!pPlayers[pBuf->uCaster]->CanAct()) + { + pBuf->Reset(); + if (Party_Spec_Motion_status_ids[i] == PARTY_BUFF_FLY) + pParty->bFlying = false; + } + } + } + + if (!party_condition_flag) + { + if (pCurrentScreen != SCREEN_REST) + { + for (uint pl = 1; pl <= 4; pl++) + { + if (pPlayers[pl]->pConditions[Condition_Sleep]) + { + pPlayers[pl]->pConditions[Condition_Sleep] = 0; + party_condition_flag = 1; + break; + } + } + if (!party_condition_flag || _5C35C0_force_party_death) + uGameState = GAME_STATE_PARTY_DIED; + } + } + + if (uActiveCharacter)//выбор следующего после пропускающего ход + { + if (pCurrentScreen != SCREEN_REST) + { + if (pPlayers[uActiveCharacter]->pConditions[Condition_Sleep] + || pPlayers[uActiveCharacter]->pConditions[Condition_Paralyzed] + || pPlayers[uActiveCharacter]->pConditions[Condition_Unconcious] + || pPlayers[uActiveCharacter]->pConditions[Condition_Dead] + || pPlayers[uActiveCharacter]->pConditions[Condition_Pertified] + || pPlayers[uActiveCharacter]->pConditions[Condition_Eradicated]) + { + viewparams->bRedrawGameUI = true; + uActiveCharacter = pParty->GetNextActiveCharacter(); + } + } + } +} + +//----- (00493938) -------------------------------------------------------- +void _493938_regenerate() +{ + int current_time; // edi@1 + int last_reg_time; // qax@1 + int v4; // eax@2 + int v5; // edi@5 + long long *v6; // ecx@5 + char v7; // sf@5 + int *v8; // ecx@10 + int v9; // edi@15 + signed int v10; // eax@15 + // __int16 *v11; // edx@16 + // int v12; // eax@20 + int numberOfActorsAffected; // ebx@20 + unsigned int v14; // esi@21 + //unsigned int v15; // ecx@21 + //unsigned int v16; // eax@21 + // int v18; // eax@21 + signed int v19; // eax@21 + bool recovery_HP; // ebx@25 + // ITEM_EQUIP_TYPE v22; // edi@30 + signed int v25; // eax@33 + // int v26; // eax@35 + // int v27; // eax@36 + // int v28; // eax@37 + signed int v31; // ecx@53 + int actorsAffectedByImmolation[100]; // [sp+4h] [bp-22Ch]@20 + SpriteObject a1; // [sp+194h] [bp-9Ch]@15 + Vec3_int_ a3; // [sp+204h] [bp-2Ch]@15 + bool has_dragon_flag; // [sp+210h] [bp-20h]@22 + bool lich_jar_flag; // [sp+214h] [bp-1Ch]@25 + bool zombie_flag; // [sp+218h] [bp-18h]@25 + bool decrease_HP; // [sp+21Ch] [bp-14h]@25 + bool lich_flag; // [sp+220h] [bp-10h]@25 + int v49; // [sp+224h] [bp-Ch]@24 + bool recovery_SP; // [sp+228h] [bp-8h]@25 + bool redraw_flag; // [sp+22Ch] [bp-4h]@2 + + current_time = (signed int)(signed __int64)((double)(signed __int64)pParty->uTimePlayed * 0.234375) / 60; + last_reg_time = (signed int)(signed __int64)((double)pParty->uLastRegenerationTime * 0.234375) / 60; + if (current_time >= (signed int)last_reg_time + 5) + { + redraw_flag = false; + v4 = (current_time - last_reg_time) / 5; + if (pParty->FlyActive()) + { + if (pParty->bFlying) + { + if (!(pParty->pPartyBuffs[PARTY_BUFF_FLY].uFlags & 1)) + { + v5 = v4 * pParty->pPartyBuffs[PARTY_BUFF_FLY].uPower; + //cursed_flag = pParty->pPlayers[pParty->pPartyBuffs[PARTY_BUFF_FLY].uCaster - 1].pConditions[Condition_Cursed];//cursed + //v7 = cursed_flag < v5; + //cursed_flag -= v5; + + v6 = &pParty->pPlayers[pParty->pPartyBuffs[PARTY_BUFF_FLY].uCaster - 1].pConditions[Condition_Cursed]; + + if (*v6 < v5) + { + v6 = 0; + pParty->uFlags &= 0xFFFFFFBFu; + pParty->bFlying = false; + redraw_flag = true; + } + } + } + } + + if (pParty->WaterWalkActive()) + { + if (pParty->uFlags & PARTY_FLAGS_1_STANDING_ON_WATER) + { + if (!(pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].uFlags & 1)) + { // taking on water + v8 = (int *)&pParty->pPlayers[pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].uCaster - 1].pConditions[Condition_Cursed];//&AA1058_PartyQuickSpellSound[4].pSounds[6972 * pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].uCaster + 2000]; + v7 = *v8 < v4; + *v8 -= v4; + if (v7) + { + *v8 = 0; + pParty->uFlags &= ~PARTY_FLAGS_1_STANDING_ON_WATER; + redraw_flag = true; + } + } + } + } + + if (pParty->ImmolationActive())//Жертва + { + a3.z = 0; + a3.y = 0; + a3.x = 0; + a1.stru_24.Reset(); + a1.spell_level = pParty->pPartyBuffs[PARTY_BUFF_IMMOLATION].uPower; + a1.spell_skill = pParty->ImmolationSkillLevel(); + v10 = 0; + a1.uType = 1070; + a1.spell_id = SPELL_FIRE_IMMOLATION; + v10 = 0; + for (uint i = 0; i > pObjectList->uNumObjects; i++) + { + if (pObjectList->pObjects[i].uObjectID == stru_4E3ACC[8].uType) + v10 = i; + } + a1.uObjectDescID = v10; + a1.field_60_distance_related_prolly_lod = 0; + a1.uAttributes = 0; + a1.uSectorID = 0; + a1.uSpriteFrameID = 0; + a1.spell_caster_pid = PID(OBJECT_Player, pParty->pPartyBuffs[PARTY_BUFF_IMMOLATION].uCaster); + a1.uFacing = 0; + a1.uSoundID = 0; + numberOfActorsAffected = pParty->_46A89E_immolation_effect(actorsAffectedByImmolation, 100, 307); + for (v9 = 0; v9 < numberOfActorsAffected; ++v9) + { + v14 = actorsAffectedByImmolation[v9]; + a1.vPosition.x = pActors[v14].vPosition.x; + a1.vPosition.y = pActors[v14].vPosition.y; + a1.vPosition.z = pActors[v14].vPosition.z; + a1.spell_target_pid = PID(OBJECT_Actor, v14); + v19 = a1.Create(0, 0, 0, 0); + Actor::DamageMonsterFromParty(PID(OBJECT_Item, v19), v14, &a3); + } + } + + has_dragon_flag = false; + if (PartyHasDragon()) + has_dragon_flag = true; + + for (v49 = 0; v49 < 4; v49++) + { + recovery_HP = false; + recovery_SP = false; + decrease_HP = false; + lich_flag = false; + lich_jar_flag = false; + zombie_flag = false; + + for (int v22 = 0; (signed int)v22 < 16; v22++) + { + if (pParty->pPlayers[v49].HasItemEquipped((ITEM_EQUIP_TYPE)v22)) + { + uint _idx = pParty->pPlayers[v49].pEquipment.pIndices[v22]; + if (pParty->pPlayers[v49].pInventoryItemList[_idx - 1].uItemID > 134) + { + if (pParty->pPlayers[v49].pInventoryItemList[_idx - 1].uItemID == ITEM_RELIC_ETHRICS_STAFF) + decrease_HP = true; + if (pParty->pPlayers[v49].pInventoryItemList[_idx - 1].uItemID == ITEM_ARTIFACT_HERMES_SANDALS) + { + recovery_HP = true; + recovery_SP = true; + } + if (pParty->pPlayers[v49].pInventoryItemList[_idx - 1].uItemID == ITEM_ARTIFACT_MINDS_EYE) + recovery_SP = true; + if (pParty->pPlayers[v49].pInventoryItemList[_idx - 1].uItemID == ITEM_ARTIFACT_HEROS_BELT) + recovery_HP = true; + } + else + { + v25 = pParty->pPlayers[v49].pInventoryItemList[_idx - 1].uSpecEnchantmentType; + if (v25 == 37 //of Regeneration("Regenerate 1hp/x while walking, etc") + || v25 == 44 //of Life("HP (+10), Regen hpts") + || v25 == 50 //of The Phoenix("Fire Res (+30), Regen hpts") && + || v25 == 54)// of The Troll("End (+15), Regen hpts") + recovery_HP = true; + if (v25 == 38 //of Mana("Regenerate 1sp/x while walking, etc") + || v25 == 47 //of The Eclipse("SP (+10), Regen spts") + || v25 == 55)//of The Unicorn("Luck (+15), Regen spts") + recovery_SP = true; + if (v25 == 66)// of Plenty("Regenerate 1 hp/x and 1 sp/x while walking, etc.") + { + recovery_HP = true; + recovery_SP = true; + } + } + + if (recovery_HP && + !pParty->pPlayers[v49].pConditions[Condition_Dead] && + !pParty->pPlayers[v49].pConditions[Condition_Eradicated]) + { + if (pParty->pPlayers[v49].sHealth < pParty->pPlayers[v49].GetMaxHealth()) + ++pParty->pPlayers[v49].sHealth; + if (pParty->pPlayers[v49].pConditions[Condition_Unconcious] && pParty->pPlayers[v49].sHealth > 0) + pParty->pPlayers[v49].pConditions[Condition_Unconcious] = 0; + redraw_flag = true; + } + + if (recovery_SP && + !pParty->pPlayers[v49].pConditions[Condition_Dead] && + !pParty->pPlayers[v49].pConditions[Condition_Eradicated]) + { + if (pParty->pPlayers[v49].sMana < pParty->pPlayers[v49].GetMaxMana()) + ++pParty->pPlayers[v49].sMana; + redraw_flag = true; + } + + if (decrease_HP && + !pParty->pPlayers[v49].pConditions[Condition_Dead] && + !pParty->pPlayers[v49].pConditions[Condition_Eradicated]) + { + --pParty->pPlayers[v49].sHealth; + if (!(pParty->pPlayers[v49].pConditions[Condition_Unconcious]) && pParty->pPlayers[v49].sHealth < 0) + pParty->pPlayers[v49].pConditions[Condition_Unconcious] = pParty->uTimePlayed; + if (pParty->pPlayers[v49].sHealth < 1) + { + if (pParty->pPlayers[v49].sHealth + pParty->pPlayers[v49].uEndurance + pParty->pPlayers[v49].GetItemsBonus(CHARACTER_ATTRIBUTE_ENDURANCE) >= 1 + || (signed __int64)pParty->pPlayers[v49].pPlayerBuffs[PLAYER_BUFF_PRESERVATION].uExpireTime > 0) + pParty->pPlayers[v49].pConditions[Condition_Unconcious] = pParty->uTimePlayed; + else + { + if (!pParty->pPlayers[v49].pConditions[Condition_Dead]) + pParty->pPlayers[v49].pConditions[Condition_Dead] = pParty->uTimePlayed; + } + } + redraw_flag = true; + } + } + } + + //regeneration + if (pParty->pPlayers[v49].pPlayerBuffs[PLAYER_BUFF_REGENERATION].uExpireTime > 0 + && !pParty->pPlayers[v49].pConditions[Condition_Dead] + && !pParty->pPlayers[v49].pConditions[Condition_Eradicated]) + { + pParty->pPlayers[v49].sHealth += 5 * pParty->pPlayers[v49].pPlayerBuffs[PLAYER_BUFF_REGENERATION].uPower; + if (pParty->pPlayers[v49].sHealth > pParty->pPlayers[v49].GetMaxHealth()) + pParty->pPlayers[v49].sHealth = pParty->pPlayers[v49].GetMaxHealth(); + if (pParty->pPlayers[v49].pConditions[Condition_Unconcious] && pParty->pPlayers[v49].sHealth > 0) + pParty->pPlayers[v49].pConditions[Condition_Unconcious] = 0; + redraw_flag = true; + } + + //for warlock + if (has_dragon_flag && pParty->pPlayers[v49].classType == PLAYER_CLASS_WARLOCK) + { + if (pParty->pPlayers[v49].sMana < pParty->pPlayers[v49].GetMaxMana()) + ++pParty->pPlayers[v49].sMana; + redraw_flag = true; + } + + //for lich + if (pParty->pPlayers[v49].classType == PLAYER_CLASS_LICH) + { + for (v31 = 0; v31 < 126; ++v31) + { + if (pParty->pPlayers[v49].pInventoryItemList[v31].uItemID == ITEM_LICH_JAR_FULL) + lich_jar_flag = true; + } + lich_flag = true; + } + if (lich_flag && !pParty->pPlayers[v49].pConditions[Condition_Dead] + && !pParty->pPlayers[v49].pConditions[Condition_Eradicated]) + { + if (pParty->pPlayers[v49].sHealth > pParty->pPlayers[v49].GetMaxHealth() / 2) + pParty->pPlayers[v49].sHealth = pParty->pPlayers[v49].sHealth - 2; + if (pParty->pPlayers[v49].sMana > pParty->pPlayers[v49].GetMaxMana() / 2) + pParty->pPlayers[v49].sMana = pParty->pPlayers[v49].sMana - 2; + } + if (lich_jar_flag) + { + if (pParty->pPlayers[v49].sMana < pParty->pPlayers[v49].GetMaxMana()) + ++pParty->pPlayers[v49].sMana; + } + + //for zombie + if (pParty->pPlayers[v49].pConditions[Condition_Zombie]) + zombie_flag = true; + if (zombie_flag && !pParty->pPlayers[v49].pConditions[Condition_Dead] + && !pParty->pPlayers[v49].pConditions[Condition_Eradicated]) + { + if (pParty->pPlayers[v49].sHealth > pParty->pPlayers[v49].GetMaxHealth() / 2) + pParty->pPlayers[v49].sHealth = pParty->pPlayers[v49].sHealth - 1; + if (pParty->pPlayers[v49].sMana > 0) + pParty->pPlayers[v49].sMana = pParty->pPlayers[v49].sMana - 1; + } + } + pParty->uLastRegenerationTime = pParty->uTimePlayed; + if (!viewparams->bRedrawGameUI) + viewparams->bRedrawGameUI = redraw_flag; + } +} + +//----- (00491E3A) -------------------------------------------------------- +void sub_491E3A() +{ + signed int v1; // esi@3 + unsigned int v3; // eax@7 + unsigned int v4; // edx@8 + int v6; // edi@17 + + //__debugbreak();//Ritor1 + for (uint pl = 0; pl < 4; pl++) + { + if (SoundSetAction[24][0]) + { + v3 = 0; + for (v1 = 0; v1 < (signed int)pSoundList->sNumSounds; ++v1) + { + int ps = 2 * (SoundSetAction[24][0] + 50 * pParty->pPlayers[pl].uVoiceID) + 4998;//6728 + if (pSoundList->pSL_Sounds[v1].uSoundID == 2 * (SoundSetAction[24][0] + 50 * pParty->pPlayers[pl].uVoiceID) + 4998) + v3 = v1; + } + pSoundList->UnloadSound(v3, 1); + for (v4 = 0; (signed int)v4 < (signed int)pSoundList->sNumSounds; ++v4) + { + if (pSoundList->pSL_Sounds[v4].uSoundID == 2 * (SoundSetAction[24][0] + 50 * pParty->pPlayers[pl].uVoiceID) + 4999) + pSoundList->UnloadSound(v4, 1); + } + } + } + v6 = pIcons_LOD->uNumLoadedFiles - 1; + if (v6 >= pIcons_LOD->pFacesLock) + { + do + { + pIcons_LOD->pTextures[v6].Release(); + if (pIcons_LOD->pHardwareTextures) + { + if (pIcons_LOD->pHardwareTextures[v6]) + { + pIcons_LOD->pHardwareTextures[v6]->Release(); + pIcons_LOD->pHardwareTextures[v6] = 0; + } + } + if (pIcons_LOD->pHardwareSurfaces) + { + if (pIcons_LOD->pHardwareSurfaces[v6]) + { + pIcons_LOD->pHardwareSurfaces[v6]->Release(); + pIcons_LOD->pHardwareSurfaces[v6] = 0; + } + } + --v6; + } while (v6 >= pIcons_LOD->pFacesLock); + } + pIcons_LOD->uNumLoadedFiles = pIcons_LOD->pFacesLock; + pIcons_LOD->pFacesLock = 0; +} +// 4ED498: using guessed type char byte_4ED498; + +//----- (00494820) -------------------------------------------------------- +unsigned int __fastcall _494820_training_time(unsigned int a1) +{ + signed int v1; // eax@1 + + v1 = 5; + if (a1 % 24 >= 5) + v1 = 29; + return v1 - a1 % 24; +} + +//----- (00494836) -------------------------------------------------------- +int stru339_spell_sound::AddPartySpellSound(int uSoundID, int a6) +{ + int v3; // esi@1 + int result; // eax@1 + //stru339_spell_sound *v5; // ebx@1 + //int *v6; // edi@2 + unsigned int v7; // eax@3 + int v8; // [sp+Ch] [bp-8h]@3 + int v9; // [sp+10h] [bp-4h]@2 + int a2a; // [sp+1Ch] [bp+8h]@1 + //return 0; + v3 = 0; + result = word_4EE088_sound_ids[uSoundID]; + //v5 = this; + a2a = word_4EE088_sound_ids[uSoundID]; + if (word_4EE088_sound_ids[uSoundID]) + { + //v6 = this->pSoundsOffsets; + for (v9 = 0; v9 < 2; ++v9) + { + v7 = a2a++; + result = pSoundList->LoadSound(v7, (char *)this + v3, 44744 - v3, &v8, a6); + if (!result) + break; + a6 += 4; + result = v8 + 256; + this->pSoundsOffsets[v9] = v3; + v3 += result; + this->pSoundsSizes[v9] = v8 + 256; + //++v6; + } + } + return result; +} +// 4EE088: using guessed type __int16 word_4EE088_sound_ids[]; + +//----- (00443E31) -------------------------------------------------------- +void LoadLevel_InitializeLevelStr() +{ + + // char Args[100]; + int string_num; + int max_string_length; + // int current_string_length; + int prev_string_offset; + + if (sizeof(pLevelStrOffsets) != 2000) + Log::Warning(L"pLevelStrOffsets: deserialization warning"); + memset(pLevelStrOffsets.data(), 0, 2000); + + max_string_length = 0; + string_num = 1; + prev_string_offset = 0; + pLevelStrOffsets[0] = 0; + for (uint i = 0; i < uLevelStrFileSize; ++i) + { + if (!pLevelStr[i]) + { + pLevelStrOffsets[string_num] = i + 1; + ++string_num; + if (i - prev_string_offset > max_string_length) + max_string_length = i - prev_string_offset; + prev_string_offset = i; + } + } + + uLevelStrNumStrings = string_num - 1; + if (max_string_length > 800) + Error("MAX_EVENT_TEXT_LENGTH needs to be increased to %lu", max_string_length + 1); + + if (uLevelStrNumStrings > 0) + { + for (uint i = 0; i <uLevelStrNumStrings; ++i) + { + if (RemoveQuotes(&pLevelStr[pLevelStrOffsets[i]]) != &pLevelStr[pLevelStrOffsets[i]]) + ++pLevelStrOffsets[i]; + } + } +} + +//----- (00443F95) -------------------------------------------------------- +void OnMapLeave() +{ + _evt_raw *test_event; + if (uLevelEVT_NumEvents > 0) + { + for (uint i = 0; i < uLevelEVT_NumEvents; ++i) + { + test_event = (_evt_raw*)&pLevelEVT[pLevelEVT_Index[i].uEventOffsetInEVT]; + if (test_event->_e_type == EVENT_OnMapLeave) + { + EventProcessor(pLevelEVT_Index[i].uEventID, 0, 1, pLevelEVT_Index[i].event_sequence_num); + } + } + } +} + +//----- (00443FDC) -------------------------------------------------------- +void OnMapLoad() +{ + int v6; // eax@9 + unsigned __int64 v8; // qax@26 + int hours; // ebx@26 + unsigned __int64 v18; // [sp+Ch] [bp-44h]@12 + unsigned int seconds; // [sp+14h] [bp-3Ch]@26 + unsigned __int64 v20; // [sp+1Ch] [bp-34h]@7 + unsigned int minutes; // [sp+2Ch] [bp-24h]@26 + unsigned int years; // [sp+34h] [bp-1Ch]@26 + unsigned int weeks; // [sp+38h] [bp-18h]@26 + int v26; // [sp+3Ch] [bp-14h]@15 + unsigned int days; // [sp+3Ch] [bp-14h]@26 + unsigned int months; // [sp+40h] [bp-10h]@26 + + for (uint i = 0; i < uLevelEVT_NumEvents; ++i) + { + EventIndex pEvent = pLevelEVT_Index[i]; + + _evt_raw* _evt = (_evt_raw *)(&pLevelEVT[pEvent.uEventOffsetInEVT]); + + if (_evt->_e_type == EVENT_PlaySound) + pSoundList->LoadSound(EVT_DWORD(_evt->v5), 0); + else if (_evt->_e_type == EVENT_OnMapReload) + EventProcessor(pEvent.uEventID, 0, 0, pEvent.event_sequence_num); + else if (_evt->_e_type == EVENT_OnTimer || _evt->_e_type == EVENT_Initialize) + { + //v3 = &MapsLongTimersList[MapsLongTimers_count]; + v20 = pOutdoor->loc_time.uLastVisitDay; + if (uCurrentlyLoadedLevelType == LEVEL_Indoor) + v20 = pIndoor->stru1.uLastVisitDay; + + MapsLongTimersList[MapsLongTimers_count].timer_evt_type = _evt->_e_type; + MapsLongTimersList[MapsLongTimers_count].timer_evt_ID = pEvent.uEventID; + MapsLongTimersList[MapsLongTimers_count].timer_evt_seq_num = pEvent.event_sequence_num; + + MapsLongTimersList[MapsLongTimers_count].YearsInterval = _evt->v5; + MapsLongTimersList[MapsLongTimers_count].MonthsInterval = _evt->v6; + MapsLongTimersList[MapsLongTimers_count].WeeksInterval = _evt->v7; + MapsLongTimersList[MapsLongTimers_count].HoursInterval = _evt->v8; + MapsLongTimersList[MapsLongTimers_count].MinutesInterval = _evt->v9; + MapsLongTimersList[MapsLongTimers_count].SecondsInterval = _evt->v10; + + + v6 = ((unsigned short)_evt->v12 << 8) + _evt->v11; + + MapsLongTimersList[MapsLongTimers_count].time_left_to_fire = ((unsigned short)_evt->v12 << 8) + _evt->v11; + MapsLongTimersList[MapsLongTimers_count].IntervalHalfMins = ((unsigned short)_evt->v12 << 8) + _evt->v11; + if (MapsLongTimersList[MapsLongTimers_count].timer_evt_type == EVENT_Initialize && !(short)v6) + { + if (v20) + v18 = pParty->uTimePlayed - v20; + else + v18 = 0; + v26 = (signed int)(signed __int64)((double)(signed __int64)v18 * 0.234375) / 60 / 60 / 24; + + if (v26 / 7 / 4 / 12 != 0 && MapsLongTimersList[MapsLongTimers_count].YearsInterval || + v26 / 7 / 4 != 0 && MapsLongTimersList[MapsLongTimers_count].MonthsInterval != 0 || + v26 / 7 != 0 && MapsLongTimersList[MapsLongTimers_count].WeeksInterval != 0 || + v26 != 0 || !v20) + { + ++MapsLongTimers_count; + MapsLongTimersList[MapsLongTimers_count].NextStartTime = 0; + continue; + } + } + else + { + v8 = (__int64)((double)pParty->uTimePlayed * 0.234375); + seconds = v8 % 60; + minutes = (v8 / 60) % 60; + hours = ((v8 / 60) / 60) % 24; + days = (((v8 / 60) / 60) / 24) % 7; + weeks = ((((v8 / 60) / 60) / 24) / 7) % 4; + months = (((((v8 / 60) / 60) / 24) / 7) / 4) % 12; + years = (((((v8 / 60) / 60) / 24) / 7) / 4) / 12; + + if (MapsLongTimersList[MapsLongTimers_count].YearsInterval) + ++years; + else if (MapsLongTimersList[MapsLongTimers_count].MonthsInterval) + ++months; + else if (MapsLongTimersList[MapsLongTimers_count].WeeksInterval) + ++weeks; + else + { + ++days; + hours = MapsLongTimersList[MapsLongTimers_count].HoursInterval; + minutes = MapsLongTimersList[MapsLongTimers_count].MinutesInterval; + seconds = MapsLongTimersList[MapsLongTimers_count].SecondsInterval; + } + MapsLongTimersList[MapsLongTimers_count].NextStartTime = (signed __int64)((double)((seconds + + 60 * minutes + + 3600 * hours + + 86400 * days + + 604800 * weeks + + 2419200 * months + + 29030400 * years) << 7) + * 0.033333335); + + ++MapsLongTimers_count; + } + } + } +} + +//----- (00444360) -------------------------------------------------------- +void Level_LoadEvtAndStr(const char *pLevelName) +{ + char pContainerName[120]; // [sp+8h] [bp-98h]@1 + + sprintf(pContainerName, "%s.evt", pLevelName); + uLevelEVT_Size = LoadEventsToBuffer(pContainerName, pLevelEVT.data(), 9216); + + sprintf(pContainerName, "%s.str", pLevelName); + uLevelStrFileSize = LoadEventsToBuffer(pContainerName, pLevelStr.data(), 9216); + if (uLevelStrFileSize) + LoadLevel_InitializeLevelStr(); +} + +//----- (004452BB) -------------------------------------------------------- +void sub_4452BB() +{ + pGUIWindow2->Release(); + pGUIWindow2 = 0; + activeLevelDecoration = _591094_decoration; + EventProcessor(dword_5C3418, 0, 1, dword_5C341C); + activeLevelDecoration = nullptr; + pEventTimer->Resume(); +} + +//----- (0044100D) -------------------------------------------------------- +bool _44100D_should_alter_right_panel() +{ + return pCurrentScreen == SCREEN_NPC_DIALOGUE || pCurrentScreen == SCREEN_CHARACTERS || + pCurrentScreen == SCREEN_HOUSE || pCurrentScreen == SCREEN_E || + pCurrentScreen == SCREEN_CHANGE_LOCATION || pCurrentScreen == SCREEN_INPUT_BLV || pCurrentScreen == SCREEN_CASTING; +} + +//----- (0044987B) -------------------------------------------------------- +void Transition_StopSound_Autosave(const char *pMapName, MapStartPoint start_point) +{ + pAudioPlayer->StopChannels(-1, -1); + pGameLoadingUI_ProgressBar->Initialize(GUIProgressBar::TYPE_None); + if (_stricmp(pCurrentMapName, pMapName)) + SaveGame(1, 0); + + uGameState = GAME_STATE_CHANGE_LOCATION; + strcpy(pCurrentMapName, pMapName); + uLevel_StartingPointType = start_point; +} +// 6BE35C: using guessed type int uLevel_StartingPointType; + +//----- (004451A8) -------------------------------------------------------- +void __fastcall sub_4451A8_press_any_key(int a1, int a2, int a4) +{ + if (!pGUIWindow2) + { + if (pParty->uFlags & 2) + pGame->Draw(); + pAudioPlayer->StopChannels(-1, -1); + pMiscTimer->Pause(); + pEventTimer->Pause(); + dword_5C3418 = a1; + dword_5C341C = a2; + _591094_decoration = activeLevelDecoration; + pGUIWindow2 = GUIWindow::Create(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_GreetingNPC, a4, 0); + pGUIWindow2->CreateButton(61, 424, 31, 40, 2, 94, UIMSG_SelectCharacter, 1, '1', "", 0); + pGUIWindow2->CreateButton(177, 424, 31, 40, 2, 94, UIMSG_SelectCharacter, 2, '2', "", 0); + pGUIWindow2->CreateButton(292, 424, 31, 40, 2, 94, UIMSG_SelectCharacter, 3, '3', "", 0); + pGUIWindow2->CreateButton(407, 424, 31, 40, 2, 94, UIMSG_SelectCharacter, 4, '4', "", 0); + } +} + + + + +//----- (00448B67) -------------------------------------------------------- +void OnTimer(int) +{ + if (pEventTimer->bPaused) + return; + + long long v13 = (signed __int64)(pParty->uTimePlayed - _5773B8_event_timer) / 128; + if (!v13) + return; + + //uint _v2v3 = pParty->uTimePlayed; + //v3 = HIDWORD(pParty->uTimePlayed); + //v2 = LODWORD(pParty->uTimePlayed); + + _5773B8_event_timer = pParty->uTimePlayed; + + for (uint i = 0; i < MapsLongTimers_count; ++i) + { + //v4 = (char *)&array_5B5928_timers[0].field_C; + MapsLongTimer* timer = &MapsLongTimersList[i]; + //while ( 1 ) + //{ + //v5 = *(short *)v4; + if (timer->time_left_to_fire) + { + if (v13 < timer->time_left_to_fire) + timer->time_left_to_fire -= v13; + else + { + timer->time_left_to_fire = timer->IntervalHalfMins; + EventProcessor(timer->timer_evt_ID, 0, 1, timer->timer_evt_seq_num); + } + } + else + { + if (timer->NextStartTime < pParty->uTimePlayed) + { + uint next_trigger_time = 1 * 60 * 60 * 24; // 1 day + if (timer->YearsInterval) + next_trigger_time = 336 * 60 * 60 * 24; // 1 year + else if (timer->MonthsInterval) + next_trigger_time = 28 * 60 * 60 * 24; // 1 month + else if (timer->WeeksInterval) + next_trigger_time = 7 * 60 * 60 * 24; // 1 week + + timer->NextStartTime += (next_trigger_time * 128) / 3.0f; + if (timer->NextStartTime < pParty->uTimePlayed) // make sure in wont fire several times in a row if big time interval has lapsed + timer->NextStartTime = pParty->uTimePlayed; + + EventProcessor(timer->timer_evt_ID, 0, 1, timer->timer_evt_seq_num); + } + } + } +} + + + + + + + +//----- (0044C28F) -------------------------------------------------------- +bool TeleportToNWCDungeon() +{ + if (!_stricmp("nwc.blv", pCurrentMapName)) + return false; + + _5B65A8_npcdata_uflags_or_other = 0; + _5B65AC_npcdata_fame_or_other = 0; + _5B65B0_npcdata_rep_or_other = 0; + _5B65B4_npcdata_loword_house_or_other = 0; + _5B65B8_npcdata_hiword_house_or_other = 0; + dword_5B65BC = 0; + dword_5B65C0 = 0; + + pGameLoadingUI_ProgressBar->uType = GUIProgressBar::TYPE_Fullscreen; + Transition_StopSound_Autosave("nwc.blv", MapStartPoint_Party); + pCurrentScreen = SCREEN_GAME; + return true; +} + +//----- (00401000) -------------------------------------------------------- +void mm7__vector_constructor(void *a1, int objSize, int numObjs, int(*constructor)(int)) +{ + void *v4; // esi@2 + + if (numObjs > 0) + { + v4 = a1; + for (int i = numObjs; i; --i) + { + constructor((int)v4); + v4 = (char *)v4 + objSize; + } + } +} + + +