From 48f56e2e85b5dfe496f4a1921949ef9991d9f89a Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Fri, 8 Dec 2017 09:39:18 +0200 Subject: [PATCH] Added factories and civ resource management --- android/assets/jsons/Buildings.json | 25 +++++- android/assets/jsons/Techs.json | 4 +- android/build.gradle | 2 +- core/src/com/unciv/civinfo/CityBuildings.java | 6 +- core/src/com/unciv/civinfo/CityInfo.java | 15 ++-- .../com/unciv/civinfo/CivilizationInfo.java | 23 +++++- .../com/unciv/models/gamebasics/Building.java | 76 +++++++++++-------- 7 files changed, 102 insertions(+), 49 deletions(-) diff --git a/android/assets/jsons/Buildings.json b/android/assets/jsons/Buildings.json index 0846c25907..b5c2bee809 100644 --- a/android/assets/jsons/Buildings.json +++ b/android/assets/jsons/Buildings.json @@ -84,7 +84,7 @@ name:"Stable", description: "Cattle, sheep and horses provide +1 production.", maintainance:1, - resourceRequired:true, + resourceBoostingBuilding:true, resourceBonusStats:{production:1}, requiredTech:"Horseback Riding" }, @@ -131,7 +131,7 @@ name:"Mint", description: "", maintainance:0, - resourceRequired:true, + resourceBoostingBuilding:true, resourceBonusStats:{gold:2}, requiredTech:"Currency" }, @@ -164,7 +164,7 @@ name:"Forge", description: "Iron provides +1 production", maintainance:1, - resourceRequired:true, + resourceBoostingBuilding:true, resourceBonusStats:{production:1}, requiredTech:"Metal Casting" }, @@ -175,7 +175,7 @@ percentStatBonus:{science:33}, requiredBuilding:"Library", unique:"JunglesProvideScience", - requiredTech:"Metal Casting" + requiredTech:"Education" }, { name:"Oxford University", @@ -288,6 +288,23 @@ unique:"FreeGreatArtistAppears", requiredTech:"Archaeology" }, + { + name:"Hospital", + description: "", + food:5, + requiredBuilding:"Aqueduct", + maintainance:2, + requiredTech:"Biology" + }, + { + name:"Factory", + description: "", + production:4, + requiredBuilding:"Workshop", + maintainance:3, + requiredResource:"Coal", + requiredTech:"Steam Power" + }, ] \ No newline at end of file diff --git a/android/assets/jsons/Techs.json b/android/assets/jsons/Techs.json index 958f99e2b5..a9d017982f 100644 --- a/android/assets/jsons/Techs.json +++ b/android/assets/jsons/Techs.json @@ -318,13 +318,13 @@ name:"Biology", row:4, prerequisites:["Archaeology","Scientific Theory"], - description:"Reveals oil and allows construction of oil wells - Todo" + description:"Reveals oil and allows construction of oil wells, and construction of hospitals, which provide a large amount of food" }, { name:"Steam Power", row:6, prerequisites:["Scientific Theory","Military Science"], - description:"Enables construction of factories and - Todo" + description:"Enables construction of factories, boosting production" }, { name:"Dynamite", diff --git a/android/build.gradle b/android/build.gradle index cfedcde070..4fe74d1cba 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -21,7 +21,7 @@ android { applicationId "com.unciv.game" minSdkVersion 9 targetSdkVersion 25 - versionCode 8 + versionCode 9 versionName "0.9" } buildTypes { diff --git a/core/src/com/unciv/civinfo/CityBuildings.java b/core/src/com/unciv/civinfo/CityBuildings.java index 424e15a7db..175e4630d1 100644 --- a/core/src/com/unciv/civinfo/CityBuildings.java +++ b/core/src/com/unciv/civinfo/CityBuildings.java @@ -86,8 +86,7 @@ public class CityBuildings { CivilizationInfo civInfo = UnCivGame.Current.civInfo; if(isBuilt(building.name)) return false; -// if (building.name.equals("Worker") || building.name.equals("Settler")) return false; - if(building.resourceRequired) { + if(building.resourceBoostingBuilding) { boolean containsResourceWithImprovement = getCity().getTilesInRange() .any(new Predicate() { @Override @@ -117,6 +116,9 @@ public class CityBuildings return arg0.cityBuildings.isBuilt(building.requiredBuildingInAllCities); } }) ) return false; + if(building.requiredResource!=null && + !civInfo.getCivResources().keySet().contains(GameBasics.TileResources.get(building.requiredResource))) + return false; // Only checks if exists, doesn't check amount - todo return true; } diff --git a/core/src/com/unciv/civinfo/CityInfo.java b/core/src/com/unciv/civinfo/CityInfo.java index e44e4904a0..cf8796840e 100644 --- a/core/src/com/unciv/civinfo/CityInfo.java +++ b/core/src/com/unciv/civinfo/CityInfo.java @@ -4,6 +4,7 @@ import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Predicate; import com.unciv.game.UnCivGame; import com.unciv.models.LinqCollection; +import com.unciv.models.LinqHashMap; import com.unciv.models.gamebasics.Building; import com.unciv.models.gamebasics.ResourceType; import com.unciv.models.gamebasics.TileResource; @@ -69,15 +70,17 @@ public class CityInfo { civInfo.cities.add(this); } - ArrayList getLuxuryResources() { - LinqCollection LuxuryResources = new LinqCollection(); + public LinqHashMap getCityResources(){ + LinqHashMap cityResources = new LinqHashMap(); + for (TileInfo tileInfo : getTilesInRange()) { TileResource resource = tileInfo.getTileResource(); - if (resource != null && resource.resourceType == ResourceType.Luxury && - (resource.improvement.equals(tileInfo.improvement) || tileInfo.isCityCenter())) - LuxuryResources.add(tileInfo.resource); + if (resource != null && (resource.improvement.equals(tileInfo.improvement) || tileInfo.isCityCenter())){ + if(cityResources.containsKey(resource)) cityResources.put(resource,cityResources.get(resource)+1); + else cityResources.put(resource,1); + } } - return LuxuryResources.unique(); + return cityResources; } private int getWorkingPopulation() { diff --git a/core/src/com/unciv/civinfo/CivilizationInfo.java b/core/src/com/unciv/civinfo/CivilizationInfo.java index 5634de30dc..d557744b93 100644 --- a/core/src/com/unciv/civinfo/CivilizationInfo.java +++ b/core/src/com/unciv/civinfo/CivilizationInfo.java @@ -4,8 +4,11 @@ import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Predicate; import com.unciv.game.UnCivGame; import com.unciv.models.LinqCollection; +import com.unciv.models.LinqHashMap; import com.unciv.models.gamebasics.Building; import com.unciv.models.gamebasics.GameBasics; +import com.unciv.models.gamebasics.ResourceType; +import com.unciv.models.gamebasics.TileResource; import com.unciv.models.stats.CivStats; import java.util.Collection; @@ -74,16 +77,30 @@ public class CivilizationInfo { CivStats statsForTurn = new CivStats() {{ happiness = baseHappiness; }}; - HashSet LuxuryResources = new HashSet(); for (CityInfo city : cities) { statsForTurn.add(city.getCityStats()); - LuxuryResources.addAll(city.getLuxuryResources()); } - statsForTurn.happiness += LuxuryResources.size() * 5; // 5 happiness for each unique luxury in civ + statsForTurn.happiness += new LinqCollection(getCivResources().keySet()).count(new Predicate() { + @Override + public boolean evaluate(TileResource arg0) { + return arg0.resourceType == ResourceType.Luxury; + } + }) * 5; // 5 happiness for each unique luxury in civ return statsForTurn; } + public LinqHashMap getCivResources(){ + LinqHashMap civResources = new LinqHashMap(); + for (CityInfo city : cities) { + for(TileResource resource : city.getCityResources().keySet()){ + if(civResources.containsKey(resource)) civResources.put(resource,civResources.get(resource)+1); + else civResources.put(resource,1); + } + } + return civResources; + } + public LinqCollection getBuildingUniques(){ return cities.selectMany(new LinqCollection.Func>() { @Override diff --git a/core/src/com/unciv/models/gamebasics/Building.java b/core/src/com/unciv/models/gamebasics/Building.java index 86c2df757b..32b8567f90 100644 --- a/core/src/com/unciv/models/gamebasics/Building.java +++ b/core/src/com/unciv/models/gamebasics/Building.java @@ -5,41 +5,55 @@ import com.unciv.models.stats.FullStats; import com.unciv.models.stats.NamedStats; public class Building extends NamedStats implements ICivilopedia { - public String description; - public String requiredTech; - public Technology GetRequiredTech(){return GameBasics.Technologies.get(requiredTech);} - public int cost; - public int maintainance = 0; - public FullStats percentStatBonus = new FullStats(); - //public Func GetFlatBonusStats; - public boolean isWonder = false; - public boolean resourceRequired = false; - public String requiredBuilding; - public String requiredBuildingInAllCities; + public String description; + public String requiredTech; - // Uniques - public String providesFreeBuilding; - public int freeTechs; - public String unique; // for wonders which have individual functions that are totally unique + public Technology GetRequiredTech() { + return GameBasics.Technologies.get(requiredTech); + } - /** The bonus stats that a resource gets when this building is built */ - public FullStats resourceBonusStats; + public int cost; + public int maintainance = 0; + public FullStats percentStatBonus = new FullStats(); + //public Func GetFlatBonusStats; + public boolean isWonder = false; + public boolean resourceBoostingBuilding = false; + public String requiredBuilding; + public String requiredBuildingInAllCities; + public String requiredResource; - public String getDescription(){return getDescription(false);} + // Uniques + public String providesFreeBuilding; + public int freeTechs; + public String unique; // for wonders which have individual functions that are totally unique - public String getDescription(boolean forBuildingPickerScreen) { - FullStats stats = new FullStats(this); - StringBuilder stringBuilder = new StringBuilder(); - if (!forBuildingPickerScreen) stringBuilder.append("Cost: "+cost+"\r\n"); - if (isWonder) stringBuilder.append("Wonder\r\n"); - if (!forBuildingPickerScreen && requiredTech != null) stringBuilder.append("Requires "+requiredTech+" to be researched\r\n"); - if (!forBuildingPickerScreen && requiredBuilding != null) stringBuilder.append("Requires a "+requiredBuilding+" to be built in this city\r\n"); - if (!forBuildingPickerScreen && requiredBuildingInAllCities != null) stringBuilder.append("Requires a "+requiredBuildingInAllCities+" to be built in all cities\r\n"); - if(providesFreeBuilding!=null) stringBuilder.append("Provides a free "+providesFreeBuilding+" in this city\r\n"); - if(maintainance!=0) stringBuilder.append("Maintainance cost: "+maintainance+" gold\r\n"); - stringBuilder.append(description + "\r\n" + stats); - return stringBuilder.toString(); - } + /** + * The bonus stats that a resource gets when this building is built + */ + public FullStats resourceBonusStats; + + public String getDescription() { + return getDescription(false); + } + + public String getDescription(boolean forBuildingPickerScreen) { + FullStats stats = new FullStats(this); + StringBuilder stringBuilder = new StringBuilder(); + if (!forBuildingPickerScreen) stringBuilder.append("Cost: " + cost + "\r\n"); + if (isWonder) stringBuilder.append("Wonder\r\n"); + if (!forBuildingPickerScreen && requiredTech != null) + stringBuilder.append("Requires " + requiredTech + " to be researched\r\n"); + if (!forBuildingPickerScreen && requiredBuilding != null) + stringBuilder.append("Requires a " + requiredBuilding + " to be built in this city\r\n"); + if (!forBuildingPickerScreen && requiredBuildingInAllCities != null) + stringBuilder.append("Requires a " + requiredBuildingInAllCities + " to be built in all cities\r\n"); + if (providesFreeBuilding != null) + stringBuilder.append("Provides a free " + providesFreeBuilding + " in this city\r\n"); + if (maintainance != 0) + stringBuilder.append("Maintainance cost: " + maintainance + " gold\r\n"); + stringBuilder.append(description + "\r\n" + stats); + return stringBuilder.toString(); + } }