Added specialists and great person generation!

This commit is contained in:
Yair Morgenstern 2017-12-21 12:25:55 +02:00
parent ad94866aba
commit d81cb8cda7
28 changed files with 207 additions and 77 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -20,7 +20,7 @@
}, },
{ {
name:"Granary", name:"Granary",
description: "Wheat, bananas and deer produce +1 food.", description: "",
food:2, food:2,
resourceBonusStats:{food:1}, resourceBonusStats:{food:1},
maintainance:1, maintainance:1,
@ -80,7 +80,7 @@
greatPersonPoints:{production:1}, greatPersonPoints:{production:1},
isWonder:true, isWonder:true,
unique:"WorkerConstruction", unique:"WorkerConstruction",
requiredTech:"Writing" requiredTech:"Masonry"
}, },
{ {
name:"Temple", name:"Temple",
@ -111,7 +111,7 @@
}, },
{ {
name:"Stable", name:"Stable",
description: "Cattle, sheep and horses provide +1 production.", description: "",
maintainance:1, maintainance:1,
requiredNearbyImprovedResources:["Horses","Sheep","Cattle"] requiredNearbyImprovedResources:["Horses","Sheep","Cattle"]
resourceBonusStats:{production:1}, resourceBonusStats:{production:1},
@ -169,6 +169,14 @@
isWonder:true, isWonder:true,
requiredTech:"Theology" requiredTech:"Theology"
}, },
{
name:"Hagia Sophia",
description: "+33% great person generation in all cities",
culture:1,
isWonder:true,
unique:"GreatPersonGenerationIncrease",
requiredTech:"Theology"
},
{ {
name:"Chichen Itza", name:"Chichen Itza",
description: "Length of golden ages increased +50%", description: "Length of golden ages increased +50%",
@ -355,7 +363,7 @@
}, },
{ {
name:"The Louvre", name:"The Louvre",
description: "Free Great Artist appears near the city - TODO", description: "Free Great Artist appears near the city",
culture:1, culture:1,
happiness:4, happiness:4,
isWonder:true, isWonder:true,

View File

@ -56,7 +56,7 @@
name:"The Wheel", name:"The Wheel",
row:6, row:6,
prerequisites:["Animal Husbandry"], prerequisites:["Animal Husbandry"],
description:"Allows construction or roads to your capilat city, providing gold from trade" description:"Allows construction of roads to your capital city, providing gold from trade"
}, },
{ {
name:"Masonry", name:"Masonry",
@ -127,7 +127,7 @@
name:"Theology", name:"Theology",
row:2, row:2,
prerequisites:["Calendar","Philosophy"], prerequisites:["Calendar","Philosophy"],
description:"Unclear what this does in Vanilla civ" description:"Enables construction of Monasteries, the Hagia Sophia and Notre Dame, providing culture, Great Person generation, and happiness, respectively"
}, },
{ {
name:"Civil Service", name:"Civil Service",
@ -228,7 +228,7 @@
name:"Printing Press", name:"Printing Press",
row:8, row:8,
prerequisites:["Machinery","Physics"], prerequisites:["Machinery","Physics"],
description:"Eables construction of the Theatre and Taj Mahal, increasing happiness" description:"Enables construction of the Theatre and Taj Mahal, increasing happiness"
}, },
{ {
name:"Gunpowder", name:"Gunpowder",

View File

@ -151,7 +151,8 @@
terrainsCanBeFoundOn:["Grassland","Plains","Desert","Hill"], terrainsCanBeFoundOn:["Grassland","Plains","Desert","Hill"],
gold:2, gold:2,
improvement:"Mine", improvement:"Mine",
improvementStats:{gold:1} improvementStats:{gold:1},
building:"Mint"
}, },
{ {
name:"Silver", name:"Silver",
@ -159,7 +160,8 @@
terrainsCanBeFoundOn:["Desert","Tundra","Hill"], terrainsCanBeFoundOn:["Desert","Tundra","Hill"],
gold:2, gold:2,
improvement:"Mine", improvement:"Mine",
improvementStats:{gold:1} improvementStats:{gold:1},
building:"Mint"
}, },
{ {
name:"Incense", name:"Incense",
@ -167,7 +169,8 @@
terrainsCanBeFoundOn:["Plains","Desert"], terrainsCanBeFoundOn:["Plains","Desert"],
gold:3, gold:3,
improvement:"Plantation", improvement:"Plantation",
improvementStats:{gold:1} improvementStats:{gold:1},
building:"Monastery"
}, },
{ {
name:"Ivory", name:"Ivory",
@ -199,7 +202,8 @@
terrainsCanBeFoundOn:["Grassland","Plains"], terrainsCanBeFoundOn:["Grassland","Plains"],
gold:2, gold:2,
improvement:"Plantation", improvement:"Plantation",
improvementStats:{gold:1} improvementStats:{gold:1},
building:"Monastery"
}, },
{ {
name:"Sugar", name:"Sugar",

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 B

View File

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

View File

@ -19,6 +19,7 @@ public class CityInfo {
private int tilesClaimed; private int tilesClaimed;
public int population = 1; public int population = 1;
public int foodStored = 0; public int foodStored = 0;
public FullStats specialists = new FullStats();
public FullStats cityStats; // This is so we won't have to calculate this multiple times - takes a lot of time, especially on phones! public FullStats cityStats; // This is so we won't have to calculate this multiple times - takes a lot of time, especially on phones!
@ -95,17 +96,15 @@ public class CityInfo {
return cityResources; return cityResources;
} }
private int getWorkingPopulation() { public int getFreePopulation() {
return getTilesInRange().count(new Predicate<TileInfo>() { int workingPopulation = getTilesInRange().count(new Predicate<TileInfo>() {
@Override @Override
public boolean evaluate(TileInfo arg0) { public boolean evaluate(TileInfo arg0) {
return name.equals(arg0.workingCity); return name.equals(arg0.workingCity);
} }
})-1; // 1 is the city center })-1; // 1 is the city center
} int specialistNum = (int) (specialists.science+specialists.production+specialists.culture+specialists.gold);
return population - workingPopulation - specialistNum;
public int getFreePopulation() {
return population - getWorkingPopulation();
} }
public boolean hasNonWorkingPopulation() { public boolean hasNonWorkingPopulation() {
@ -121,6 +120,12 @@ public class CityInfo {
if (name.equals(cell.workingCity)) if (name.equals(cell.workingCity))
stats.add(cell.getTileStats(this)); stats.add(cell.getTileStats(this));
// Specialists
stats.culture+=specialists.culture*3;
stats.production+=specialists.production*2;
stats.science+=specialists.science*3;
stats.gold+=specialists.gold*2;
//idle ppl //idle ppl
stats.production += getFreePopulation(); stats.production += getFreePopulation();
@ -200,6 +205,14 @@ public class CityInfo {
addNewTile(); addNewTile();
CivilizationInfo.current().notifications.add(name+" has expanded its borders!"); CivilizationInfo.current().notifications.add(name+" has expanded its borders!");
} }
CivilizationInfo civInfo = CivilizationInfo.current();
float greatPersonGenerationMultiplier = 3;
if(civInfo.getBuildingUniques().contains("GreatPersonGenerationIncrease")) greatPersonGenerationMultiplier*=1.33;
civInfo.greatPersonPoints.gold+=specialists.gold*greatPersonGenerationMultiplier;
civInfo.greatPersonPoints.production+=specialists.production*greatPersonGenerationMultiplier;
civInfo.greatPersonPoints.culture+=specialists.culture*greatPersonGenerationMultiplier;
civInfo.greatPersonPoints.science+=specialists.science*greatPersonGenerationMultiplier;
} }
private void addNewTile(){ private void addNewTile(){

View File

@ -80,11 +80,16 @@ public class CivilizationInfo {
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();
}
for(TileInfo tile : tileMap.values()) tile.nextTurn(); for(TileInfo tile : tileMap.values()) tile.nextTurn();
checkGreatPersonGeneration();
for (CityInfo city : cities) city.updateCityStats(); for (CityInfo city : cities) city.updateCityStats();
turns++; turns++;
if(isGoldenAge()) turnsLeftForCurrentGoldenAge--; if(isGoldenAge()) turnsLeftForCurrentGoldenAge--;
@ -95,10 +100,39 @@ public class CivilizationInfo {
} }
} }
public void addGreatPerson(String unitName){ // This is also done by some wonders and social policies, remember
tileMap.placeUnitNearTile(cities.get(0).cityLocation,unitName);
notifications.add("A "+unitName+" has been born!");
}
public void checkGreatPersonGeneration(){
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(){ public void enterGoldenAge(){
int turnsToGoldenAge = 10; int turnsToGoldenAge = 10;
if(getBuildingUniques().contains("GoldenAgeLengthIncrease")) turnsToGoldenAge*=1.5; if(getBuildingUniques().contains("GoldenAgeLengthIncrease")) turnsToGoldenAge*=1.5;
turnsLeftForCurrentGoldenAge += turnsToGoldenAge; turnsLeftForCurrentGoldenAge += turnsToGoldenAge;
notifications.add("You have entered a golden age!");
} }
public CivStats getStatsForNextTurn() { public CivStats getStatsForNextTurn() {

View File

@ -126,7 +126,7 @@ public class TileMap{
} }
public void placeUnitNearTile(Vector2 position, final String unit){ public void placeUnitNearTile(Vector2 position, final String unit){
getTilesInDistance(position,1).first(new Predicate<TileInfo>() { getTilesInDistance(position,2).first(new Predicate<TileInfo>() {
@Override @Override
public boolean evaluate(TileInfo arg0) { public boolean evaluate(TileInfo arg0) {
return arg0.unit==null; return arg0.unit==null;

View File

@ -1,14 +1,11 @@
package com.unciv.game; package com.unciv.game;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.Pixmap.Blending;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.Group; import com.badlogic.gdx.scenes.scene2d.Group;
import com.badlogic.gdx.scenes.scene2d.InputEvent; 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.Image;
import com.badlogic.gdx.scenes.scene2d.ui.Label; import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane; import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
import com.badlogic.gdx.scenes.scene2d.ui.Table; import com.badlogic.gdx.scenes.scene2d.ui.Table;
@ -16,13 +13,15 @@ import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.ActorGestureListener; import com.badlogic.gdx.scenes.scene2d.utils.ActorGestureListener;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.scenes.scene2d.utils.Drawable; import com.badlogic.gdx.scenes.scene2d.utils.Drawable;
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Align;
import com.unciv.civinfo.CityInfo; import com.unciv.civinfo.CityInfo;
import com.unciv.civinfo.CivilizationInfo;
import com.unciv.civinfo.IConstruction; import com.unciv.civinfo.IConstruction;
import com.unciv.civinfo.TileInfo; import com.unciv.civinfo.TileInfo;
import com.unciv.game.pickerscreens.ConstructionPickerScreen; import com.unciv.game.pickerscreens.ConstructionPickerScreen;
import com.unciv.game.utils.CameraStageBaseScreen;
import com.unciv.game.utils.HexMath;
import com.unciv.game.utils.ImageGetter;
import com.unciv.models.gamebasics.Building; import com.unciv.models.gamebasics.Building;
import com.unciv.models.stats.FullStats; import com.unciv.models.stats.FullStats;
@ -30,16 +29,19 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
public class CityScreen extends com.unciv.game.utils.CameraStageBaseScreen { public class CityScreen extends CameraStageBaseScreen {
TileInfo selectedTile = null; TileInfo selectedTile = null;
float buttonScale = game.settings.buttonScale; float buttonScale = game.settings.buttonScale;
Table TileTable = new Table(); Table TileTable = new Table();
Table BuildingsTable = new Table();
Table CityStatsTable = new Table(); Table CityStatsTable = new Table();
Table CityPickerTable = new Table(); Table CityPickerTable = new Table();
TextButton TechButton = new TextButton("Exit city",skin); TextButton TechButton = new TextButton("Exit city",skin);
public ArrayList<TileGroup> tileGroups = new ArrayList<TileGroup>(); public ArrayList<TileGroup> tileGroups = new ArrayList<TileGroup>();
public CityInfo getCity(){return game.civInfo.getCurrentCity();}
public CityScreen(final UnCivGame game) { public CityScreen(final UnCivGame game) {
super(game); super(game);
new Label("",skin).getStyle().font.getData().setScale(game.settings.labelScale); new Label("",skin).getStyle().font.getData().setScale(game.settings.labelScale);
@ -47,22 +49,96 @@ public class CityScreen extends com.unciv.game.utils.CameraStageBaseScreen {
addTiles(); addTiles();
stage.addActor(TileTable); stage.addActor(TileTable);
Drawable tileTableBackground = ImageGetter.getDrawable("skin/tileTableBackground.png")
Drawable tileTableBackground = new TextureRegionDrawable(new TextureRegion(new Texture("skin/tileTableBackground.png")))
.tint(new Color(0x0040804f)); .tint(new Color(0x0040804f));
tileTableBackground.setMinHeight(0); tileTableBackground.setMinHeight(0);
tileTableBackground.setMinWidth(0); tileTableBackground.setMinWidth(0);
TileTable.setBackground(tileTableBackground); TileTable.setBackground(tileTableBackground);
Table BuildingsTableContainer = new Table();
BuildingsTableContainer.pad(20);
BuildingsTableContainer.setBackground(tileTableBackground);
BuildingsTableContainer.add(new Label("Buildings",skin)).row();
updateBuildingsTable();
ScrollPane buildingsScroll = new ScrollPane(BuildingsTable);
BuildingsTableContainer.add(buildingsScroll).height(stage.getHeight()/2);
BuildingsTableContainer.pack();
BuildingsTableContainer.setPosition(stage.getWidth()-BuildingsTableContainer.getWidth(),
stage.getHeight()-BuildingsTableContainer.getHeight());
CityStatsTable.setBackground(tileTableBackground); CityStatsTable.setBackground(tileTableBackground);
updateCityTable();
stage.addActor(CityStatsTable); stage.addActor(CityStatsTable);
updateGoToWorldButton();
stage.addActor(TechButton); stage.addActor(TechButton);
updateCityPickerTable();
stage.addActor(CityPickerTable); stage.addActor(CityPickerTable);
stage.addActor(BuildingsTableContainer);
update();
}
private void update(){
updateBuildingsTable();
updateCityPickerTable();
updateCityTable();
updateGoToWorldButton();
updateTileTable();
updateTileGroups();
}
private void updateTileGroups(){
for(TileGroup HG : tileGroups) {
HG.update();
}
}
private Image getSpecialistIcon(String imageName, final boolean isFilled, final FullStats specialistType) {
Image specialist = ImageGetter.getImage(imageName);
specialist.setSize(20,20);
if(!isFilled) specialist.setColor(Color.GRAY);
specialist.addListener(new ClickListener(){
@Override
public void clicked(InputEvent event, float x, float y) {
if(isFilled) getCity().specialists.add(specialistType.minus()); //unassign
else if(getCity().getFreePopulation()==0) return;
else getCity().specialists.add(specialistType); //assign!
getCity().updateCityStats();
update();
}
});
return specialist;
}
private void updateBuildingsTable(){
BuildingsTable.clear();
for(Building building : getCity().cityConstructions.getBuiltBuildings()){
BuildingsTable.add(new Label(building.name,skin)).pad(10);
if(building.specialistSlots==null) BuildingsTable.add();
else {
Table specialists = new Table();
specialists.row().size(20).pad(10);
for (int i = 0; i < building.specialistSlots.production; i++) {
specialists.add(getSpecialistIcon("StatIcons/populationBrown.png",
getCity().specialists.production > i, new FullStats(){{production=1;}}) );
}
for (int i = 0; i < building.specialistSlots.science; i++) {
specialists.add(getSpecialistIcon("StatIcons/populationBlue.png",
getCity().specialists.science > i, new FullStats(){{science=1;}}) );
}
for (int i = 0; i < building.specialistSlots.culture; i++) {
specialists.add(getSpecialistIcon("StatIcons/populationPurple.png",
getCity().specialists.culture > i, new FullStats(){{culture=1;}}) );
}
for (int i = 0; i < building.specialistSlots.gold; i++) {
specialists.add(getSpecialistIcon("StatIcons/populationYellow.png",
getCity().specialists.gold > i, new FullStats(){{gold=1;}}) );
}
BuildingsTable.add(specialists);
}
BuildingsTable.row();
}
BuildingsTable.pack();
} }
private void updateCityPickerTable() { private void updateCityPickerTable() {
@ -73,7 +149,7 @@ public class CityScreen extends com.unciv.game.utils.CameraStageBaseScreen {
prevCityButton.addListener(new ClickListener() { prevCityButton.addListener(new ClickListener() {
@Override @Override
public void clicked(InputEvent event, float x, float y) { public void clicked(InputEvent event, float x, float y) {
com.unciv.civinfo.CivilizationInfo ci = game.civInfo; CivilizationInfo ci = game.civInfo;
if (ci.currentCity == 0) ci.currentCity = ci.cities.size()-1; if (ci.currentCity == 0) ci.currentCity = ci.cities.size()-1;
else ci.currentCity--; else ci.currentCity--;
game.setScreen(new CityScreen(game)); game.setScreen(new CityScreen(game));
@ -83,7 +159,7 @@ public class CityScreen extends com.unciv.game.utils.CameraStageBaseScreen {
CityPickerTable.add(prevCityButton); CityPickerTable.add(prevCityButton);
} }
Label currentCityLabel = new Label(game.civInfo.getCurrentCity().name, skin); Label currentCityLabel = new Label(getCity().name, skin);
currentCityLabel.setFontScale(2); currentCityLabel.setFontScale(2);
CityPickerTable.add(currentCityLabel); CityPickerTable.add(currentCityLabel);
@ -92,7 +168,7 @@ public class CityScreen extends com.unciv.game.utils.CameraStageBaseScreen {
nextCityButton.addListener(new ClickListener() { nextCityButton.addListener(new ClickListener() {
@Override @Override
public void clicked(InputEvent event, float x, float y) { public void clicked(InputEvent event, float x, float y) {
com.unciv.civinfo.CivilizationInfo ci = game.civInfo; CivilizationInfo ci = game.civInfo;
if (ci.currentCity == ci.cities.size()-1) ci.currentCity = 0; if (ci.currentCity == ci.cities.size()-1) ci.currentCity = 0;
else ci.currentCity++; else ci.currentCity++;
game.setScreen(new CityScreen(game)); game.setScreen(new CityScreen(game));
@ -112,7 +188,7 @@ public class CityScreen extends com.unciv.game.utils.CameraStageBaseScreen {
@Override @Override
public void clicked(InputEvent event, float x, float y) { public void clicked(InputEvent event, float x, float y) {
game.setWorldScreen(); game.setWorldScreen();
game.worldScreen.setCenterPosition(game.civInfo.getCurrentCity().cityLocation); game.worldScreen.setCenterPosition(getCity().cityLocation);
dispose(); dispose();
} }
}); });
@ -122,7 +198,7 @@ public class CityScreen extends com.unciv.game.utils.CameraStageBaseScreen {
} }
private void addTiles() { private void addTiles() {
final CityInfo cityInfo = game.civInfo.getCurrentCity(); final CityInfo cityInfo = getCity();
Group allTiles = new Group(); Group allTiles = new Group();
@ -132,11 +208,13 @@ public class CityScreen extends com.unciv.game.utils.CameraStageBaseScreen {
@Override @Override
public void clicked(InputEvent event, float x, float y) { public void clicked(InputEvent event, float x, float y) {
selectedTile = tileInfo; selectedTile = tileInfo;
updateTileTable(); update();
} }
}); });
if(!cityInfo.getTilesInRange().contains(tileInfo)) group.setColor(0,0,0,0.3f); if(!cityInfo.getTilesInRange().contains(tileInfo) ||
(tileInfo.workingCity!=null && !tileInfo.workingCity.equals(cityInfo.name)))
group.setColor(0,0,0,0.3f);
else if(!tileInfo.isCityCenter()) { else if(!tileInfo.isCityCenter()) {
group.addPopulationIcon(); group.addPopulationIcon();
group.populationImage.addListener(new ClickListener() { group.populationImage.addListener(new ClickListener() {
@ -145,12 +223,12 @@ public class CityScreen extends com.unciv.game.utils.CameraStageBaseScreen {
if(tileInfo.workingCity ==null && cityInfo.getFreePopulation() > 0) tileInfo.workingCity = cityInfo.name; if(tileInfo.workingCity ==null && cityInfo.getFreePopulation() > 0) tileInfo.workingCity = cityInfo.name;
else if(cityInfo.name.equals(tileInfo.workingCity)) tileInfo.workingCity = null; else if(cityInfo.name.equals(tileInfo.workingCity)) tileInfo.workingCity = null;
cityInfo.updateCityStats(); cityInfo.updateCityStats();
updateCityTable(); update();
} }
}); });
} }
Vector2 positionalVector = com.unciv.game.utils.HexMath.Hex2WorldCoords(tileInfo.position.cpy().sub(cityInfo.cityLocation)); Vector2 positionalVector = HexMath.Hex2WorldCoords(tileInfo.position.cpy().sub(cityInfo.cityLocation));
int groupSize = 50; int groupSize = 50;
group.setPosition(stage.getWidth()/2 + positionalVector.x*0.8f * groupSize, group.setPosition(stage.getWidth()/2 + positionalVector.x*0.8f * groupSize,
stage.getHeight()/2 + positionalVector.y*0.8f * groupSize); stage.getHeight()/2 + positionalVector.y*0.8f * groupSize);
@ -189,7 +267,7 @@ public class CityScreen extends com.unciv.game.utils.CameraStageBaseScreen {
} }
private void updateCityTable() { private void updateCityTable() {
final CityInfo cityInfo = game.civInfo.getCurrentCity(); final CityInfo cityInfo = getCity();
FullStats stats = cityInfo.cityStats; FullStats stats = cityInfo.cityStats;
CityStatsTable.pad(20); CityStatsTable.pad(20);
CityStatsTable.columnDefaults(0).padRight(10); CityStatsTable.columnDefaults(0).padRight(10);
@ -213,12 +291,12 @@ public class CityScreen extends com.unciv.game.utils.CameraStageBaseScreen {
CityStatsValues.put("Population",cityInfo.getFreePopulation()+"/"+cityInfo.population); CityStatsValues.put("Population",cityInfo.getFreePopulation()+"/"+cityInfo.population);
for(String key : CityStatsValues.keySet()){ for(String key : CityStatsValues.keySet()){
CityStatsTable.add(com.unciv.game.utils.ImageGetter.getStatIcon(key)).align(Align.right); CityStatsTable.add(ImageGetter.getStatIcon(key)).align(Align.right);
CityStatsTable.add(new Label(CityStatsValues.get(key),skin)).align(Align.left); CityStatsTable.add(new Label(CityStatsValues.get(key),skin)).align(Align.left);
CityStatsTable.row(); CityStatsTable.row();
} }
String CurrentBuilding = game.civInfo.getCurrentCity().cityConstructions.currentConstruction; String CurrentBuilding = getCity().cityConstructions.currentConstruction;
String BuildingText = "Pick building"; String BuildingText = "Pick building";
if(CurrentBuilding != null) BuildingText = cityInfo.cityConstructions.getCityProductionTextForCityButton(); if(CurrentBuilding != null) BuildingText = cityInfo.cityConstructions.getCityProductionTextForCityButton();
@ -236,7 +314,6 @@ public class CityScreen extends com.unciv.game.utils.CameraStageBaseScreen {
// https://forums.civfanatics.com/threads/rush-buying-formula.393892/ // https://forums.civfanatics.com/threads/rush-buying-formula.393892/
IConstruction construction = cityInfo.cityConstructions.getCurrentConstruction(); IConstruction construction = cityInfo.cityConstructions.getCurrentConstruction();
if(construction != null && !(construction instanceof Building && ((Building)construction).isWonder)) { if(construction != null && !(construction instanceof Building && ((Building)construction).isWonder)) {
CityStatsTable.row(); CityStatsTable.row();
@ -246,7 +323,7 @@ public class CityScreen extends com.unciv.game.utils.CameraStageBaseScreen {
@Override @Override
public void clicked(InputEvent event, float x, float y) { public void clicked(InputEvent event, float x, float y) {
cityInfo.cityConstructions.purchaseBuilding(cityInfo.cityConstructions.currentConstruction); cityInfo.cityConstructions.purchaseBuilding(cityInfo.cityConstructions.currentConstruction);
updateCityTable(); update();
} }
}); });
if(buildingGoldCost > game.civInfo.civStats.gold){ if(buildingGoldCost > game.civInfo.civStats.gold){
@ -266,7 +343,7 @@ public class CityScreen extends com.unciv.game.utils.CameraStageBaseScreen {
if(selectedTile == null) return; if(selectedTile == null) return;
TileTable.clearChildren(); TileTable.clearChildren();
CityInfo city =game.civInfo.getCurrentCity(); CityInfo city = getCity();
FullStats stats = selectedTile.getTileStats(city); FullStats stats = selectedTile.getTileStats(city);
TileTable.pad(20); TileTable.pad(20);
TileTable.columnDefaults(0).padRight(10); TileTable.columnDefaults(0).padRight(10);
@ -288,7 +365,7 @@ public class CityScreen extends com.unciv.game.utils.CameraStageBaseScreen {
for(String key : TileStatsValues.keySet()){ for(String key : TileStatsValues.keySet()){
if(TileStatsValues.get(key) == 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(com.unciv.game.utils.ImageGetter.getStatIcon(key)).align(Align.right); TileTable.add(ImageGetter.getStatIcon(key)).align(Align.right);
TileTable.add(new Label(Math.round(TileStatsValues.get(key))+"",skin)).align(Align.left); TileTable.add(new Label(Math.round(TileStatsValues.get(key))+"",skin)).align(Align.left);
TileTable.row(); TileTable.row();
} }
@ -298,30 +375,5 @@ public class CityScreen extends com.unciv.game.utils.CameraStageBaseScreen {
TileTable.setPosition(stage.getWidth()-10- TileTable.getWidth(), 10); TileTable.setPosition(stage.getWidth()-10- TileTable.getWidth(), 10);
} }
@Override
public void render(float delta) {
for(TileGroup HG : tileGroups) {
HG.update();
}
super.render(delta);
}
public static Pixmap getPixmapRoundedRectangle(int width, int height, int radius, int color) {
Pixmap pixmap = new Pixmap(width, height, Pixmap.Format.RGBA8888);
pixmap.setBlending(Blending.None);
pixmap.setColor(color);
pixmap.fillRectangle(0, radius, pixmap.getWidth(), pixmap.getHeight()-2*radius);
pixmap.fillRectangle(radius, 0, pixmap.getWidth() - 2*radius, pixmap.getHeight());
pixmap.fillCircle(radius, radius, radius);
pixmap.fillCircle(radius, pixmap.getHeight()-radius, radius);
pixmap.fillCircle(pixmap.getWidth()-radius, radius, radius);
pixmap.fillCircle(pixmap.getWidth()-radius, pixmap.getHeight()-radius, radius);
return pixmap;
}
} }

View File

@ -40,7 +40,8 @@ public class TileGroup extends Group {
void addPopulationIcon(){ void addPopulationIcon(){
populationImage = ImageGetter.getStatIcon("Population"); populationImage = ImageGetter.getImage("StatIcons/populationGreen.png");
populationImage.setSize(20,20);
populationImage.moveBy(0, terrainImage.getHeight()-populationImage.getHeight()); // top left populationImage.moveBy(0, terrainImage.getHeight()-populationImage.getHeight()); // top left
addActor(populationImage); addActor(populationImage);
} }
@ -68,7 +69,7 @@ public class TileGroup extends Group {
} }
if (tileInfo.unit != null && unitImage == null) { if (tileInfo.unit != null && unitImage == null) {
unitImage = ImageGetter.getImage("StatIcons/" + tileInfo.unit.name + "_(Civ5).png"); unitImage = ImageGetter.getImage("StatIcons/" + tileInfo.unit.name.replace(" ","_") + "_(Civ5).png");
addActor(unitImage); addActor(unitImage);
unitImage.setSize(20, 20); // not moved - is at bottom left unitImage.setSize(20, 20); // not moved - is at bottom left
} }

View File

@ -65,7 +65,7 @@ public class WorldScreen extends CameraStageBaseScreen {
tileTable.setBackground(tileTableBackground); tileTable.setBackground(tileTableBackground);
OptionsTable.setBackground(tileTableBackground); OptionsTable.setBackground(tileTableBackground);
NotificationsTable.background(ImageGetter.getDrawable(ImageGetter.WhiteDot).tint(new Color(0x004085bf))); NotificationsTable.background(ImageGetter.getSingleColorDrawable(new Color(0x004085bf)));
TextureRegionDrawable civBackground = ImageGetter.getDrawable("skin/civTableBackground.png"); TextureRegionDrawable civBackground = ImageGetter.getDrawable("skin/civTableBackground.png");
CivTable.setBackground(civBackground.tint(new Color(0x004085bf))); CivTable.setBackground(civBackground.tint(new Color(0x004085bf)));

View File

@ -1,6 +1,7 @@
package com.unciv.game.utils; package com.unciv.game.utils;
import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.scenes.scene2d.ui.Image; import com.badlogic.gdx.scenes.scene2d.ui.Image;
@ -21,6 +22,10 @@ public class ImageGetter {
return new TextureRegionDrawable(getTextureRegion(fileName)); return new TextureRegionDrawable(getTextureRegion(fileName));
} }
public static Drawable getSingleColorDrawable(Color color){
return getDrawable("skin/whiteDot.png").tint(color);
}
private static TextureRegion getTextureRegion(String fileName) { private static TextureRegion getTextureRegion(String fileName) {
if (!textureRegionByFileName.containsKey(fileName)) if (!textureRegionByFileName.containsKey(fileName))
textureRegionByFileName.put(fileName, new TextureRegion(new Texture(Gdx.files.internal(fileName)))); textureRegionByFileName.put(fileName, new TextureRegion(new Texture(Gdx.files.internal(fileName))));

View File

@ -165,6 +165,7 @@ public class Building extends NamedStats implements IConstruction, ICivilopedia
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().enterGoldenAge();
if("FreeGreatArtistAppears".equals(unique)) CivilizationInfo.current().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");

View File

@ -23,6 +23,17 @@ public class FullStats extends CivStats // also used for hex stats, since it's b
production +=other.production; production +=other.production;
} }
public FullStats minus(){
FullStats sub = new FullStats();
sub.gold=-gold;
sub.science=-science;
sub.happiness=-happiness;
sub.culture=-culture;
sub.food=-food;
sub.production=-production;
return sub;
}
public String display(float value, String name){ public String display(float value, String name){
return ", " + (value>0 ? "+" : "") + Math.round(value) + " "+name; return ", " + (value>0 ? "+" : "") + Math.round(value) + " "+name;
} }