diff --git a/core/src/com/unciv/logic/city/CityInfo.java b/core/src/com/unciv/logic/city/CityInfo.java index 1b2a6ed331..b17c6fad09 100644 --- a/core/src/com/unciv/logic/city/CityInfo.java +++ b/core/src/com/unciv/logic/city/CityInfo.java @@ -23,7 +23,7 @@ public class CityInfo { public CityExpansionManager expansion = new CityExpansionManager(); public CityStats cityStats = new CityStats(); - private TileMap getTileMap(){return UnCivGame.Current.civInfo.tileMap; } + TileMap getTileMap(){return UnCivGame.Current.civInfo.tileMap; } public TileInfo getTile(){return getTileMap().get(cityLocation);} public Linq getTilesInRange(){ @@ -44,7 +44,6 @@ public class CityInfo { } // for json parsing, we need to have a default constructor - public CityInfo(CivilizationInfo civInfo, Vector2 cityLocation) { population.cityInfo = this; @@ -72,7 +71,7 @@ public class CityInfo { if("Forest".equals(tile.terrainFeature) || "Jungle".equals(tile.terrainFeature) || "Marsh".equals(tile.terrainFeature)) tile.terrainFeature=null; - autoAssignWorker(); + population.autoAssignWorker(); cityStats.update(); } @@ -107,23 +106,6 @@ public class CityInfo { expansion.nextTurn(stats.culture); } - - void autoAssignWorker() { - double maxValue = 0; - TileInfo toWork = null; - for (TileInfo tileInfo : getTilesInRange()) { - if (tileInfo.workingCity !=null) continue; - double value = rankTile(tileInfo); - if (value > maxValue) { - maxValue = value; - toWork = tileInfo; - } - } - - if(toWork!=null) // This is when we've run out of tiles! - toWork.workingCity = name; - } - double rankTile(TileInfo tile){ FullStats stats = tile.getTileStats(this); double rank=0; @@ -137,30 +119,6 @@ public class CityInfo { return rank; } - boolean isCapital(){ return CivilizationInfo.current().getCapital() == this; } - - boolean isConnectedToCapital(RoadStatus roadType){ - if(CivilizationInfo.current().getCapital()==null) return false;// first city! - TileInfo capitalTile = CivilizationInfo.current().getCapital().getTile(); - Linq tilesReached = new Linq(); - Linq tilesToCheck = new Linq(); - tilesToCheck.add(getTile()); - while(!tilesToCheck.isEmpty()){ - Linq newTiles = new Linq(); - for(TileInfo tile : tilesToCheck) - for (TileInfo maybeNewTile : getTileMap().getTilesInDistance(tile.position,1)) - if(!tilesReached.contains(maybeNewTile) && !tilesToCheck.contains(maybeNewTile) && !newTiles.contains(maybeNewTile) - && (roadType != RoadStatus.Road || maybeNewTile.roadStatus != RoadStatus.None) - && (roadType!=RoadStatus.Railroad || maybeNewTile.roadStatus == roadType)) - newTiles.add(maybeNewTile); - - if(newTiles.contains(capitalTile)) return true; - tilesReached.addAll(tilesToCheck); - tilesToCheck = newTiles; - } - return false; - } - public Linq getBuildingUniques(){ return cityConstructions.getBuiltBuildings().select(new Linq.Func() { @Override @@ -183,7 +141,6 @@ public class CityInfo { if(building.greatPersonPoints!=null) greatPersonPoints.add(building.greatPersonPoints); - float multiplier = 1; if(civInfo.getBuildingUniques().contains("GreatPersonGenerationIncrease")) greatPersonPoints = greatPersonPoints.multiply(1.33f); if(civInfo.policies.isAdopted("Entrepreneurship")) diff --git a/core/src/com/unciv/logic/city/CityStats.java b/core/src/com/unciv/logic/city/CityStats.java index cc05e46723..949c03c68b 100644 --- a/core/src/com/unciv/logic/city/CityStats.java +++ b/core/src/com/unciv/logic/city/CityStats.java @@ -7,6 +7,7 @@ import com.unciv.logic.map.RoadStatus; import com.unciv.logic.map.TileInfo; import com.unciv.models.gamebasics.Building; import com.unciv.models.gamebasics.GameBasics; +import com.unciv.models.linq.Linq; import com.unciv.models.stats.FullStats; /** @@ -46,7 +47,7 @@ public class CityStats{ private FullStats getStatsFromTradeRoute(){ FullStats stats = new FullStats(); - if(!cityInfo.isCapital() && cityInfo.isConnectedToCapital(RoadStatus.Road)) { + if(!isCapital() && isConnectedToCapital(RoadStatus.Road)) { CivilizationInfo civInfo = CivilizationInfo.current(); // Calculated by http://civilization.wikia.com/wiki/Trade_route_(Civ5) double goldFromTradeRoute = civInfo.getCapital().population.population * 0.15 @@ -62,13 +63,13 @@ public class CityStats{ FullStats stats = new FullStats(); PolicyManager policies = CivilizationInfo.current().policies; - if(policies.isAdopted("Tradition") && cityInfo.isCapital()) + if(policies.isAdopted("Tradition") && isCapital()) stats.culture+=3; - if(policies.isAdopted("Landed Elite") && cityInfo.isCapital()) + if(policies.isAdopted("Landed Elite") && isCapital()) stats.food+=2; if(policies.isAdopted("Tradition Complete")) stats.food+=2; - if(policies.isAdopted("Monarchy") && cityInfo.isCapital()) + if(policies.isAdopted("Monarchy") && isCapital()) stats.gold+=cityInfo.population.population/2; if(policies.isAdopted("Liberty")) stats.culture+=1; @@ -101,7 +102,7 @@ public class CityStats{ private FullStats getStatPercentBonusesFromRailroad(){ FullStats stats = new FullStats(); if( CivilizationInfo.current().tech.isResearched ("Combustion") && - (cityInfo.isCapital() || cityInfo.isConnectedToCapital(RoadStatus.Railroad))) + (isCapital() || isConnectedToCapital(RoadStatus.Railroad))) stats.production += 25; return stats; } @@ -118,7 +119,7 @@ public class CityStats{ PolicyManager policies = CivilizationInfo.current().policies; CityConstructions cityConstructions = cityInfo.cityConstructions; - if(policies.isAdopted("Collective Rule") && cityInfo.isCapital() + if(policies.isAdopted("Collective Rule") && isCapital() && "Settler".equals(cityConstructions.currentConstruction)) stats.production+=50; if(policies.isAdopted("Republic") && cityConstructions.getCurrentConstruction() instanceof Building) @@ -130,7 +131,7 @@ public class CityStats{ } })) stats.culture+=33; - if(policies.isAdopted("Commerce") && cityInfo.isCapital()) + if(policies.isAdopted("Commerce") && isCapital()) stats.gold+=25; if(policies.isAdopted("Sovereignty") && CivilizationInfo.current().getHappinessForNextTurn() >= 0) stats.science+=15; @@ -167,7 +168,7 @@ public class CityStats{ private float getGrowthBonusFromPolicies(){ float bonus = 0; - if(CivilizationInfo.current().policies.isAdopted("Landed Elite") && cityInfo.isCapital()) + if(CivilizationInfo.current().policies.isAdopted("Landed Elite") && isCapital()) bonus+=0.1; if(CivilizationInfo.current().policies.isAdopted("Tradition Complete")) bonus+=0.15; @@ -231,9 +232,9 @@ public class CityStats{ if(civInfo.policies.isAdopted("Aristocracy")) happiness+=cityInfo.population.population/10; - if(civInfo.policies.isAdopted("Monarchy") && cityInfo.isCapital()) + if(civInfo.policies.isAdopted("Monarchy") && isCapital()) happiness+=cityInfo.population.population/2; - if(civInfo.policies.isAdopted("Meritocracy") && cityInfo.isConnectedToCapital(RoadStatus.Road)) + if(civInfo.policies.isAdopted("Meritocracy") && isConnectedToCapital(RoadStatus.Road)) happiness+=1; happiness+=(int) cityInfo.cityConstructions.getStats().happiness; @@ -241,4 +242,29 @@ public class CityStats{ return happiness; } + + boolean isConnectedToCapital(RoadStatus roadType){ + if(CivilizationInfo.current().getCapital()==null) return false;// first city! + TileInfo capitalTile = CivilizationInfo.current().getCapital().getTile(); + Linq tilesReached = new Linq(); + Linq tilesToCheck = new Linq(); + tilesToCheck.add(cityInfo.getTile()); + while(!tilesToCheck.isEmpty()){ + Linq newTiles = new Linq(); + for(TileInfo tile : tilesToCheck) + for (TileInfo maybeNewTile : cityInfo.getTileMap().getTilesInDistance(tile.position,1)) + if(!tilesReached.contains(maybeNewTile) && !tilesToCheck.contains(maybeNewTile) && !newTiles.contains(maybeNewTile) + && (roadType != RoadStatus.Road || maybeNewTile.roadStatus != RoadStatus.None) + && (roadType!=RoadStatus.Railroad || maybeNewTile.roadStatus == roadType)) + newTiles.add(maybeNewTile); + + if(newTiles.contains(capitalTile)) return true; + tilesReached.addAll(tilesToCheck); + tilesToCheck = newTiles; + } + return false; + } + + boolean isCapital(){ return CivilizationInfo.current().getCapital() == cityInfo; } + } diff --git a/core/src/com/unciv/logic/city/PopulationManager.java b/core/src/com/unciv/logic/city/PopulationManager.java index 3a39a131b1..00916cec81 100644 --- a/core/src/com/unciv/logic/city/PopulationManager.java +++ b/core/src/com/unciv/logic/city/PopulationManager.java @@ -58,8 +58,25 @@ public class PopulationManager { foodStored -= foodToNextPopulation(); if(cityInfo.getBuildingUniques().contains("FoodCarriesOver")) foodStored+=0.4f*foodToNextPopulation(); // Aqueduct special population++; - cityInfo.autoAssignWorker(); + autoAssignWorker(); CivilizationInfo.current().addNotification(cityInfo.name+" has grown!",cityInfo.cityLocation); } } + + void autoAssignWorker() { + double maxValue = 0; + TileInfo toWork = null; + for (TileInfo tileInfo : cityInfo.getTilesInRange()) { + if (tileInfo.workingCity !=null) continue; + double value = cityInfo.rankTile(tileInfo); + if (value > maxValue) { + maxValue = value; + toWork = tileInfo; + } + } + + if(toWork!=null) // This is when we've run out of tiles! + toWork.workingCity = cityInfo.name; + } + }