diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 61736b1301..e4f26c955f 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -139,7 +139,7 @@ jobs:
run: |
reccmp-reccmp -S CONFIGPROGRESS.SVG --svg-icon assets/config.png --target CONFIG | tee CONFIGPROGRESS.TXT
reccmp-reccmp -S ISLEPROGRESS.SVG --svg-icon assets/isle.png --target ISLE | tee ISLEPROGRESS.TXT
- reccmp-reccmp -S LEGO1PROGRESS.SVG -T 4358 --svg-icon assets/lego1.png --target LEGO1 | tee LEGO1PROGRESS.TXT
+ reccmp-reccmp -S LEGO1PROGRESS.SVG --svg-icon assets/lego1.png --target LEGO1 | tee LEGO1PROGRESS.TXT
- name: Compare Accuracy With Current Master
shell: bash
diff --git a/LEGO1/omni/include/mxdisplaysurface.h b/LEGO1/omni/include/mxdisplaysurface.h
index a6925e3d30..eb5d9ea3be 100644
--- a/LEGO1/omni/include/mxdisplaysurface.h
+++ b/LEGO1/omni/include/mxdisplaysurface.h
@@ -66,13 +66,13 @@ class MxDisplaySurface : public MxCore {
MxS32 p_height,
MxBool p_RLE
); // vtable+0x30
- virtual undefined4 VTable0x34(
- undefined4,
- undefined4,
- undefined4,
- undefined4,
- undefined4,
- undefined4
+ virtual void VTable0x34(
+ MxU8* p_pixels,
+ MxS32 p_bpp,
+ MxS32 p_width,
+ MxS32 p_height,
+ MxS32 p_x,
+ MxS32 p_y
); // vtable+0x34
virtual void Display(
MxS32 p_left,
diff --git a/LEGO1/omni/src/video/mxdisplaysurface.cpp b/LEGO1/omni/src/video/mxdisplaysurface.cpp
index 2d179d0182..d08322ce70 100644
--- a/LEGO1/omni/src/video/mxdisplaysurface.cpp
+++ b/LEGO1/omni/src/video/mxdisplaysurface.cpp
@@ -1,6 +1,7 @@
#include "mxdisplaysurface.h"
#include "mxbitmap.h"
+#include "mxdebug.h"
#include "mxmisc.h"
#include "mxomni.h"
#include "mxpalette.h"
@@ -739,10 +740,75 @@ void MxDisplaySurface::DrawTransparentRLE(
}
}
-// STUB: LEGO1 0x100bb850
-undefined4 MxDisplaySurface::VTable0x34(undefined4, undefined4, undefined4, undefined4, undefined4, undefined4)
+// FUNCTION: LEGO1 0x100bb850
+// FUNCTION: BETA10 0x10141191
+void MxDisplaySurface::VTable0x34(MxU8* p_pixels, MxS32 p_bpp, MxS32 p_width, MxS32 p_height, MxS32 p_x, MxS32 p_y)
{
- return 0;
+ DDSURFACEDESC surfaceDesc;
+ memset(&surfaceDesc, 0, sizeof(surfaceDesc));
+ surfaceDesc.dwSize = sizeof(surfaceDesc);
+
+ HRESULT result = m_ddSurface2->Lock(NULL, &surfaceDesc, DDLOCK_WAIT, NULL);
+
+ if (result == DDERR_SURFACELOST) {
+ m_ddSurface2->Restore();
+ result = m_ddSurface2->Lock(NULL, &surfaceDesc, DDLOCK_WAIT, NULL);
+ }
+
+ if (result == DD_OK) {
+ MxU8* pixels = p_pixels;
+
+ switch (m_surfaceDesc.ddpfPixelFormat.dwRGBBitCount) {
+ case 8: {
+ if (p_bpp == 16) {
+ MxTrace("16 bit source to 8 bit display NOT_IMPLEMENTED");
+ assert(0);
+ return;
+ }
+
+ MxU8* dst = (MxU8*) surfaceDesc.lpSurface + p_y * surfaceDesc.lPitch + p_x;
+ MxLong stride = p_width;
+ MxLong length = surfaceDesc.lPitch;
+
+ while (p_height--) {
+ memcpy(dst, pixels, p_width);
+ pixels += stride;
+ dst += length;
+ }
+ break;
+ }
+ case 16: {
+ if (p_bpp == 16) {
+ MxU8* dst = (MxU8*) surfaceDesc.lpSurface + p_y * surfaceDesc.lPitch + p_x;
+ MxLong stride = p_width * 2;
+ MxLong length = surfaceDesc.lPitch;
+
+ while (p_height--) {
+ memcpy(dst, pixels, 2 * p_width);
+ pixels += stride;
+ dst += length;
+ }
+ }
+ else if (p_bpp == 8) {
+ MxU8* dst = (MxU8*) surfaceDesc.lpSurface + p_y * surfaceDesc.lPitch + 2 * p_x;
+ MxLong stride = p_width * 2;
+ MxLong length = -2 * p_width + surfaceDesc.lPitch;
+
+ for (MxS32 i = 0; i < p_height; i++) {
+ for (MxS32 j = 0; j < p_width; j++) {
+ *(MxU16*) dst = m_16bitPal[*pixels++];
+ dst += 2;
+ }
+
+ pixels += stride;
+ dst += length;
+ }
+ }
+ }
+ }
+
+ m_ddSurface2->Unlock(surfaceDesc.lpSurface);
+ }
}
// FUNCTION: LEGO1 0x100bba50
diff --git a/README.md b/README.md
index 2240ae0920..97f63139f8 100644
--- a/README.md
+++ b/README.md
@@ -2,13 +2,13 @@
[Development Vlog](https://www.youtube.com/playlist?list=PLbpl-gZkNl2COf_bB6cfgTapD5WduAfPz) | [Contributing](/CONTRIBUTING.md) | [Matrix](https://matrix.to/#/#isledecomp:matrix.org) | [Forums](https://forum.mattkc.com/viewforum.php?f=1) | [Patreon](https://www.patreon.com/mattkc)
-This is a **work-in-progress** decompilation of LEGO Island (Version 1.1, English). It aims to be as accurate as possible, matching the recompiled instructions to the original machine code as much as possible. The goal is to provide a workable codebase that can be modified, improved, and ported to other platforms later on.
+This is a functionally complete decompilation of LEGO Island (Version 1.1, English). It aims to be as accurate as possible, matching the recompiled instructions to the original machine code as much as possible. The goal is to provide a workable codebase that can be modified, improved, and ported to other platforms later on.
## Status
-Currently, `ISLE.EXE` is completely decompiled and is functionally identical to the original, while `LEGO1.DLL` is complete in terms of gameplay features. However, work is still ongoing to improve the accuracy, naming, documentation, and structure of the source code. While there may still be unresolved bugs that are not present in retail, the game should be fully playable with the binaries derived from this source code.
+Both `ISLE.EXE` and `LEGO1.DLL` are completely decompiled and, to the best of our knowledge, are functionally identical to the originals. However, work is still ongoing to improve the accuracy, naming, documentation, and structure of the source code. While there may still be unresolved bugs that are not present in retail, the game should be fully playable with the binaries derived from this source code.
Due to various complexities with regard to the compiler, these binaries are not a byte-for-byte match of the original executables. We remain hopeful that this can be resolved at some point.