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 |
|
} |
|
} |
|
} |
|
}
|
|
|