Map mirroring!

This commit is contained in:
yairm210 2024-12-05 23:45:51 +02:00
parent 19a1bbcdc3
commit e8afeb505e
2 changed files with 64 additions and 4 deletions

View File

@ -39,6 +39,14 @@ object MapType {
const val empty = "Empty"
}
object MirroringType {
const val none = "None"
const val aroundCenterTile = "Around Center Tile"
const val fourway = "4-way"
const val topbottom = "Top-Bottom"
const val leftright = "Bottom-Top"
}
class MapParameters : IsPartOfGameInfoSerialization {
var name = ""
var type = MapType.pangaea
@ -46,6 +54,7 @@ class MapParameters : IsPartOfGameInfoSerialization {
var shape = MapShape.hexagonal
var mapSize = MapSize.Medium
var mapResources = MapResourceSetting.default.label
var mirroring: String = MirroringType.none
var noRuins = false
var noNaturalWonders = false
// DO NOT CHANGE DEFAULTS since that changes all existing games to new default!

View File

@ -1,12 +1,10 @@
package com.unciv.logic.map.mapgenerator
import com.badlogic.gdx.math.Vector2
import com.unciv.Constants
import com.unciv.UncivGame
import com.unciv.logic.civilization.Civilization
import com.unciv.logic.map.MapParameters
import com.unciv.logic.map.MapShape
import com.unciv.logic.map.MapType
import com.unciv.logic.map.TileMap
import com.unciv.logic.map.*
import com.unciv.logic.map.mapgenerator.mapregions.MapRegions
import com.unciv.logic.map.tile.Tile
import com.unciv.models.Counter
@ -173,6 +171,8 @@ class MapGenerator(val ruleset: Ruleset, private val coroutineScope: CoroutineSc
runAndMeasure("spreadAncientRuins") {
spreadAncientRuins(map)
}
mirror(map)
// Map generation may generate incompatible terrain/feature combinations
for (tile in map.values)
@ -180,6 +180,57 @@ class MapGenerator(val ruleset: Ruleset, private val coroutineScope: CoroutineSc
return map
}
private fun flipTopBottom(vector: Vector2): Vector2 = Vector2(-vector.y, -vector.x)
private fun flipLeftRight(vector: Vector2): Vector2 = Vector2(vector.y, vector.x)
private fun mirror(map: TileMap) {
fun copyTile(tile: Tile, x: Int, y: Int) {
val mirrorTile = map.getIfTileExistsOrNull(x, y) ?: return
tile.setBaseTerrain(mirrorTile.getBaseTerrain())
// todo rivers are a bitch
tile.naturalWonder = mirrorTile.naturalWonder
tile.setTerrainFeatures(mirrorTile.terrainFeatures)
tile.resource = mirrorTile.resource
tile.improvement = mirrorTile.improvement
}
when (map.mapParameters.mirroring){
MirroringType.none -> return
MirroringType.topbottom -> {
for (tile in map.values) {
if (tile.getRow() <= 0) continue
val flip = flipTopBottom(tile.position)
copyTile(tile, flip.x.toInt(), flip.y.toInt())
}
}
MirroringType.leftright -> {
for (tile in map.values) {
if (tile.getColumn() <= 0) continue
val flip = flipLeftRight(tile.position)
copyTile(tile, flip.x.toInt(), flip.y.toInt())
}
}
MirroringType.aroundCenterTile -> {
for (tile in map.values) {
if (tile.getRow() <= 0) continue
val flipTopBottom = flipTopBottom(tile.position)
val flipTopBottomLeftRight = flipLeftRight(flipTopBottom)
copyTile(tile, flipTopBottomLeftRight.x.toInt(), flipTopBottomLeftRight.y.toInt())
}
}
MirroringType.fourway -> {
for (tile in map.values) {
if (tile.getRow() < 0 && tile.getColumn() < 0) continue
var originVector = tile.position
if (tile.getRow() >= 0) originVector = flipTopBottom(originVector)
if (tile.getColumn() >= 0) originVector = flipLeftRight(originVector)
copyTile(tile, originVector.x.toInt(), originVector.y.toInt())
}
}
else -> return
}
}
fun generateSingleStep(map: TileMap, step: MapGeneratorSteps) {
if (map.mapParameters.seed == 0L)