From babd29919a5a3808fb55d21cc3833ceb663c65af Mon Sep 17 00:00:00 2001 From: Duan Tao Date: Fri, 19 Apr 2019 18:46:43 +0800 Subject: [PATCH 1/2] MapGen added type Continents. --- .../com/unciv/logic/map/RandomMapGenerator.kt | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/core/src/com/unciv/logic/map/RandomMapGenerator.kt b/core/src/com/unciv/logic/map/RandomMapGenerator.kt index dc993b0033..3c6af8e826 100644 --- a/core/src/com/unciv/logic/map/RandomMapGenerator.kt +++ b/core/src/com/unciv/logic/map/RandomMapGenerator.kt @@ -8,15 +8,13 @@ import com.unciv.models.gamebasics.tile.TerrainType import com.unciv.models.gamebasics.tile.TileResource import java.util.* import kotlin.collections.HashMap -import kotlin.math.abs -import kotlin.math.ceil -import kotlin.math.pow -import kotlin.math.sin +import kotlin.math.* enum class MapType { Perlin, Default, Pangaea, + Continents, File } @@ -59,6 +57,13 @@ class CelluarAutomataRandomMapGenerator(): SeedRandomMapGenerator() { landscape[vector] = TerrainType.Water } } + if (mapType == MapType.Continents) { //keep a ocean column in the middle + for (y in -distance..distance) { + landscape[Vector2(0f, y.toFloat())] = TerrainType.Water + landscape[Vector2(1f, y.toFloat())] = TerrainType.Water + landscape[Vector2(-1f, y.toFloat())] = TerrainType.Water + } + } } val map = HashMap() @@ -82,11 +87,25 @@ class CelluarAutomataRandomMapGenerator(): SeedRandomMapGenerator() { return mapToReturn } + private fun getDistanceWeightForContinents(origin: Vector2, destination: Vector2): Float { + val relative_x = 2*(origin.x-destination.x) + val relative_y = origin.y-destination.y + if (relative_x * relative_y >= 0) + return max(abs(relative_x),abs(relative_y)) + else + return (abs(relative_x) + abs(relative_y)) + } + private fun generateInitTerrain(vector: Vector2, distance: Int): TerrainType { val type: TerrainType if (mapType == MapType.Pangaea) { val distanceFactor = (HexMath().getDistance(Vector2.Zero, vector) * 1.8 / distance).toFloat() type = if (Random().nextDouble() < landProb.pow(distanceFactor)) TerrainType.Land else TerrainType.Water + } else if (mapType == MapType.Continents) { + val distanceWeight = min(getDistanceWeightForContinents(Vector2(distance.toFloat()/2, 0f), vector), + getDistanceWeightForContinents(Vector2(-distance.toFloat()/2, 0f), vector)) + val distanceFactor = (distanceWeight * 1.8 / distance).toFloat() + type = if (Random().nextDouble() < landProb.pow(distanceFactor)) TerrainType.Land else TerrainType.Water } else { //default if (HexMath().getDistance(Vector2.Zero, vector) > 0.9f * distance) type = if (Random().nextDouble() < 0.1) TerrainType.Land else TerrainType.Water From c83a2ed73c213bb694ec6ff3cd3e22b3289b174d Mon Sep 17 00:00:00 2001 From: Duan Tao Date: Fri, 19 Apr 2019 19:03:40 +0800 Subject: [PATCH 2/2] Continents shape improved. --- core/src/com/unciv/logic/map/RandomMapGenerator.kt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/core/src/com/unciv/logic/map/RandomMapGenerator.kt b/core/src/com/unciv/logic/map/RandomMapGenerator.kt index 3c6af8e826..1a148415ae 100644 --- a/core/src/com/unciv/logic/map/RandomMapGenerator.kt +++ b/core/src/com/unciv/logic/map/RandomMapGenerator.kt @@ -13,8 +13,8 @@ import kotlin.math.* enum class MapType { Perlin, Default, - Pangaea, Continents, + Pangaea, File } @@ -26,7 +26,7 @@ class CelluarAutomataRandomMapGenerator(): SeedRandomMapGenerator() { constructor(type: MapType): this() { mapType = type - if (mapType != MapType.Default && mapType !=MapType.Pangaea) { + if (mapType != MapType.Default && mapType !=MapType.Pangaea && mapType !=MapType.Continents) { mapType = MapType.Default } } @@ -59,9 +59,8 @@ class CelluarAutomataRandomMapGenerator(): SeedRandomMapGenerator() { } if (mapType == MapType.Continents) { //keep a ocean column in the middle for (y in -distance..distance) { - landscape[Vector2(0f, y.toFloat())] = TerrainType.Water - landscape[Vector2(1f, y.toFloat())] = TerrainType.Water - landscape[Vector2(-1f, y.toFloat())] = TerrainType.Water + landscape[Vector2((y/2).toFloat(), y.toFloat())] = TerrainType.Water + landscape[Vector2((y/2+1).toFloat(), y.toFloat())] = TerrainType.Water } } }