mirror of
https://github.com/yairm210/Unciv.git
synced 2025-09-29 15:01:09 -04:00
terrain.occursOn is now an arrayList - helps with definition checking and generally simplifies things
This commit is contained in:
parent
c85b51474c
commit
93aa06bc99
@ -237,21 +237,21 @@ class MapGenerator(val ruleset: Ruleset) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* [MapParameters.vegetationOccurrance] is the threshold for vegetation spawn
|
* [MapParameters.vegetationRichness] is the threshold for vegetation spawn
|
||||||
*/
|
*/
|
||||||
private fun spawnVegetation(tileMap: TileMap) {
|
private fun spawnVegetation(tileMap: TileMap) {
|
||||||
val vegetationSeed = randomness.RNG.nextInt().toDouble()
|
val vegetationSeed = randomness.RNG.nextInt().toDouble()
|
||||||
val candidateTerrains = Constants.vegetation.flatMap{ ruleset.terrains[it]!!.occursOn!! }
|
val candidateTerrains = Constants.vegetation.flatMap{ ruleset.terrains[it]!!.occursOn }
|
||||||
for (tile in tileMap.values.asSequence().filter { it.baseTerrain in candidateTerrains && it.terrainFeature == null
|
for (tile in tileMap.values.asSequence().filter { it.baseTerrain in candidateTerrains && it.terrainFeature == null
|
||||||
&& (!it.isHill() || Constants.hill in candidateTerrains) }) {
|
&& (!it.isHill() || Constants.hill in candidateTerrains) }) {
|
||||||
val vegetation = (randomness.getPerlinNoise(tile, vegetationSeed, scale = 3.0, nOctaves = 1) + 1.0) / 2.0
|
val vegetation = (randomness.getPerlinNoise(tile, vegetationSeed, scale = 3.0, nOctaves = 1) + 1.0) / 2.0
|
||||||
|
|
||||||
if (vegetation <= tileMap.mapParameters.vegetationRichness)
|
if (vegetation <= tileMap.mapParameters.vegetationRichness)
|
||||||
tile.terrainFeature = Constants.vegetation.filter { ruleset.terrains[it]!!.occursOn!!.contains(tile.baseTerrain) }.random(randomness.RNG)
|
tile.terrainFeature = Constants.vegetation.filter { ruleset.terrains[it]!!.occursOn.contains(tile.baseTerrain) }.random(randomness.RNG)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* [MapParameters.rareFeaturesProbability] is the probability of spawning a rare feature
|
* [MapParameters.rareFeaturesRichness] is the probability of spawning a rare feature
|
||||||
*/
|
*/
|
||||||
private fun spawnRareFeatures(tileMap: TileMap) {
|
private fun spawnRareFeatures(tileMap: TileMap) {
|
||||||
val rareFeatures = ruleset.terrains.values.filter {
|
val rareFeatures = ruleset.terrains.values.filter {
|
||||||
@ -259,8 +259,8 @@ class MapGenerator(val ruleset: Ruleset) {
|
|||||||
}
|
}
|
||||||
for (tile in tileMap.values.asSequence().filter { it.terrainFeature == null }) {
|
for (tile in tileMap.values.asSequence().filter { it.terrainFeature == null }) {
|
||||||
if (randomness.RNG.nextDouble() <= tileMap.mapParameters.rareFeaturesRichness) {
|
if (randomness.RNG.nextDouble() <= tileMap.mapParameters.rareFeaturesRichness) {
|
||||||
val possibleFeatures = rareFeatures.filter { it.occursOn != null && it.occursOn.contains(tile.baseTerrain)
|
val possibleFeatures = rareFeatures.filter { it.occursOn.contains(tile.baseTerrain)
|
||||||
&& (!tile.isHill() || it.occursOn.contains(Constants.hill) )}
|
&& (!tile.isHill() || it.occursOn.contains(Constants.hill)) }
|
||||||
if (possibleFeatures.any())
|
if (possibleFeatures.any())
|
||||||
tile.terrainFeature = possibleFeatures.random(randomness.RNG).name
|
tile.terrainFeature = possibleFeatures.random(randomness.RNG).name
|
||||||
}
|
}
|
||||||
|
@ -79,7 +79,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){
|
|||||||
private fun spawnBarringerCrater(tileMap: TileMap) {
|
private fun spawnBarringerCrater(tileMap: TileMap) {
|
||||||
val wonder = ruleset.terrains[Constants.barringerCrater]!!
|
val wonder = ruleset.terrains[Constants.barringerCrater]!!
|
||||||
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
|
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
|
||||||
&& wonder.occursOn!!.contains(it.getLastTerrain().name)
|
&& wonder.occursOn.contains(it.getLastTerrain().name)
|
||||||
&& it.neighbors.none { neighbor -> neighbor.getBaseTerrain().name == Constants.grassland }
|
&& it.neighbors.none { neighbor -> neighbor.getBaseTerrain().name == Constants.grassland }
|
||||||
&& it.neighbors.count{ neighbor -> neighbor.getBaseTerrain().name == Constants.mountain } <= 2
|
&& it.neighbors.count{ neighbor -> neighbor.getBaseTerrain().name == Constants.mountain } <= 2
|
||||||
&& it.neighbors.count{ neighbor -> neighbor.getBaseTerrain().name == Constants.mountain || neighbor.isHill() } <= 4
|
&& it.neighbors.count{ neighbor -> neighbor.getBaseTerrain().name == Constants.mountain || neighbor.isHill() } <= 4
|
||||||
@ -95,7 +95,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){
|
|||||||
private fun spawnMountFuji(tileMap: TileMap) {
|
private fun spawnMountFuji(tileMap: TileMap) {
|
||||||
val wonder = ruleset.terrains[Constants.mountFuji]!!
|
val wonder = ruleset.terrains[Constants.mountFuji]!!
|
||||||
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
|
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
|
||||||
&& wonder.occursOn!!.contains(it.getLastTerrain().name)
|
&& wonder.occursOn.contains(it.getLastTerrain().name)
|
||||||
&& it.neighbors.none { neighbor -> neighbor.getBaseTerrain().name == Constants.tundra }
|
&& it.neighbors.none { neighbor -> neighbor.getBaseTerrain().name == Constants.tundra }
|
||||||
&& it.neighbors.none { neighbor -> neighbor.getBaseTerrain().name == Constants.desert }
|
&& it.neighbors.none { neighbor -> neighbor.getBaseTerrain().name == Constants.desert }
|
||||||
&& it.neighbors.none { neighbor -> neighbor.getBaseTerrain().name == Constants.mountain }
|
&& it.neighbors.none { neighbor -> neighbor.getBaseTerrain().name == Constants.mountain }
|
||||||
@ -113,7 +113,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){
|
|||||||
private fun spawnGrandMesa(tileMap: TileMap) {
|
private fun spawnGrandMesa(tileMap: TileMap) {
|
||||||
val wonder = ruleset.terrains[Constants.grandMesa]!!
|
val wonder = ruleset.terrains[Constants.grandMesa]!!
|
||||||
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
|
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
|
||||||
&& wonder.occursOn!!.contains(it.getLastTerrain().name)
|
&& wonder.occursOn.contains(it.getLastTerrain().name)
|
||||||
&& it.neighbors.count{ neighbor -> neighbor.isHill() } >= 2
|
&& it.neighbors.count{ neighbor -> neighbor.isHill() } >= 2
|
||||||
&& it.neighbors.none { neighbor -> neighbor.getBaseTerrain().name == Constants.grassland }
|
&& it.neighbors.none { neighbor -> neighbor.getBaseTerrain().name == Constants.grassland }
|
||||||
&& it.neighbors.count { neighbor -> neighbor.getBaseTerrain().name == Constants.mountain } <= 2
|
&& it.neighbors.count { neighbor -> neighbor.getBaseTerrain().name == Constants.mountain } <= 2
|
||||||
@ -129,13 +129,13 @@ class NaturalWonderGenerator(val ruleset: Ruleset){
|
|||||||
private fun spawnGreatBarrierReef(tileMap: TileMap) {
|
private fun spawnGreatBarrierReef(tileMap: TileMap) {
|
||||||
val wonder = ruleset.terrains[Constants.greatBarrierReef]!!
|
val wonder = ruleset.terrains[Constants.greatBarrierReef]!!
|
||||||
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
|
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
|
||||||
&& wonder.occursOn!!.contains(it.getLastTerrain().name)
|
&& wonder.occursOn.contains(it.getLastTerrain().name)
|
||||||
&& abs(it.latitude) > tileMap.maxLatitude * 0.1
|
&& abs(it.latitude) > tileMap.maxLatitude * 0.1
|
||||||
&& abs(it.latitude) < tileMap.maxLatitude * 0.7
|
&& abs(it.latitude) < tileMap.maxLatitude * 0.7
|
||||||
&& it.neighbors.all {neighbor -> neighbor.isWater}
|
&& it.neighbors.all {neighbor -> neighbor.isWater}
|
||||||
&& it.neighbors.any {neighbor ->
|
&& it.neighbors.any {neighbor ->
|
||||||
neighbor.resource == null && neighbor.improvement == null
|
neighbor.resource == null && neighbor.improvement == null
|
||||||
&& wonder.occursOn!!.contains(neighbor.getLastTerrain().name)
|
&& wonder.occursOn.contains(neighbor.getLastTerrain().name)
|
||||||
&& neighbor.neighbors.all{ it.isWater } }
|
&& neighbor.neighbors.all{ it.isWater } }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,7 +143,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){
|
|||||||
if (location != null) {
|
if (location != null) {
|
||||||
val location2 = location.neighbors
|
val location2 = location.neighbors
|
||||||
.filter { it.resource == null && it.improvement == null
|
.filter { it.resource == null && it.improvement == null
|
||||||
&& wonder.occursOn!!.contains(it.getLastTerrain().name)
|
&& wonder.occursOn.contains(it.getLastTerrain().name)
|
||||||
&& it.neighbors.all{ it.isWater } }
|
&& it.neighbors.all{ it.isWater } }
|
||||||
.toList().random()
|
.toList().random()
|
||||||
|
|
||||||
@ -160,7 +160,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){
|
|||||||
private fun spawnKrakatoa(tileMap: TileMap) {
|
private fun spawnKrakatoa(tileMap: TileMap) {
|
||||||
val wonder = ruleset.terrains[Constants.krakatoa]!!
|
val wonder = ruleset.terrains[Constants.krakatoa]!!
|
||||||
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
|
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
|
||||||
&& wonder.occursOn!!.contains(it.getLastTerrain().name)
|
&& wonder.occursOn.contains(it.getLastTerrain().name)
|
||||||
&& it.neighbors.any { neighbor -> neighbor.getBaseTerrain().name == Constants.coast }
|
&& it.neighbors.any { neighbor -> neighbor.getBaseTerrain().name == Constants.coast }
|
||||||
&& it.neighbors.none { neighbor -> neighbor.getLastTerrain().name == Constants.ice }
|
&& it.neighbors.none { neighbor -> neighbor.getLastTerrain().name == Constants.ice }
|
||||||
}
|
}
|
||||||
@ -186,7 +186,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){
|
|||||||
private fun spawnRockOfGibraltar(tileMap: TileMap) {
|
private fun spawnRockOfGibraltar(tileMap: TileMap) {
|
||||||
val wonder = ruleset.terrains[Constants.rockOfGibraltar]!!
|
val wonder = ruleset.terrains[Constants.rockOfGibraltar]!!
|
||||||
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
|
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
|
||||||
&& wonder.occursOn!!.contains(it.getLastTerrain().name)
|
&& wonder.occursOn.contains(it.getLastTerrain().name)
|
||||||
&& it.neighbors.any { neighbor -> neighbor.getBaseTerrain().name == Constants.coast }
|
&& it.neighbors.any { neighbor -> neighbor.getBaseTerrain().name == Constants.coast }
|
||||||
&& it.neighbors.count { neighbor -> neighbor.getBaseTerrain().name == Constants.mountain } == 1
|
&& it.neighbors.count { neighbor -> neighbor.getBaseTerrain().name == Constants.mountain } == 1
|
||||||
}
|
}
|
||||||
@ -221,7 +221,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){
|
|||||||
private fun spawnOldFaithful(tileMap: TileMap) {
|
private fun spawnOldFaithful(tileMap: TileMap) {
|
||||||
val wonder = ruleset.terrains[Constants.oldFaithful]!!
|
val wonder = ruleset.terrains[Constants.oldFaithful]!!
|
||||||
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
|
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
|
||||||
&& wonder.occursOn!!.contains(it.getLastTerrain().name)
|
&& wonder.occursOn.contains(it.getLastTerrain().name)
|
||||||
&& it.neighbors.count { neighbor -> neighbor.getBaseTerrain().name == Constants.mountain } <= 4
|
&& it.neighbors.count { neighbor -> neighbor.getBaseTerrain().name == Constants.mountain } <= 4
|
||||||
&& it.neighbors.count { neighbor -> neighbor.getBaseTerrain().name == Constants.mountain ||
|
&& it.neighbors.count { neighbor -> neighbor.getBaseTerrain().name == Constants.mountain ||
|
||||||
neighbor.isHill()
|
neighbor.isHill()
|
||||||
@ -239,7 +239,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){
|
|||||||
private fun spawnCerroDePotosi(tileMap: TileMap) {
|
private fun spawnCerroDePotosi(tileMap: TileMap) {
|
||||||
val wonder = ruleset.terrains[Constants.cerroDePotosi]!!
|
val wonder = ruleset.terrains[Constants.cerroDePotosi]!!
|
||||||
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
|
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
|
||||||
&& wonder.occursOn!!.contains(it.getLastTerrain().name)
|
&& wonder.occursOn.contains(it.getLastTerrain().name)
|
||||||
&& it.neighbors.any { neighbor -> neighbor.isHill() }
|
&& it.neighbors.any { neighbor -> neighbor.isHill() }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -252,7 +252,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){
|
|||||||
private fun spawnElDorado(tileMap: TileMap) {
|
private fun spawnElDorado(tileMap: TileMap) {
|
||||||
val wonder = ruleset.terrains[Constants.elDorado]!!
|
val wonder = ruleset.terrains[Constants.elDorado]!!
|
||||||
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
|
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
|
||||||
&& wonder.occursOn!!.contains(it.getLastTerrain().name)
|
&& wonder.occursOn.contains(it.getLastTerrain().name)
|
||||||
&& it.neighbors.any { neighbor -> neighbor.getLastTerrain().name == Constants.jungle }
|
&& it.neighbors.any { neighbor -> neighbor.getLastTerrain().name == Constants.jungle }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -265,7 +265,7 @@ class NaturalWonderGenerator(val ruleset: Ruleset){
|
|||||||
private fun spawnFountainOfYouth(tileMap: TileMap) {
|
private fun spawnFountainOfYouth(tileMap: TileMap) {
|
||||||
val wonder = ruleset.terrains[Constants.fountainOfYouth]!!
|
val wonder = ruleset.terrains[Constants.fountainOfYouth]!!
|
||||||
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
|
val suitableLocations = tileMap.values.filter { it.resource == null && it.improvement == null
|
||||||
&& wonder.occursOn!!.contains(it.getLastTerrain().name) }
|
&& wonder.occursOn.contains(it.getLastTerrain().name) }
|
||||||
|
|
||||||
trySpawnOnSuitableLocation(suitableLocations, wonder)
|
trySpawnOnSuitableLocation(suitableLocations, wonder)
|
||||||
}
|
}
|
||||||
|
@ -258,8 +258,8 @@ class Ruleset {
|
|||||||
lines += "${resource.name} revealed by tech ${resource.revealedBy} which does not exist!"
|
lines += "${resource.name} revealed by tech ${resource.revealedBy} which does not exist!"
|
||||||
if (resource.improvement != null && !tileImprovements.containsKey(resource.improvement!!))
|
if (resource.improvement != null && !tileImprovements.containsKey(resource.improvement!!))
|
||||||
lines += "${resource.name} improved by improvement ${resource.improvement} which does not exist!"
|
lines += "${resource.name} improved by improvement ${resource.improvement} which does not exist!"
|
||||||
for(terrain in resource.terrainsCanBeFoundOn)
|
for (terrain in resource.terrainsCanBeFoundOn)
|
||||||
if(!terrains.containsKey(terrain))
|
if (!terrains.containsKey(terrain))
|
||||||
lines += "${resource.name} can be found on terrain $terrain which does not exist!"
|
lines += "${resource.name} can be found on terrain $terrain which does not exist!"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -270,12 +270,12 @@ class Ruleset {
|
|||||||
if (!terrains.containsKey(terrain))
|
if (!terrains.containsKey(terrain))
|
||||||
lines += "${improvement.name} can be built on terrain $terrain which does not exist!"
|
lines += "${improvement.name} can be built on terrain $terrain which does not exist!"
|
||||||
}
|
}
|
||||||
//
|
|
||||||
// for(terrain in terrains.values){
|
for (terrain in terrains.values) {
|
||||||
// for(baseTerrain in terrain.occursOn)
|
for (baseTerrain in terrain.occursOn)
|
||||||
// if (!terrains.containsKey(baseTerrain))
|
if (!terrains.containsKey(baseTerrain))
|
||||||
// lines += "${improvement.name} can be built on terrain $terrain which does not exist!"
|
lines += "${terrain.name} occurs on terrain $baseTerrain which does not exist!"
|
||||||
// }
|
}
|
||||||
|
|
||||||
for (tech in technologies.values) {
|
for (tech in technologies.values) {
|
||||||
for (prereq in tech.prerequisites) {
|
for (prereq in tech.prerequisites) {
|
||||||
|
@ -20,7 +20,7 @@ class Terrain : NamedStats() {
|
|||||||
var unbuildable = false
|
var unbuildable = false
|
||||||
|
|
||||||
/** For terrain features */
|
/** For terrain features */
|
||||||
val occursOn: Collection<String>? = null
|
val occursOn = ArrayList<String>()
|
||||||
|
|
||||||
/** Used by Natural Wonders: it is the baseTerrain on top of which the Natural Wonder is placed */
|
/** Used by Natural Wonders: it is the baseTerrain on top of which the Natural Wonder is placed */
|
||||||
val turnsInto: String? = null
|
val turnsInto: String? = null
|
||||||
@ -48,7 +48,7 @@ class Terrain : NamedStats() {
|
|||||||
fun getDescription(ruleset: Ruleset): String {
|
fun getDescription(ruleset: Ruleset): String {
|
||||||
val sb = StringBuilder()
|
val sb = StringBuilder()
|
||||||
sb.appendln(this.clone().toString())
|
sb.appendln(this.clone().toString())
|
||||||
if (occursOn != null)
|
if (occursOn.isNotEmpty())
|
||||||
sb.appendln("Occurs on [${occursOn.joinToString(", ") { it.tr() }}]".tr())
|
sb.appendln("Occurs on [${occursOn.joinToString(", ") { it.tr() }}]".tr())
|
||||||
|
|
||||||
if (turnsInto != null)
|
if (turnsInto != null)
|
||||||
|
@ -149,7 +149,7 @@ class CivilopediaScreen(ruleset: Ruleset) : CameraStageBaseScreen() {
|
|||||||
}
|
}
|
||||||
TerrainType.TerrainFeature -> {
|
TerrainType.TerrainFeature -> {
|
||||||
tileInfo.terrainFeature = terrain.name
|
tileInfo.terrainFeature = terrain.name
|
||||||
tileInfo.baseTerrain = terrain.occursOn?.last() ?: Constants.grassland
|
tileInfo.baseTerrain = terrain.occursOn.lastOrNull() ?: Constants.grassland
|
||||||
}
|
}
|
||||||
else ->
|
else ->
|
||||||
tileInfo.baseTerrain = terrain.name
|
tileInfo.baseTerrain = terrain.name
|
||||||
|
@ -359,7 +359,7 @@ class TileEditorOptionsTable(val mapEditorScreen: MapEditorScreen): Table(Camera
|
|||||||
val terrainObject = ruleset.terrains[terrain]!!
|
val terrainObject = ruleset.terrains[terrain]!!
|
||||||
if (terrainObject.type == TerrainType.TerrainFeature) {
|
if (terrainObject.type == TerrainType.TerrainFeature) {
|
||||||
tileInfo.baseTerrain =
|
tileInfo.baseTerrain =
|
||||||
if (terrainObject.occursOn != null) terrainObject.occursOn.first()
|
if (terrainObject.occursOn.isNotEmpty()) terrainObject.occursOn.first()
|
||||||
else "Grassland"
|
else "Grassland"
|
||||||
tileInfo.terrainFeature = terrain
|
tileInfo.terrainFeature = terrain
|
||||||
} else tileInfo.baseTerrain = terrain
|
} else tileInfo.baseTerrain = terrain
|
||||||
@ -379,7 +379,7 @@ class TileEditorOptionsTable(val mapEditorScreen: MapEditorScreen): Table(Camera
|
|||||||
val tileInfo = TileInfo()
|
val tileInfo = TileInfo()
|
||||||
if (terrain.type == TerrainType.TerrainFeature) {
|
if (terrain.type == TerrainType.TerrainFeature) {
|
||||||
tileInfo.baseTerrain = when {
|
tileInfo.baseTerrain = when {
|
||||||
terrain.occursOn != null -> terrain.occursOn.first()
|
terrain.occursOn.isNotEmpty() -> terrain.occursOn.first()
|
||||||
else -> "Grassland"
|
else -> "Grassland"
|
||||||
}
|
}
|
||||||
tileInfo.terrainFeature = terrain.name
|
tileInfo.terrainFeature = terrain.name
|
||||||
@ -493,7 +493,7 @@ class TileEditorOptionsTable(val mapEditorScreen: MapEditorScreen): Table(Camera
|
|||||||
|
|
||||||
if (tileInfo.terrainFeature != null) {
|
if (tileInfo.terrainFeature != null) {
|
||||||
val terrainFeature = tileInfo.getTerrainFeature()!!
|
val terrainFeature = tileInfo.getTerrainFeature()!!
|
||||||
if(terrainFeature.occursOn!=null && !terrainFeature.occursOn.contains(tileInfo.baseTerrain))
|
if(terrainFeature.occursOn.isNotEmpty() && !terrainFeature.occursOn.contains(tileInfo.baseTerrain))
|
||||||
tileInfo.terrainFeature=null
|
tileInfo.terrainFeature=null
|
||||||
}
|
}
|
||||||
if (tileInfo.resource != null) {
|
if (tileInfo.resource != null) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user