isle-portable/ISLE/isle.h

147 lines
2.9 KiB
C
Raw Normal View History

2023-04-27 22:19:39 -04:00
#ifndef ISLE_H
#define ISLE_H
#include "legoinc.h"
#include "define.h"
#include "legoomni.h"
2023-05-05 05:54:17 -04:00
#include "mxresult.h"
#include "mxvideoparam.h"
2023-04-27 22:19:39 -04:00
class Isle
{
public:
Isle();
~Isle();
void Close();
BOOL ReadReg(LPCSTR name, LPSTR outValue, DWORD outSize);
int ReadRegBool(LPCSTR name, BOOL *out);
int ReadRegInt(LPCSTR name, int *out);
2023-04-27 22:19:39 -04:00
MxResult SetupWindow(HINSTANCE hInstance);
2023-04-27 22:19:39 -04:00
void Tick(BOOL sleepIfNotNextFrame);
2023-04-27 22:19:39 -04:00
BOOL SetupLegoOmni();
void LoadConfig();
void SetupVideoFlags(BOOL fullScreen, BOOL flipSurfaces, BOOL backBuffers,
2023-04-27 22:19:39 -04:00
BOOL using8bit, BOOL m_using16bit, BOOL param_6, BOOL param_7,
BOOL wideViewAngle, char *deviceId);
void SetupCursor(WPARAM wParam);
2023-04-27 23:34:11 -04:00
// private:
2023-04-27 22:19:39 -04:00
// 0
LPSTR m_hdPath;
LPSTR m_cdPath;
LPSTR m_deviceId;
LPSTR m_savePath;
// 10
BOOL m_fullScreen;
BOOL m_flipSurfaces;
BOOL m_backBuffersInVram;
BOOL m_using8bit;
// 20
BOOL m_using16bit;
int m_unk24;
BOOL m_use3dSound;
BOOL m_useMusic;
// 30
BOOL m_useJoystick;
int m_joystickIndex;
BOOL m_wideViewAngle;
int m_islandQuality;
// 40
int m_islandTexture;
int m_gameStarted;
long m_frameDelta;
// 4c
MxVideoParam m_videoParam;
// 70
BOOL m_windowActive;
HWND m_windowHandle;
BOOL m_drawCursor;
2023-04-27 23:34:11 -04:00
HCURSOR m_cursorArrow;
2023-04-27 22:19:39 -04:00
// 80
2023-04-27 23:34:11 -04:00
HCURSOR m_cursorBusy;
HCURSOR m_cursorNo;
HCURSOR m_cursorCurrent;
2023-04-27 22:19:39 -04:00
};
// OFFSET: ISLE 0x402c20
inline void Isle::Tick(BOOL sleepIfNotNextFrame)
{
if (this->m_windowActive) {
if (!Lego()) return;
if (!TickleManager()) return;
if (!Timer()) return;
long currentTime = Timer()->GetRealTime();
if (currentTime < g_lastFrameTime) {
g_lastFrameTime = -this->m_frameDelta;
}
if (this->m_frameDelta + g_lastFrameTime < currentTime) {
if (!Lego()->vtable40()) {
TickleManager()->Tickle();
}
g_lastFrameTime = currentTime;
if (g_startupDelay == 0) {
return;
}
g_startupDelay--;
if (g_startupDelay != 0) {
return;
}
LegoOmni::GetInstance()->CreateBackgroundAudio();
BackgroundAudioManager()->Enable(this->m_useMusic);
MxStreamController *stream = Streamer()->Open("\\lego\\scripts\\isle\\isle", 0);
MxDSAction ds;
if (!stream) {
stream = Streamer()->Open("\\lego\\scripts\\nocd", 0);
if (!stream) {
return;
}
ds.SetAtomId(stream->atom);
ds.SetUnknown24(-1);
ds.SetUnknown1c(0);
VideoManager()->EnableFullScreenMovie(TRUE, TRUE);
if (Start(&ds) != SUCCESS) {
return;
}
} else {
ds.SetAtomId(stream->atom);
ds.SetUnknown24(-1);
ds.SetUnknown1c(0);
if (Start(&ds) != SUCCESS) {
return;
}
this->m_gameStarted = 1;
}
return;
}
if (sleepIfNotNextFrame == 0) return;
}
Sleep(0);
}
2023-04-27 22:19:39 -04:00
#endif // ISLE_H