Added Moai as part of Polynesian civ - lots of changes to be made for that!
This commit is contained in:
parent
0d929a7942
commit
a8dac82157
11 changed files with 40 additions and 18 deletions
BIN
android/Images/ImprovementIcons/Moai.png
Normal file
BIN
android/Images/ImprovementIcons/Moai.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.9 KiB |
|
@ -146,17 +146,18 @@
|
||||||
},
|
},
|
||||||
|
|
||||||
//Civilization unique improvements
|
//Civilization unique improvements
|
||||||
/*
|
|
||||||
{
|
{
|
||||||
name:"Moai",
|
name:"Moai",
|
||||||
uniqueTo:"Polynesia",
|
uniqueTo:"Polynesia",
|
||||||
culture:1,
|
culture:1,
|
||||||
turnsToBuild:4,
|
turnsToBuild:4,
|
||||||
improvingTech:"Construction",
|
uniques:["+1 additional Culture for each adjacent Moai","Can only be built on Coastal tiles"],
|
||||||
uniques:["+1 additional Culture for each adjacent Moai","+1 Gold after researching Flight"],
|
techRequired:"Construction",
|
||||||
terrainsCanBeBuiltOn:["Hill"],
|
improvingTech:"Flight",
|
||||||
|
improvingTechStats:{gold:1}
|
||||||
//It can be colored in orange
|
//It can be colored in orange
|
||||||
},
|
},
|
||||||
|
/*
|
||||||
{
|
{
|
||||||
name:"Terrace Farm",
|
name:"Terrace Farm",
|
||||||
uniqueTo:"Inca",
|
uniqueTo:"Inca",
|
||||||
|
|
|
@ -174,7 +174,7 @@ class GameInfo {
|
||||||
val waterUnits = unitList.filter { it.unitType.isWaterUnit() }
|
val waterUnits = unitList.filter { it.unitType.isWaterUnit() }
|
||||||
|
|
||||||
val unit:String
|
val unit:String
|
||||||
if(waterUnits.isNotEmpty() && tileToPlace.neighbors.any{ it.baseTerrain==Constants.coast } && Random().nextBoolean())
|
if(waterUnits.isNotEmpty() && tileToPlace.isCoastalTile() && Random().nextBoolean())
|
||||||
unit=waterUnits.random().name
|
unit=waterUnits.random().name
|
||||||
else unit = landUnits.random().name
|
else unit = landUnits.random().name
|
||||||
|
|
||||||
|
|
|
@ -131,7 +131,7 @@ class GameStarter{
|
||||||
if (startBias.startsWith("Avoid ")) {
|
if (startBias.startsWith("Avoid ")) {
|
||||||
val tileToAvoid = startBias.removePrefix("Avoid ")
|
val tileToAvoid = startBias.removePrefix("Avoid ")
|
||||||
preferredTiles = preferredTiles.filter { it.baseTerrain != tileToAvoid && it.terrainFeature != tileToAvoid }
|
preferredTiles = preferredTiles.filter { it.baseTerrain != tileToAvoid && it.terrainFeature != tileToAvoid }
|
||||||
} else if (startBias == Constants.coast) preferredTiles = preferredTiles.filter { it.neighbors.any { n -> n.baseTerrain == startBias } }
|
} else if (startBias == Constants.coast) preferredTiles = preferredTiles.filter { it.isCoastalTile() }
|
||||||
else preferredTiles = preferredTiles.filter { it.baseTerrain == startBias || it.terrainFeature == startBias }
|
else preferredTiles = preferredTiles.filter { it.baseTerrain == startBias || it.terrainFeature == startBias }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package com.unciv.logic.automation
|
package com.unciv.logic.automation
|
||||||
|
|
||||||
import com.unciv.Constants
|
|
||||||
import com.unciv.UnCivGame
|
import com.unciv.UnCivGame
|
||||||
import com.unciv.logic.battle.MapUnitCombatant
|
import com.unciv.logic.battle.MapUnitCombatant
|
||||||
import com.unciv.logic.civilization.CivilizationInfo
|
import com.unciv.logic.civilization.CivilizationInfo
|
||||||
|
@ -78,7 +77,7 @@ class SpecificUnitAutomation{
|
||||||
.take(5)
|
.take(5)
|
||||||
.toList()
|
.toList()
|
||||||
var rank = top5Tiles.asSequence().map { nearbyTileRankings[it]!! }.sum()
|
var rank = top5Tiles.asSequence().map { nearbyTileRankings[it]!! }.sum()
|
||||||
if (tileInfo.neighbors.any { it.baseTerrain == Constants.coast }) rank += 5
|
if (tileInfo.isCoastalTile()) rank += 5
|
||||||
|
|
||||||
val luxuryResourcesInCityArea = tileInfo.getTilesAtDistance(2).filter { it.resource!=null }
|
val luxuryResourcesInCityArea = tileInfo.getTilesAtDistance(2).filter { it.resource!=null }
|
||||||
.map { it.getTileResource() }.filter { it.resourceType==ResourceType.Luxury }.distinct()
|
.map { it.getTileResource() }.filter { it.resourceType==ResourceType.Luxury }.distinct()
|
||||||
|
|
|
@ -46,7 +46,7 @@ class WorkerAutomation(val unit: MapUnit) {
|
||||||
val citiesToNumberOfUnimprovedTiles = HashMap<String, Int>()
|
val citiesToNumberOfUnimprovedTiles = HashMap<String, Int>()
|
||||||
for (city in unit.civInfo.cities) {
|
for (city in unit.civInfo.cities) {
|
||||||
citiesToNumberOfUnimprovedTiles[city.name] =
|
citiesToNumberOfUnimprovedTiles[city.name] =
|
||||||
city.getTiles().count { it.isLand && tileNeedToImprove(it, unit.civInfo) }
|
city.getTiles().count { it.isLand && tileCanBeImproved(it, unit.civInfo) }
|
||||||
}
|
}
|
||||||
|
|
||||||
val mostUndevelopedCity = unit.civInfo.cities
|
val mostUndevelopedCity = unit.civInfo.cities
|
||||||
|
@ -118,7 +118,7 @@ class WorkerAutomation(val unit: MapUnit) {
|
||||||
val workableTiles = currentTile.getTilesInDistance(4)
|
val workableTiles = currentTile.getTilesInDistance(4)
|
||||||
.filter {
|
.filter {
|
||||||
(it.civilianUnit== null || it == currentTile)
|
(it.civilianUnit== null || it == currentTile)
|
||||||
&& tileNeedToImprove(it, unit.civInfo) }
|
&& tileCanBeImproved(it, unit.civInfo) }
|
||||||
.sortedByDescending { getPriority(it, unit.civInfo) }.toMutableList()
|
.sortedByDescending { getPriority(it, unit.civInfo) }.toMutableList()
|
||||||
|
|
||||||
// the tile needs to be actually reachable - more difficult than it seems,
|
// the tile needs to be actually reachable - more difficult than it seems,
|
||||||
|
@ -134,14 +134,25 @@ class WorkerAutomation(val unit: MapUnit) {
|
||||||
else return currentTile
|
else return currentTile
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun tileNeedToImprove(tile: TileInfo, civInfo: CivilizationInfo): Boolean {
|
private fun tileCanBeImproved(tile: TileInfo, civInfo: CivilizationInfo): Boolean {
|
||||||
if (!tile.isLand || tile.getBaseTerrain().impassable)
|
if (!tile.isLand || tile.getBaseTerrain().impassable)
|
||||||
return false
|
return false
|
||||||
val city=tile.getCity()
|
val city=tile.getCity()
|
||||||
if (city == null || city.civInfo != civInfo)
|
if (city == null || city.civInfo != civInfo)
|
||||||
return false
|
return false
|
||||||
return (tile.improvement == null || (tile.hasViewableResource(civInfo) && !tile.containsGreatImprovement() && tile.getTileResource().improvement != tile.improvement))
|
|
||||||
&& (tile.containsUnfinishedGreatImprovement() || tile.canBuildImprovement(chooseImprovement(tile, civInfo), civInfo))
|
if(tile.improvement==null){
|
||||||
|
if(tile.improvementInProgress!=null) return true
|
||||||
|
val chosenImprovement = chooseImprovement(tile, civInfo)
|
||||||
|
if(chosenImprovement!=null) return true
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if(!tile.containsGreatImprovement() && tile.hasViewableResource(civInfo)
|
||||||
|
&& tile.getTileResource().improvement != tile.improvement)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false // cou;dn't find anything to construct here
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getPriority(tileInfo: TileInfo, civInfo: CivilizationInfo): Int {
|
private fun getPriority(tileInfo: TileInfo, civInfo: CivilizationInfo): Int {
|
||||||
|
|
|
@ -205,16 +205,20 @@ open class TileInfo {
|
||||||
return stats
|
return stats
|
||||||
}
|
}
|
||||||
|
|
||||||
fun canBuildImprovement(improvement: TileImprovement?, civInfo: CivilizationInfo): Boolean {
|
fun canBuildImprovement(improvement: TileImprovement, civInfo: CivilizationInfo): Boolean {
|
||||||
if (improvement == null) return false
|
|
||||||
if (isCityCenter() || improvement.name == this.improvement) return false
|
if (isCityCenter() || improvement.name == this.improvement) return false
|
||||||
val topTerrain = if (terrainFeature == null) getBaseTerrain() else getTerrainFeature()
|
if(improvement.uniqueTo!=null && improvement.uniqueTo!=civInfo.civName) return false
|
||||||
if (improvement.techRequired != null && !civInfo.tech.isResearched(improvement.techRequired!!)) return false
|
if (improvement.techRequired != null && !civInfo.tech.isResearched(improvement.techRequired!!)) return false
|
||||||
|
|
||||||
|
val topTerrain = if (terrainFeature == null) getBaseTerrain() else getTerrainFeature()
|
||||||
if (improvement.terrainsCanBeBuiltOn.contains(topTerrain!!.name)) return true
|
if (improvement.terrainsCanBeBuiltOn.contains(topTerrain!!.name)) return true
|
||||||
|
|
||||||
if (improvement.name == "Road" && this.roadStatus === RoadStatus.None) return true
|
if (improvement.name == "Road" && this.roadStatus === RoadStatus.None) return true
|
||||||
if (improvement.name == "Railroad" && this.roadStatus !== RoadStatus.Railroad) return true
|
if (improvement.name == "Railroad" && this.roadStatus !== RoadStatus.Railroad) return true
|
||||||
if(improvement.name == "Remove Road" && this.roadStatus===RoadStatus.Road) return true
|
if(improvement.name == "Remove Road" && this.roadStatus===RoadStatus.Road) return true
|
||||||
if(improvement.name == "Remove Railroad" && this.roadStatus===RoadStatus.Railroad) return true
|
if(improvement.name == "Remove Railroad" && this.roadStatus===RoadStatus.Railroad) return true
|
||||||
|
|
||||||
|
if("Can only be built on Coastal tiles" in improvement.uniques && isCoastalTile()) return true
|
||||||
if (topTerrain.unbuildable && !(topTerrain.name==Constants.forest && improvement.name=="Camp")) return false
|
if (topTerrain.unbuildable && !(topTerrain.name==Constants.forest && improvement.name=="Camp")) return false
|
||||||
return hasViewableResource(civInfo) && getTileResource().improvement == improvement.name
|
return hasViewableResource(civInfo) && getTileResource().improvement == improvement.name
|
||||||
|
|
||||||
|
@ -222,6 +226,8 @@ open class TileInfo {
|
||||||
|
|
||||||
fun hasImprovementInProgress() = improvementInProgress!=null
|
fun hasImprovementInProgress() = improvementInProgress!=null
|
||||||
|
|
||||||
|
fun isCoastalTile() = neighbors.any { it.baseTerrain==Constants.coast }
|
||||||
|
|
||||||
fun hasViewableResource(civInfo: CivilizationInfo): Boolean {
|
fun hasViewableResource(civInfo: CivilizationInfo): Boolean {
|
||||||
return resource != null && (getTileResource().revealedBy == null || civInfo.tech.isResearched(getTileResource().revealedBy!!))
|
return resource != null && (getTileResource().revealedBy == null || civInfo.tech.isResearched(getTileResource().revealedBy!!))
|
||||||
}
|
}
|
||||||
|
|
|
@ -245,7 +245,7 @@ class Building : NamedStats(), IConstruction{
|
||||||
return "Must not be on hill"
|
return "Must not be on hill"
|
||||||
|
|
||||||
if("Can only be built in coastal cities" in uniques
|
if("Can only be built in coastal cities" in uniques
|
||||||
&& !construction.cityInfo.getCenterTile().neighbors.any { it.baseTerrain==Constants.coast })
|
&& !construction.cityInfo.getCenterTile().isCoastalTile())
|
||||||
return "Can only be built in coastal cities"
|
return "Can only be built in coastal cities"
|
||||||
|
|
||||||
if("Can only be built in annexed cities" in uniques
|
if("Can only be built in annexed cities" in uniques
|
||||||
|
|
|
@ -15,8 +15,12 @@ class TileImprovement : NamedStats(), ICivilopedia {
|
||||||
|
|
||||||
var improvingTech: String? = null
|
var improvingTech: String? = null
|
||||||
var improvingTechStats: Stats? = null
|
var improvingTechStats: Stats? = null
|
||||||
|
var uniqueTo:String? = null
|
||||||
|
var uniques = ArrayList<String>()
|
||||||
|
|
||||||
private val turnsToBuild: Int = 0 // This is the base cost.
|
private val turnsToBuild: Int = 0 // This is the base cost.
|
||||||
|
|
||||||
|
|
||||||
fun getTurnsToBuild(civInfo: CivilizationInfo): Int {
|
fun getTurnsToBuild(civInfo: CivilizationInfo): Int {
|
||||||
var realTurnsToBuild = turnsToBuild.toFloat()
|
var realTurnsToBuild = turnsToBuild.toFloat()
|
||||||
if (civInfo.containsBuildingUnique("Worker construction increased 25%"))
|
if (civInfo.containsBuildingUnique("Worker construction increased 25%"))
|
||||||
|
|
|
@ -127,7 +127,7 @@ class BaseUnit : INamed, IConstruction, ICivilopedia {
|
||||||
fun getRejectionReason(construction: CityConstructions): String {
|
fun getRejectionReason(construction: CityConstructions): String {
|
||||||
val civRejectionReason = getRejectionReason(construction.cityInfo.civInfo)
|
val civRejectionReason = getRejectionReason(construction.cityInfo.civInfo)
|
||||||
if(civRejectionReason!="") return civRejectionReason
|
if(civRejectionReason!="") return civRejectionReason
|
||||||
if(unitType.isWaterUnit() && construction.cityInfo.getCenterTile().neighbors.none { it.baseTerrain==Constants.coast })
|
if(unitType.isWaterUnit() && !construction.cityInfo.getCenterTile().isCoastalTile())
|
||||||
return "Can't build water units by the coast"
|
return "Can't build water units by the coast"
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
|
@ -145,6 +145,7 @@ Unless otherwise specified, all the following are from [the Noun Project](https:
|
||||||
* [Ruins](https://thenounproject.com/term/ruins/175277/) By Creative Stall for Ancient runs
|
* [Ruins](https://thenounproject.com/term/ruins/175277/) By Creative Stall for Ancient runs
|
||||||
* [Ruins](https://thenounproject.com/term/ruins/3849/) By Paulo Volkova for City ruins
|
* [Ruins](https://thenounproject.com/term/ruins/3849/) By Paulo Volkova for City ruins
|
||||||
* [Fishing Net](https://thenounproject.com/term/fishing-net/1073133/) By Made for Fishing Boats
|
* [Fishing Net](https://thenounproject.com/term/fishing-net/1073133/) By Made for Fishing Boats
|
||||||
|
* [Moai](https://thenounproject.com/search/?q=moai&i=2878111) By Template
|
||||||
|
|
||||||
## Buildings
|
## Buildings
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue