From ec5a201853a25e2e98a5c9042f1975776cee8952 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Mon, 4 Dec 2017 19:10:32 +0200 Subject: [PATCH] Organized unique wonder abilities by adding "unique" string to building Added Machu Pichu, Angkor Wat and Aqueduct unique abilities Expanded civilopidia entry for buildings Merged CityPopulation into CityInfo because the division was arbitrary --- core/src/com/unciv/civinfo/CityInfo.java | 52 ++++++++++++++----- .../com/unciv/civinfo/CivilizationInfo.java | 4 +- core/src/com/unciv/models/LinqCollection.java | 5 ++ 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/core/src/com/unciv/civinfo/CityInfo.java b/core/src/com/unciv/civinfo/CityInfo.java index 68923aebb6..8b461fb699 100644 --- a/core/src/com/unciv/civinfo/CityInfo.java +++ b/core/src/com/unciv/civinfo/CityInfo.java @@ -2,9 +2,9 @@ package com.unciv.civinfo; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Predicate; -import com.unciv.game.CivilopediaScreen; import com.unciv.game.UnCivGame; import com.unciv.models.LinqCollection; +import com.unciv.models.gamebasics.Building; import com.unciv.models.gamebasics.ResourceType; import com.unciv.models.gamebasics.TileResource; import com.unciv.models.stats.FullStats; @@ -16,9 +16,10 @@ public class CityInfo { public String name; public CityBuildings cityBuildings; - public CityPopulation cityPopulation; public int cultureStored; private int tilesClaimed; + public int population = 1; + public int foodStored = 0; private TileMap getTileMap(){return UnCivGame.Current.civInfo.tileMap; } @@ -45,7 +46,7 @@ public class CityInfo { // (per game XML files) at 6*(t+0.4813)^1.3 // The second seems to be more based, so I'll go with that double a = 6*Math.pow(tilesClaimed+1.4813,1.3); - if(CivilizationInfo.current().getCivTags().contains("NewTileCostReduction")) a *= 0.75; //Speciality of Angkor Wat + if(CivilizationInfo.current().getBuildingUniques().contains("NewTileCostReduction")) a *= 0.75; //Speciality of Angkor Wat return (int)Math.round(a); } @@ -53,7 +54,6 @@ public class CityInfo { name = CityNames[civInfo.cities.size()]; this.cityLocation = cityLocation; cityBuildings = new CityBuildings(this); - cityPopulation = new CityPopulation(); for(TileInfo tileInfo : civInfo.tileMap.getTilesInDistance(cityLocation,1)) { tileInfo.owner = civInfo.civName; @@ -87,7 +87,7 @@ public class CityInfo { } public int getFreePopulation() { - return cityPopulation.Population - getWorkingPopulation(); + return population - getWorkingPopulation(); } public boolean hasNonWorkingPopulation() { @@ -96,8 +96,8 @@ public class CityInfo { public FullStats getCityStats() { FullStats stats = new FullStats(); - stats.happiness = -3 - cityPopulation.Population; // -3 happiness per city and -3 per population - stats.science += cityPopulation.Population; + stats.happiness = -3 - population; // -3 happiness per city and -3 per population + stats.science += population; // Working ppl for (TileInfo cell : getTilesInRange()) @@ -106,12 +106,12 @@ public class CityInfo { //idle ppl stats.production += getFreePopulation(); - stats.food -= cityPopulation.Population * 2; + stats.food -= population * 2; if(!isCapital() && isConnectedToCapital()) { // Calculated by http://civilization.wikia.com/wiki/Trade_route_(Civ5) - double goldFromTradeRoute = CivilizationInfo.current().getCapital().cityPopulation.Population * 0.15 - + cityPopulation.Population * 1.1 - 1; - if(CivilizationInfo.current().getCivTags().contains("TradeRouteGoldIncrease")) goldFromTradeRoute*=1.25; // Machu Pichu speciality + double goldFromTradeRoute = CivilizationInfo.current().getCapital().population * 0.15 + + population * 1.1 - 1; + if(CivilizationInfo.current().getBuildingUniques().contains("TradeRouteGoldIncrease")) goldFromTradeRoute*=1.25; // Machu Pichu speciality stats.gold += goldFromTradeRoute; } @@ -128,7 +128,19 @@ public class CityInfo { stats.food = 0; } - if (cityPopulation.NextTurn(Math.round(stats.food))) autoAssignWorker(); + foodStored += stats.food; + if (foodStored < 0) // starvation! + { + population--; + foodStored = 0; + } + if (foodStored >= foodToNextPopulation()) // growth! + { + foodStored -= foodToNextPopulation(); + if(getBuildingUniques().contains("FoodCarriesOver")) foodStored+=0.4f*foodToNextPopulation(); // Aqueduct special + population++; + autoAssignWorker(); + } cityBuildings.nextTurn(Math.round(stats.production)); @@ -216,4 +228,20 @@ public class CityInfo { } return false; } + + public int foodToNextPopulation() + { + // civ v math,civilization.wikia + return 15 + 6 * (population - 1) + (int)Math.floor(Math.pow(population - 1, 1.8f)); + } + + public LinqCollection getBuildingUniques(){ + return cityBuildings.getBuiltBuildings().select(new LinqCollection.Func() { + @Override + public String GetBy(Building arg0) { + return arg0.unique; + } + }).unique(); + } + } \ No newline at end of file diff --git a/core/src/com/unciv/civinfo/CivilizationInfo.java b/core/src/com/unciv/civinfo/CivilizationInfo.java index a9b494be7b..3b70b91ce6 100644 --- a/core/src/com/unciv/civinfo/CivilizationInfo.java +++ b/core/src/com/unciv/civinfo/CivilizationInfo.java @@ -82,7 +82,7 @@ public class CivilizationInfo { return statsForTurn; } - public LinqCollection getCivTags(){ + public LinqCollection getBuildingUniques(){ return cities.selectMany(new LinqCollection.Func>() { @Override public Collection GetBy(CityInfo arg0) { @@ -93,7 +93,7 @@ public class CivilizationInfo { } }); } - }); + }).unique(); } } diff --git a/core/src/com/unciv/models/LinqCollection.java b/core/src/com/unciv/models/LinqCollection.java index ea16dc0914..478237ee98 100644 --- a/core/src/com/unciv/models/LinqCollection.java +++ b/core/src/com/unciv/models/LinqCollection.java @@ -4,6 +4,7 @@ import com.badlogic.gdx.utils.Predicate; import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; /** * Created by LENOVO on 10/20/2017. @@ -52,6 +53,10 @@ public class LinqCollection extends ArrayList { return get((int) (Math.random() * (size()))); } + public LinqCollection unique() { + return new LinqCollection(new HashSet(this)); // Shove it all into a hashset and build a new one around the results. + } + public interface Func { public T2 GetBy(T1 arg0); }