Added gold for cities connected to capital
Added roads in world and city view Fixed crash if the settler was in the middle of moving and then we founded a city with it All stats are now floats, meaning we now deal in decimals is the background
This commit is contained in:
parent
f51923b1f6
commit
7a4b0232a7
14 changed files with 190 additions and 104 deletions
|
@ -25,64 +25,64 @@ public class CityBuildings
|
|||
cityLocation = cityInfo.cityLocation;
|
||||
}
|
||||
|
||||
public LinqCollection<String> BuiltBuildings = new LinqCollection<String>();
|
||||
public HashMap<String, Integer> InProgressBuildings = new HashMap<String, Integer>();
|
||||
public String CurrentBuilding = Worker; // default starting building!
|
||||
public LinqCollection<String> builtBuildings = new LinqCollection<String>();
|
||||
public HashMap<String, Integer> inProgressBuildings = new HashMap<String, Integer>();
|
||||
public String currentBuilding = Worker; // default starting building!
|
||||
|
||||
public CityInfo GetCity(){return UnCivGame.Current.civInfo.tileMap.get(cityLocation).getCity(); }
|
||||
public boolean IsBuilt(String buildingName) { return BuiltBuildings.contains(buildingName); }
|
||||
public boolean IsBuilding(String buildingName) { return CurrentBuilding.equals(buildingName); }
|
||||
public CityInfo getCity(){return UnCivGame.Current.civInfo.tileMap.get(cityLocation).getCity(); }
|
||||
public boolean isBuilt(String buildingName) { return builtBuildings.contains(buildingName); }
|
||||
public boolean isBuilding(String buildingName) { return currentBuilding.equals(buildingName); }
|
||||
|
||||
Building GetGameBuilding(String buildingName) { return GameBasics.Buildings.get(buildingName); }
|
||||
public LinqCollection<Building> GetBuiltBuildings(){ return BuiltBuildings.select(new LinqCollection.Func<String, Building>() {
|
||||
Building getGameBuilding(String buildingName) { return GameBasics.Buildings.get(buildingName); }
|
||||
public LinqCollection<Building> getBuiltBuildings(){ return builtBuildings.select(new LinqCollection.Func<String, Building>() {
|
||||
@Override
|
||||
public Building GetBy(String arg0) {
|
||||
return GetGameBuilding(arg0);
|
||||
return getGameBuilding(arg0);
|
||||
}
|
||||
}); }
|
||||
|
||||
public void NextTurn(int ProductionProduced)
|
||||
public void nextTurn(int ProductionProduced)
|
||||
{
|
||||
if (CurrentBuilding == null) return;
|
||||
if (!InProgressBuildings.containsKey(CurrentBuilding)) InProgressBuildings.put(CurrentBuilding, 0);
|
||||
InProgressBuildings.put(CurrentBuilding, InProgressBuildings.get(CurrentBuilding) + ProductionProduced);
|
||||
if (currentBuilding == null) return;
|
||||
if (!inProgressBuildings.containsKey(currentBuilding)) inProgressBuildings.put(currentBuilding, 0);
|
||||
inProgressBuildings.put(currentBuilding, inProgressBuildings.get(currentBuilding) + ProductionProduced);
|
||||
|
||||
if (InProgressBuildings.get(CurrentBuilding) >= GetGameBuilding(CurrentBuilding).cost)
|
||||
if (inProgressBuildings.get(currentBuilding) >= getGameBuilding(currentBuilding).cost)
|
||||
{
|
||||
if (CurrentBuilding.equals(Worker) || CurrentBuilding.equals(Settler))
|
||||
UnCivGame.Current.civInfo.tileMap.get(cityLocation).unit = new Unit(CurrentBuilding,2);
|
||||
if (currentBuilding.equals(Worker) || currentBuilding.equals(Settler))
|
||||
UnCivGame.Current.civInfo.tileMap.get(cityLocation).unit = new Unit(currentBuilding,2);
|
||||
|
||||
else
|
||||
{
|
||||
BuiltBuildings.add(CurrentBuilding);
|
||||
Building gameBuilding = GetGameBuilding(CurrentBuilding);
|
||||
if (gameBuilding.providesFreeBuilding != null && !BuiltBuildings.contains(gameBuilding.providesFreeBuilding))
|
||||
BuiltBuildings.add(gameBuilding.providesFreeBuilding);
|
||||
builtBuildings.add(currentBuilding);
|
||||
Building gameBuilding = getGameBuilding(currentBuilding);
|
||||
if (gameBuilding.providesFreeBuilding != null && !builtBuildings.contains(gameBuilding.providesFreeBuilding))
|
||||
builtBuildings.add(gameBuilding.providesFreeBuilding);
|
||||
if (gameBuilding.freeTechs != 0) UnCivGame.Current.civInfo.tech.FreeTechs += gameBuilding.freeTechs;
|
||||
}
|
||||
|
||||
InProgressBuildings.remove(CurrentBuilding);
|
||||
inProgressBuildings.remove(currentBuilding);
|
||||
|
||||
// Choose next building to build
|
||||
CurrentBuilding = GetBuildableBuildings().first(new Predicate<String>() {
|
||||
currentBuilding = getBuildableBuildings().first(new Predicate<String>() {
|
||||
@Override
|
||||
public boolean evaluate(String arg0) {
|
||||
if(arg0.equals(Settler) || arg0.equals(Worker)) return false;
|
||||
return !BuiltBuildings.contains(arg0);
|
||||
return !builtBuildings.contains(arg0);
|
||||
}
|
||||
});
|
||||
if (CurrentBuilding == null) CurrentBuilding = Worker;
|
||||
if (currentBuilding == null) currentBuilding = Worker;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public boolean CanBuild(final Building building)
|
||||
public boolean canBuild(final Building building)
|
||||
{
|
||||
CivilizationInfo civInfo = UnCivGame.Current.civInfo;
|
||||
if(IsBuilt(building.name)) return false;
|
||||
if(isBuilt(building.name)) return false;
|
||||
// if (building.name.equals("Worker") || building.name.equals("Settler")) return false;
|
||||
if(building.resourceRequired) {
|
||||
boolean containsResourceWithImprovement = GetCity().getTilesInRange()
|
||||
boolean containsResourceWithImprovement = getCity().getTilesInRange()
|
||||
.any(new Predicate<TileInfo>() {
|
||||
@Override
|
||||
public boolean evaluate(TileInfo tile) {
|
||||
|
@ -100,27 +100,27 @@ public class CityBuildings
|
|||
@Override
|
||||
public boolean evaluate(CityInfo arg0) {
|
||||
CityBuildings CB = arg0.cityBuildings;
|
||||
return CB.IsBuilding(building.name) || CB.IsBuilt(building.name);
|
||||
return CB.isBuilding(building.name) || CB.isBuilt(building.name);
|
||||
}
|
||||
}) ) return false;
|
||||
if (building.requiredBuilding != null && !IsBuilt(building.requiredBuilding)) return false;
|
||||
if (building.requiredBuilding != null && !isBuilt(building.requiredBuilding)) return false;
|
||||
if (building.requiredBuildingInAllCities != null ||
|
||||
civInfo.cities.any(new Predicate<CityInfo>() {
|
||||
@Override
|
||||
public boolean evaluate(CityInfo arg0) {
|
||||
return arg0.cityBuildings.IsBuilt(building.requiredBuildingInAllCities);
|
||||
return arg0.cityBuildings.isBuilt(building.requiredBuildingInAllCities);
|
||||
}
|
||||
}) ) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public com.unciv.models.LinqCollection<String> GetBuildableBuildings()
|
||||
public LinqCollection<String> getBuildableBuildings()
|
||||
{
|
||||
return new com.unciv.models.LinqCollection<Building>(GameBasics.Buildings.values())
|
||||
return new LinqCollection<Building>(GameBasics.Buildings.values())
|
||||
.where(new Predicate<Building>() {
|
||||
@Override
|
||||
public boolean evaluate(Building arg0) { return CanBuild(arg0); }
|
||||
public boolean evaluate(Building arg0) { return canBuild(arg0); }
|
||||
})
|
||||
.select(new com.unciv.models.LinqCollection.Func<Building, String>() {
|
||||
@Override
|
||||
|
@ -130,12 +130,12 @@ public class CityBuildings
|
|||
});
|
||||
}
|
||||
|
||||
public FullStats GetStats()
|
||||
public FullStats getStats()
|
||||
{
|
||||
FullStats stats = new FullStats();
|
||||
for (String building : BuiltBuildings)
|
||||
for (String building : builtBuildings)
|
||||
{
|
||||
Building gameBuilding = GetGameBuilding(building);
|
||||
Building gameBuilding = getGameBuilding(building);
|
||||
stats.add(gameBuilding);
|
||||
//if (gameBuilding.GetFlatBonusStats != null) stats.add(gameBuilding.GetFlatBonusStats(cityInfo));
|
||||
stats.gold -= gameBuilding.maintainance;
|
||||
|
@ -143,14 +143,14 @@ public class CityBuildings
|
|||
return stats;
|
||||
}
|
||||
|
||||
public int TurnsToBuilding(String buildingName)
|
||||
public int turnsToBuilding(String buildingName)
|
||||
{
|
||||
int workDone = 0;
|
||||
if (InProgressBuildings.containsKey(buildingName)) workDone = InProgressBuildings.get(buildingName);
|
||||
float workLeft = GetGameBuilding(buildingName).cost - workDone; // needs to be float so that we get the cieling properly ;)
|
||||
if (inProgressBuildings.containsKey(buildingName)) workDone = inProgressBuildings.get(buildingName);
|
||||
float workLeft = getGameBuilding(buildingName).cost - workDone; // needs to be float so that we get the cieling properly ;)
|
||||
|
||||
FullStats cityStats = GetCity().getCityStats();
|
||||
int production = cityStats.production;
|
||||
FullStats cityStats = getCity().getCityStats();
|
||||
int production = Math.round(cityStats.production);
|
||||
if (buildingName.equals(Settler)) production += cityStats.food;
|
||||
|
||||
return (int) Math.ceil(workLeft / production);
|
||||
|
|
|
@ -2,6 +2,7 @@ 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.ResourceType;
|
||||
|
@ -21,6 +22,7 @@ public class CityInfo {
|
|||
|
||||
private TileMap getTileMap(){return UnCivGame.Current.civInfo.tileMap; }
|
||||
|
||||
public TileInfo getTile(){return getTileMap().get(cityLocation);}
|
||||
public LinqCollection<TileInfo> getTilesInRange(){
|
||||
return getTileMap().getTilesInDistance(cityLocation,3).where(new Predicate<TileInfo>() {
|
||||
@Override
|
||||
|
@ -55,8 +57,9 @@ public class CityInfo {
|
|||
for(TileInfo tileInfo : civInfo.tileMap.getTilesInDistance(cityLocation,1)) {
|
||||
tileInfo.owner = civInfo.civName;
|
||||
}
|
||||
civInfo.tileMap.get(cityLocation).workingCity = this.name;
|
||||
|
||||
getTile().workingCity = this.name;
|
||||
getTile().roadStatus = RoadStatus.Railroad;
|
||||
|
||||
autoAssignWorker();
|
||||
civInfo.cities.add(this);
|
||||
|
@ -91,10 +94,8 @@ public class CityInfo {
|
|||
}
|
||||
|
||||
public FullStats getCityStats() {
|
||||
FullStats stats = new FullStats() {{
|
||||
happiness = -3 - cityPopulation.Population; // -3 happiness per city and -3 per population
|
||||
}};
|
||||
|
||||
FullStats stats = new FullStats();
|
||||
stats.happiness = -3 - cityPopulation.Population; // -3 happiness per city and -3 per population
|
||||
stats.science += cityPopulation.Population;
|
||||
|
||||
// Working ppl
|
||||
|
@ -106,7 +107,11 @@ public class CityInfo {
|
|||
stats.production += getFreePopulation();
|
||||
stats.food -= cityPopulation.Population * 2;
|
||||
|
||||
stats.add(cityBuildings.GetStats());
|
||||
if(!isCapital() && isConnectedToCapital()) // Calculated by http://civilization.wikia.com/wiki/Trade_route_(Civ5)
|
||||
stats.gold+= CivilizationInfo.current().getCapital().cityPopulation.Population * 0.15
|
||||
+ cityPopulation.Population * 1.1 - 1;
|
||||
|
||||
stats.add(cityBuildings.getStats());
|
||||
|
||||
return stats;
|
||||
}
|
||||
|
@ -114,14 +119,14 @@ public class CityInfo {
|
|||
void nextTurn() {
|
||||
FullStats stats = getCityStats();
|
||||
|
||||
if (cityBuildings.CurrentBuilding.equals(CityBuildings.Settler) && stats.food > 0) {
|
||||
if (cityBuildings.currentBuilding.equals(CityBuildings.Settler) && stats.food > 0) {
|
||||
stats.production += stats.food;
|
||||
stats.food = 0;
|
||||
}
|
||||
|
||||
if (cityPopulation.NextTurn(stats.food)) autoAssignWorker();
|
||||
if (cityPopulation.NextTurn(Math.round(stats.food))) autoAssignWorker();
|
||||
|
||||
cityBuildings.NextTurn(stats.production);
|
||||
cityBuildings.nextTurn(Math.round(stats.production));
|
||||
|
||||
cultureStored+=stats.culture;
|
||||
if(cultureStored>=getCultureToNextTile()){
|
||||
|
@ -186,4 +191,25 @@ public class CityInfo {
|
|||
if(tile.improvement ==null) rank+=0.5; // improvement potential!
|
||||
return rank;
|
||||
}
|
||||
|
||||
private boolean isCapital(){ return CivilizationInfo.current().getCapital() == this; }
|
||||
|
||||
private boolean isConnectedToCapital(){
|
||||
TileInfo capitalTile = CivilizationInfo.current().getCapital().getTile();
|
||||
LinqCollection<TileInfo> tilesReached = new LinqCollection<TileInfo>();
|
||||
LinqCollection<TileInfo> tilesToCheck = new LinqCollection<TileInfo>();
|
||||
tilesToCheck.add(getTile());
|
||||
while(!tilesToCheck.isEmpty()){
|
||||
LinqCollection<TileInfo> newTiles = new LinqCollection<TileInfo>();
|
||||
for(TileInfo tile : tilesToCheck)
|
||||
for (TileInfo maybeNewTile : getTileMap().getTilesInDistance(tile.position,1))
|
||||
if(!tilesReached.contains(maybeNewTile) && !tilesToCheck.contains(maybeNewTile) && !newTiles.contains(maybeNewTile))
|
||||
newTiles.add(maybeNewTile);
|
||||
|
||||
if(newTiles.contains(capitalTile)) return true;
|
||||
tilesReached.addAll(tilesToCheck);
|
||||
tilesToCheck = newTiles;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -1,6 +1,7 @@
|
|||
package com.unciv.civinfo;
|
||||
|
||||
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.gamebasics.GameBasics;
|
||||
|
@ -40,14 +41,23 @@ public class CivilizationInfo {
|
|||
|
||||
public void addCity(Vector2 location){
|
||||
CityInfo city = new CityInfo(this,location);
|
||||
if(cities.size()==1) city.cityBuildings.BuiltBuildings.add("Palace");
|
||||
if(cities.size()==1) city.cityBuildings.builtBuildings.add("Palace");
|
||||
}
|
||||
|
||||
public CityInfo getCapital(){
|
||||
return cities.first(new Predicate<CityInfo>() {
|
||||
@Override
|
||||
public boolean evaluate(CityInfo arg0) {
|
||||
return arg0.cityBuildings.isBuilt("Palace");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void nextTurn()//out boolean displayTech)
|
||||
{
|
||||
CivStats nextTurnStats = getStatsForNextTurn();
|
||||
civStats.add(nextTurnStats);
|
||||
if(cities.size() > 0) tech.NextTurn(nextTurnStats.science);
|
||||
if(cities.size() > 0) tech.NextTurn((int)nextTurnStats.science);
|
||||
|
||||
for (CityInfo city : cities) city.nextTurn();
|
||||
|
||||
|
|
7
core/src/com/unciv/civinfo/RoadStatus.java
Normal file
7
core/src/com/unciv/civinfo/RoadStatus.java
Normal file
|
@ -0,0 +1,7 @@
|
|||
package com.unciv.civinfo;
|
||||
|
||||
public enum RoadStatus{
|
||||
None,
|
||||
Road,
|
||||
Railroad
|
||||
}
|
|
@ -9,12 +9,6 @@ import com.unciv.models.gamebasics.TileImprovement;
|
|||
import com.unciv.models.gamebasics.TileResource;
|
||||
import com.unciv.models.stats.FullStats;
|
||||
|
||||
enum RoadStatus{
|
||||
None,
|
||||
Road,
|
||||
Railroad
|
||||
}
|
||||
|
||||
public class TileInfo
|
||||
{
|
||||
public Unit unit;
|
||||
|
@ -70,7 +64,7 @@ public class TileInfo
|
|||
if (hasViewableResource())
|
||||
{
|
||||
stats.add(resource);
|
||||
if(resource.building !=null && City!=null && City.cityBuildings.IsBuilt(resource.building))
|
||||
if(resource.building !=null && City!=null && City.cityBuildings.isBuilt(resource.building))
|
||||
{
|
||||
stats.add(resource.GetBuilding().resourceBonusStats);
|
||||
}
|
||||
|
@ -100,6 +94,12 @@ public class TileInfo
|
|||
if (improvement.techRequired != null && !isResearched(improvement.techRequired)) return false;
|
||||
if (improvement.terrainsCanBeBuiltOn.contains(topTerrain.name)) return true;
|
||||
if (topTerrain.unbuildable) return false;
|
||||
|
||||
if(improvement.name.equals(this.improvement)) return false;
|
||||
|
||||
if(improvement.name.equals("Road") && this.roadStatus== RoadStatus.None) return true;
|
||||
if(improvement.name.equals("Railroad") && this.roadStatus != RoadStatus.Railroad) return true;
|
||||
|
||||
return resource != null && getTileResource().improvement.equals(improvement.name);
|
||||
}
|
||||
|
||||
|
@ -123,8 +123,8 @@ public class TileInfo
|
|||
if(turnsToImprovement == 0)
|
||||
{
|
||||
if (improvementInProgress.startsWith("Remove")) terrainFeature = null;
|
||||
else if(improvement.equals("Road")) roadStatus = RoadStatus.Road;
|
||||
else if(improvement.equals("Railroad")) roadStatus = RoadStatus.Railroad;
|
||||
else if(improvementInProgress.equals("Road")) roadStatus = RoadStatus.Road;
|
||||
else if(improvementInProgress.equals("Railroad")) roadStatus = RoadStatus.Railroad;
|
||||
else improvement = improvementInProgress;
|
||||
|
||||
improvementInProgress = null;
|
||||
|
@ -135,6 +135,7 @@ public class TileInfo
|
|||
StringBuilder SB = new StringBuilder(this.baseTerrain);
|
||||
if (terrainFeature != null) SB.append(",\r\n" + terrainFeature);
|
||||
if (hasViewableResource()) SB.append(",\r\n" + resource);
|
||||
if(roadStatus!= RoadStatus.None) SB.append(",\r\n" + roadStatus);
|
||||
if (improvement != null) SB.append(",\r\n" + improvement);
|
||||
if (improvementInProgress != null) SB.append(",\r\n" + improvementInProgress +" in "+this.turnsToImprovement +" turns");
|
||||
if(unit !=null) SB.append(",\r\n" + unit.Name+ "("+ unit.CurrentMovement+"/"+ unit.MaxMovement+")");
|
||||
|
|
|
@ -11,6 +11,8 @@ import com.unciv.models.gamebasics.Terrain;
|
|||
import com.unciv.models.gamebasics.TerrainType;
|
||||
import com.unciv.models.gamebasics.TileResource;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
public class TileMap{
|
||||
|
||||
private LinqHashMap<String, TileInfo> tiles = new LinqHashMap<String, TileInfo>();
|
||||
|
@ -86,7 +88,7 @@ public class TileMap{
|
|||
|
||||
public LinqCollection<TileInfo> values(){return tiles.linqValues();}
|
||||
|
||||
public TileResource GetRandomResource(LinqCollection<TileResource> resources, final ResourceType resourceType) {
|
||||
TileResource GetRandomResource(LinqCollection<TileResource> resources, final ResourceType resourceType) {
|
||||
return resources.where(new Predicate<TileResource>() {
|
||||
@Override
|
||||
public boolean evaluate(TileResource arg0) {
|
||||
|
@ -95,4 +97,5 @@ public class TileMap{
|
|||
}).getRandom();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -198,11 +198,13 @@ public class CityScreen extends CameraStageBaseScreen {
|
|||
CityStatsTable.row();
|
||||
|
||||
HashMap<String,String> CityStatsValues = new LinkedHashMap<String, String>();
|
||||
CityStatsValues.put("production",stats.production +"");
|
||||
CityStatsValues.put("food",stats.food +" ("+cityInfo.cityPopulation.FoodStored+"/"+cityInfo.cityPopulation.FoodToNextPopulation()+")");
|
||||
CityStatsValues.put("gold",stats.gold +"");
|
||||
CityStatsValues.put("science",stats.science +"");
|
||||
CityStatsValues.put("culture",stats.culture +" ("+cityInfo.cultureStored+"/"+cityInfo.getCultureToNextTile()+")");
|
||||
CityStatsValues.put("production",Math.round(stats.production) +"");
|
||||
CityStatsValues.put("food",Math.round(stats.food)
|
||||
+" ("+cityInfo.cityPopulation.FoodStored+"/"+cityInfo.cityPopulation.FoodToNextPopulation()+")");
|
||||
CityStatsValues.put("gold",Math.round(stats.gold) +"");
|
||||
CityStatsValues.put("science",Math.round(stats.science) +"");
|
||||
CityStatsValues.put("culture",Math.round(stats.culture)
|
||||
+" ("+cityInfo.cultureStored+"/"+cityInfo.getCultureToNextTile()+")");
|
||||
CityStatsValues.put("Population",cityInfo.getFreePopulation()+"/"+cityInfo.cityPopulation.Population);
|
||||
|
||||
for(String key : CityStatsValues.keySet()){
|
||||
|
@ -211,11 +213,11 @@ public class CityScreen extends CameraStageBaseScreen {
|
|||
CityStatsTable.row();
|
||||
}
|
||||
|
||||
String CurrentBuilding = game.civInfo.getCurrentCity().cityBuildings.CurrentBuilding;
|
||||
String CurrentBuilding = game.civInfo.getCurrentCity().cityBuildings.currentBuilding;
|
||||
|
||||
String BuildingText = "Pick building";
|
||||
if(CurrentBuilding != null) BuildingText = CurrentBuilding+"\r\n"
|
||||
+cityInfo.cityBuildings.TurnsToBuilding(CurrentBuilding)+" turns";
|
||||
+cityInfo.cityBuildings.turnsToBuilding(CurrentBuilding)+" turns";
|
||||
TextButton buildingPickButton = new TextButton(BuildingText,skin);
|
||||
buildingPickButton.addListener(new ClickListener(){
|
||||
@Override
|
||||
|
@ -249,17 +251,17 @@ public class CityScreen extends CameraStageBaseScreen {
|
|||
TileTable.add(new Label(selectedTile.toString(),skin)).colspan(2);
|
||||
TileTable.row();
|
||||
|
||||
HashMap<String,String> TileStatsValues = new HashMap<String, String>();
|
||||
TileStatsValues.put("production",stats.production +"");
|
||||
TileStatsValues.put("food",stats.food +"");
|
||||
TileStatsValues.put("gold",stats.gold +"");
|
||||
TileStatsValues.put("science",stats.science +"");
|
||||
TileStatsValues.put("culture",stats.culture +"");
|
||||
HashMap<String,Float> TileStatsValues = new HashMap<String, Float>();
|
||||
TileStatsValues.put("production",stats.production);
|
||||
TileStatsValues.put("food",stats.food);
|
||||
TileStatsValues.put("gold",stats.gold);
|
||||
TileStatsValues.put("science",stats.science);
|
||||
TileStatsValues.put("culture",stats.culture);
|
||||
|
||||
for(String key : TileStatsValues.keySet()){
|
||||
if(TileStatsValues.get(key).equals("0")) continue; // this tile gives nothing of this stat, so why even display it?
|
||||
if(TileStatsValues.get(key) == 0) continue; // this tile gives nothing of this stat, so why even display it?
|
||||
TileTable.add(ImageGetter.getStatIcon(key)).align(Align.right);
|
||||
TileTable.add(new Label(TileStatsValues.get(key),skin)).align(Align.left);
|
||||
TileTable.add(new Label(Math.round(TileStatsValues.get(key))+"",skin)).align(Align.left);
|
||||
TileTable.row();
|
||||
}
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@ import java.util.HashSet;
|
|||
|
||||
public class HexMath
|
||||
{
|
||||
|
||||
public static Vector2 GetVectorForAngle(float angle)
|
||||
{
|
||||
return new Vector2((float)Math.sin(angle), (float) Math.cos(angle));
|
||||
|
|
|
@ -1,11 +1,16 @@
|
|||
package com.unciv.game;
|
||||
|
||||
import com.badlogic.gdx.graphics.Color;
|
||||
import com.badlogic.gdx.math.Vector2;
|
||||
import com.badlogic.gdx.scenes.scene2d.Group;
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.Container;
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.Image;
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
|
||||
import com.unciv.civinfo.CivilizationInfo;
|
||||
import com.unciv.civinfo.RoadStatus;
|
||||
import com.unciv.civinfo.TileInfo;
|
||||
import com.unciv.models.LinqCollection;
|
||||
import com.unciv.models.LinqHashMap;
|
||||
|
||||
public class TileGroup extends Group {
|
||||
Image terrainImage;
|
||||
|
@ -13,6 +18,7 @@ public class TileGroup extends Group {
|
|||
Image unitImage;
|
||||
Image improvementImage;
|
||||
Image populationImage;
|
||||
LinqHashMap<String,Image> roadImages = new LinqHashMap<String, Image>();
|
||||
Image hexagon;
|
||||
|
||||
Container<TextButton> cityButton;
|
||||
|
@ -80,5 +86,28 @@ public class TileGroup extends Group {
|
|||
if(tileInfo.workingCity !=null) populationImage.setColor(Color.WHITE);
|
||||
else populationImage.setColor(Color.GRAY);
|
||||
}
|
||||
|
||||
if(tileInfo.roadStatus != RoadStatus.None){
|
||||
for (TileInfo neighbor : CivilizationInfo.current().tileMap.getTilesInDistance(tileInfo.position,1)) {
|
||||
if (neighbor == tileInfo || neighbor.roadStatus == RoadStatus.None) continue;
|
||||
if (roadImages.containsKey(neighbor.position.toString())) continue;
|
||||
|
||||
Image image = ImageGetter.getImageByFilename("TerrainIcons/road.png");
|
||||
roadImages.put(neighbor.position.toString(), image);
|
||||
|
||||
Vector2 relativeHexPosition = tileInfo.position.cpy().sub(neighbor.position);
|
||||
Vector2 relativeWorldPosition = HexMath.Hex2WorldCoords(relativeHexPosition);
|
||||
|
||||
// This is some crazy voodoo magic so I'll explain.
|
||||
image.moveBy(25, 25); // Move road to center of tile
|
||||
// in addTiles, we set the position of groups by relative world position *0.8*groupSize, where groupSize = 50
|
||||
// Here, we want to have the roads start HALFWAY THERE and extend towards the tiles, so we give them a position of 0.8*25.
|
||||
image.moveBy(-relativeWorldPosition.x * 0.8f * 25, -relativeWorldPosition.y * 0.8f * 25);
|
||||
image.setSize(10, 2);
|
||||
addActor(image);
|
||||
image.setOrigin(0, 1); // This is so that the rotation is calculated from the middle of the road and not the edge
|
||||
image.setRotation((float) (180 / Math.PI * Math.atan2(relativeWorldPosition.y, relativeWorldPosition.x)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -162,11 +162,12 @@ public class WorldScreen extends CameraStageBaseScreen {
|
|||
|
||||
CivStats nextTurnStats = game.civInfo.getStatsForNextTurn();
|
||||
|
||||
CivTable.add(new Label("gold: " + currentStats.gold + "(" +(nextTurnStats.gold >0?"+":"") + nextTurnStats.gold +")", skin));
|
||||
CivTable.add(new Label("gold: " + Math.round(currentStats.gold)
|
||||
+ "(" +(nextTurnStats.gold >0?"+":"") + Math.round(nextTurnStats.gold) +")", skin));
|
||||
|
||||
CivTable.add(new Label("science: +" + nextTurnStats.science, skin));
|
||||
CivTable.add(new Label("happiness: " + nextTurnStats.happiness, skin));
|
||||
CivTable.add(new Label("culture: " + currentStats.culture + "(+" + nextTurnStats.culture +")", skin));
|
||||
CivTable.add(new Label("science: +" + Math.round(nextTurnStats.science), skin));
|
||||
CivTable.add(new Label("happiness: " + Math.round(nextTurnStats.happiness), skin));
|
||||
CivTable.add(new Label("culture: " + Math.round(currentStats.culture) + "(+" + Math.round(nextTurnStats.culture) +")", skin));
|
||||
|
||||
CivTable.pack();
|
||||
|
||||
|
@ -290,20 +291,22 @@ public class WorldScreen extends CameraStageBaseScreen {
|
|||
TileTable.add(new Label(selectedTile.toString(),skin)).colspan(2);
|
||||
TileTable.row();
|
||||
|
||||
HashMap<String,String> TileStatsValues = new HashMap<String, String>();
|
||||
TileStatsValues.put("production",stats.production +"");
|
||||
TileStatsValues.put("food",stats.food +"");
|
||||
TileStatsValues.put("gold",stats.gold +"");
|
||||
TileStatsValues.put("science",stats.science +"");
|
||||
TileStatsValues.put("culture",stats.culture +"");
|
||||
|
||||
HashMap<String,Float> TileStatsValues = new HashMap<String, Float>();
|
||||
TileStatsValues.put("production",stats.production);
|
||||
TileStatsValues.put("food",stats.food);
|
||||
TileStatsValues.put("gold",stats.gold);
|
||||
TileStatsValues.put("science",stats.science);
|
||||
TileStatsValues.put("culture",stats.culture);
|
||||
|
||||
for(String key : TileStatsValues.keySet()){
|
||||
if(TileStatsValues.get(key).equals("0")) continue; // this tile gives nothing of this stat, so why even display it?
|
||||
if(TileStatsValues.get(key) == 0) continue; // this tile gives nothing of this stat, so why even display it?
|
||||
TileTable.add(ImageGetter.getStatIcon(key)).align(Align.right);
|
||||
TileTable.add(new Label(TileStatsValues.get(key),skin)).align(Align.left);
|
||||
TileTable.add(new Label(Math.round(TileStatsValues.get(key))+"",skin)).align(Align.left);
|
||||
TileTable.row();
|
||||
}
|
||||
|
||||
|
||||
if(selectedTile.unit !=null){
|
||||
TextButton moveUnitButton = new TextButton("Move to", skin);
|
||||
if(unitTile == selectedTile) moveUnitButton = new TextButton("Stop movement",skin);
|
||||
|
@ -342,6 +345,7 @@ public class WorldScreen extends CameraStageBaseScreen {
|
|||
@Override
|
||||
public void clicked(InputEvent event, float x, float y) {
|
||||
game.civInfo.addCity(selectedTile.position);
|
||||
if(unitTile==selectedTile) unitTile = null; // The settler was in the middle of moving and we then founded a city with it
|
||||
selectedTile.unit = null; // Remove settler!
|
||||
update();
|
||||
}
|
||||
|
@ -374,7 +378,7 @@ public class WorldScreen extends CameraStageBaseScreen {
|
|||
dispose();
|
||||
}
|
||||
});
|
||||
if(selectedTile.unit.CurrentMovement==0 ||
|
||||
if(selectedTile.unit.CurrentMovement==0 || selectedTile.isCityCenter() ||
|
||||
!GameBasics.TileImprovements.linqValues().any(new Predicate<TileImprovement>() {
|
||||
@Override
|
||||
public boolean evaluate(TileImprovement arg0) {
|
||||
|
|
|
@ -57,18 +57,19 @@ public class WorldTileGroup extends TileGroup {
|
|||
});
|
||||
|
||||
addActor(cityButton);
|
||||
setZIndex(getParent().getChildren().size);
|
||||
setZIndex(getParent().getChildren().size); // so this tile is rendered over neighboing tiles
|
||||
}
|
||||
|
||||
String cityButtonText = city.name +" ("+city.cityPopulation.Population+")"
|
||||
+ "\r\n" + city.cityBuildings.CurrentBuilding + " in "
|
||||
+ city.cityBuildings.TurnsToBuilding(city.cityBuildings.CurrentBuilding);
|
||||
+ "\r\n" + city.cityBuildings.currentBuilding + " in "
|
||||
+ city.cityBuildings.turnsToBuilding(city.cityBuildings.currentBuilding);
|
||||
TextButton button = cityButton.getActor();
|
||||
button.setText(cityButtonText);
|
||||
button.setSize(button.getPrefWidth(), button.getPrefHeight());
|
||||
|
||||
cityButton.setPosition((getWidth() - cityButton.getWidth()) / 2,
|
||||
getHeight() * 0.9f);
|
||||
cityButton.setZIndex(cityButton.getParent().getChildren().size); // so city button is rendere over oeverything else in this tile
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@ public class BuildingPickerScreen extends PickerScreen {
|
|||
rightSideButton.addListener(new ClickListener(){
|
||||
@Override
|
||||
public void clicked(InputEvent event, float x, float y) {
|
||||
game.civInfo.getCurrentCity().cityBuildings.CurrentBuilding = selectedBuilding.name;
|
||||
game.civInfo.getCurrentCity().cityBuildings.currentBuilding = selectedBuilding.name;
|
||||
game.setScreen(new CityScreen(game));
|
||||
dispose();
|
||||
}
|
||||
|
@ -40,8 +40,8 @@ public class BuildingPickerScreen extends PickerScreen {
|
|||
|
||||
CityBuildings cityBuildings = game.civInfo.getCurrentCity().cityBuildings;
|
||||
for(final Building building : GameBasics.Buildings.values()) {
|
||||
if(!cityBuildings.CanBuild(building)) continue;
|
||||
TextButton TB = new TextButton(building.name +"\r\n"+cityBuildings.TurnsToBuilding(building.name)+" turns", skin);
|
||||
if(!cityBuildings.canBuild(building)) continue;
|
||||
TextButton TB = new TextButton(building.name +"\r\n"+cityBuildings.turnsToBuilding(building.name)+" turns", skin);
|
||||
TB.addListener(new ClickListener(){
|
||||
@Override
|
||||
public void clicked(InputEvent event, float x, float y) {
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
package com.unciv.models.stats;
|
||||
|
||||
public class CivStats {
|
||||
public int gold = 0;
|
||||
public int science = 0;
|
||||
public int culture = 0;
|
||||
public int happiness = 0;
|
||||
public float gold = 0;
|
||||
public float science = 0;
|
||||
public float culture = 0;
|
||||
public float happiness = 0;
|
||||
|
||||
public void add(CivStats other) {
|
||||
gold += other.gold;
|
||||
|
|
|
@ -1,9 +1,11 @@
|
|||
package com.unciv.models.stats;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
|
||||
public class FullStats extends CivStats // also used for hex stats, since it's basically the same
|
||||
{
|
||||
public int production = 0;
|
||||
public int food = 0;
|
||||
public float production = 0;
|
||||
public float food = 0;
|
||||
|
||||
public FullStats() {
|
||||
}
|
||||
|
@ -21,8 +23,8 @@ public class FullStats extends CivStats // also used for hex stats, since it's b
|
|||
production +=other.production;
|
||||
}
|
||||
|
||||
public String display(int value, String name){
|
||||
return ", " + (value>0 ? "+" : "") + value + " "+name;
|
||||
public String display(float value, String name){
|
||||
return ", " + (value>0 ? "+" : "") + Math.round(value) + " "+name;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
|
|
Loading…
Reference in a new issue