mirror of
https://github.com/isledecomp/isle.git
synced 2025-10-22 16:04:17 +00:00
Implement MxDisplaySurface::VTable0x34 (#1264)
* Implement MxDisplaySurface::VTable0x34 * Match * Remove function count since we got them all * Update README.md * Remove emphasis on work-in-progress --------- Co-authored-by: Christian Semmler <mail@csemmler.com>
This commit is contained in:

committed by
GitHub

parent
5ffa91d5fd
commit
938a5d7f19
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@@ -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
|
||||
|
@@ -66,13 +66,13 @@ public:
|
||||
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,
|
||||
|
@@ -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 @@ sixteen_bit:
|
||||
}
|
||||
}
|
||||
|
||||
// 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
|
||||
|
@@ -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
|
||||
|
||||
<img src="https://legoisland.org/progress/ISLEPROGRESS.SVG" width="50%"><img src="https://legoisland.org/progress/LEGO1PROGRESS.SVG" width="50%">
|
||||
|
||||
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.
|
||||
|
||||
|
Reference in New Issue
Block a user