diff --git a/core/src/com/unciv/logic/GameStarter.kt b/core/src/com/unciv/logic/GameStarter.kt index 5aab9b6b4a..40416ec757 100644 --- a/core/src/com/unciv/logic/GameStarter.kt +++ b/core/src/com/unciv/logic/GameStarter.kt @@ -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 } diff --git a/core/src/com/unciv/logic/automation/Automation.kt b/core/src/com/unciv/logic/automation/Automation.kt index a52f2ae459..9f4baddb20 100644 --- a/core/src/com/unciv/logic/automation/Automation.kt +++ b/core/src/com/unciv/logic/automation/Automation.kt @@ -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) { diff --git a/core/src/com/unciv/logic/automation/SpecificUnitAutomation.kt b/core/src/com/unciv/logic/automation/SpecificUnitAutomation.kt index 4a3a08ee10..9b793549ef 100644 --- a/core/src/com/unciv/logic/automation/SpecificUnitAutomation.kt +++ b/core/src/com/unciv/logic/automation/SpecificUnitAutomation.kt @@ -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 diff --git a/core/src/com/unciv/logic/automation/WorkerAutomation.kt b/core/src/com/unciv/logic/automation/WorkerAutomation.kt index 99247974f0..757473c077 100644 --- a/core/src/com/unciv/logic/automation/WorkerAutomation.kt +++ b/core/src/com/unciv/logic/automation/WorkerAutomation.kt @@ -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 diff --git a/core/src/com/unciv/logic/city/CityInfo.kt b/core/src/com/unciv/logic/city/CityInfo.kt index c813e9538a..faaeef8966 100644 --- a/core/src/com/unciv/logic/city/CityInfo.kt +++ b/core/src/com/unciv/logic/city/CityInfo.kt @@ -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 diff --git a/core/src/com/unciv/logic/map/TileInfo.kt b/core/src/com/unciv/logic/map/TileInfo.kt index 3ba18ee778..8be4d19cb5 100644 --- a/core/src/com/unciv/logic/map/TileInfo.kt +++ b/core/src/com/unciv/logic/map/TileInfo.kt @@ -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 = 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) } } diff --git a/core/src/com/unciv/models/ruleset/Building.kt b/core/src/com/unciv/models/ruleset/Building.kt index 02d161d114..0253502e36 100644 --- a/core/src/com/unciv/models/ruleset/Building.kt +++ b/core/src/com/unciv/models/ruleset/Building.kt @@ -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) diff --git a/core/src/com/unciv/ui/pickerscreens/ImprovementPickerScreen.kt b/core/src/com/unciv/ui/pickerscreens/ImprovementPickerScreen.kt index ce31417075..e9295f3809 100644 --- a/core/src/com/unciv/ui/pickerscreens/ImprovementPickerScreen.kt +++ b/core/src/com/unciv/ui/pickerscreens/ImprovementPickerScreen.kt @@ -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) diff --git a/core/src/com/unciv/ui/trade/DiplomacyScreen.kt b/core/src/com/unciv/ui/trade/DiplomacyScreen.kt index 4d63b42f1a..f238386588 100644 --- a/core/src/com/unciv/ui/trade/DiplomacyScreen.kt +++ b/core/src/com/unciv/ui/trade/DiplomacyScreen.kt @@ -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() diff --git a/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt b/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt index 6392b9cce1..ad258921a1 100644 --- a/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt +++ b/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt @@ -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