therealbluepandabear
03/18/2021, 4:15 AMimport biomes.Biome
import biomes.OakForest
import biomes.Savannah
import kotlin.random.Random
class World {
private var worldSize: Int = 0
private var biomes: MutableMap<IntRange, Biome> = mutableMapOf()
data class PointData(val currentPoint: Int?, val currentBiome: Biome?)
fun getPointData(point: Int): PointData {
biomes.keys.forEach {
if (it.contains(point)) {
return PointData(point, biomes[it])
}
}
return PointData(null, null)
}
companion object {
fun generateWorld(): World {
val it = World()
it.worldSize = (Random.nextInt(100000, 1000000))
var blocksCovered = 0
var priorBiomeEndPoint = 0
while (blocksCovered <= it.worldSize) {
val possibleBiomes: List<Biome> = listOf(OakForest(), Savannah())
val rand: Biome = possibleBiomes[Random.nextInt(0, 2)]
val size = blocksCovered + rand.biomeSize
it.biomes[priorBiomeEndPoint..size] = rand
priorBiomeEndPoint = blocksCovered + rand.biomeSize
blocksCovered += rand.biomeSize
}
return it
}
}
}
It will return at particular Int Ranges a certain biome:Luke
03/18/2021, 1:04 PMgetPointData()
could use extensions:
fun getPointData(point: Int): PointData {
return biomes.values.firstOrNull { (range, _) -> point in range }
?.let { (_, biome) -> PointData(point, biome) }
?: PointData(null, null)
}
Matteo Mirk
03/25/2021, 9:09 AMPointData?
• don’t know how you modeled biomes, but since they’re a finite set of types, you could use an enum or sealed classes, depending on your need
• having a map but iterating its entries every time to find a value, smells like the wrong data structure for the job; probably you need a binary search tree or similartherealbluepandabear
03/26/2021, 3:35 AM