From 6207d1f775f7a8a94603a2f246fd30287b50b8f6 Mon Sep 17 00:00:00 2001 From: MS Date: Wed, 21 Jun 2023 03:30:07 -0400 Subject: [PATCH 1/5] add more MxString functions (#31) --- LEGO1/mxstring.cpp | 60 +++++++++++++++++++++++++++++++++++++++++----- LEGO1/mxstring.h | 4 ++++ 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/LEGO1/mxstring.cpp b/LEGO1/mxstring.cpp index 81188291..37d7b7e6 100644 --- a/LEGO1/mxstring.cpp +++ b/LEGO1/mxstring.cpp @@ -11,6 +11,60 @@ MxString::MxString() this->m_length = 0; } +// OFFSET: LEGO1 0x100ae2a0 +MxString::MxString(const MxString &str) +{ + this->m_length = str.m_length; + this->m_data = (char *)malloc(this->m_length + 1); + strcpy(this->m_data, str.m_data); +} + +// OFFSET: LEGO1 0x100ae350 +MxString::MxString(const char *str) +{ + if (str) { + this->m_length = strlen(str); + this->m_data = (char *)malloc(this->m_length + 1); + strcpy(this->m_data, str); + } else { + this->m_data = (char *)malloc(1); + this->m_data[0] = 0; + this->m_length = 0; + } +} + +// OFFSET: LEGO1 0x100ae420 +MxString::~MxString() +{ + free(this->m_data); +} + +// OFFSET: LEGO1 0x100ae490 +void MxString::ToUpperCase() +{ + strupr(this->m_data); +} + +// OFFSET: LEGO1 0x100ae4a0 +void MxString::ToLowerCase() +{ + strlwr(this->m_data); +} + +// OFFSET: LEGO1 0x100ae4b0 +const MxString &MxString::operator=(MxString *param) +{ + if (this->m_data != param->m_data) + { + free(this->m_data); + this->m_length = param->m_length; + this->m_data = (char *)malloc(this->m_length + 1); + strcpy(this->m_data, param->m_data); + } + + return *this; +} + // TODO: this *mostly* matches, again weird with the comparison // OFFSET: LEGO1 0x100ae510 const MxString &MxString::operator=(const char *param) @@ -25,9 +79,3 @@ const MxString &MxString::operator=(const char *param) return *this; } - -// OFFSET: LEGO1 0x100ae420 -MxString::~MxString() -{ - free(this->m_data); -} diff --git a/LEGO1/mxstring.h b/LEGO1/mxstring.h index 9551f1c9..0f9ff9f3 100644 --- a/LEGO1/mxstring.h +++ b/LEGO1/mxstring.h @@ -11,6 +11,10 @@ class MxString : public MxCore __declspec(dllexport) const MxString &operator=(const char *); MxString(); + MxString(const char *); + void ToUpperCase(); + void ToLowerCase(); + const MxString &operator=(MxString *); private: char *m_data; From 124a5ddaa35eb0d36e1df595d0cdc54369e75c29 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Wed, 21 Jun 2023 09:30:46 +0200 Subject: [PATCH 2/5] isle: Accuracy improvements (#27) * Isle::Isle 100% accuracy * Isle::~Isle 100% * improve accuracy of ReadReg functions * refactor * fix Isle::ReadRegBool * fix Isle::ReadRegInt * empty commit to reset GH action * fix Isle::SetupLegoOmni --- ISLE/isle.cpp | 36 +++++++++++++++++------------------- ISLE/isle.h | 6 +++++- LEGO1/mxrect32.h | 8 ++++++++ 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/ISLE/isle.cpp b/ISLE/isle.cpp index 5e9e1ec4..7c981bd0 100644 --- a/ISLE/isle.cpp +++ b/ISLE/isle.cpp @@ -37,13 +37,7 @@ Isle::Isle() m_frameDelta = 10; m_windowActive = 1; - MxRect32 rect; - rect.m_left = 0; - rect.m_top = 0; - rect.m_right = 639; - rect.m_bottom = 479; - - m_videoParam = MxVideoParam(rect, NULL, 1, MxVideoParamFlags()); + m_videoParam = MxVideoParam(MxRect32(0, 0, 639, 479), NULL, 1, MxVideoParamFlags()); m_videoParam.flags().Enable16Bit(MxDirectDraw::GetPrimaryBitDepth() == 16); m_windowHandle = NULL; @@ -116,7 +110,7 @@ void Isle::Close() } // OFFSET: ISLE 0x402740 -BOOL ReadReg(LPCSTR name, LPSTR outValue, DWORD outSize) +BOOL Isle::ReadReg(LPCSTR name, LPSTR outValue, DWORD outSize) { HKEY hKey; DWORD valueType; @@ -135,7 +129,7 @@ BOOL ReadReg(LPCSTR name, LPSTR outValue, DWORD outSize) } // OFFSET: ISLE 0x4027b0 -int ReadRegBool(LPCSTR name, BOOL *out) +int Isle::ReadRegBool(LPCSTR name, BOOL *out) { char buffer[256]; @@ -143,28 +137,30 @@ int ReadRegBool(LPCSTR name, BOOL *out) if (read) { if (strcmp("YES", buffer) == 0) { *out = TRUE; - return TRUE; + return read; } if (strcmp("NO", buffer) == 0) { *out = FALSE; - return TRUE; + return read; } + + read = FALSE; } - return FALSE; + return read; } // OFFSET: ISLE 0x402880 -int ReadRegInt(LPCSTR name, int *out) +int Isle::ReadRegInt(LPCSTR name, int *out) { char buffer[256]; - if (ReadReg(name, buffer, sizeof(buffer))) { + BOOL read = ReadReg(name, buffer, sizeof(buffer)); + if (read) { *out = atoi(buffer); - return TRUE; } - return FALSE; + return read; } // OFFSET: ISLE 0x4028d0 @@ -256,16 +252,18 @@ void Isle::SetupVideoFlags(BOOL fullScreen, BOOL flipSurfaces, BOOL backBuffers, // OFFSET: ISLE 0x4013b0 BOOL Isle::SetupLegoOmni() { + BOOL result = FALSE; char mediaPath[256]; GetProfileStringA("LEGO Island", "MediaPath", "", mediaPath, sizeof(mediaPath)); - if (Lego()->Create(MxOmniCreateParam(mediaPath, (struct HWND__ *) m_windowHandle, m_videoParam, MxOmniCreateFlags())) != FAILURE) { + BOOL failure = Lego()->Create(MxOmniCreateParam(mediaPath, (struct HWND__ *) m_windowHandle, m_videoParam, MxOmniCreateFlags())) == FAILURE; + if (!failure) { VariableTable()->SetVariable("ACTOR_01", ""); TickleManager()->vtable1c(VideoManager(), 10); - return TRUE; + result = TRUE; } - return FALSE; + return result; } // OFFSET: ISLE 0x402e80 diff --git a/ISLE/isle.h b/ISLE/isle.h index d4f4e42e..4d6b73c4 100644 --- a/ISLE/isle.h +++ b/ISLE/isle.h @@ -12,7 +12,11 @@ class Isle Isle(); ~Isle(); - static void Close(); + void Close(); + + BOOL ReadReg(LPCSTR name, LPSTR outValue, DWORD outSize); + int ReadRegBool(LPCSTR name, BOOL *out); + int ReadRegInt(LPCSTR name, int *out); MxResult SetupWindow(HINSTANCE hInstance); diff --git a/LEGO1/mxrect32.h b/LEGO1/mxrect32.h index 764117ec..092396f5 100644 --- a/LEGO1/mxrect32.h +++ b/LEGO1/mxrect32.h @@ -4,6 +4,14 @@ class MxRect32 { public: + MxRect32(int p_left, int p_top, int p_right, int p_bottom) + { + this->m_left = p_left; + this->m_top = p_top; + this->m_right = p_right; + this->m_bottom = p_bottom; + } + int m_left; int m_top; int m_right; From bfa035ca7964b1c50c4f280c24c0ac3ec5f3767c Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Wed, 21 Jun 2023 09:30:59 +0200 Subject: [PATCH 3/5] isle: Match Isle::SetupCursor (#28) * match Isle::SetupCursor * case --- ISLE/isle.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ISLE/isle.cpp b/ISLE/isle.cpp index 7c981bd0..a58ad707 100644 --- a/ISLE/isle.cpp +++ b/ISLE/isle.cpp @@ -281,6 +281,14 @@ void Isle::SetupCursor(WPARAM wParam) break; case 0xB: m_cursorCurrent = NULL; + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 0xA: break; } From 4b71fb88153cef88d22361a0212388f3c896ca1b Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 21 Jun 2023 00:36:38 -0700 Subject: [PATCH 4/5] ci: upload HTML summaries of accuracy/progress too --- .github/workflows/build.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3e98bafd..335b9699 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -60,11 +60,14 @@ jobs: C:\msys64\usr\bin\wget.exe https://legoisland.org/download/ISLE.EXE C:\msys64\usr\bin\wget.exe https://legoisland.org/download/LEGO1.DLL pip install capstone - python3 tools/reccomp/reccomp.py ISLE.EXE Release/ISLE.EXE Release/ISLE.PDB ISLE - python3 tools/reccomp/reccomp.py LEGO1.DLL Release/LEGO1.DLL Release/LEGO1.PDB LEGO1 + python3 tools/reccomp/reccomp.py -h ISLEPROGRESS.HTML ISLE.EXE Release/ISLE.EXE Release/ISLE.PDB ISLE + python3 tools/reccomp/reccomp.py -h LEGO1PROGRESS.HTML LEGO1.DLL Release/LEGO1.DLL Release/LEGO1.PDB LEGO1 - name: Upload Artifact uses: actions/upload-artifact@master with: name: Win32 - path: Release + path: | + Release + ISLEPROGRESS.HTML + LEGO1PROGRESS.HTML From 2644be3ca65e3582d75eb4ae061368b268ade559 Mon Sep 17 00:00:00 2001 From: Joshua Peisach Date: Wed, 21 Jun 2023 03:37:46 -0400 Subject: [PATCH 5/5] MxTimer matching (#29) * MxTimer::Start - swap instruction order Technically, isRunning is set after getting the real time according to the pseudo code, which i guess is fine, you dont know it started until it really started * MxTimer - finish tweaking to match assembly --- LEGO1/mxtimer.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/LEGO1/mxtimer.cpp b/LEGO1/mxtimer.cpp index 8be837d4..782ccd70 100644 --- a/LEGO1/mxtimer.cpp +++ b/LEGO1/mxtimer.cpp @@ -10,17 +10,18 @@ long MxTimer::s_LastTimeTimerStarted = 0; // OFFSET: LEGO1 0x100ae060 MxTimer::MxTimer() -{ - this->m_isRunning = MX_FALSE; - MxTimer::s_LastTimeCalculated = timeGetTime(); - this->m_startTime = MxTimer::s_LastTimeCalculated; +{ + this->m_isRunning = MX_FALSE; + m_startTime = timeGetTime(); + // yeah this is somehow what the asm is + s_LastTimeCalculated = m_startTime; } // OFFSET: LEGO1 0x100ae160 void MxTimer::Start() { + s_LastTimeTimerStarted = this->GetRealTime(); this->m_isRunning = MX_TRUE; - MxTimer::s_LastTimeTimerStarted = timeGetTime(); } // OFFSET: LEGO1 0x100ae180