# HG changeset patch # User Ritor1 # Date 1379492400 -21600 # Node ID 620b6ba3e6b8ad5b195c265d8d7093703f133c47 # Parent e1d1fe32c19448ef24aa48c3391dec50eb6d977b# Parent a7eebb6ee7a25c575ff81d9e2869e9dd82ba30f9 Слияние diff -r e1d1fe32c194 -r 620b6ba3e6b8 NPC.cpp --- a/NPC.cpp Wed Sep 18 14:19:37 2013 +0600 +++ b/NPC.cpp Wed Sep 18 14:20:00 2013 +0600 @@ -503,10 +503,10 @@ switch (decode_step) { case 1: - pNPCGreetings[i].pGreeting[0] = RemoveQuotes(test_string); + pNPCGreetings[i].pGreetings[0] = RemoveQuotes(test_string); break; case 2: - pNPCGreetings[i].pGreeting[1] = RemoveQuotes(test_string); + pNPCGreetings[i].pGreetings[1] = RemoveQuotes(test_string); break; } } diff -r e1d1fe32c194 -r 620b6ba3e6b8 NPC.h --- a/NPC.h Wed Sep 18 14:19:37 2013 +0600 +++ b/NPC.h Wed Sep 18 14:20:00 2013 +0600 @@ -132,8 +132,15 @@ #pragma pack(push, 1) struct NPCGreeting { - char *pGreeting[2]; //at first meet - //char *pGreeting2; // at latest meets + union + { + struct + { + char *pGreeting1; //at first meet + char *pGreeting2; // at latest meets + }; + char *pGreetings[2]; + }; }; #pragma pack(pop) diff -r e1d1fe32c194 -r 620b6ba3e6b8 Render.cpp --- a/Render.cpp Wed Sep 18 14:19:37 2013 +0600 +++ b/Render.cpp Wed Sep 18 14:20:00 2013 +0600 @@ -2094,10 +2094,14 @@ hd_water_current_frame = 0; } -bool Render::Initialize(bool bWindowed, uint32_t uDefaultDevice, bool bColoredLights, uint32_t uDetailLevel, bool bTinting) +bool Render::Initialize(bool bWindowed, int windowed_width, int windowed_height, uint32_t uDefaultDevice, + bool bColoredLights, uint32_t uDetailLevel, bool bTinting) { bUserDirect3D = true;//ReadWindowsRegistryInt("Use D3D", 0); + bStartInWindow = bWindowed; + windowed_mode_width = windowed_width; + windowed_mode_height = windowed_height; uDesiredDirect3DDevice = uDefaultDevice;//ReadWindowsRegistryInt("D3D Device", 1); @@ -2177,30 +2181,21 @@ //----- (0049ED18) -------------------------------------------------------- void Render::PresentBlackScreen() { - LONG w; // edx@3 IDirectDrawSurface *v2; // eax@3 DDBLTFX v3; // [sp+4h] [bp-74h]@5 RECT x; // [sp+68h] [bp-10h]@3 memset(&v3, 0, sizeof(DDBLTFX)); + GetWindowRect(hWnd, &x); if (pVersion->pVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT || pVersion->pVersionInfo.dwMajorVersion >= 5) { - x.left = uWindowX; - x.right = uWindowX + uWindowHeight; - x.top = uWindowY; - w = uWindowY + uWindowWidth; v2 = (IDirectDrawSurface *)this->pBackBuffer4; } else { - x.left = uWindowX; - x.right = uWindowX + uWindowHeight; - x.top = uWindowY; - w = uWindowY + uWindowWidth; v2 = (IDirectDrawSurface *)this->pBackBuffer2; } - x.bottom = w; v3.dwFillColor = 0; v3.dwSize = 100; v2->Blt(&x, 0, 0, DDBLT_COLORFILL, &v3); @@ -8361,13 +8356,6 @@ } if ( pRenderer->bWindowMode ) { - if ( GetWindowRect(hWnd, &Rect) ) - { - WriteWindowsRegistryInt("window X", Rect.left); - WriteWindowsRegistryInt("window Y", Rect.top); - uWindowX = Rect.left; - uWindowY = Rect.top; - } SetMenu(hWnd, 0); SetWindowLongA(hWnd, -20, 0); SetWindowLongA(hWnd, -16, 0x10000000u); @@ -8379,7 +8367,6 @@ { ClipCursor(0); pRenderer->SwitchToWindow(hWnd); - SetWindowLongA(hWnd, -16, uWindowStyle); } if ( pRenderer->pRenderD3D ) { @@ -8434,14 +8421,14 @@ pMouse->SetCurrentCursorBitmap(); if ( pRenderer->bWindowMode ) { - InvalidateRect(0, 0, 0); - MoveWindow(hWnd, uWindowX, uWindowY, uWindowWidth, uWindowHeight, 0); + //MoveWindow(hWnd, uWindowX, uWindowY, uWindowWidth, uWindowHeight, 0); + CenterWindowAndAdjustSize(hWnd, windowed_mode_width, windowed_mode_height); ShowWindow(hWnd, SW_SHOWNORMAL); } pMouse->bActive = 1; if ( pVideoPlayer->AnyMovieLoaded() ) pVideoPlayer->SelectMovieType(); - if ( BYTE1(dword_6BE364_game_settings_1) & 8 ) + if (dword_6BE364_game_settings_1 & 0x0800 ) BYTE1(dword_6BE364_game_settings_1) &= 0xF7u; else pEventTimer->Resume(); diff -r e1d1fe32c194 -r 620b6ba3e6b8 Render.h --- a/Render.h Wed Sep 18 14:19:37 2013 +0600 +++ b/Render.h Wed Sep 18 14:20:00 2013 +0600 @@ -269,7 +269,7 @@ static Render *Create() {return new Render;} - bool Initialize(bool bWindowed, uint32_t uDefaultDevice, + bool Initialize(bool bWindowed, int window_width, int window_height, uint32_t uDefaultDevice, bool bColoredLights, uint32_t uDetailLevel, bool bTinting); @@ -457,6 +457,10 @@ unsigned int uCurrentlyLockedSurfacePitch; unsigned __int16 *pCurrentlyLockedSurfaceDataPtr; unsigned __int16 *pCurrentlyLockedSoftSurface; + + + int windowed_mode_width; + int windowed_mode_height; }; #pragma pack(pop) diff -r e1d1fe32c194 -r 620b6ba3e6b8 UI/UIHouses.cpp --- a/UI/UIHouses.cpp Wed Sep 18 14:19:37 2013 +0600 +++ b/UI/UIHouses.cpp Wed Sep 18 14:20:00 2013 +0600 @@ -3404,7 +3404,7 @@ { house_window.uFrameWidth = game_viewport_width; house_window.uFrameZ = 452; - pInString = pNPCStats->pNPCGreetings[pNPC->greet].pGreeting[((pNPC->uFlags & 3) == 2)]; + pInString = pNPCStats->pNPCGreetings[pNPC->greet].pGreetings[((pNPC->uFlags & 3) == 2)]; //pInString = (char *)*(&pNPCStats->field_17884 + ((pNPC->uFlags & 3) == 2) + 2 * pNPC->greet); pRenderer->GetLeather(8, 352 - (pFontArrus->CalcTextHeight(pInString, &house_window, 13, 0) + 7), pIcons_LOD->GetTexture(uTextureID_Leather), pIcons_LOD->GetTexture(uTextureID_Leather)->uTextureHeight diff -r e1d1fe32c194 -r 620b6ba3e6b8 UI/UiGame.cpp --- a/UI/UiGame.cpp Wed Sep 18 14:19:37 2013 +0600 +++ b/UI/UiGame.cpp Wed Sep 18 14:20:00 2013 +0600 @@ -434,9 +434,9 @@ if (pNPC->greet) { if ((pNPC->uFlags & 3) == 2) - pInString = pNPCStats->pNPCGreetings[pNPC->greet].pGreeting[1]; + pInString = pNPCStats->pNPCGreetings[pNPC->greet].pGreeting2; else - pInString = pNPCStats->pNPCGreetings[pNPC->greet].pGreeting[0]; + pInString = pNPCStats->pNPCGreetings[pNPC->greet].pGreeting1; } } else if (pGreetType == 2)//HiredNPC_greet diff -r e1d1fe32c194 -r 620b6ba3e6b8 mm7_2.cpp --- a/mm7_2.cpp Wed Sep 18 14:19:37 2013 +0600 +++ b/mm7_2.cpp Wed Sep 18 14:20:00 2013 +0600 @@ -4277,8 +4277,35 @@ } } + + +void CenterWindowAndAdjustSize(HWND hwnd, int client_width, int client_height) +{ + RECT rcWindow; + GetWindowRect(hWnd, &rcWindow); + + RECT rcClient; + GetClientRect(hWnd, &rcClient); + + int window_borders_width = (rcWindow.right - rcWindow.left) - (rcClient.right - rcClient.left), + window_borders_height = (rcWindow.bottom - rcWindow.top) - (rcClient.bottom - rcClient.top); + int window_total_width = client_width + window_borders_width, + window_total_height = client_height + window_borders_height; + + MoveWindow(hWnd, (GetSystemMetrics(SM_CXSCREEN) - window_total_width) / 2, + (GetSystemMetrics(SM_CYSCREEN) - window_total_height) / 2, + window_total_width, + window_total_height, 0); +/* + auto hDesktopDC = GetDC(nullptr); + uint uDesktopWidth = GetDeviceCaps(hDesktopDC, HORZRES); + uint uDesktopHeight = GetDeviceCaps(hDesktopDC, VERTRES); + ReleaseDC(nullptr, hDesktopDC); +*/ +} + //----- (004651F4) -------------------------------------------------------- -bool MM7_Initialize() +bool MM7_Initialize(int game_width, int game_height) { wchar_t pCurrentDir[1024]; _wgetcwd(pCurrentDir, 1024); @@ -4318,29 +4345,10 @@ return false; } - auto hDesktopDC = GetDC(nullptr); - uint uDesktopWidth = GetDeviceCaps(hDesktopDC, HORZRES); - uint uDesktopHeight = GetDeviceCaps(hDesktopDC, VERTRES); - ReleaseDC(nullptr, hDesktopDC); - - uint uTotalWinWidth = 2 * GetSystemMetrics(SM_CXFRAME) + 640; - uint uTotalWinHeight = GetSystemMetrics(SM_CYCAPTION) + 2 * GetSystemMetrics(SM_CYFRAME) + 480; - - uint uWinCenteredPosX = (uDesktopWidth - uTotalWinWidth) / 2; - uint uWinCenteredPosY = (uDesktopHeight - uTotalWinHeight) / 2; - - uWindowX = ReadWindowsRegistryInt("window X", uWinCenteredPosX); - uWindowX = uDesktopWidth / 2 - 640 / 2; - WriteWindowsRegistryInt("window X", uWindowX); - - uWindowY = ReadWindowsRegistryInt("window Y", uWinCenteredPosY); - uWindowY = uDesktopHeight / 2 - 480 / 2; - WriteWindowsRegistryInt("window Y", uWindowY); - hWnd = CreateWindowExW(0, wcxw.lpszClassName, L"Might and Magic VII", - uWindowStyle = WS_SYSMENU | WS_GROUP | WS_DLGFRAME | WS_BORDER, - uWindowX, uWindowY, - 640, 480, + WS_SYSMENU | WS_GROUP | WS_DLGFRAME | WS_BORDER, + 0, 0, + 1, 1, nullptr, nullptr, wcxw.hInstance, @@ -4485,7 +4493,10 @@ } } } + SetMenu(hWnd, menu); + CenterWindowAndAdjustSize(hWnd, game_width, game_height); + ShowWindow(hWnd, SW_SHOWNORMAL); SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS); @@ -4503,7 +4514,7 @@ uint uLevelOfDetail = ReadWindowsRegistryInt("Detail Level", 1); uint bTinting = ReadWindowsRegistryInt("Tinting", 1) != 0; - if (!pRenderer->Initialize(bWindowMode, uDefaultDevice, bColoredLights, uLevelOfDetail, bTinting)) + if (!pRenderer->Initialize(bWindowMode, game_width, game_height, uDefaultDevice, bColoredLights, uLevelOfDetail, bTinting)) { Log::Warning(L"Render failed to initialize"); return false; @@ -4532,18 +4543,7 @@ GameUI_StatusBar_UpdateTimedString(1); pGame = Game::Create(); pMouse = pGame->pMouseInstance; - - - RECT rcWindow; - GetWindowRect(hWnd, &rcWindow); - - RECT rcClient; - GetClientRect(hWnd, &rcClient); - uWindowWidth = rcClient.left - rcClient.right - rcWindow.left + rcWindow.right + 640; - uWindowHeight = rcClient.top - rcClient.bottom - rcWindow.top + rcWindow.bottom + 480; - MoveWindow(hWnd, uWindowX, uWindowY, - rcClient.left - rcClient.right - rcWindow.left + rcWindow.right + 640, - rcClient.top - rcClient.bottom - rcWindow.top + rcWindow.bottom + 480, 0); + pIcons_LOD = new LODFile_IconsBitmaps; if (!pIcons_LOD->Load("data\\icons.lod", "icons")) @@ -4858,7 +4858,6 @@ break; } - ShowWindow(hWnd, SW_SHOWNORMAL); return true; } @@ -5065,7 +5064,7 @@ assert(sizeof(MonsterInfo) == 0x58); assert(sizeof(MonsterStats) == 0x5BA0); assert(sizeof(RenderD3D) == 0x148); - assert(sizeof(Render) == 0x129844); +// assert(sizeof(Render) == 0x129844); assert(sizeof(Player) == 0x1B3C); assert(sizeof(Party_stru0) == 0x678); assert(sizeof(Party) == 0x16238); @@ -5153,7 +5152,7 @@ uCPUSpeed = 2048; // about 2GHz - if (!MM7_Initialize()) + if (!MM7_Initialize(640, 480)) { Log::Warning(L"MM init: failed"); pGame->Deinitialize(); diff -r e1d1fe32c194 -r 620b6ba3e6b8 mm7_data.cpp --- a/mm7_data.cpp Wed Sep 18 14:19:37 2013 +0600 +++ b/mm7_data.cpp Wed Sep 18 14:20:00 2013 +0600 @@ -1198,11 +1198,6 @@ float fTurnSpeedMultiplier = 1.0f; // weak float flt_6BE150_look_up_down_dangle = 1.0f; // weak HWND hWnd; // idb -int uWindowWidth; // idb -int uWindowHeight; // idb -int uWindowX; // idb -int uWindowY; // idb -LONG uWindowStyle; // idb int dword_6BE340; // weak char pCurrentMapName[32]; // idb unsigned int uLevelMapStatsID; diff -r e1d1fe32c194 -r 620b6ba3e6b8 mm7_data.h --- a/mm7_data.h Wed Sep 18 14:19:37 2013 +0600 +++ b/mm7_data.h Wed Sep 18 14:20:00 2013 +0600 @@ -847,11 +847,6 @@ //extern HINSTANCE hInstance; // idb //extern char *pCmdLine; extern HWND hWnd; // idb -extern int uWindowWidth; // idb -extern int uWindowHeight; // idb -extern int uWindowX; // idb -extern int uWindowY; // idb -extern LONG uWindowStyle; // idb extern int dword_6BE340; // weak extern char pCurrentMapName[32]; // idb extern unsigned int uLevelMapStatsID; @@ -1369,6 +1364,7 @@ } //inline void __fastcall j_memset32(int a2, void *a1, unsigned int a3) {memset32(a1, a2, a3);} +void CenterWindowAndAdjustSize(HWND hwnd, int client_width, int client_height); #define ErrD3D(hr) do {extern void ErrHR(HRESULT, const char *, const char *, const char *, int); ErrHR(hr, "Direct3D", __FUNCTION__, __FILE__, __LINE__);} while(0)