diff --git a/src/main/kotlin/Rs2MapEditor.kt b/src/main/kotlin/Rs2MapEditor.kt index b0fa85e..9e0a156 100644 --- a/src/main/kotlin/Rs2MapEditor.kt +++ b/src/main/kotlin/Rs2MapEditor.kt @@ -17,7 +17,6 @@ import java.awt.* import java.awt.event.KeyEvent import java.awt.event.MouseAdapter import java.awt.event.MouseEvent -import java.lang.Exception import javax.swing.* import javax.swing.border.* import kotlin.system.exitProcess @@ -141,16 +140,28 @@ object Rs2MapEditor { val border: Border = MatteBorder(1, 1, if (row == mapHeight) 1 else 0, if (column == mapWidth) 1 else 0, Color.GRAY) val flippedY = (64 - row) - 1 val point = Point(column, flippedY) - colorPointMap[point] = MapTileParser.definition.getTile(column, flippedY, plane).underlayId + colorPointMap[point] = MapTileParser.definition.getTile(column, flippedY, plane).underlayId - 1 val mapCell = MapCell() - val overlayID = MapTileParser.definition.getTile(column, flippedY, plane).overlayId - val floDef = overlayMap[overlayID]!! + var overlayID = (MapTileParser.definition.getTile(column, flippedY, plane).overlayId - 1) + if (overlayID < 0) { + overlayID = 0 + } + var underlayID = (MapTileParser.definition.getTile(column, flippedY, plane).underlayId - 1) + if (underlayID < 0) { + underlayID = 0 + } + val fluDef = underlayMap[underlayID] + val floDef = overlayMap[overlayID] - if (overlayID == 0) { - mapCell.background = underlayMap[MapTileParser.definition.getTile(column, flippedY, plane).underlayId]!!.getRGB() + if (underlayID == 0) { + mapCell.background = Color(overlayMap[overlayID + 1]!!.color) + } else if (overlayID == 0) { + mapCell.background = fluDef!!.getRGB() + } else if (floDef!!.blendColor != -1) { + mapCell.background = Color(floDef.blendColor) } else { - mapCell.background = overlayMap[overlayID]!!.getRGB() + mapCell.background = floDef.getRGB() } mapCell.border = border @@ -512,9 +523,9 @@ object Rs2MapEditor { selectedUnderlayId = id } statusLabel.text = "Region: $region | " + - "Local Coordinates: [$selectedPointX, $selectedPointY] | " + - "Global Coordinates: [${MapTileParser.coordinateX(selectedPointX)}, ${MapTileParser.coordinateX(selectedPointY)}] | " + - "Viewing Underlay: ${MapTileParser.definition.getTile(selectedPointX, selectedPointY, 0).underlayId} | " + + "Local Coordinates: [$selectedPointX, $selectedPointY, $plane] | " + + "Global Coordinates: [${MapTileParser.coordinateX(selectedPointX)}, ${MapTileParser.coordinateX(selectedPointY)}, $plane] | " + + "Viewing Underlay: ${MapTileParser.definition.getTile(selectedPointX, selectedPointY, 0).underlayId - 1} | " + "Selected Underlay: ${if (selectedUnderlayId == null) "No underlay selected!" else "$selectedUnderlayId"}" } else -> { diff --git a/src/main/kotlin/cacheops/cache/definition/data/BlendedTextureDefinition.kt b/src/main/kotlin/cacheops/cache/definition/data/BlendedTextureDefinition.kt new file mode 100644 index 0000000..27ad4d2 --- /dev/null +++ b/src/main/kotlin/cacheops/cache/definition/data/BlendedTextureDefinition.kt @@ -0,0 +1,9 @@ +package cacheops.cache.definition.data + +import cacheops.cache.Definition + +data class BlendedTextureDefinition( + override var id: Int = -1, + var renderOnMap: Boolean = false, + var blendedColor: Int = -1 +) : Definition \ No newline at end of file diff --git a/src/main/kotlin/cacheops/cache/definition/decoder/BlendedTextureDecoder.kt b/src/main/kotlin/cacheops/cache/definition/decoder/BlendedTextureDecoder.kt new file mode 100644 index 0000000..2efec55 --- /dev/null +++ b/src/main/kotlin/cacheops/cache/definition/decoder/BlendedTextureDecoder.kt @@ -0,0 +1,95 @@ +package cacheops.cache.definition.decoder + +import cacheops.cache.Cache +import cacheops.cache.DefinitionDecoder +import cacheops.cache.buffer.read.BufferReader +import cacheops.cache.buffer.read.Reader +import cacheops.cache.definition.data.BlendedTextureDefinition +import const.Indices + +class BlendedTextureDecoder(cache: Cache) : DefinitionDecoder(cache, Indices.MATERIALS) { + + companion object { + val blendedTextureDef = HashMap() + } + + override fun create() = BlendedTextureDefinition() + + var metricsCount = 0 + + override val last: Int + get() = metricsCount + + init { + val data = getData(0, 0) + if (data != null) { + decode(BufferReader(data)) + } + } + + fun decode(buffer: Reader) { + metricsCount = buffer.readShort() + for (id in 0 until metricsCount) { + if (buffer.readUnsignedBoolean()) { + blendedTextureDef[id] = BlendedTextureDefinition(id = id) + } + } + + for (texture in blendedTextureDef.values) { // J + texture.renderOnMap = !buffer.readUnsignedBoolean() // 0 + } + for (texture in blendedTextureDef.values) { + buffer.readUnsignedBoolean() // 1 + } + for (texture in blendedTextureDef.values) { + buffer.readUnsignedBoolean() // 1 + } + for (texture in blendedTextureDef.values) { + buffer.readByte().toByte() // 1 + } + for (texture in blendedTextureDef.values) { + buffer.readByte().toByte() + } + for (texture in blendedTextureDef.values) { + buffer.readByte().toByte() + } + for (texture in blendedTextureDef.values) { + buffer.readByte().toByte() + } + for (texture in blendedTextureDef.values) { + texture.blendedColor = buffer.readUnsignedShort() + println(texture.blendedColor) + } + for (texture in blendedTextureDef.values) { + buffer.readByte().toByte() + } + for (texture in blendedTextureDef.values) { + buffer.readByte().toByte() + } + for (texture in blendedTextureDef.values) { + buffer.readUnsignedBoolean() + } + for (texture in blendedTextureDef.values) { + buffer.readUnsignedBoolean() + } + for (texture in blendedTextureDef.values) { + buffer.readByte().toByte() + } + for (texture in blendedTextureDef.values) { + buffer.readUnsignedBoolean() + } + for (texture in blendedTextureDef.values) { + buffer.readUnsignedBoolean() + } + for (texture in blendedTextureDef.values) { + buffer.readUnsignedBoolean() + } + } + + override fun clear() { + } + + override fun BlendedTextureDefinition.read(opcode: Int, buffer: Reader) { + throw IllegalStateException("Shouldn't be used.") + } +} \ No newline at end of file diff --git a/src/main/kotlin/cacheops/cache/definition/decoder/FloorOverlayDecoder.kt b/src/main/kotlin/cacheops/cache/definition/decoder/FloorOverlayDecoder.kt index f9c4e2b..2e61fb1 100644 --- a/src/main/kotlin/cacheops/cache/definition/decoder/FloorOverlayDecoder.kt +++ b/src/main/kotlin/cacheops/cache/definition/decoder/FloorOverlayDecoder.kt @@ -26,9 +26,6 @@ class FloorOverlayDecoder { while (true) { val opcode = buffer.unsignedByte() if (opcode == 0) { - if (color == 12098407) { - color = waterColor - } return OverlayDefinition(color, texture, hideUnderlay, blendColor, scale, blockShadow, aByte0, blendTexture, waterColor, waterScale, anInt0, waterIntensity) } decodeOverlayType(opcode, buffer) diff --git a/src/main/kotlin/worldmap/OverlayHandler.kt b/src/main/kotlin/worldmap/OverlayHandler.kt new file mode 100644 index 0000000..900c353 --- /dev/null +++ b/src/main/kotlin/worldmap/OverlayHandler.kt @@ -0,0 +1,185 @@ +package worldmap + +import cacheops.cache.definition.data.OverlayDefinition +import cacheops.cache.definition.decoder.BlendedTextureDecoder +import cacheops.cache.definition.decoder.FloorOverlayConfiguration +import kotlin.math.pow + +object OverlayHandler { + + var blendedOverlayColors: IntArray = IntArray(FloorOverlayConfiguration.floorOverlays.size + 1) + var p: IntArray = IntArray(65536) + + var f_l = (Math.random() * 11.0).toInt() - 5 + var n = (Math.random() * 17.0).toInt() - 8 + + fun init() { + f(0) + f_l += -2 + (5.0 * Math.random()).toInt() + if (f_l < -8) { + f_l = -8 + } + n += -2 + (Math.random() * 5.0).toInt() + if (f_l > 8) { + f_l = 8 + } + if (n < -16) { + n = -16 + } + if (n > 16) { + n = 16 + } + setOverlayColorArray(((f_l shr 2) shl 10), n shr 1) + } + + fun setOverlayColorArray(randomColorOffset1: Int, randomColorOffset2: Int) { + for (overlayId in 0 until FloorOverlayConfiguration.floorOverlays.size) { + blendedOverlayColors[overlayId + 1] = getOverlayColor(overlayId,randomColorOffset1,randomColorOffset2) + } + } + + fun getOverlayColor(id: Int, colorOffset1: Int, colorOffset2: Int): Int { + val floDefinition: OverlayDefinition = FloorOverlayConfiguration.floorOverlays[id] ?: return 0 + var floorOverlayTexture = floDefinition.texture + if (floorOverlayTexture >= 0 && BlendedTextureDecoder.blendedTextureDef[floorOverlayTexture]!!.renderOnMap) { + floorOverlayTexture = -1 + } + val negativeRGBColor: Int + if (floDefinition.blendColor >= 0) { + val floorOverlayBlendColor = floDefinition.blendColor + var offsetBlendedValue = ((floorOverlayBlendColor and 0x7F) + colorOffset2) + if (offsetBlendedValue < 0) { + offsetBlendedValue = 0 + } else if (offsetBlendedValue > 127) { + offsetBlendedValue = 127 + } + val combinedBlendedValue = ((floorOverlayBlendColor + (colorOffset1 and 0xfc00) + ((floorOverlayBlendColor and 0x380))) + offsetBlendedValue) + negativeRGBColor = (0xffffff.inv() or p[colorFunc2(colorFunc1(96, 2, combinedBlendedValue),-2045205981).toInt() and 0xffff]) + } else if (floorOverlayTexture >= 0) { + negativeRGBColor = (0xffffff.inv() or p[colorFunc2(colorFunc1(96, 2, BlendedTextureDecoder.blendedTextureDef[floorOverlayTexture]!!.blendedColor),-2045205981).toInt() and 0xffff]) + } else if (floDefinition.color == -1) { + negativeRGBColor = 0 + } else { + val floorOverlayColor = floDefinition.color + var offsetColorValue = ((floorOverlayColor and 0x7f) + colorOffset2) + if (offsetColorValue < 0) { + offsetColorValue = 0 + } else if (offsetColorValue > 127) { + offsetColorValue = 127 + } + val combinedColorValue = (((colorOffset1 and 0xfc00) + floorOverlayColor) + ((floorOverlayColor and 0x380) + offsetColorValue)) + negativeRGBColor = (0xffffff.inv() or p[colorFunc2(colorFunc1(96, 2, combinedColorValue),-2045205981).toInt() and 0xffff]) + } + return negativeRGBColor + } + + fun colorFunc1(i: Int, i_1_: Int, i_2_: Int): Int { + var i = i + if (i_1_ != 2) { + return 64 + } + if (i_2_ == -2) { + return 12345678 + } + if (i_2_ == -1) { + if (i >= 2) { + if (i > 126) { + i = 126 + } + } else { + i = 2 + } + return i + } + i = i * (i_2_ and 0x7f) shr 7 + if (i < 2) { + i = 2 + } else if (i > 126) { + i = 126 + } + return (0xff80 and i_2_) + i + } + + fun colorFunc2(i: Int, i_1_: Int): Short { + return try { + val i_2_ = ((0xfddc and i) shr 10) + if (i_1_ != -2045205981) { + return 123.toShort() + } + var i_3_ = 0x384 and i shr 3 + val i_4_ = 0x7f and i + i_3_ = if (i_4_ <= 64) i_4_ * i_3_ shr 7 else (127 - i_4_) * i_3_ shr 7 + val i_5_ = i_3_ + i_4_ + var i_6_: Int + do { + if (i_5_ == 0) { + i_6_ = i_3_ shl 1 + if (!true) { + break + } + } + i_6_ = (i_3_ shl 8) / i_5_ + } while (false) + (i_5_ or (i_2_ shl 10 or i_6_ shr 4 shl 7)).toShort() + } catch (runtimeexception: RuntimeException) { + throw error("fuk") + } + } + + fun f(i: Int) { + val d = -0.015 + 0.03 * Math.random() + 0.7 + var i_7_ = i + for (i_8_ in 0..511) { + val f = (0.0078125f + (i_8_ shr 3).toFloat() / 64.0f) * 360.0f + val f_9_ = (i_8_ and 0x7).toFloat() / 8.0f + 0.0625f + for (i_10_ in 0..127) { + val f_11_ = i_10_.toFloat() / 128.0f + var f_12_ = 0.0f + var f_13_ = 0.0f + var f_14_ = 0.0f + val f_15_ = f / 60.0f + val i_16_ = f_15_.toInt() + val i_17_ = i_16_ % 6 + val f_18_ = f_15_ - i_16_.toFloat() + val f_19_ = f_11_ * (1.0f - f_9_) + val f_20_ = f_11_ * (-(f_18_ * f_9_) + 1.0f) + val f_21_ = f_11_ * (-(f_9_ * (-f_18_ + 1.0f)) + 1.0f) + if (i_17_ == 0) { + f_13_ = f_21_ + f_14_ = f_19_ + f_12_ = f_11_ + } else if (i_17_ == 1) { + f_14_ = f_19_ + f_13_ = f_11_ + f_12_ = f_20_ + } else if (i_17_ == 2) { + f_14_ = f_21_ + f_13_ = f_11_ + f_12_ = f_19_ + } else if (i_17_ == 3) { + f_13_ = f_20_ + f_12_ = f_19_ + f_14_ = f_11_ + } else if (i_17_ == 4) { + f_13_ = f_19_ + f_12_ = f_21_ + f_14_ = f_11_ + } else if (i_17_ == 5) { + f_12_ = f_11_ + f_13_ = f_19_ + f_14_ = f_20_ + } + f_12_ = f_12_.toDouble().pow(d).toFloat() + f_13_ = f_13_.toDouble().pow(d).toFloat() + f_14_ = f_14_.toDouble().pow(d).toFloat() + val i_22_ = (f_12_ * 256.0f).toInt() + val i_23_ = (f_13_ * 254.0f).toInt() + val i_24_ = (f_14_ * 256.0f).toInt() + val i_25_ = i_24_ + ((i_23_ shl 8) - 16777216 + (i_22_ shl 16)) + p[i_7_++] = i_25_ + } + } + } + + +} \ No newline at end of file