mirror of
https://github.com/yairm210/Unciv.git
synced 2025-09-28 22:37:02 -04:00
Made resource object lazy - this should speed up all sorts, especially tile stats checking
This commit is contained in:
parent
21925b920b
commit
96c69cf1e9
@ -476,7 +476,7 @@ object GameStarter {
|
||||
val relevantTiles = spawn.getTilesInDistance(2).shuffled()
|
||||
|
||||
for (tile in relevantTiles) {
|
||||
if(tile.resource != null && tile.getTileResource().resourceType == ResourceType.Luxury)
|
||||
if(tile.resource != null && tile.tileResource.resourceType == ResourceType.Luxury)
|
||||
return // At least one luxury; all set
|
||||
}
|
||||
|
||||
|
@ -221,7 +221,7 @@ object Automation {
|
||||
var rank = rankStatsValue(stats, civInfo)
|
||||
if (tile.improvement == null) rank += 0.5f // improvement potential!
|
||||
if (tile.hasViewableResource(civInfo)) {
|
||||
val resource = tile.getTileResource()
|
||||
val resource = tile.tileResource
|
||||
if (resource.resourceType != ResourceType.Bonus) rank += 1f // for usage
|
||||
if (tile.improvement == null) rank += 1f // improvement potential - resources give lots when improved!
|
||||
}
|
||||
@ -243,7 +243,7 @@ object Automation {
|
||||
|
||||
// Resources are good: less points
|
||||
if (tile.hasViewableResource(cityInfo.civInfo)) {
|
||||
if (tile.getTileResource().resourceType != ResourceType.Bonus) score -= 105
|
||||
if (tile.tileResource.resourceType != ResourceType.Bonus) score -= 105
|
||||
else if (distance <= 3) score -= 104
|
||||
|
||||
} else {
|
||||
@ -273,7 +273,7 @@ object Automation {
|
||||
val adjacentDistance = cityInfo.getCenterTile().aerialDistanceTo(adjacentTile)
|
||||
if (adjacentTile.hasViewableResource(cityInfo.civInfo) &&
|
||||
(adjacentDistance < 3 ||
|
||||
adjacentTile.getTileResource().resourceType != ResourceType.Bonus
|
||||
adjacentTile.tileResource.resourceType != ResourceType.Bonus
|
||||
)
|
||||
) score -= 1
|
||||
if (adjacentTile.naturalWonder != null) {
|
||||
|
@ -34,7 +34,7 @@ object SpecificUnitAutomation {
|
||||
unit.movement.headTowards(closestReachableResource)
|
||||
|
||||
// could be either fishing boats or oil well
|
||||
val improvement = closestReachableResource.getTileResource().improvement
|
||||
val improvement = closestReachableResource.tileResource.improvement
|
||||
if (unit.currentTile == closestReachableResource && improvement != null)
|
||||
UnitActions.getWaterImprovementAction(unit)?.action?.invoke()
|
||||
}
|
||||
@ -137,7 +137,7 @@ object SpecificUnitAutomation {
|
||||
if (tileInfo.isCoastalTile()) rank += 5
|
||||
|
||||
val luxuryResourcesInCityArea = tileInfo.getTilesAtDistance(2).filter { it.resource != null }
|
||||
.map { it.getTileResource() }.filter { it.resourceType == ResourceType.Luxury }.distinct()
|
||||
.map { it.tileResource }.filter { it.resourceType == ResourceType.Luxury }.distinct()
|
||||
val luxuryResourcesAlreadyInCivArea = luxuryResourcesInCivArea.map { it.name }.toHashSet()
|
||||
val luxuryResourcesNotYetInCiv = luxuryResourcesInCityArea
|
||||
.count { it.name !in luxuryResourcesAlreadyInCivArea }
|
||||
@ -191,7 +191,7 @@ object SpecificUnitAutomation {
|
||||
|
||||
val luxuryResourcesInCivArea = unit.civInfo.cities.asSequence()
|
||||
.flatMap { it.getTiles().asSequence() }.filter { it.resource != null }
|
||||
.map { it.getTileResource() }.filter { it.resourceType == ResourceType.Luxury }
|
||||
.map { it.tileResource }.filter { it.resourceType == ResourceType.Luxury }
|
||||
.distinct()
|
||||
|
||||
val citiesByRanking = possibleCityLocations
|
||||
|
@ -301,7 +301,7 @@ class WorkerAutomation(
|
||||
if (chosenImprovement != null && tile.canBuildImprovement(chosenImprovement, civInfo) && unit.canBuildImprovement(chosenImprovement, tile)) return true
|
||||
|
||||
} else if (!tile.containsGreatImprovement() && tile.hasViewableResource(civInfo)
|
||||
&& tile.getTileResource().improvement != tile.improvement
|
||||
&& tile.tileResource.improvement != tile.improvement
|
||||
&& (unit == null || chooseImprovement(unit, tile) // if the chosen improvement is not null and buildable
|
||||
.let { it != null && tile.canBuildImprovement(it, civInfo) && unit.canBuildImprovement(it, tile)}))
|
||||
return true
|
||||
@ -335,7 +335,7 @@ class WorkerAutomation(
|
||||
tile.terrainFeatures.contains("Fallout") && !isImprovementOnFeatureAllowed(tile) -> "Remove Fallout" // for really mad modders
|
||||
tile.terrainFeatures.contains(Constants.jungle) && !isImprovementOnFeatureAllowed(tile) -> "Remove Jungle"
|
||||
tile.terrainFeatures.contains(Constants.forest) && !isImprovementOnFeatureAllowed(tile) -> "Remove Forest"
|
||||
else -> tile.getTileResource().improvement
|
||||
else -> tile.tileResource.improvement
|
||||
}
|
||||
|
||||
// turnsToBuild is what defines them as buildable
|
||||
@ -378,7 +378,7 @@ class WorkerAutomation(
|
||||
* Assumes the caller ensured that terrainFeature and resource are both present!
|
||||
*/
|
||||
private fun isImprovementOnFeatureAllowed(tile: TileInfo): Boolean {
|
||||
val resourceImprovementName = tile.getTileResource().improvement
|
||||
val resourceImprovementName = tile.tileResource.improvement
|
||||
?: return false
|
||||
val resourceImprovement = ruleSet.tileImprovements[resourceImprovementName]
|
||||
?: return false
|
||||
|
@ -273,7 +273,7 @@ class CityInfo {
|
||||
val cityResources = ResourceSupplyList()
|
||||
|
||||
for (tileInfo in getTiles().filter { it.resource != null }) {
|
||||
val resource = tileInfo.getTileResource()
|
||||
val resource = tileInfo.tileResource
|
||||
val amount = getTileResourceAmount(tileInfo) * civInfo.getResourceModifier(resource)
|
||||
if (amount > 0) cityResources.add(resource, amount, "Tiles")
|
||||
}
|
||||
@ -336,7 +336,7 @@ class CityInfo {
|
||||
|
||||
fun getTileResourceAmount(tileInfo: TileInfo): Int {
|
||||
if (tileInfo.resource == null) return 0
|
||||
val resource = tileInfo.getTileResource()
|
||||
val resource = tileInfo.tileResource
|
||||
if (resource.revealedBy != null && !civInfo.tech.isResearched(resource.revealedBy!!)) return 0
|
||||
|
||||
// Even if the improvement exists (we conquered an enemy city or somesuch) or we have a city on it, we won't get the resource until the correct tech is researched
|
||||
|
@ -135,10 +135,12 @@ open class TileInfo {
|
||||
else -> getBaseTerrain()
|
||||
}
|
||||
|
||||
fun getTileResource(): TileResource =
|
||||
if (resource == null) throw Exception("No resource exists for this tile!")
|
||||
else if (!ruleset.tileResources.containsKey(resource!!)) throw Exception("Resource $resource does not exist in this ruleset!")
|
||||
else ruleset.tileResources[resource!!]!!
|
||||
@delegate:Transient
|
||||
val tileResource: TileResource by lazy {
|
||||
if (resource == null) throw Exception("No resource exists for this tile!")
|
||||
else if (!ruleset.tileResources.containsKey(resource!!)) throw Exception("Resource $resource does not exist in this ruleset!")
|
||||
else ruleset.tileResources[resource!!]!!
|
||||
}
|
||||
|
||||
private fun getNaturalWonder(): Terrain =
|
||||
if (naturalWonder == null) throw Exception("No natural wonder exists for this tile!")
|
||||
@ -278,7 +280,7 @@ open class TileInfo {
|
||||
}
|
||||
|
||||
// resource base
|
||||
if (hasViewableResource(observingCiv)) stats.add(getTileResource())
|
||||
if (hasViewableResource(observingCiv)) stats.add(tileResource)
|
||||
|
||||
val improvement = getTileImprovement()
|
||||
if (improvement != null)
|
||||
@ -332,7 +334,7 @@ open class TileInfo {
|
||||
else
|
||||
stats.add(terrainFeatureBase)
|
||||
}
|
||||
if (resource != null) stats.add(getTileResource())
|
||||
if (resource != null) stats.add(tileResource)
|
||||
|
||||
if (stats.production < 0) stats.production = 0f
|
||||
if (isCenter) {
|
||||
@ -345,8 +347,8 @@ open class TileInfo {
|
||||
|
||||
fun getImprovementStats(improvement: TileImprovement, observingCiv: CivilizationInfo, city: CityInfo?): Stats {
|
||||
val stats = improvement.clone() // clones the stats of the improvement, not the improvement itself
|
||||
if (hasViewableResource(observingCiv) && getTileResource().improvement == improvement.name)
|
||||
stats.add(getTileResource().improvementStats!!.clone()) // resource-specific improvement
|
||||
if (hasViewableResource(observingCiv) && tileResource.improvement == improvement.name)
|
||||
stats.add(tileResource.improvementStats!!.clone()) // resource-specific improvement
|
||||
|
||||
for (unique in improvement.uniqueObjects)
|
||||
if (unique.placeholderText == "[] once [] is discovered" && observingCiv.tech.isResearched(unique.params[1]))
|
||||
@ -460,7 +462,7 @@ open class TileInfo {
|
||||
it.any() && it.all { unique -> matchesTerrainFilter(unique.params[0]) }
|
||||
} -> true
|
||||
|
||||
else -> resourceIsVisible && getTileResource().improvement == improvement.name
|
||||
else -> resourceIsVisible && tileResource.improvement == improvement.name
|
||||
}
|
||||
}
|
||||
|
||||
@ -499,7 +501,7 @@ open class TileInfo {
|
||||
// Checks 'luxury resource', 'strategic resource' and 'bonus resource' - only those that are visible of course
|
||||
// not using hasViewableResource as observingCiv is often not passed in,
|
||||
// and we want to be able to at least test for non-strategic in that case.
|
||||
val resourceObject = getTileResource()
|
||||
val resourceObject = tileResource
|
||||
if (resourceObject.resourceType.name + " resource" != filter) return false // filter match
|
||||
if (resourceObject.revealedBy == null) return true // no need for tech
|
||||
if (observingCiv == null) return false // can't check tech
|
||||
@ -515,7 +517,8 @@ open class TileInfo {
|
||||
fun isCoastalTile() = _isCoastalTile
|
||||
|
||||
fun hasViewableResource(civInfo: CivilizationInfo): Boolean =
|
||||
resource != null && (getTileResource().revealedBy == null || civInfo.tech.isResearched(getTileResource().revealedBy!!))
|
||||
resource != null && (tileResource.revealedBy == null || civInfo.tech.isResearched(
|
||||
tileResource.revealedBy!!))
|
||||
|
||||
fun getViewableTilesList(distance: Int): List<TileInfo> =
|
||||
tileMap.getViewableTiles(position, distance)
|
||||
@ -564,7 +567,7 @@ open class TileInfo {
|
||||
lineList += baseTerrain
|
||||
for (terrainFeature in terrainFeatures) lineList += terrainFeature
|
||||
if (resource != null) {
|
||||
lineList += if (getTileResource().resourceType == ResourceType.Strategic)
|
||||
lineList += if (tileResource.resourceType == ResourceType.Strategic)
|
||||
"{$resourceAmount} {$resource}"
|
||||
else
|
||||
resource!!
|
||||
@ -626,12 +629,12 @@ open class TileInfo {
|
||||
for (terrainFeature in terrainFeatures)
|
||||
lineList += FormattedLine(terrainFeature, link="Terrain/$terrainFeature")
|
||||
if (resource != null && (viewingCiv == null || hasViewableResource(viewingCiv)))
|
||||
lineList += if (getTileResource().resourceType == ResourceType.Strategic)
|
||||
lineList += if (tileResource.resourceType == ResourceType.Strategic)
|
||||
FormattedLine("{$resource} ($resourceAmount)", link="Resource/$resource")
|
||||
else
|
||||
FormattedLine(resource!!, link="Resource/$resource")
|
||||
if (resource != null && viewingCiv != null && hasViewableResource(viewingCiv)) {
|
||||
val tileImprovement = ruleset.tileImprovements[getTileResource().improvement]
|
||||
val tileImprovement = ruleset.tileImprovements[tileResource.improvement]
|
||||
if (tileImprovement?.techRequired != null
|
||||
&& !viewingCiv.tech.isResearched(tileImprovement.techRequired!!)) {
|
||||
lineList += FormattedLine(
|
||||
@ -725,9 +728,9 @@ open class TileInfo {
|
||||
isOcean = baseTerrain == Constants.ocean
|
||||
|
||||
// Resource amounts missing - Old save or bad mapgen?
|
||||
if (resource != null && getTileResource().resourceType == ResourceType.Strategic && resourceAmount == 0) {
|
||||
if (resource != null && tileResource.resourceType == ResourceType.Strategic && resourceAmount == 0) {
|
||||
// Let's assume it's a small deposit
|
||||
setTileResource(getTileResource(), majorDeposit = false)
|
||||
setTileResource(tileResource, majorDeposit = false)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -620,8 +620,8 @@ class Building : RulesetStatsObject(), INonPerpetualConstruction {
|
||||
it.resource != null
|
||||
&& requiredNearbyImprovedResources!!.contains(it.resource!!)
|
||||
&& it.getOwner() == civInfo
|
||||
&& (it.getTileResource().improvement == it.improvement || it.isCityCenter()
|
||||
|| (it.getTileImprovement()?.isGreatImprovement() == true && it.getTileResource().resourceType == ResourceType.Strategic)
|
||||
&& (it.tileResource.improvement == it.improvement || it.isCityCenter()
|
||||
|| (it.getTileImprovement()?.isGreatImprovement() == true && it.tileResource.resourceType == ResourceType.Strategic)
|
||||
)
|
||||
}
|
||||
if (!containsResourceWithImprovement)
|
||||
|
@ -88,7 +88,7 @@ class ImprovementPickerScreen(val tileInfo: TileInfo, unit: MapUnit, val onAccep
|
||||
val turnsToBuild = if (tileInfo.improvementInProgress == improvement.name) tileInfo.turnsToImprovement
|
||||
else improvement.getTurnsToBuild(currentPlayerCiv)
|
||||
if (turnsToBuild > 0) labelText += " - $turnsToBuild${Fonts.turn}"
|
||||
val provideResource = tileInfo.hasViewableResource(currentPlayerCiv) && tileInfo.getTileResource().improvement == improvement.name
|
||||
val provideResource = tileInfo.hasViewableResource(currentPlayerCiv) && tileInfo.tileResource.improvement == improvement.name
|
||||
if (provideResource) labelText += "\n" + "Provides [${tileInfo.resource}]".tr()
|
||||
val removeImprovement = (improvement.name != RoadStatus.Road.name
|
||||
&& improvement.name != RoadStatus.Railroad.name && !improvement.name.startsWith("Remove") && improvement.name != Constants.cancelImprovementOrder)
|
||||
@ -149,7 +149,7 @@ class ImprovementPickerScreen(val tileInfo: TileInfo, unit: MapUnit, val onAccep
|
||||
statIcons.add(ImageGetter.getResourceImage(tileInfo.resource.toString(), 30f)).pad(3f)
|
||||
|
||||
// icon for removing the resource by replacing improvement
|
||||
if (removeImprovement && tileInfo.hasViewableResource(currentPlayerCiv) && tileInfo.getTileResource().improvement == tileInfo.improvement) {
|
||||
if (removeImprovement && tileInfo.hasViewableResource(currentPlayerCiv) && tileInfo.tileResource.improvement == tileInfo.improvement) {
|
||||
val crossedResource = Group()
|
||||
val cross = ImageGetter.getRedCross(30f, 0.8f)
|
||||
val resourceIcon = ImageGetter.getResourceImage(tileInfo.resource.toString(), 30f)
|
||||
|
@ -393,7 +393,7 @@ class DiplomacyScreen(val viewingCiv:CivilizationInfo): CameraStageBaseScreen()
|
||||
if (improvableTile.canBuildImprovement(
|
||||
tileImprovement,
|
||||
otherCiv
|
||||
) && improvableTile.getTileResource().improvement == tileImprovement.name
|
||||
) && improvableTile.tileResource.improvement == tileImprovement.name
|
||||
)
|
||||
needsImprovements = true
|
||||
|
||||
@ -457,7 +457,7 @@ class DiplomacyScreen(val viewingCiv:CivilizationInfo): CameraStageBaseScreen()
|
||||
|
||||
fun getImprovableResourceTiles(otherCiv:CivilizationInfo) = otherCiv.getCapital().getTiles()
|
||||
.filter { it.hasViewableResource(otherCiv) && it.improvement == null
|
||||
&& it.getTileResource().resourceType!=ResourceType.Bonus }
|
||||
&& it.tileResource.resourceType!=ResourceType.Bonus }
|
||||
|
||||
private fun getImprovementGiftTable(otherCiv: CivilizationInfo): Table {
|
||||
val improvementGiftTable = getCityStateDiplomacyTableHeader(otherCiv)
|
||||
@ -470,10 +470,10 @@ class DiplomacyScreen(val viewingCiv:CivilizationInfo): CameraStageBaseScreen()
|
||||
for (improvableTile in improvableResourceTiles) {
|
||||
for (tileImprovement in tileImprovements.values) {
|
||||
if (improvableTile.canBuildImprovement(tileImprovement, otherCiv) &&
|
||||
improvableTile.getTileResource().improvement == tileImprovement.name
|
||||
improvableTile.tileResource.improvement == tileImprovement.name
|
||||
) {
|
||||
val improveTileButton =
|
||||
"Build [${tileImprovement}] on [${improvableTile.getTileResource()}] (200 Gold)".toTextButton()
|
||||
"Build [${tileImprovement}] on [${improvableTile.tileResource}] (200 Gold)".toTextButton()
|
||||
improveTileButton.onClick {
|
||||
viewingCiv.addGold(-200)
|
||||
improvableTile.stopWorkingOnImprovement()
|
||||
|
@ -130,7 +130,7 @@ object UnitActions {
|
||||
val tile = unit.currentTile
|
||||
if (!tile.isWater || !unit.hasUnique(UniqueType.CreateWaterImprovements) || tile.resource == null) return null
|
||||
|
||||
val improvementName = tile.getTileResource().improvement ?: return null
|
||||
val improvementName = tile.tileResource.improvement ?: return null
|
||||
val improvement = tile.ruleset.tileImprovements[improvementName] ?: return null
|
||||
if (!tile.canBuildImprovement(improvement, unit.civInfo)) return null
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user