diff --git a/android/assets/jsons/Civilizations.json b/android/assets/jsons/Civilizations.json index 8bd24bb502..e9dff8def5 100644 --- a/android/assets/jsons/Civilizations.json +++ b/android/assets/jsons/Civilizations.json @@ -12,10 +12,15 @@ "Eretria","Pergamon","Miletos","Megara","Phocaea"] }, { - name:"Chinese", - RGB:[ 101, 253, 155], + name:"China", + RGB:[ 9, 112, 84], cities:["Beijing","Shanghai","Guangzhou","Nanjing","Xian","Chengdu","Hangzhou","Tianjin","Macau","Shandong"] }, + { + name:"Egypt", + RGB:[ 255, 153, 0], + cities:["Thebes","Memphis","Heliopolis","Elephantine","Alexandria","Pi-Ramesses","Giza","Byblos","Akhetaten","Hieraconpolis"] + }, { name:"Barbarians", RGB:[200,200,200] diff --git a/core/src/com/unciv/UnCivGame.kt b/core/src/com/unciv/UnCivGame.kt index 322ca8ca29..83c10a55cb 100644 --- a/core/src/com/unciv/UnCivGame.kt +++ b/core/src/com/unciv/UnCivGame.kt @@ -12,6 +12,7 @@ import com.unciv.models.gamebasics.Unit import com.unciv.models.stats.INamed import com.unciv.ui.GameSettings import com.unciv.ui.utils.GameSaver +import com.unciv.ui.utils.getRandom import com.unciv.ui.worldscreen.WorldScreen class UnCivGame : Game() { @@ -52,19 +53,23 @@ class UnCivGame : Game() { gameInfo.tileMap = TileMap(20) gameInfo.civilizations.add(CivilizationInfo("Babylon", Vector2.Zero, gameInfo)) // first one is player civ - val freeTiles = gameInfo.tileMap.values - freeTiles.removeAll() + val freeTiles = gameInfo.tileMap.values.toMutableList() + freeTiles.removeAll(gameInfo.tileMap.getTilesInDistance(Vector2.Zero,6)) val barbarianCivilization = CivilizationInfo() gameInfo.civilizations.add(barbarianCivilization)// second is barbarian civ - gameInfo.civilizations.add(CivilizationInfo("Greece", Vector2(3f,5f), gameInfo)) // all the rest whatever + for (civname in listOf("Greece","China","Egypt")) { + val startingLocation = freeTiles.toList().getRandom().position + gameInfo.civilizations.add(CivilizationInfo(civname, startingLocation, gameInfo)) // all the rest whatever + freeTiles.removeAll(gameInfo.tileMap.getTilesInDistance(startingLocation, 6)) + } barbarianCivilization.civName = "Barbarians" gameInfo.setTransients() // needs to be before placeBarbarianUnit because it depends on the tilemap having its gameinfo set - (1..5).forEach { gameInfo.placeBarbarianUnit() } + (1..5).forEach { gameInfo.placeBarbarianUnit(freeTiles.toList().getRandom()) } worldScreen = WorldScreen() diff --git a/core/src/com/unciv/logic/Automation.kt b/core/src/com/unciv/logic/Automation.kt index 0faf800367..cf95b0db67 100644 --- a/core/src/com/unciv/logic/Automation.kt +++ b/core/src/com/unciv/logic/Automation.kt @@ -186,16 +186,23 @@ class Automation { fun chooseNextConstruction(cityConstructions: CityConstructions) { cityConstructions.run { val buildableNotWonders = getBuildableBuildings().filterNot { (getConstruction(it) as Building).isWonder } - if (!buildableNotWonders.isEmpty()) { - currentConstruction = buildableNotWonders.first() - } else { - val militaryUnits = cityInfo.civInfo.getCivUnits().filter { it.getBaseUnit().unitType != UnitType.Civilian }.size - if (cityInfo.civInfo.getCivUnits().none { it.name == CityConstructions.Worker } || militaryUnits > cityInfo.civInfo.cities.size * 2) { - currentConstruction = CityConstructions.Worker - } else { - trainCombatUnit(cityInfo) - } + val buildableWonders = getBuildableBuildings().filter { (getConstruction(it) as Building).isWonder } + + val civUnits = cityInfo.civInfo.getCivUnits() + val militaryUnits = civUnits.filter { it.getBaseUnit().unitType != UnitType.Civilian }.size + val workers = civUnits.filter { it.name == CityConstructions.Worker }.size + val cities = cityInfo.civInfo.cities.size + + when { + !buildableNotWonders.isEmpty() -> currentConstruction = buildableNotWonders.first() + militaryUnits==0 -> trainCombatUnit(cityInfo) + workers==0 -> currentConstruction = CityConstructions.Worker + militaryUnits trainCombatUnit(cityInfo) + workers currentConstruction = CityConstructions.Worker + buildableWonders.isNotEmpty() -> currentConstruction = buildableWonders.getRandom() + else -> trainCombatUnit(cityInfo) } + if (cityInfo.civInfo == cityInfo.civInfo.gameInfo.getPlayerCivilization()) cityInfo.civInfo.addNotification("Work has started on $currentConstruction", cityInfo.location) } diff --git a/core/src/com/unciv/logic/GameInfo.kt b/core/src/com/unciv/logic/GameInfo.kt index 5d484912bc..118818ca50 100644 --- a/core/src/com/unciv/logic/GameInfo.kt +++ b/core/src/com/unciv/logic/GameInfo.kt @@ -2,6 +2,7 @@ package com.unciv.logic import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.Notification +import com.unciv.logic.map.TileInfo import com.unciv.logic.map.TileMap import com.unciv.models.gamebasics.GameBasics import com.unciv.ui.utils.getRandom @@ -48,16 +49,20 @@ class GameInfo { } if(turns%10 == 0){ // every 10 turns add a barbarian in a random place - placeBarbarianUnit() + placeBarbarianUnit(null) } turns++ } - fun placeBarbarianUnit() { - val playerViewableTiles = getPlayerCivilization().getViewableTiles().toHashSet() - val viableTiles = tileMap.values.filterNot { playerViewableTiles.contains(it) || it.unit!=null } - tileMap.placeUnitNearTile(viableTiles.getRandom().position,"Warrior",getBarbarianCivilization()) + fun placeBarbarianUnit(tileToPlace: TileInfo?) { + var tile = tileToPlace + if(tileToPlace==null) { + val playerViewableTiles = getPlayerCivilization().getViewableTiles().toHashSet() + val viableTiles = tileMap.values.filterNot { playerViewableTiles.contains(it) || it.unit != null } + tile=viableTiles.getRandom() + } + tileMap.placeUnitNearTile(tile!!.position,"Warrior",getBarbarianCivilization()) } fun setTransients() { diff --git a/core/src/com/unciv/logic/city/CityConstructions.kt b/core/src/com/unciv/logic/city/CityConstructions.kt index 4f53469f5f..3f90f13bb6 100644 --- a/core/src/com/unciv/logic/city/CityConstructions.kt +++ b/core/src/com/unciv/logic/city/CityConstructions.kt @@ -97,7 +97,11 @@ class CityConstructions { if (inProgressConstructions[currentConstruction]!! >= productionCost) { construction.postBuildEvent(this) inProgressConstructions.remove(currentConstruction) - cityInfo.civInfo.addNotification(currentConstruction + " has been built in " + cityInfo.name, cityInfo.location) + + if(construction is Building && construction.isWonder) + cityInfo.civInfo.gameInfo.getPlayerCivilization().addNotification(currentConstruction + " has been built in " + cityInfo.name, cityInfo.location) + else + cityInfo.civInfo.addNotification(currentConstruction + " has been built in " + cityInfo.name, cityInfo.location) Automation().chooseNextConstruction(this) } diff --git a/core/src/com/unciv/models/gamebasics/Building.kt b/core/src/com/unciv/models/gamebasics/Building.kt index 71ee988f78..eefdaac6bb 100644 --- a/core/src/com/unciv/models/gamebasics/Building.kt +++ b/core/src/com/unciv/models/gamebasics/Building.kt @@ -134,7 +134,7 @@ class Building : NamedStats(), IConstruction, ICivilopedia { if (construction.isBuilt(name)) return false val civInfo = construction.cityInfo.civInfo if (requiredTech != null && !civInfo.tech.isResearched(requiredTech!!)) return false - if (isWonder && civInfo.cities.any { + if (isWonder && civInfo.gameInfo.civilizations.flatMap { it.cities }.any { it.cityConstructions.isBuilding(name) || it.cityConstructions.isBuilt(name) }) return false