Split CivInfo's responsibility into separate classes: Tech,Policy,GoldenAge,GreatPerson and ScienceVictory managers.

This commit is contained in:
Yair Morgenstern 2018-01-12 12:37:31 +02:00
parent 85ffcc58ee
commit 3bb849726a
17 changed files with 219 additions and 169 deletions

View File

@ -161,7 +161,7 @@ public class CityConstructions
} }
public void purchaseBuilding(String buildingName) { public void purchaseBuilding(String buildingName) {
CivilizationInfo.current().civStats.gold -= getConstruction(buildingName).getGoldCost(); CivilizationInfo.current().gold -= getConstruction(buildingName).getGoldCost();
getConstruction(buildingName).postBuildEvent(this); getConstruction(buildingName).postBuildEvent(this);
if(currentConstruction.equals(buildingName)) chooseNextConstruction(); if(currentConstruction.equals(buildingName)) chooseNextConstruction();
getCity().updateCityStats(); getCity().updateCityStats();

View File

@ -56,7 +56,7 @@ public class CityInfo {
// The second seems to be more based, so I'll go with that // The second seems to be more based, so I'll go with that
double a = 6*Math.pow(tilesClaimed+1.4813,1.3); double a = 6*Math.pow(tilesClaimed+1.4813,1.3);
if(CivilizationInfo.current().getBuildingUniques().contains("NewTileCostReduction")) a *= 0.75; //Speciality of Angkor Wat if(CivilizationInfo.current().getBuildingUniques().contains("NewTileCostReduction")) a *= 0.75; //Speciality of Angkor Wat
if(CivilizationInfo.current().policies.contains("Tradition")) a *= 0.75; if(CivilizationInfo.current().policies.isAdopted("Tradition")) a *= 0.75;
return (int)Math.round(a); return (int)Math.round(a);
} }
@ -66,7 +66,7 @@ public class CityInfo {
civInfo.cities.add(this); civInfo.cities.add(this);
CivilizationInfo.current().addNotification(name+" has been founded!",cityLocation); CivilizationInfo.current().addNotification(name+" has been founded!",cityLocation);
cityConstructions = new CityConstructions(this); cityConstructions = new CityConstructions(this);
if(civInfo.policies.contains("Legalism") && civInfo.cities.size() <= 4) cityConstructions.addCultureBuilding(); if(civInfo.policies.isAdopted("Legalism") && civInfo.cities.size() <= 4) cityConstructions.addCultureBuilding();
if(civInfo.cities.size()==1) { if(civInfo.cities.size()==1) {
cityConstructions.builtBuildings.add("Palace"); cityConstructions.builtBuildings.add("Palace");
cityConstructions.currentConstruction = "Worker"; // Default for first city only! cityConstructions.currentConstruction = "Worker"; // Default for first city only!
@ -147,8 +147,8 @@ public class CityInfo {
stats.production+=specialists.production*2; stats.production+=specialists.production*2;
stats.science+=specialists.science*3; stats.science+=specialists.science*3;
stats.gold+=specialists.gold*2; stats.gold+=specialists.gold*2;
if(civInfo.policies.contains("Commerce Complete")) stats.gold+=getNumberOfSpecialists(); if(civInfo.policies.isAdopted("Commerce Complete")) stats.gold+=getNumberOfSpecialists();
if(civInfo.policies.contains("Secularism")) stats.science+=getNumberOfSpecialists()*2; if(civInfo.policies.isAdopted("Secularism")) stats.science+=getNumberOfSpecialists()*2;
//idle ppl //idle ppl
stats.production += getFreePopulation(); stats.production += getFreePopulation();
@ -157,38 +157,38 @@ public class CityInfo {
// Calculated by http://civilization.wikia.com/wiki/Trade_route_(Civ5) // Calculated by http://civilization.wikia.com/wiki/Trade_route_(Civ5)
double goldFromTradeRoute = civInfo.getCapital().population * 0.15 double goldFromTradeRoute = civInfo.getCapital().population * 0.15
+ population * 1.1 - 1; + population * 1.1 - 1;
if(civInfo.policies.contains("Trade Unions")) goldFromTradeRoute+=2; if(civInfo.policies.isAdopted("Trade Unions")) goldFromTradeRoute+=2;
if(civInfo.getBuildingUniques().contains("TradeRouteGoldIncrease")) goldFromTradeRoute*=1.25; // Machu Pichu speciality if(civInfo.getBuildingUniques().contains("TradeRouteGoldIncrease")) goldFromTradeRoute*=1.25; // Machu Pichu speciality
stats.gold += goldFromTradeRoute; stats.gold += goldFromTradeRoute;
} }
stats.add(cityConstructions.getStats()); stats.add(cityConstructions.getStats());
if(civInfo.policies.contains("Tradition") && isCapital()) if(civInfo.policies.isAdopted("Tradition") && isCapital())
stats.culture+=3; stats.culture+=3;
if(civInfo.policies.contains("Landed Elite") && isCapital()) if(civInfo.policies.isAdopted("Landed Elite") && isCapital())
stats.food+=2; stats.food+=2;
if(CivilizationInfo.current().policies.contains("Tradition Complete")) if(CivilizationInfo.current().policies.isAdopted("Tradition Complete"))
stats.food+=2; stats.food+=2;
if(CivilizationInfo.current().policies.contains("Monarchy") && isCapital()) if(CivilizationInfo.current().policies.isAdopted("Monarchy") && isCapital())
stats.gold+=population/2; stats.gold+=population/2;
if(CivilizationInfo.current().policies.contains("Liberty")) if(CivilizationInfo.current().policies.isAdopted("Liberty"))
stats.culture+=1; stats.culture+=1;
if(CivilizationInfo.current().policies.contains("Republic")) if(CivilizationInfo.current().policies.isAdopted("Republic"))
stats.production+=1; stats.production+=1;
if(CivilizationInfo.current().policies.contains("Universal Suffrage")) if(CivilizationInfo.current().policies.isAdopted("Universal Suffrage"))
stats.production+=population/5; stats.production+=population/5;
if(CivilizationInfo.current().policies.contains("Free Speech")) if(CivilizationInfo.current().policies.isAdopted("Free Speech"))
stats.culture+=population/2; stats.culture+=population/2;
FullStats statPercentBonuses = cityConstructions.getStatPercentBonuses(); FullStats statPercentBonuses = cityConstructions.getStatPercentBonuses();
if( civInfo.tech.isResearched ("Combustion") && if( civInfo.tech.isResearched ("Combustion") &&
(isCapital() || isConnectedToCapital(RoadStatus.Railroad))) statPercentBonuses.production += 25; (isCapital() || isConnectedToCapital(RoadStatus.Railroad))) statPercentBonuses.production += 25;
if(civInfo.isGoldenAge()) statPercentBonuses.production+=20; if(civInfo.goldenAges.isGoldenAge()) statPercentBonuses.production+=20;
IConstruction currentConstruction = cityConstructions.getCurrentConstruction(); IConstruction currentConstruction = cityConstructions.getCurrentConstruction();
if(currentConstruction instanceof Building && ((Building)currentConstruction).isWonder){ if(currentConstruction instanceof Building && ((Building)currentConstruction).isWonder){
if(civInfo.getCivResources().containsKey(GameBasics.TileResources.get("Marble"))) if(civInfo.getCivResources().containsKey(GameBasics.TileResources.get("Marble")))
statPercentBonuses.production+=15; statPercentBonuses.production+=15;
if(civInfo.policies.contains("Aristocracy")) if(civInfo.policies.isAdopted("Aristocracy"))
statPercentBonuses.production+=15; statPercentBonuses.production+=15;
} }
@ -197,21 +197,21 @@ public class CityInfo {
statPercentBonuses.science+=10; statPercentBonuses.science+=10;
} }
if(civInfo.policies.contains("Collective Rule") && isCapital() if(civInfo.policies.isAdopted("Collective Rule") && isCapital()
&& "Settler".equals(cityConstructions.currentConstruction)) && "Settler".equals(cityConstructions.currentConstruction))
statPercentBonuses.production+=50; statPercentBonuses.production+=50;
if(civInfo.policies.contains("Republic") && currentConstruction instanceof Building) if(civInfo.policies.isAdopted("Republic") && currentConstruction instanceof Building)
statPercentBonuses.production+=5; statPercentBonuses.production+=5;
if(civInfo.policies.contains("Reformation") && cityConstructions.builtBuildings.any(new Predicate<String>() { if(civInfo.policies.isAdopted("Reformation") && cityConstructions.builtBuildings.any(new Predicate<String>() {
@Override @Override
public boolean evaluate(String arg0) { public boolean evaluate(String arg0) {
return GameBasics.Buildings.get(arg0).isWonder; return GameBasics.Buildings.get(arg0).isWonder;
} }
})) }))
statPercentBonuses.culture+=33; statPercentBonuses.culture+=33;
if(civInfo.policies.contains("Commerce") && isCapital()) if(civInfo.policies.isAdopted("Commerce") && isCapital())
statPercentBonuses.gold+=25; statPercentBonuses.gold+=25;
if(civInfo.policies.contains("Sovereignty") && civInfo.getHappinessForNextTurn() >= 0) if(civInfo.policies.isAdopted("Sovereignty") && civInfo.getHappinessForNextTurn() >= 0)
statPercentBonuses.science+=15; statPercentBonuses.science+=15;
stats.production*=1+statPercentBonuses.production/100; // So they get bonuses for production and gold/science stats.production*=1+statPercentBonuses.production/100; // So they get bonuses for production and gold/science
@ -220,7 +220,7 @@ public class CityInfo {
float scienceProduced=stats.production/4; float scienceProduced=stats.production/4;
if (civInfo.getBuildingUniques().contains("ScienceConversionIncrease")) if (civInfo.getBuildingUniques().contains("ScienceConversionIncrease"))
scienceProduced*=1.33; scienceProduced*=1.33;
if(civInfo.policies.contains("Rationalism")) scienceProduced*=1.33; if(civInfo.policies.isAdopted("Rationalism")) scienceProduced*=1.33;
stats.science += scienceProduced; stats.science += scienceProduced;
} }
@ -231,13 +231,13 @@ public class CityInfo {
boolean isUnhappy = civInfo.getHappinessForNextTurn() < 0; boolean isUnhappy = civInfo.getHappinessForNextTurn() < 0;
if (!isUnhappy) stats.food*=1+statPercentBonuses.food/100; // Regular food bonus revoked when unhappy per https://forums.civfanatics.com/resources/complete-guide-to-happiness-vanilla.25584/ if (!isUnhappy) stats.food*=1+statPercentBonuses.food/100; // Regular food bonus revoked when unhappy per https://forums.civfanatics.com/resources/complete-guide-to-happiness-vanilla.25584/
stats.food -= population * 2; // Food reduced after the bonus stats.food -= population * 2; // Food reduced after the bonus
if(CivilizationInfo.current().policies.contains("Civil Society")) if(CivilizationInfo.current().policies.isAdopted("Civil Society"))
stats.food+=getNumberOfSpecialists(); stats.food+=getNumberOfSpecialists();
if(isUnhappy) stats.food /= 4; // Reduce excess food to 1/4 per the same if(isUnhappy) stats.food /= 4; // Reduce excess food to 1/4 per the same
if(civInfo.policies.contains("Landed Elite") && isCapital()) if(civInfo.policies.isAdopted("Landed Elite") && isCapital())
stats.food*=1.1; stats.food*=1.1;
if(CivilizationInfo.current().policies.contains("Tradition Complete")) if(CivilizationInfo.current().policies.isAdopted("Tradition Complete"))
stats.food*=1.15; stats.food*=1.15;
stats.gold-= cityConstructions.getMaintainanceCosts(); // this is AFTER the bonus calculation! stats.gold-= cityConstructions.getMaintainanceCosts(); // this is AFTER the bonus calculation!
@ -249,18 +249,18 @@ public class CityInfo {
// in order to determine how much food is produced in a city! // in order to determine how much food is produced in a city!
float happiness = -3; // -3 happiness per city float happiness = -3; // -3 happiness per city
float unhappinessFromCitizens = population; float unhappinessFromCitizens = population;
if(civInfo.policies.contains("Democracy")) unhappinessFromCitizens-=getNumberOfSpecialists()*0.5f; if(civInfo.policies.isAdopted("Democracy")) unhappinessFromCitizens-=getNumberOfSpecialists()*0.5f;
if(civInfo.getBuildingUniques().contains("CitizenUnhappinessDecreased")) if(civInfo.getBuildingUniques().contains("CitizenUnhappinessDecreased"))
unhappinessFromCitizens*=0.9; unhappinessFromCitizens*=0.9;
if(civInfo.policies.contains("Aristocracy")) if(civInfo.policies.isAdopted("Aristocracy"))
unhappinessFromCitizens*=0.95; unhappinessFromCitizens*=0.95;
happiness-=unhappinessFromCitizens; happiness-=unhappinessFromCitizens;
if(civInfo.policies.contains("Aristocracy")) if(civInfo.policies.isAdopted("Aristocracy"))
happiness+=population/10; happiness+=population/10;
if(civInfo.policies.contains("Monarchy") && isCapital()) if(civInfo.policies.isAdopted("Monarchy") && isCapital())
happiness+=population/2; happiness+=population/2;
if(civInfo.policies.contains("Meritocracy") && isConnectedToCapital(RoadStatus.Road)) if(civInfo.policies.isAdopted("Meritocracy") && isConnectedToCapital(RoadStatus.Road))
happiness+=1; happiness+=1;
happiness+=(int) cityConstructions.getStats().happiness; happiness+=(int) cityConstructions.getStats().happiness;
@ -413,9 +413,9 @@ public class CityInfo {
float multiplier = 1; float multiplier = 1;
if(civInfo.getBuildingUniques().contains("GreatPersonGenerationIncrease")) if(civInfo.getBuildingUniques().contains("GreatPersonGenerationIncrease"))
greatPersonPoints = greatPersonPoints.multiply(1.33f); greatPersonPoints = greatPersonPoints.multiply(1.33f);
if(civInfo.policies.contains("Entrepreneurship")) if(civInfo.policies.isAdopted("Entrepreneurship"))
greatPersonPoints.gold*=1.25; greatPersonPoints.gold*=1.25;
if(civInfo.policies.contains("Freedom")) if(civInfo.policies.isAdopted("Freedom"))
greatPersonPoints = greatPersonPoints.multiply(1.25f); greatPersonPoints = greatPersonPoints.multiply(1.25f);
return greatPersonPoints; return greatPersonPoints;

View File

@ -24,18 +24,16 @@ import java.util.Collection;
public class CivilizationInfo { public class CivilizationInfo {
public static CivilizationInfo current(){ return UnCivGame.Current.civInfo; } public static CivilizationInfo current(){ return UnCivGame.Current.civInfo; }
public CivStats civStats = new CivStats(); //public CivStats civStats = new CivStats();
public int gold = 0;
public int baseHappiness = 15; public int baseHappiness = 15;
public int numberOfGoldenAges=0;
public int turnsLeftForCurrentGoldenAge=0;
public int pointsForNextGreatPerson=100;
public String civName = "Babylon"; public String civName = "Babylon";
public FullStats greatPersonPoints = new FullStats();
public CivilizationTech tech = new CivilizationTech(); public TechManager tech = new TechManager();
public CivilizationPolicies policies = new CivilizationPolicies(); public PolicyManager policies = new PolicyManager();
public int freePolicies=0; public GoldenAgeManager goldenAges = new GoldenAgeManager();
public GreatPersonManager greatPeople = new GreatPersonManager();
public int turns = 1; public int turns = 1;
public class Notification{ public class Notification{
@ -56,7 +54,7 @@ public class CivilizationInfo {
public Linq<CityInfo> cities = new Linq<CityInfo>(); public Linq<CityInfo> cities = new Linq<CityInfo>();
public TileMap tileMap = new TileMap(20); public TileMap tileMap = new TileMap(20);
public ScienceVictory scienceVictory = new ScienceVictory(); public ScienceVictoryManager scienceVictory = new ScienceVictoryManager();
public int currentCity =0; //index! public int currentCity =0; //index!
@ -83,28 +81,19 @@ public class CivilizationInfo {
}); });
} }
public boolean isGoldenAge(){return turnsLeftForCurrentGoldenAge>0;}
public int happinessRequiredForNextGoldenAge(){
return (int) ((500+numberOfGoldenAges*250)*(1+cities.size()/100.0)); //https://forums.civfanatics.com/resources/complete-guide-to-happiness-vanilla.25584/
}
public void nextTurn() public void nextTurn()
{ {
notifications.clear(); notifications.clear();
CivStats nextTurnStats = getStatsForNextTurn(); CivStats nextTurnStats = getStatsForNextTurn();
boolean couldAdoptPolicyBefore = canAdoptPolicy(); policies.nextTurn(nextTurnStats.culture);
civStats.add(nextTurnStats);
if(!couldAdoptPolicyBefore && canAdoptPolicy())
UnCivGame.Current.setScreen(new PolicyPickerScreen());
int happiness = getHappinessForNextTurn(); int happiness = getHappinessForNextTurn();
if(!isGoldenAge() && happiness>0)
civStats.happiness += happiness;
if(cities.size() > 0) tech.nextTurn((int)nextTurnStats.science); if(cities.size() > 0) tech.nextTurn((int)nextTurnStats.science);
for (CityInfo city : cities) city.nextTurn(); for (CityInfo city : cities) city.nextTurn();
greatPersonPointsForTurn();
greatPeople.greatPersonPointsForTurn();
// We need to update the stats after ALL the cities are done updating because // We need to update the stats after ALL the cities are done updating because
// maybe one of them has a wonder that affects the stats of all the rest of the cities // maybe one of them has a wonder that affects the stats of all the rest of the cities
@ -118,57 +107,12 @@ public class CivilizationInfo {
} }
})) tile.nextTurn(); })) tile.nextTurn();
if(isGoldenAge()) turnsLeftForCurrentGoldenAge--; goldenAges.nextTurn(happiness);
if(civStats.happiness > happinessRequiredForNextGoldenAge()){
civStats.happiness-=happinessRequiredForNextGoldenAge();
enterGoldenAge();
numberOfGoldenAges++;
}
for (CityInfo city : cities) city.updateCityStats(); for (CityInfo city : cities) city.updateCityStats();
turns++; turns++;
} }
public void addGreatPerson(String unitName){ // This is also done by some wonders and social policies, remember
tileMap.placeUnitNearTile(cities.get(0).cityLocation,unitName);
addNotification("A "+unitName+" has been born!",cities.get(0).cityLocation);
}
public void greatPersonPointsForTurn(){
for(CityInfo city : cities)
greatPersonPoints.add(city.getGreatPersonPoints());
if(greatPersonPoints.science>pointsForNextGreatPerson){
greatPersonPoints.science-=pointsForNextGreatPerson;
pointsForNextGreatPerson*=2;
addGreatPerson("Great Scientist");
}
if(greatPersonPoints.production>pointsForNextGreatPerson){
greatPersonPoints.production-=pointsForNextGreatPerson;
pointsForNextGreatPerson*=2;
addGreatPerson("Great Engineer");
}
if(greatPersonPoints.culture>pointsForNextGreatPerson){
greatPersonPoints.culture-=pointsForNextGreatPerson;
pointsForNextGreatPerson*=2;
addGreatPerson("Great Artist");
}
if(greatPersonPoints.gold>pointsForNextGreatPerson){
greatPersonPoints.gold-=pointsForNextGreatPerson;
pointsForNextGreatPerson*=2;
addGreatPerson("Great Merchant");
}
}
public void enterGoldenAge(){
int turnsToGoldenAge = 10;
if(getBuildingUniques().contains("GoldenAgeLengthIncrease")) turnsToGoldenAge*=1.5;
if(policies.contains("Freedom Complete")) turnsToGoldenAge*=1.5;
turnsLeftForCurrentGoldenAge += turnsToGoldenAge;
addNotification("You have entered a golden age!",null);
}
public CivStats getStatsForNextTurn() { public CivStats getStatsForNextTurn() {
CivStats statsForTurn = new CivStats(); CivStats statsForTurn = new CivStats();
for (CityInfo city : cities) { for (CityInfo city : cities) {
@ -182,10 +126,10 @@ public class CivilizationInfo {
if (tile.roadStatus == RoadStatus.Road) transportationUpkeep+=1; if (tile.roadStatus == RoadStatus.Road) transportationUpkeep+=1;
else if(tile.roadStatus == RoadStatus.Railroad) transportationUpkeep+=2; else if(tile.roadStatus == RoadStatus.Railroad) transportationUpkeep+=2;
} }
if(policies.contains("Trade Unions")) transportationUpkeep *= 2/3f; if(policies.isAdopted("Trade Unions")) transportationUpkeep *= 2/3f;
statsForTurn.gold -=transportationUpkeep; statsForTurn.gold -=transportationUpkeep;
if(policies.contains("Mandate Of Heaven")) if(policies.isAdopted("Mandate Of Heaven"))
statsForTurn.culture+=getHappinessForNextTurn()/2; statsForTurn.culture+=getHappinessForNextTurn()/2;
return statsForTurn; return statsForTurn;
} }
@ -193,7 +137,7 @@ public class CivilizationInfo {
public int getHappinessForNextTurn(){ public int getHappinessForNextTurn(){
int happiness = baseHappiness; int happiness = baseHappiness;
int happinessPerUniqueLuxury = 5; int happinessPerUniqueLuxury = 5;
if(policies.contains("Protectionism")) happinessPerUniqueLuxury+=1; if(policies.isAdopted("Protectionism")) happinessPerUniqueLuxury+=1;
happiness += new Linq<TileResource>(getCivResources().keySet()).count(new Predicate<TileResource>() { happiness += new Linq<TileResource>(getCivResources().keySet()).count(new Predicate<TileResource>() {
@Override @Override
public boolean evaluate(TileResource arg0) { public boolean evaluate(TileResource arg0) {
@ -204,7 +148,7 @@ public class CivilizationInfo {
happiness += city.getCityHappiness(); happiness += city.getCityHappiness();
} }
if(getBuildingUniques().contains("HappinessPerSocialPolicy")) if(getBuildingUniques().contains("HappinessPerSocialPolicy"))
happiness+=policies.count(new Predicate<String>() { happiness+=policies.getAdoptedPolicies().count(new Predicate<String>() {
@Override @Override
public boolean evaluate(String arg0) { public boolean evaluate(String arg0) {
return !arg0.endsWith("Complete"); return !arg0.endsWith("Complete");
@ -233,26 +177,5 @@ public class CivilizationInfo {
} }
}).unique(); }).unique();
} }
public int getCultureNeededForNextPolicy(){
// from https://forums.civfanatics.com/threads/the-number-crunching-thread.389702/
int basicPolicies = policies.count(new Predicate<String>() {
@Override
public boolean evaluate(String arg0) {
return !arg0.endsWith("Complete");
}
});
double baseCost = 25+ Math.pow(basicPolicies*6,1.7);
double cityModifier = 0.3*(cities.size()-1);
if(policies.contains("Representation")) cityModifier *= 2/3f;
int cost = (int) Math.round(baseCost*(1+cityModifier));
if(policies.contains("Piety Complete")) cost*=0.9;
if(getBuildingUniques().contains("PolicyCostReduction")) cost*=0.9;
return cost-cost%5; // round down to nearest 5
}
public boolean canAdoptPolicy(){
return civStats.culture >= getCultureNeededForNextPolicy();
}
} }

View File

@ -0,0 +1,34 @@
package com.unciv.logic.civilization;
public class GoldenAgeManager{
public int storedHappiness=0;
public int numberOfGoldenAges=0;
public int turnsLeftForCurrentGoldenAge=0;
public boolean isGoldenAge(){return turnsLeftForCurrentGoldenAge>0;}
public int happinessRequiredForNextGoldenAge(){
return (int) ((500+numberOfGoldenAges*250)*(1+CivilizationInfo.current().cities.size()/100.0)); //https://forums.civfanatics.com/resources/complete-guide-to-happiness-vanilla.25584/
}
public void enterGoldenAge(){
int turnsToGoldenAge = 10;
CivilizationInfo civInfo = CivilizationInfo.current();
if(civInfo.getBuildingUniques().contains("GoldenAgeLengthIncrease")) turnsToGoldenAge*=1.5;
if(civInfo.policies.isAdopted("Freedom Complete")) turnsToGoldenAge*=1.5;
turnsLeftForCurrentGoldenAge += turnsToGoldenAge;
civInfo.addNotification("You have entered a golden age!",null);
}
public void nextTurn(int happiness) {
if(happiness>0&& !isGoldenAge()) storedHappiness+=happiness;
if(isGoldenAge()) turnsLeftForCurrentGoldenAge--;
else if(storedHappiness > happinessRequiredForNextGoldenAge()){
storedHappiness -= happinessRequiredForNextGoldenAge();
enterGoldenAge();
numberOfGoldenAges++;
}
}
}

View File

@ -0,0 +1,44 @@
package com.unciv.logic.civilization;
import com.unciv.logic.city.CityInfo;
import com.unciv.models.stats.FullStats;
public class GreatPersonManager{
public void addGreatPerson(String unitName){ // This is also done by some wonders and social policies, remember
CivilizationInfo civInfo = CivilizationInfo.current();
civInfo.tileMap.placeUnitNearTile(civInfo.getCapital().cityLocation,unitName);
civInfo.addNotification("A "+unitName+" has been born!",civInfo.getCapital().cityLocation);
}
public void greatPersonPointsForTurn(){
for(CityInfo city : CivilizationInfo.current().cities)
greatPersonPoints.add(city.getGreatPersonPoints());
if(greatPersonPoints.science>pointsForNextGreatPerson){
greatPersonPoints.science-=pointsForNextGreatPerson;
pointsForNextGreatPerson*=2;
addGreatPerson("Great Scientist");
}
if(greatPersonPoints.production>pointsForNextGreatPerson){
greatPersonPoints.production-=pointsForNextGreatPerson;
pointsForNextGreatPerson*=2;
addGreatPerson("Great Engineer");
}
if(greatPersonPoints.culture>pointsForNextGreatPerson){
greatPersonPoints.culture-=pointsForNextGreatPerson;
pointsForNextGreatPerson*=2;
addGreatPerson("Great Artist");
}
if(greatPersonPoints.gold>pointsForNextGreatPerson){
greatPersonPoints.gold-=pointsForNextGreatPerson;
pointsForNextGreatPerson*=2;
addGreatPerson("Great Merchant");
}
}
public int pointsForNextGreatPerson=100;
public FullStats greatPersonPoints = new FullStats();
}

View File

@ -8,17 +8,48 @@ import com.unciv.models.gamebasics.PolicyBranch;
import com.unciv.models.linq.Linq; import com.unciv.models.linq.Linq;
import com.unciv.ui.UnCivGame; import com.unciv.ui.UnCivGame;
import com.unciv.ui.pickerscreens.GreatPersonPickerScreen; import com.unciv.ui.pickerscreens.GreatPersonPickerScreen;
import com.unciv.ui.pickerscreens.PolicyPickerScreen;
public class CivilizationPolicies extends Linq<String> { public class PolicyManager {
public int freePolicies=0;
public int storedCulture=0;
private Linq<String> adoptedPolicies = new Linq<String>();
public Linq<String> getAdoptedPolicies(){return adoptedPolicies.clone();}
public boolean isAdopted(String policyName){return adoptedPolicies.contains(policyName);}
public int getCultureNeededForNextPolicy(){
// from https://forums.civfanatics.com/threads/the-number-crunching-thread.389702/
int basicPolicies = adoptedPolicies.count(new Predicate<String>() {
@Override
public boolean evaluate(String arg0) {
return !arg0.endsWith("Complete");
}
});
double baseCost = 25+ Math.pow(basicPolicies*6,1.7);
double cityModifier = 0.3*(CivilizationInfo.current().cities.size()-1);
if(isAdopted("Representation")) cityModifier *= 2/3f;
int cost = (int) Math.round(baseCost*(1+cityModifier));
if(isAdopted("Piety Complete")) cost*=0.9;
if(CivilizationInfo.current().getBuildingUniques().contains("PolicyCostReduction")) cost*=0.9;
return cost-cost%5; // round down to nearest 5
}
public boolean canAdoptPolicy(){
return storedCulture >= getCultureNeededForNextPolicy();
}
public void adopt(Policy policy){ public void adopt(Policy policy){
adoptedPolicies.add(policy.name);
PolicyBranch branch = GameBasics.PolicyBranches.get(policy.branch); PolicyBranch branch = GameBasics.PolicyBranches.get(policy.branch);
int policiesCompleteInBranch = branch.policies.count(new Predicate<Policy>() { int policiesCompleteInBranch = branch.policies.count(new Predicate<Policy>() {
@Override @Override
public boolean evaluate(Policy arg0) { public boolean evaluate(Policy arg0) {
return contains(arg0.name); return isAdopted(arg0.name);
} }
}); });
@ -32,7 +63,7 @@ public class CivilizationPolicies extends Linq<String> {
CivilizationInfo.current().tileMap. CivilizationInfo.current().tileMap.
placeUnitNearTile(CivilizationInfo.current().getCapital().cityLocation, "Worker"); placeUnitNearTile(CivilizationInfo.current().getCapital().cityLocation, "Worker");
if (policy.name.equals("Representation") || policy.name.equals("Reformation")) if (policy.name.equals("Representation") || policy.name.equals("Reformation"))
CivilizationInfo.current().enterGoldenAge(); CivilizationInfo.current().goldenAges.enterGoldenAge();
if (policy.name.equals("Scientific Revolution")) if (policy.name.equals("Scientific Revolution"))
CivilizationInfo.current().tech.freeTechs+=2; CivilizationInfo.current().tech.freeTechs+=2;
@ -42,10 +73,17 @@ public class CivilizationPolicies extends Linq<String> {
city.cityConstructions.addCultureBuilding(); city.cityConstructions.addCultureBuilding();
if (policy.name.equals("Free Religion")) if (policy.name.equals("Free Religion"))
CivilizationInfo.current().freePolicies++; freePolicies++;
if (policy.name.equals("Liberty Complete")) if (policy.name.equals("Liberty Complete"))
UnCivGame.Current.setScreen(new GreatPersonPickerScreen()); UnCivGame.Current.setScreen(new GreatPersonPickerScreen());
} }
public void nextTurn(float culture) {
storedCulture+=culture;
boolean couldAdoptPolicyBefore = canAdoptPolicy();
if(!couldAdoptPolicyBefore && canAdoptPolicy())
UnCivGame.Current.setScreen(new PolicyPickerScreen());
}
} }

View File

@ -2,7 +2,7 @@ package com.unciv.logic.civilization;
import com.unciv.models.linq.LinqCounter; import com.unciv.models.linq.LinqCounter;
public class ScienceVictory{ public class ScienceVictoryManager {
public LinqCounter<String> requiredParts = new LinqCounter<String>(){ public LinqCounter<String> requiredParts = new LinqCounter<String>(){
{ {
add("SS Booster",3); add("SS Booster",3);

View File

@ -10,7 +10,7 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
public class CivilizationTech{ public class TechManager {
public int freeTechs = 0; public int freeTechs = 0;
public HashSet<String> techsResearched = new HashSet<String>(); public HashSet<String> techsResearched = new HashSet<String>();

View File

@ -84,10 +84,10 @@ public class TileInfo
else stats.add(improvement); // basic improvement else stats.add(improvement); // basic improvement
if (isResearched(improvement.improvingTech)) stats.add(improvement.improvingTechStats); // eg Chemistry for mines if (isResearched(improvement.improvingTech)) stats.add(improvement.improvingTechStats); // eg Chemistry for mines
if(improvement.name.equals("Trading post") && CivilizationInfo.current().policies.contains("Free Thought")) if(improvement.name.equals("Trading post") && CivilizationInfo.current().policies.isAdopted("Free Thought"))
stats.science+=1; stats.science+=1;
if(new Linq<String>("Academy","Landmark","Manufactory","Customs House").contains(improvement.name) if(new Linq<String>("Academy","Landmark","Manufactory","Customs House").contains(improvement.name)
&& CivilizationInfo.current().policies.contains("Freedom Complete")) && CivilizationInfo.current().policies.isAdopted("Freedom Complete"))
stats.add(improvement); // again, for the double effect stats.add(improvement); // again, for the double effect
} }
@ -100,7 +100,7 @@ public class TileInfo
if("Jungle".equals(terrainFeature) && city!=null if("Jungle".equals(terrainFeature) && city!=null
&& city.getBuildingUniques().contains("JunglesProvideScience")) stats.science+=2; && city.getBuildingUniques().contains("JunglesProvideScience")) stats.science+=2;
if(stats.gold!=0 && CivilizationInfo.current().isGoldenAge()) if(stats.gold!=0 && CivilizationInfo.current().goldenAges.isGoldenAge())
stats.gold++; stats.gold++;
return stats; return stats;

View File

@ -48,7 +48,7 @@ public class Building extends NamedStats implements IConstruction, ICivilopedia
public FullStats getStats(){ public FullStats getStats(){
FullStats stats = new FullStats(this); FullStats stats = new FullStats(this);
Linq<String> policies = CivilizationInfo.current().policies; Linq<String> policies = CivilizationInfo.current().policies.getAdoptedPolicies();
if (policies.contains("Organized Religion") && if (policies.contains("Organized Religion") &&
new Linq<String>("Monument","Temple","Monastery").contains(name)) new Linq<String>("Monument","Temple","Monastery").contains(name))
stats.happiness+=1; stats.happiness+=1;
@ -134,15 +134,15 @@ public class Building extends NamedStats implements IConstruction, ICivilopedia
@Override @Override
public int getProductionCost() { public int getProductionCost() {
if(!isWonder && culture!=0 && CivilizationInfo.current().policies.contains("Piety")) if(!isWonder && culture!=0 && CivilizationInfo.current().policies.isAdopted("Piety"))
return (int) (cost*0.85); return (int) (cost*0.85);
return cost; return cost;
} }
public int getGoldCost(){ public int getGoldCost(){
double cost = Math.pow(30 * getProductionCost(),0.75) * (1 + hurryCostModifier/100); double cost = Math.pow(30 * getProductionCost(),0.75) * (1 + hurryCostModifier/100);
if(CivilizationInfo.current().policies.contains("Mercantilism")) cost*=0.75; if(CivilizationInfo.current().policies.isAdopted("Mercantilism")) cost*=0.75;
if(CivilizationInfo.current().policies.contains("Patronage")) cost*=0.5; if(CivilizationInfo.current().policies.isAdopted("Patronage")) cost*=0.5;
return (int)( cost / 10 ) * 10; return (int)( cost / 10 ) * 10;
} }
@ -214,14 +214,14 @@ public class Building extends NamedStats implements IConstruction, ICivilopedia
if (providesFreeBuilding != null && !constructions.builtBuildings.contains(providesFreeBuilding)) if (providesFreeBuilding != null && !constructions.builtBuildings.contains(providesFreeBuilding))
constructions.builtBuildings.add(providesFreeBuilding); constructions.builtBuildings.add(providesFreeBuilding);
if (freeTechs != 0) UnCivGame.Current.civInfo.tech.freeTechs += freeTechs; if (freeTechs != 0) UnCivGame.Current.civInfo.tech.freeTechs += freeTechs;
if("EmpireEntersGoldenAge".equals(unique)) CivilizationInfo.current().enterGoldenAge(); if("EmpireEntersGoldenAge".equals(unique)) CivilizationInfo.current().goldenAges.enterGoldenAge();
if("FreeGreatArtistAppears".equals(unique)) CivilizationInfo.current().addGreatPerson("Great Artist"); if("FreeGreatArtistAppears".equals(unique)) CivilizationInfo.current().greatPeople.addGreatPerson("Great Artist");
if("WorkerConstruction".equals(unique)){ if("WorkerConstruction".equals(unique)){
CivilizationInfo.current().tileMap.placeUnitNearTile(constructions.cityLocation,"Worker"); CivilizationInfo.current().tileMap.placeUnitNearTile(constructions.cityLocation,"Worker");
CivilizationInfo.current().tileMap.placeUnitNearTile(constructions.cityLocation,"Worker"); CivilizationInfo.current().tileMap.placeUnitNearTile(constructions.cityLocation,"Worker");
} }
if("FreeSocialPolicy".equals(unique)){ if("FreeSocialPolicy".equals(unique)){
CivilizationInfo.current().freePolicies++; CivilizationInfo.current().policies.freePolicies++;
UnCivGame.Current.setScreen(new PolicyPickerScreen()); UnCivGame.Current.setScreen(new PolicyPickerScreen());
} }
} }

View File

@ -20,7 +20,7 @@ public class TileImprovement extends NamedStats implements ICivilopedia {
float realTurnsToBuild = turnsToBuild; float realTurnsToBuild = turnsToBuild;
if(CivilizationInfo.current().getBuildingUniques().contains("WorkerConstruction")) if(CivilizationInfo.current().getBuildingUniques().contains("WorkerConstruction"))
realTurnsToBuild*=0.75; realTurnsToBuild*=0.75;
if(CivilizationInfo.current().policies.contains("Citizenship")) if(CivilizationInfo.current().policies.isAdopted("Citizenship"))
realTurnsToBuild*=0.75; realTurnsToBuild*=0.75;
return Math.round(realTurnsToBuild); return Math.round(realTurnsToBuild);
} }

View File

@ -76,8 +76,12 @@ public class Linq<T> extends ArrayList<T> {
} }
public Linq<T> reverse(){ public Linq<T> reverse(){
Linq<T> newCol = new Linq<T>(this); Linq<T> newCol = clone();
Collections.reverse(newCol); Collections.reverse(newCol);
return newCol; return newCol;
} }
public Linq<T> clone(){
return new Linq<T>(this);
}
} }

View File

@ -387,7 +387,7 @@ public class CityScreen extends CameraStageBaseScreen {
update(); update();
} }
}); });
if(buildingGoldCost > game.civInfo.civStats.gold){ if(buildingGoldCost > game.civInfo.gold){
buildingBuyButton.setColor(Color.GRAY); buildingBuyButton.setColor(Color.GRAY);
buildingBuyButton.setTouchable(Touchable.disabled); buildingBuyButton.setTouchable(Touchable.disabled);
} }

View File

@ -2,6 +2,7 @@ package com.unciv.ui;
import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.ui.Label; import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton; import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.unciv.ui.utils.CameraStageBaseScreen; import com.unciv.ui.utils.CameraStageBaseScreen;
@ -9,11 +10,12 @@ import com.unciv.ui.utils.CameraStageBaseScreen;
public class VictoryScreen extends CameraStageBaseScreen{ public class VictoryScreen extends CameraStageBaseScreen{
public VictoryScreen() { public VictoryScreen() {
Label label = new Label("Congrendulation!\r\nYou have won!!!!!",skin);
label.setFontScale(5);
label.setPosition((stage.getWidth()-label.getWidth())/2 , (stage.getHeight()-label.getHeight())/2 );
stage.addActor(label);
Table table = new Table();
Label label = new Label("A resounding victory!",skin);
label.setFontScale(2);
table.add(label).pad(20).row();
TextButton newGameButton = new TextButton("New game!",skin); TextButton newGameButton = new TextButton("New game!",skin);
newGameButton.addListener(new ClickListener(){ newGameButton.addListener(new ClickListener(){
@ -22,7 +24,13 @@ public class VictoryScreen extends CameraStageBaseScreen{
game.startNewGame(); game.startNewGame();
} }
}); });
newGameButton.setPosition((stage.getWidth()-newGameButton.getWidth())/2 , 10); table.add(newGameButton).pad(20).row();
table.pack();
table.setPosition((stage.getWidth()-table.getWidth())/2 , (stage.getHeight()-table.getHeight())/2 );
stage.addActor(table);
} }

View File

@ -273,7 +273,6 @@ public class WorldScreen extends CameraStageBaseScreen {
private void updateCivTable() { private void updateCivTable() {
civTable.clear(); civTable.clear();
civTable.row().pad(15); civTable.row().pad(15);
CivStats currentStats = game.civInfo.civStats;
TextButton CivilopediaButton = new TextButton("Menu", skin); TextButton CivilopediaButton = new TextButton("Menu", skin);
CivilopediaButton.addListener(new ClickListener() { CivilopediaButton.addListener(new ClickListener() {
@ -291,7 +290,7 @@ public class WorldScreen extends CameraStageBaseScreen {
CivStats nextTurnStats = game.civInfo.getStatsForNextTurn(); CivStats nextTurnStats = game.civInfo.getStatsForNextTurn();
civTable.add(new Label("Gold: " + Math.round(currentStats.gold) civTable.add(new Label("Gold: " + Math.round(game.civInfo.gold)
+ "(" + (nextTurnStats.gold > 0 ? "+" : "") + Math.round(nextTurnStats.gold) + ")", skin)); + "(" + (nextTurnStats.gold > 0 ? "+" : "") + Math.round(nextTurnStats.gold) + ")", skin));
Label scienceLabel = new Label("Science: +" + Math.round(nextTurnStats.science) Label scienceLabel = new Label("Science: +" + Math.round(nextTurnStats.science)
@ -299,15 +298,15 @@ public class WorldScreen extends CameraStageBaseScreen {
scienceLabel.setAlignment(Align.center); scienceLabel.setAlignment(Align.center);
civTable.add(scienceLabel); civTable.add(scienceLabel);
String happinessText = "Happiness: " + Math.round(game.civInfo.getHappinessForNextTurn()); String happinessText = "Happiness: " + Math.round(game.civInfo.getHappinessForNextTurn());
if (game.civInfo.isGoldenAge()) if (game.civInfo.goldenAges.isGoldenAge())
happinessText += "\r\n GOLDEN AGE (" + game.civInfo.turnsLeftForCurrentGoldenAge + ")"; happinessText += "\r\n GOLDEN AGE (" + game.civInfo.goldenAges.turnsLeftForCurrentGoldenAge + ")";
else else
happinessText += "\r\n (" + (int) game.civInfo.civStats.happiness + "/" + game.civInfo.happinessRequiredForNextGoldenAge() + ")"; happinessText += "\r\n (" + game.civInfo.goldenAges.storedHappiness + "/" + game.civInfo.goldenAges.happinessRequiredForNextGoldenAge() + ")";
Label happinessLabel = new Label(happinessText, skin); Label happinessLabel = new Label(happinessText, skin);
happinessLabel.setAlignment(Align.center); happinessLabel.setAlignment(Align.center);
civTable.add(happinessLabel); civTable.add(happinessLabel);
String cultureString = "Culture: " + "+" + Math.round(nextTurnStats.culture) + "\r\n" String cultureString = "Culture: " + "+" + Math.round(nextTurnStats.culture) + "\r\n"
+ "(" + ((int) game.civInfo.civStats.culture) + "/" + game.civInfo.getCultureNeededForNextPolicy() + ")"; + "(" + game.civInfo.policies.storedCulture + "/" + game.civInfo.policies.getCultureNeededForNextPolicy() + ")";
Label cultureLabel = new Label(cultureString, skin); Label cultureLabel = new Label(cultureString, skin);
cultureLabel.setAlignment(Align.center); cultureLabel.setAlignment(Align.center);
civTable.add(cultureLabel); civTable.add(cultureLabel);
@ -592,7 +591,7 @@ public class WorldScreen extends CameraStageBaseScreen {
new ClickListener() { new ClickListener() {
@Override @Override
public void clicked(InputEvent event, float x, float y) { public void clicked(InputEvent event, float x, float y) {
game.civInfo.enterGoldenAge(); game.civInfo.goldenAges.enterGoldenAge();
selectedTile.unit = null;// destroy! selectedTile.unit = null;// destroy!
update(); update();
} }
@ -636,7 +635,7 @@ public class WorldScreen extends CameraStageBaseScreen {
new ClickListener() { new ClickListener() {
@Override @Override
public void clicked(InputEvent event, float x, float y) { public void clicked(InputEvent event, float x, float y) {
game.civInfo.civStats.gold += 350; // + 50 * era_number - todo! game.civInfo.gold += 350; // + 50 * era_number - todo!
selectedTile.unit = null; // destroy! selectedTile.unit = null; // destroy!
update(); update();
} }

View File

@ -11,6 +11,7 @@ import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.utils.Predicate; import com.badlogic.gdx.utils.Predicate;
import com.unciv.logic.city.CityInfo; import com.unciv.logic.city.CityInfo;
import com.unciv.logic.civilization.CivilizationInfo; import com.unciv.logic.civilization.CivilizationInfo;
import com.unciv.logic.civilization.PolicyManager;
import com.unciv.models.linq.Linq; import com.unciv.models.linq.Linq;
import com.unciv.models.gamebasics.GameBasics; import com.unciv.models.gamebasics.GameBasics;
import com.unciv.models.gamebasics.Policy; import com.unciv.models.gamebasics.Policy;
@ -23,6 +24,7 @@ public class PolicyPickerScreen extends PickerScreen {
public PolicyPickerScreen() { public PolicyPickerScreen() {
final PolicyManager policies = game.civInfo.policies;
Linq<String> tutorial = new Linq<String>(); Linq<String> tutorial = new Linq<String>();
tutorial.add("Each turn, the culture you gain from all your " + tutorial.add("Each turn, the culture you gain from all your " +
"\r\n cities is added to your Civilization's culture." + "\r\n cities is added to your Civilization's culture." +
@ -35,9 +37,9 @@ public class PolicyPickerScreen extends PickerScreen {
"\r\n the cost of adopting another policy rises - so choose wisely!"); "\r\n the cost of adopting another policy rises - so choose wisely!");
displayTutorials("PolicyPickerScreen",tutorial); displayTutorials("PolicyPickerScreen",tutorial);
rightSideButton.setText("Adopt policy\r\n(" + ((int) game.civInfo.civStats.culture) + "/" + game.civInfo.getCultureNeededForNextPolicy() + ")"); rightSideButton.setText("Adopt policy\r\n(" + policies.storedCulture + "/" + policies.getCultureNeededForNextPolicy() + ")");
if(CivilizationInfo.current().freePolicies>0) { if(policies.freePolicies>0) {
rightSideButton.setText("Adopt free policy"); rightSideButton.setText("Adopt free policy");
closeButton.setColor(Color.GRAY); closeButton.setColor(Color.GRAY);
closeButton.setTouchable(Touchable.disabled); closeButton.setTouchable(Touchable.disabled);
@ -46,13 +48,10 @@ public class PolicyPickerScreen extends PickerScreen {
rightSideButton.addListener(new ClickListener() { rightSideButton.addListener(new ClickListener() {
@Override @Override
public void clicked(InputEvent event, float x, float y) { public void clicked(InputEvent event, float x, float y) {
if(game.civInfo.freePolicies>0) game.civInfo.freePolicies--; if(policies.freePolicies>0) policies.freePolicies--;
else game.civInfo.civStats.culture -= game.civInfo.getCultureNeededForNextPolicy(); else policies.storedCulture -= policies.getCultureNeededForNextPolicy();
game.civInfo.policies.adopt(pickedPolicy); game.civInfo.policies.adopt(pickedPolicy);
if (pickedPolicy.name.equals(""))
game.setScreen(new PolicyPickerScreen()); game.setScreen(new PolicyPickerScreen());
} }
}); });
@ -93,8 +92,9 @@ public class PolicyPickerScreen extends PickerScreen {
} }
public void pickPolicy(Policy policy) { public void pickPolicy(Policy policy) {
if (game.civInfo.policies.contains(policy.name) || !game.civInfo.policies.containsAll(policy.requires) if (game.civInfo.policies.isAdopted(policy.name)
|| !game.civInfo.canAdoptPolicy()) { || !game.civInfo.policies.getAdoptedPolicies().containsAll(policy.requires)
|| !game.civInfo.policies.canAdoptPolicy()) {
rightSideButton.setTouchable(Touchable.disabled); rightSideButton.setTouchable(Touchable.disabled);
rightSideButton.setColor(Color.GRAY); rightSideButton.setColor(Color.GRAY);
} else { } else {
@ -115,9 +115,9 @@ public class PolicyPickerScreen extends PickerScreen {
toReturn.add(policyImage).size(30); toReturn.add(policyImage).size(30);
} else toReturn = new TextButton(policy.name, skin); } else toReturn = new TextButton(policy.name, skin);
if (game.civInfo.policies.contains(policy.name)) { // existing if (game.civInfo.policies.isAdopted(policy.name)) { // existing
toReturn.setColor(Color.GREEN); toReturn.setColor(Color.GREEN);
} else if (!game.civInfo.policies.containsAll(policy.requires)) // non-available } else if (!game.civInfo.policies.getAdoptedPolicies().containsAll(policy.requires)) // non-available
{ {
toReturn.setColor(Color.GRAY); toReturn.setColor(Color.GRAY);
} }

View File

@ -5,7 +5,7 @@ import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.Touchable; import com.badlogic.gdx.scenes.scene2d.Touchable;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton; import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.unciv.logic.civilization.CivilizationTech; import com.unciv.logic.civilization.TechManager;
import com.unciv.models.linq.Linq; import com.unciv.models.linq.Linq;
import com.unciv.models.gamebasics.GameBasics; import com.unciv.models.gamebasics.GameBasics;
import com.unciv.models.gamebasics.Technology; import com.unciv.models.gamebasics.Technology;
@ -20,7 +20,7 @@ public class TechPickerScreen extends PickerScreen {
HashMap<String, TextButton> techNameToButton = new HashMap<String, TextButton>(); HashMap<String, TextButton> techNameToButton = new HashMap<String, TextButton>();
boolean isFreeTechPick; boolean isFreeTechPick;
Technology selectedTech; Technology selectedTech;
CivilizationTech civTech = game.civInfo.tech; TechManager civTech = game.civInfo.tech;
ArrayList<String> techsToResearch = new ArrayList<String>(civTech.techsToResearch); ArrayList<String> techsToResearch = new ArrayList<String>(civTech.techsToResearch);
public TechPickerScreen(boolean freeTechPick){ public TechPickerScreen(boolean freeTechPick){