Added factories and civ resource management

This commit is contained in:
Yair Morgenstern
2017-12-08 09:39:18 +02:00
parent 6a73c3f370
commit 48f56e2e85
7 changed files with 102 additions and 49 deletions

View File

@ -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<TileInfo>() {
@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;
}

View File

@ -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<String> getLuxuryResources() {
LinqCollection<String> LuxuryResources = new LinqCollection<String>();
public LinqHashMap<TileResource,Integer> getCityResources(){
LinqHashMap<TileResource,Integer> cityResources = new LinqHashMap<TileResource, Integer>();
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() {

View File

@ -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<String> LuxuryResources = new HashSet<String>();
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<TileResource>(getCivResources().keySet()).count(new Predicate<TileResource>() {
@Override
public boolean evaluate(TileResource arg0) {
return arg0.resourceType == ResourceType.Luxury;
}
}) * 5; // 5 happiness for each unique luxury in civ
return statsForTurn;
}
public LinqHashMap<TileResource,Integer> getCivResources(){
LinqHashMap<TileResource,Integer> civResources = new LinqHashMap<TileResource, Integer>();
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<String> getBuildingUniques(){
return cities.selectMany(new LinqCollection.Func<CityInfo, Collection<? extends String>>() {
@Override

View File

@ -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<CityInfo,FullStats> 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<CityInfo,FullStats> 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();
}
}