DEADSOFTWARE

dd64c6a04077d02c1cce66c567311749a304e2f1
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / world / GameWorldGenerator.kt
1 package ru.deadsoftware.cavedroid.game.world
3 import com.badlogic.gdx.utils.TimeUtils
4 import ru.deadsoftware.cavedroid.game.GameItems
5 import kotlin.math.abs
6 import kotlin.random.Random
8 object GameWorldGenerator {
10 private fun generateHeights(width: Int, min: Int, max: Int, random: Random) = IntArray(width).apply {
11 set(0, (min + max) / 2)
12 for (x in 1 until width) {
13 val previous = get(x - 1)
14 var d = random.nextInt(-5, 6).let { if (it !in -4..4) it / abs(it) else 0 }
16 if (previous + d !in min..max) { d = -d }
17 if (lastIndex - x < abs(get(0) - previous) * 3) {
18 d = get(0).compareTo(previous).let { if (it != 0) it / abs(it) else 0 }
19 }
21 set(x, get(x - 1) + d)
22 }
23 }
25 /**
26 * Generates world of given width and height with given seed
27 * @param width world width
28 * @param height world height
29 * @param seed seed for random number generator
30 * @return pair of foreground and background layers
31 */
32 fun generate(width: Int, height: Int, seed: Long = TimeUtils.millis()): Pair<Array<IntArray>, Array<IntArray>> {
33 val random = Random(seed)
34 val foreMap = Array(width) { IntArray(height) }
35 val backMap = Array(width) { IntArray(width) }
36 val heightsMap = generateHeights(width, height / 2, height * 3 / 4, random)
38 for (x in 0 until width) {
39 val xHeight = heightsMap[x]
41 foreMap[x][xHeight] = GameItems.getBlockId("grass")
42 foreMap[x][height - 1] = GameItems.getBlockId("bedrock")
43 backMap[x][xHeight] = GameItems.getBlockId("grass")
44 backMap[x][height - 1] = GameItems.getBlockId("bedrock")
46 for (y in xHeight + 1 until height - 1) {
47 foreMap[x][y] = when {
48 y < xHeight + random.nextInt(5, 8) -> GameItems.getBlockId("dirt")
49 else -> GameItems.getBlockId("stone")
50 }
51 backMap[x][y] = foreMap[x][y]
52 }
53 }
54 return Pair(foreMap, backMap)
55 }
57 }