Open-source multiplayer game server compatible with the RuneScape client
https://www.openrs2.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
2.6 KiB
107 lines
2.6 KiB
package org.openrs2.archive.map
|
|
|
|
import kotlin.math.max
|
|
import kotlin.math.min
|
|
import kotlin.math.pow
|
|
|
|
public object Colors {
|
|
private val HSL_TO_RGB = IntArray(65536)
|
|
private const val BRIGHTNESS = 0.8
|
|
|
|
init {
|
|
var i = 0
|
|
for (h in 0 until 64) {
|
|
for (s in 0 until 8) {
|
|
for (l in 0 until 128) {
|
|
val hue = h.toDouble() / 64 + 0.0078125
|
|
val saturation = s.toDouble() / 8 + 0.0625
|
|
val lightness = l.toDouble() / 128
|
|
HSL_TO_RGB[i++] = hslToRgb(hue, saturation, lightness)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun hslToRgb(h: Double, s: Double, l: Double): Int {
|
|
var r = l
|
|
var g = l
|
|
var b = l
|
|
|
|
if (s != 0.0) {
|
|
val q = if (l * 2 < 1) {
|
|
l * (s + 1)
|
|
} else {
|
|
l + s - (l * s)
|
|
}
|
|
|
|
val p = l * 2 - q
|
|
|
|
var tr = h + (1.0 / 3)
|
|
if (tr > 1) {
|
|
tr--
|
|
}
|
|
|
|
var tb = h - (1.0 / 3)
|
|
if (tb < 0) {
|
|
tb++
|
|
}
|
|
|
|
r = if (tr * 6 < 1) {
|
|
tr * (q - p) * 6 + p
|
|
} else if (tr * 2 < 1) {
|
|
q
|
|
} else if (tr * 3 < 2) {
|
|
(2.0 / 3 - tr) * (q - p) * 6 + p
|
|
} else {
|
|
p
|
|
}
|
|
|
|
g = if (h * 6 < 1) {
|
|
h * (q - p) * 6 + p
|
|
} else if (h * 2 < 1) {
|
|
q
|
|
} else if (h * 3 < 2) {
|
|
(2.0 / 3 - h) * (q - p) * 6 + p
|
|
} else {
|
|
p
|
|
}
|
|
|
|
b = if (tb * 6 < 1) {
|
|
tb * (q - p) * 6 + p
|
|
} else if (tb * 2 < 1) {
|
|
q
|
|
} else if (tb * 3 < 2) {
|
|
(2.0 / 3 - tb) * (q - p) * 6 + p
|
|
} else {
|
|
p
|
|
}
|
|
}
|
|
|
|
val red = (r.pow(BRIGHTNESS) * 256).toInt()
|
|
val green = (g.pow(BRIGHTNESS) * 256).toInt()
|
|
val blue = (b.pow(BRIGHTNESS) * 256).toInt()
|
|
|
|
var rgb = (red shl 16) or (green shl 8) or blue
|
|
if (rgb == 0) {
|
|
rgb = 1
|
|
}
|
|
|
|
return rgb
|
|
}
|
|
|
|
public fun hslToRgb(hsl: Int): Int {
|
|
return HSL_TO_RGB[hsl]
|
|
}
|
|
|
|
public fun multiplyLightness(hsl: Int, factor: Int): Int {
|
|
return when (hsl) {
|
|
-2 -> 12345678
|
|
-1 -> 127 - min(max(factor, 0), 127)
|
|
else -> {
|
|
var l = ((hsl and 0x7F) * factor) shr 7
|
|
l = min(max(l, 2), 126)
|
|
(hsl and 0xFF80) or l
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|