TombEngine/TR5Main/Specific/winmain.cpp

341 lines
6.7 KiB
C++
Raw Normal View History

2018-08-19 09:46:58 +02:00
#include "game.h"
#include "init.h"
2018-08-19 09:46:58 +02:00
#include "winmain.h"
2018-12-28 17:19:54 +01:00
#include <CommCtrl.h>
2018-12-28 17:19:54 +01:00
#include "..\resource.h"
2018-08-19 09:46:58 +02:00
#include <process.h>
#include <crtdbg.h>
#include <stdio.h>
#include "sol.hpp"
2018-08-19 09:46:58 +02:00
#include "..\Game\draw.h"
#include "..\Game\sound.h"
#include "..\Game\inventory.h"
#include "..\Game\control.h"
#include "..\Game\gameflow.h"
2018-10-09 00:02:14 +02:00
#include "..\Game\savegame.h"
#include "..\Specific\roomload.h"
2018-08-19 09:46:58 +02:00
#include "configuration.h"
2018-08-19 09:46:58 +02:00
WINAPP App;
unsigned int threadId;
uintptr_t hThread;
HACCEL hAccTable;
byte receivedWmClose = false;
2019-01-06 12:27:56 +01:00
bool Debug = false;
2018-08-19 09:46:58 +02:00
2019-12-02 09:11:21 +01:00
extern int IsLevelLoading;
extern GameFlow* g_GameFlow;
extern GameScript* g_GameScript;
extern GameConfiguration g_Configuration;
int WinProcMsg()
2018-08-19 09:46:58 +02:00
{
int result;
struct tagMSG Msg;
DB_Log(2, "WinProcMsg");
do
{
GetMessageA(&Msg, 0, 0, 0);
if (!TranslateAcceleratorA(WindowsHandle, hAccTable, &Msg))
{
TranslateMessage(&Msg);
DispatchMessageA(&Msg);
}
result = Unk_876C48;
} while (!Unk_876C48 && Msg.message != WM_QUIT);
return result;
}
2019-12-02 09:11:21 +01:00
void __stdcall HandleWmCommand(unsigned short wParam)
{
if (wParam == 8)
{
DB_Log(5, "Pressed ALT + ENTER");
if (!IsLevelLoading)
{
SuspendThread((HANDLE)hThread);
DB_Log(5, "Game thread suspended");
g_Renderer->ToggleFullScreen();
ResumeThread((HANDLE)hThread);
DB_Log(5, "Game thread resumed");
if (g_Renderer->IsFullsScreen())
{
SetCursor(0);
ShowCursor(false);
}
else
{
SetCursor(LoadCursorA(App.hInstance, (LPCSTR)0x68));
ShowCursor(true);
}
}
}
}
LRESULT CALLBACK WinAppProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
2019-03-17 11:05:07 +01:00
// Disables ALT + SPACE
if (msg == WM_SYSCOMMAND && wParam == SC_KEYMENU) {
return 0;
}
if (msg > 0x10)
{
if (msg == WM_COMMAND)
{
DB_Log(6, "WM_COMMAND");
2019-12-02 09:11:21 +01:00
HandleWmCommand((unsigned short)wParam);
}
return DefWindowProcA(hWnd, msg, wParam, (LPARAM)lParam);
}
if (msg == WM_CLOSE)
{
DB_Log(6, "WM_CLOSE");
2018-12-29 14:27:39 +01:00
receivedWmClose = true;
PostQuitMessage(0);
2019-03-18 22:50:41 +01:00
//DoTheGame = false;
2018-12-29 14:27:39 +01:00
return DefWindowProcA(hWnd, 0x10u, wParam, (LPARAM)lParam);
}
if (msg != WM_ACTIVATE)
{
return DefWindowProcA(hWnd, msg, wParam, (LPARAM)lParam);
}
DB_Log(6, "WM_ACTIVATE");
if (receivedWmClose)
{
return DefWindowProcA(hWnd, msg, wParam, (LPARAM)lParam);
}
if (App_Unk00D9AC2B)
return 0;
2019-12-02 09:11:21 +01:00
if ((short)wParam)
{
2019-12-02 09:11:21 +01:00
if ((signed int)(unsigned short)wParam > 0 && (signed int)(unsigned short)wParam <= 2)
{
DB_Log(6, "WM_ACTIVE");
2019-01-06 12:27:56 +01:00
if (!Debug)
ResumeThread((HANDLE)hThread);
2018-12-31 17:13:20 +01:00
App_Unk00D9ABFD = 0;
2018-12-31 17:13:20 +01:00
DB_Log(5, "Game Thread Resumed");
2018-12-31 17:13:20 +01:00
return 0;
}
}
else
{
DB_Log(6, "WM_INACTIVE");
2018-12-31 17:13:20 +01:00
DB_Log(5, "HangGameThread");
2018-12-31 17:13:20 +01:00
App_Unk00D9ABFD = 1;
2019-01-06 12:27:56 +01:00
if (!Debug)
SuspendThread((HANDLE)hThread);
2018-12-31 17:13:20 +01:00
DB_Log(5, "Game Thread Suspended");
}
2018-12-31 17:13:20 +01:00
return 0;
}
2019-12-02 09:11:21 +01:00
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
2018-08-19 09:46:58 +02:00
{
int RetVal;
int n;
2018-12-29 13:19:18 +01:00
// Process the command line
bool setup = false;
2019-01-06 12:27:56 +01:00
2018-12-29 13:19:18 +01:00
LPWSTR* argv;
2019-12-02 09:11:21 +01:00
int argc;
2018-12-29 13:19:18 +01:00
argv = CommandLineToArgvW(GetCommandLineW(), &argc);
2019-12-02 09:11:21 +01:00
for (int i = 1; i < argc; i++)
2018-12-29 13:19:18 +01:00
{
if (wcscmp(argv[i], L"/setup") == 0)
setup = true;
if (wcscmp(argv[i], L"/debug") == 0)
2019-01-06 12:27:56 +01:00
Debug = true;
2018-12-29 13:19:18 +01:00
}
LocalFree(argv);
2018-08-19 09:46:58 +02:00
// Clear Application Structure
memset(&App, 0, sizeof(WINAPP));
_CrtSetReportMode(0, 2);
_CrtSetDbgFlag(-1);
2018-09-02 09:29:36 +02:00
// Initialise the new scripting system
sol::state luaState;
luaState.open_libraries(sol::lib::base);
g_GameFlow = new GameFlow(&luaState);
LoadScript();
g_GameScript = new GameScript(&luaState);
2018-09-02 09:29:36 +02:00
2018-10-09 00:02:14 +02:00
// Initialise chunks for savegames
SaveGame::Start();
2019-05-09 13:50:55 +02:00
INITCOMMONCONTROLSEX commCtrlInit;
commCtrlInit.dwSize = sizeof(INITCOMMONCONTROLSEX);
commCtrlInit.dwICC = ICC_USEREX_CLASSES | ICC_STANDARD_CLASSES;
InitCommonControlsEx(&commCtrlInit);
// Initialise main window
2018-08-19 09:46:58 +02:00
App.hInstance = hInstance;
App.WindowClass.hIcon = NULL;
App.WindowClass.lpszMenuName = NULL;
App.WindowClass.lpszClassName = "TR5Main";
App.WindowClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
App.WindowClass.hInstance = hInstance;
App.WindowClass.style = CS_VREDRAW | CS_HREDRAW;
App.WindowClass.lpfnWndProc = (WNDPROC)WinAppProc;
App.WindowClass.cbClsExtra = 0;
App.WindowClass.cbWndExtra = 0;
App.WindowClass.hCursor = LoadCursor(App.hInstance, IDC_ARROW);
if (!RegisterClass(&App.WindowClass))
{
printf("Unable To Register Window Class\n");
2019-11-21 07:43:34 +01:00
return false;
2018-08-19 09:46:58 +02:00
}
// Create the renderer and enumerate adapters and video modes
2019-01-13 21:57:16 +01:00
g_Renderer = new Renderer11();
g_Renderer->Create();
g_Renderer->EnumerateVideoModes();
// Load configuration and optionally show the setup dialog
InitDefaultConfiguration();
//SetupDialog();
2018-12-29 13:19:18 +01:00
if (setup || !LoadConfiguration())
{
if (!SetupDialog())
{
WinClose();
return 0;
}
LoadConfiguration();
}
2018-08-19 09:46:58 +02:00
tagRECT Rect;
Rect.left = 0;
Rect.top = 0;
Rect.right = g_Configuration.Width;
Rect.bottom = g_Configuration.Height;
2018-08-19 09:46:58 +02:00
AdjustWindowRect(&Rect, WS_CAPTION, false);
App.WindowHandle = CreateWindowEx(
2019-03-17 11:05:07 +01:00
0,
2018-08-19 09:46:58 +02:00
"TR5Main",
g_GameFlow->GetSettings()->WindowTitle.c_str(),
2019-03-17 11:05:07 +01:00
WS_POPUP,
2019-03-17 19:28:25 +01:00
0,
0,
2018-08-19 09:46:58 +02:00
Rect.right - Rect.left,
Rect.bottom - Rect.top,
2019-03-17 11:05:07 +01:00
NULL,
NULL,
2018-08-19 09:46:58 +02:00
App.hInstance,
2019-03-17 11:05:07 +01:00
NULL
2018-08-19 09:46:58 +02:00
);
if (!App.WindowHandle)
{
printf("Unable To Create Window: %d\n", GetLastError());
2019-11-21 07:43:34 +01:00
return false;
2018-08-19 09:46:58 +02:00
}
PhdWidth = g_Configuration.Width;
PhdHeight = g_Configuration.Height;
WindowsHandle = App.WindowHandle;
2018-12-28 17:19:54 +01:00
// Initialise the renderer
g_Renderer->Initialise(g_Configuration.Width, g_Configuration.Height, g_Configuration.RefreshRate,
g_Configuration.Windowed, App.WindowHandle);
2018-08-19 09:46:58 +02:00
// Initialize audio
if (g_Configuration.EnableSound)
Sound_Init();
2018-08-19 09:46:58 +02:00
// Initialise the new inventory
g_Inventory = new Inventory();
2018-08-19 09:46:58 +02:00
App.bNoFocus = false;
App.isInScene = false;
UpdateWindow(WindowsHandle);
ShowWindow(WindowsHandle, nShowCmd);
SetCursor(0);
ShowCursor(0);
hAccTable = LoadAcceleratorsA(hInstance, (LPCSTR)0x65);
2019-01-13 21:57:16 +01:00
//g_Renderer->Test();
2018-08-19 09:46:58 +02:00
SoundActive = false;
DoTheGame = true;
Unk_876C48 = false;
2019-03-18 22:50:41 +01:00
hThread = _beginthreadex(0, 0, &GameMain, 0, 0, &threadId);
2018-08-19 09:46:58 +02:00
WinProcMsg();
Unk_876C48 = true;
while (DoTheGame);
WinClose();
return 0;
}
int WinClose()
2018-08-19 09:46:58 +02:00
{
DB_Log(2, "WinClose - DLL");
2018-08-19 09:46:58 +02:00
DestroyAcceleratorTable(hAccTable);
if (g_Configuration.EnableSound)
Sound_DeInit();
2018-08-19 09:46:58 +02:00
delete g_Renderer;
delete g_Inventory;
delete g_GameFlow;
2018-08-19 09:46:58 +02:00
2018-10-09 00:02:14 +02:00
SaveGame::End();
2018-08-19 09:46:58 +02:00
return 0;
}
void Inject_WinMain()
{
INJECT(0x004D23E0, WinClose);
INJECT(0x004D24C0, WinProcMsg);
INJECT(0x004D1C00, WinMain);
}