From 2d7b235f15872f4ba0d712d038baa3681d66b4d2 Mon Sep 17 00:00:00 2001 From: Graham Date: Sat, 29 Oct 2022 14:47:43 +0100 Subject: [PATCH] Add support for the new OSRS short code map format Signed-off-by: Graham --- .../org/openrs2/archive/map/MapRenderer.kt | 44 ++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/archive/src/main/kotlin/org/openrs2/archive/map/MapRenderer.kt b/archive/src/main/kotlin/org/openrs2/archive/map/MapRenderer.kt index 165310e9..01992290 100644 --- a/archive/src/main/kotlin/org/openrs2/archive/map/MapRenderer.kt +++ b/archive/src/main/kotlin/org/openrs2/archive/map/MapRenderer.kt @@ -344,6 +344,40 @@ public class MapRenderer @Inject constructor( } } + private fun isShortCode(buf: ByteBuf): Boolean { + for (plane in 0 until LEVELS) { + for (dx in 0 until MAP_SIZE) { + for (dz in 0 until MAP_SIZE) { + while (true) { + if (buf.readableBytes() < 2) { + return false + } + + val code = buf.readUnsignedShort() + if (code == 0) { + break + } else if (code == 1) { + if (!buf.isReadable) { + return false + } + + buf.skipBytes(1) + break + } else if (code <= 49) { + if (buf.readableBytes() < 2) { + return false + } + + buf.skipBytes(2) + } + } + } + } + } + + return !buf.isReadable + } + private fun renderMap( image: BufferedImage, x: Int, @@ -352,6 +386,12 @@ public class MapRenderer @Inject constructor( underlayColors: Map, overlayColors: Map ) { + val readCode = if (isShortCode(buf.slice())) { + buf::readUnsignedShort + } else { + { buf.readUnsignedByte().toInt() } + } + for (plane in 0 until LEVELS) { for (dx in 0 until MAP_SIZE) { for (dz in 0 until MAP_SIZE) { @@ -360,14 +400,14 @@ public class MapRenderer @Inject constructor( var underlay = 0 while (true) { - val code = buf.readUnsignedByte().toInt() + val code = readCode() if (code == 0) { break } else if (code == 1) { buf.skipBytes(1) break } else if (code <= 49) { - overlay = buf.readUnsignedByte().toInt() + overlay = readCode() shape = (code - 2) shr 2 } else if (code <= 81) { // empty