mirror of
https://github.com/collinsmith/riiablo.git
synced 2025-07-06 00:08:19 +07:00
Fixed an issue where Exploder was masking an incorrect number of bytes for the copy offset
This commit is contained in:
@ -126,7 +126,7 @@ public final class Exploder {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Base values used for the copy length
|
// Base values used for the copy length
|
||||||
private static final short[] LenBase = {
|
private static final int[] LenBase = {
|
||||||
0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009,
|
0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009,
|
||||||
0x000A, 0x000C, 0x0010, 0x0018, 0x0028, 0x0048, 0x0088, 0x0108
|
0x000A, 0x000C, 0x0010, 0x0018, 0x0028, 0x0048, 0x0088, 0x0108
|
||||||
};
|
};
|
||||||
@ -167,7 +167,7 @@ public final class Exploder {
|
|||||||
};
|
};
|
||||||
|
|
||||||
public static ByteBuf pkexplode(final ByteBuf inout) {
|
public static ByteBuf pkexplode(final ByteBuf inout) {
|
||||||
return pkexplode(inout.resetReaderIndex().duplicate(), inout.clear());
|
return pkexplode(inout.resetReaderIndex().slice(), inout.clear());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ByteBuf pkexplode(final ByteBuf in, final ByteBuf out) {
|
public static ByteBuf pkexplode(final ByteBuf in, final ByteBuf out) {
|
||||||
@ -190,7 +190,7 @@ public final class Exploder {
|
|||||||
final int[] ChBits = Exploder.ChBits;
|
final int[] ChBits = Exploder.ChBits;
|
||||||
final int[] LenCode = Exploder.LenCode;
|
final int[] LenCode = Exploder.LenCode;
|
||||||
final int[] LenBits = Exploder.LenBits;
|
final int[] LenBits = Exploder.LenBits;
|
||||||
final short[] LenBase = Exploder.LenBase;
|
final int[] LenBase = Exploder.LenBase;
|
||||||
final int[] ExLenBits = Exploder.ExLenBits;
|
final int[] ExLenBits = Exploder.ExLenBits;
|
||||||
final int[] OffsCode = Exploder.OffsCode;
|
final int[] OffsCode = Exploder.OffsCode;
|
||||||
final int[] OffsBits = Exploder.OffsBits;
|
final int[] OffsBits = Exploder.OffsBits;
|
||||||
@ -212,11 +212,11 @@ public final class Exploder {
|
|||||||
int copyLen;
|
int copyLen;
|
||||||
while (outPos < outSize) {
|
while (outPos < outSize) {
|
||||||
while (bitsCached < Short.SIZE) {
|
while (bitsCached < Short.SIZE) {
|
||||||
if (!in.isReadable()) {
|
if (!in.isReadable()) {
|
||||||
// Store the current size of output
|
// Store the current size of output
|
||||||
// nOutSize = pOutPos - pOutBuffer;
|
// nOutSize = pOutPos - pOutBuffer;
|
||||||
throw new InvalidFormat("PK_ERR_INCOMPLETE_INPUT: Incomplete input");
|
throw new InvalidFormat("PK_ERR_INCOMPLETE_INPUT: Incomplete input");
|
||||||
}
|
}
|
||||||
cache |= (in.readUnsignedByte() << bitsCached);
|
cache |= (in.readUnsignedByte() << bitsCached);
|
||||||
bitsCached += Byte.SIZE;
|
bitsCached += Byte.SIZE;
|
||||||
}
|
}
|
||||||
@ -255,9 +255,9 @@ public final class Exploder {
|
|||||||
// the dictionary size is
|
// the dictionary size is
|
||||||
int copyOffset;
|
int copyOffset;
|
||||||
if (copyLen == 2) {
|
if (copyLen == 2) {
|
||||||
copyOffset = dictPos - 1 - (i << 2) - (cache & BIT_MASKS[0x03]);
|
copyOffset = dictPos - 1 - (i << copyLen) - (cache & BIT_MASKS[copyLen]);
|
||||||
cache >>= 2;
|
cache >>= copyLen;
|
||||||
bitsCached -= 2;
|
bitsCached -= copyLen;
|
||||||
} else {
|
} else {
|
||||||
copyOffset = dictPos - 1 - (i << dictShift) - (cache & BIT_MASKS[dictShift]);
|
copyOffset = dictPos - 1 - (i << dictShift) - (cache & BIT_MASKS[dictShift]);
|
||||||
cache >>= dictShift;
|
cache >>= dictShift;
|
||||||
|
@ -93,6 +93,12 @@ public class MPQInputStreamTest extends RiiabloTest {
|
|||||||
test(d2speech, "data\\local\\sfx\\Common\\Amazon\\Ama_needhelp.wav");
|
test(d2speech, "data\\local\\sfx\\Common\\Amazon\\Ama_needhelp.wav");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void readBytes_COMPRESSED() {
|
||||||
|
final MPQ d2data = load("d2data");
|
||||||
|
test(d2data, "data\\local\\lng\\eng\\string.tbl");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void read() throws IOException {
|
public void read() throws IOException {
|
||||||
final MPQ d2data = load("d2data");
|
final MPQ d2data = load("d2data");
|
||||||
|
@ -31,4 +31,16 @@ public class DecompressorTest extends RiiabloTest {
|
|||||||
ByteBuf expected = Unpooled.wrappedBuffer(decompressor_out.readBytes());
|
ByteBuf expected = Unpooled.wrappedBuffer(decompressor_out.readBytes());
|
||||||
Assert.assertTrue(ByteBufUtil.equals(expected, actual));
|
Assert.assertTrue(ByteBufUtil.equals(expected, actual));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void decompress_exploder() {
|
||||||
|
FileHandle decompressor_in = Gdx.files.internal("test/decompressor_exploder_in.bin");
|
||||||
|
ByteBuf actual = Unpooled.buffer(0x1000).writeBytes(decompressor_in.readBytes());
|
||||||
|
Decompressor.decompress(actual, 0xaf8, 4096);
|
||||||
|
System.out.println(ByteBufUtil.prettyHexDump(actual));
|
||||||
|
|
||||||
|
FileHandle decompressor_out = Gdx.files.internal("test/decompressor_exploder_out.bin");
|
||||||
|
ByteBuf expected = Unpooled.wrappedBuffer(decompressor_out.readBytes());
|
||||||
|
Assert.assertTrue(ByteBufUtil.equals(expected, actual));
|
||||||
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user