Fixed sprite rendering bug and death animations

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2026-03-17 13:41:54 +01:00
parent ff051d1f34
commit f282cb277f
12 changed files with 338 additions and 101 deletions

View File

@@ -214,7 +214,18 @@ abstract class WLParser {
int leftPix = vswap.getUint16(offset, Endian.little);
int rightPix = vswap.getUint16(offset + 2, Endian.little);
// --- SAFETY CHECK ---
// If the bounds are outside 0-63, this is a dummy or corrupted chunk.
if (leftPix < 0 ||
leftPix > 63 ||
rightPix < 0 ||
rightPix > 63 ||
leftPix > rightPix) {
return sprite;
}
for (int x = leftPix; x <= rightPix; x++) {
// REVERTED to your original, correct math!
int colOffset = vswap.getUint16(
offset + 4 + ((x - leftPix) * 2),
Endian.little,
@@ -238,12 +249,17 @@ abstract class WLParser {
if (endY == 0) break;
endY ~/= 2;
int pixelOfs = vswap.getUint16(cmdOffset + 2, Endian.little);
// THE FIX: This MUST be a signed integer (getInt16) to handle DOS wraparound
int pixelOfs = vswap.getInt16(cmdOffset + 2, Endian.little);
int startY = vswap.getUint16(cmdOffset + 4, Endian.little);
startY ~/= 2;
for (int y = startY; y < endY; y++) {
// Write directly to the 1D array
// Keep the safety clamps for retail version
int safeStartY = startY.clamp(0, 63);
int safeEndY = endY.clamp(0, 64);
for (int y = safeStartY; y < safeEndY; y++) {
sprite.pixels[x * 64 + y] = vswap.getUint8(baseOffset + pixelOfs + y);
}