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