mirror of
https://github.com/isledecomp/isle-portable.git
synced 2026-02-03 12:31:15 +00:00
Add SDL callbacks to isleapp
This commit is contained in:
parent
9c83acb3b1
commit
4717531f91
115
ISLE/isleapp.cpp
115
ISLE/isleapp.cpp
@ -27,6 +27,8 @@
|
|||||||
#include "roi/legoroi.h"
|
#include "roi/legoroi.h"
|
||||||
#include "viewmanager/viewmanager.h"
|
#include "viewmanager/viewmanager.h"
|
||||||
|
|
||||||
|
#define SDL_MAIN_USE_CALLBACKS
|
||||||
|
#include <SDL3/SDL_main.h>
|
||||||
#include <dsound.h>
|
#include <dsound.h>
|
||||||
|
|
||||||
DECOMP_SIZE_ASSERT(IsleApp, 0x8c)
|
DECOMP_SIZE_ASSERT(IsleApp, 0x8c)
|
||||||
@ -236,12 +238,11 @@ void IsleApp::SetupVideoFlags(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FUNCTION: ISLE 0x401610
|
int SDL_AppInit(void** appstate, int argc, char** argv)
|
||||||
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
|
|
||||||
{
|
{
|
||||||
// Look for another instance, if we find one, bring it to the foreground instead
|
// Look for another instance, if we find one, bring it to the foreground instead
|
||||||
if (!FindExistingInstance()) {
|
if (!FindExistingInstance()) {
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Attempt to create DirectSound instance
|
// Attempt to create DirectSound instance
|
||||||
@ -263,86 +264,90 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
|
|||||||
"Lego Island Error",
|
"Lego Island Error",
|
||||||
MB_OK
|
MB_OK
|
||||||
);
|
);
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create global app instance
|
// Create global app instance
|
||||||
g_isle = new IsleApp();
|
g_isle = new IsleApp();
|
||||||
|
|
||||||
// Create window
|
// Create window
|
||||||
if (g_isle->SetupWindow(hInstance, lpCmdLine) != SUCCESS) {
|
if (g_isle->SetupWindow(GetModuleHandle(NULL), NULL) != SUCCESS) {
|
||||||
MessageBoxA(
|
MessageBoxA(
|
||||||
NULL,
|
NULL,
|
||||||
"\"LEGO\xAE Island\" failed to start. Please quit all other applications and try again.",
|
"\"LEGO\xAE Island\" failed to start. Please quit all other applications and try again.",
|
||||||
"LEGO\xAE Island Error",
|
"LEGO\xAE Island Error",
|
||||||
MB_OK
|
MB_OK
|
||||||
);
|
);
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get reference to window
|
// Get reference to window
|
||||||
HWND window;
|
*appstate = g_isle->GetWindowHandle();
|
||||||
if (g_isle->GetWindowHandle()) {
|
return 0;
|
||||||
window = g_isle->GetWindowHandle();
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Load accelerators (this call actually achieves nothing - there is no "AppAccel" resource in the original - but
|
|
||||||
// we'll keep this for authenticity) This line may actually be here because it's in DFVIEW, an example project that
|
|
||||||
// ships with MSVC420, and was such a clean example of a Win32 app, that it was later adapted into an "ExeSkeleton"
|
|
||||||
// sample for MSVC600. It's quite possible Mindscape derived this app from that example since they no longer had the
|
|
||||||
// luxury of the MFC AppWizard which we know they used for the frontend used during development (ISLEMFC.EXE,
|
|
||||||
// MAIN.EXE, et al.)
|
|
||||||
LoadAcceleratorsA(hInstance, "AppAccel");
|
|
||||||
|
|
||||||
|
int SDL_AppIterate(void* appstate)
|
||||||
|
{
|
||||||
MSG msg;
|
MSG msg;
|
||||||
|
|
||||||
|
if (g_closed) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!PeekMessageA(&msg, NULL, 0, 0, PM_NOREMOVE)) {
|
||||||
|
if (g_isle) {
|
||||||
|
g_isle->Tick(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_isle) {
|
||||||
|
g_isle->Tick(0);
|
||||||
|
}
|
||||||
|
|
||||||
while (!g_closed) {
|
while (!g_closed) {
|
||||||
while (!PeekMessageA(&msg, NULL, 0, 0, PM_NOREMOVE)) {
|
if (!PeekMessageA(&msg, NULL, 0, 0, PM_REMOVE)) {
|
||||||
if (g_isle) {
|
break;
|
||||||
g_isle->Tick(1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_isle) {
|
MSG nextMsg;
|
||||||
|
if (!g_isle || !g_isle->GetWindowHandle() || msg.message != WM_MOUSEMOVE ||
|
||||||
|
!PeekMessageA(&nextMsg, NULL, 0, 0, PM_NOREMOVE) || nextMsg.message != WM_MOUSEMOVE) {
|
||||||
|
TranslateMessage(&msg);
|
||||||
|
DispatchMessageA(&msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_reqEnableRMDevice) {
|
||||||
|
g_reqEnableRMDevice = FALSE;
|
||||||
|
VideoManager()->EnableRMDevice();
|
||||||
|
g_rmDisabled = FALSE;
|
||||||
|
Lego()->StopTimer();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_closed) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_mousedown && g_mousemoved && g_isle) {
|
||||||
g_isle->Tick(0);
|
g_isle->Tick(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!g_closed) {
|
if (g_mousemoved) {
|
||||||
if (!PeekMessageA(&msg, NULL, 0, 0, PM_REMOVE)) {
|
g_mousemoved = FALSE;
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
MSG nextMsg;
|
|
||||||
if (!g_isle || !g_isle->GetWindowHandle() || msg.message != WM_MOUSEMOVE ||
|
|
||||||
!PeekMessageA(&nextMsg, NULL, 0, 0, PM_NOREMOVE) || nextMsg.message != WM_MOUSEMOVE) {
|
|
||||||
TranslateMessage(&msg);
|
|
||||||
DispatchMessageA(&msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (g_reqEnableRMDevice) {
|
|
||||||
g_reqEnableRMDevice = FALSE;
|
|
||||||
VideoManager()->EnableRMDevice();
|
|
||||||
g_rmDisabled = FALSE;
|
|
||||||
Lego()->StopTimer();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (g_closed) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (g_mousedown && g_mousemoved && g_isle) {
|
|
||||||
g_isle->Tick(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (g_mousemoved) {
|
|
||||||
g_mousemoved = FALSE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DestroyWindow(window);
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return msg.wParam;
|
int SDL_AppEvent(void* appstate, const SDL_Event* event)
|
||||||
|
{
|
||||||
|
// Process events here once we use SDL window
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDL_AppQuit(void* appstate)
|
||||||
|
{
|
||||||
|
DestroyWindow((HWND) appstate);
|
||||||
}
|
}
|
||||||
|
|
||||||
// FUNCTION: ISLE 0x401ca0
|
// FUNCTION: ISLE 0x401ca0
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user