diff --git a/core/src/com/unciv/civinfo/MapUnit.java b/core/src/com/unciv/civinfo/MapUnit.java new file mode 100644 index 0000000000..bf1bd381b1 --- /dev/null +++ b/core/src/com/unciv/civinfo/MapUnit.java @@ -0,0 +1,7 @@ +package com.unciv.civinfo; + +public class MapUnit{ + public String name; + public int maxMovement; + public float currentMovement; +} diff --git a/core/src/com/unciv/civinfo/TileInfo.java b/core/src/com/unciv/civinfo/TileInfo.java index f1f5c74ea5..079d5582cc 100644 --- a/core/src/com/unciv/civinfo/TileInfo.java +++ b/core/src/com/unciv/civinfo/TileInfo.java @@ -14,7 +14,7 @@ import java.text.DecimalFormat; public class TileInfo { - public Unit unit; + public MapUnit unit; public Vector2 position; public String baseTerrain; public String terrainFeature; @@ -124,7 +124,7 @@ public class TileInfo public void nextTurn() { - if(unit !=null) unit.currentMovement = unit.movement; + if(unit !=null) unit.currentMovement = unit.maxMovement; if (improvementInProgress == null || unit ==null || !unit.name.equals("Worker")) return; turnsToImprovement -= 1; @@ -165,7 +165,7 @@ public class TileInfo if (roadStatus!= RoadStatus.None && !isCityCenter()) 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 + "("+ new DecimalFormat("0.#").format(unit.currentMovement)+"/"+ unit.movement +")"); + if (unit !=null) SB.append(",\r\n" + unit.name + "("+ new DecimalFormat("0.#").format(unit.currentMovement)+"/"+ unit.maxMovement+")"); return SB.toString(); } diff --git a/core/src/com/unciv/civinfo/TileMap.java b/core/src/com/unciv/civinfo/TileMap.java index bd0c867fdf..11654a00fb 100644 --- a/core/src/com/unciv/civinfo/TileMap.java +++ b/core/src/com/unciv/civinfo/TileMap.java @@ -125,13 +125,14 @@ public class TileMap{ }).getRandom(); } - void placeUnitNearTile(Vector2 position, Unit unit){ + public void placeUnitNearTile(Vector2 position, final String unit){ getTilesInDistance(position,1).first(new Predicate() { @Override public boolean evaluate(TileInfo arg0) { return arg0.unit==null; } - }).unit = unit; // And if there's none, then kill me. + }).unit = GameBasics.Units.get(unit).getMapUnit(); // And if there's none, then kill me. } } + diff --git a/core/src/com/unciv/civinfo/Unit.java b/core/src/com/unciv/civinfo/Unit.java index b6a8f879c2..840bb5e0c9 100644 --- a/core/src/com/unciv/civinfo/Unit.java +++ b/core/src/com/unciv/civinfo/Unit.java @@ -9,17 +9,10 @@ public class Unit implements INamed, IConstruction{ public int cost; public int hurryCostModifier; public int movement; - public float currentMovement; boolean unbuildable; // for special units likee great people public Unit(){} // for json parsing, we need to have a default constructor - public Unit(String name, int maxMovement) { - this.name = name; - this.movement = maxMovement; - currentMovement = maxMovement; - } - @Override public String getName() { return name; @@ -47,6 +40,14 @@ public class Unit implements INamed, IConstruction{ @Override public void postBuildEvent(CityConstructions construction) { - UnCivGame.Current.civInfo.tileMap.placeUnitNearTile(construction.cityLocation,new Unit(name,movement)); + UnCivGame.Current.civInfo.tileMap.placeUnitNearTile(construction.cityLocation,name); + } + + public MapUnit getMapUnit(){ + MapUnit unit = new MapUnit(); + unit.name=name; + unit.maxMovement=movement; + unit.currentMovement=movement; + return unit; } } diff --git a/core/src/com/unciv/game/UnCivGame.java b/core/src/com/unciv/game/UnCivGame.java index 37e045127f..8d48c35d13 100644 --- a/core/src/com/unciv/game/UnCivGame.java +++ b/core/src/com/unciv/game/UnCivGame.java @@ -49,7 +49,7 @@ public class UnCivGame extends Game { public void startNewGame(){ civInfo = new CivilizationInfo(); - civInfo.tileMap.get(Vector2.Zero).unit = new Unit("Settler",2); + civInfo.tileMap.placeUnitNearTile(Vector2.Zero,"Settler"); worldScreen = new WorldScreen(this); setWorldScreen(); diff --git a/core/src/com/unciv/game/WorldScreen.java b/core/src/com/unciv/game/WorldScreen.java index 1f501834e1..b1a101e400 100644 --- a/core/src/com/unciv/game/WorldScreen.java +++ b/core/src/com/unciv/game/WorldScreen.java @@ -18,6 +18,7 @@ import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Predicate; import com.unciv.civinfo.CityConstructions; +import com.unciv.civinfo.MapUnit; import com.unciv.civinfo.TileInfo; import com.unciv.civinfo.Unit; import com.unciv.game.pickerscreens.ImprovementPickerScreen; @@ -378,7 +379,7 @@ public class WorldScreen extends com.unciv.game.utils.CameraStageBaseScreen { .size(moveUnitButton.getWidth() * buttonScale, moveUnitButton.getHeight() * buttonScale); if(selectedTile.unit.name.equals("Settler")) { - addUnitAction(tileTable, "Found City", selectedTile.unit, + addUnitAction(tileTable, "Found City", !game.civInfo.tileMap.getTilesInDistance(selectedTile.position, 2).any(new Predicate() { @Override public boolean evaluate(TileInfo arg0) { @@ -400,7 +401,7 @@ public class WorldScreen extends com.unciv.game.utils.CameraStageBaseScreen { if(selectedTile.unit.name.equals("Worker")) { String improvementButtonText = selectedTile.improvementInProgress == null ? "Construct\r\nimprovement" : selectedTile.improvementInProgress +"\r\nin progress"; - addUnitAction(tileTable,improvementButtonText,selectedTile.unit, !selectedTile.isCityCenter() || + addUnitAction(tileTable,improvementButtonText, !selectedTile.isCityCenter() || GameBasics.TileImprovements.linqValues().any(new Predicate() { @Override public boolean evaluate(TileImprovement arg0) { @@ -415,7 +416,7 @@ public class WorldScreen extends com.unciv.game.utils.CameraStageBaseScreen { } if(selectedTile.unit.name.equals("Great Scientist")){ - addUnitAction(tileTable, "Discover Technology",selectedTile.unit,true, + addUnitAction(tileTable, "Discover Technology",true, new ClickListener(){ @Override public void clicked(InputEvent event, float x, float y) { @@ -424,7 +425,7 @@ public class WorldScreen extends com.unciv.game.utils.CameraStageBaseScreen { game.setScreen(new TechPickerScreen(game,true)); } }); - addUnitAction(tileTable, "Construct Academy",selectedTile.unit,true, + addUnitAction(tileTable, "Construct Academy",true, new ClickListener(){ @Override public void clicked(InputEvent event, float x, float y) { @@ -436,7 +437,7 @@ public class WorldScreen extends com.unciv.game.utils.CameraStageBaseScreen { } if(selectedTile.unit.name.equals("Great Artist")){ - addUnitAction(tileTable, "Start Golden Age",selectedTile.unit,true, + addUnitAction(tileTable, "Start Golden Age",true, new ClickListener(){ @Override public void clicked(InputEvent event, float x, float y) { @@ -445,7 +446,7 @@ public class WorldScreen extends com.unciv.game.utils.CameraStageBaseScreen { update(); } }); - addUnitAction(tileTable, "Construct Landmark",selectedTile.unit,true, + addUnitAction(tileTable, "Construct Landmark",true, new ClickListener(){ @Override public void clicked(InputEvent event, float x, float y) { @@ -458,7 +459,7 @@ public class WorldScreen extends com.unciv.game.utils.CameraStageBaseScreen { if(selectedTile.unit.name.equals("Great Engineer")){ final CityConstructions cityConstructions = selectedTile.getCity().cityConstructions; - addUnitAction(tileTable, "Hurry Wonder",selectedTile.unit,selectedTile.isCityCenter() && + addUnitAction(tileTable, "Hurry Wonder",selectedTile.isCityCenter() && cityConstructions.getCurrentConstruction() instanceof Building && ((Building)cityConstructions.getCurrentConstruction()).isWonder, new ClickListener(){ @@ -469,7 +470,7 @@ public class WorldScreen extends com.unciv.game.utils.CameraStageBaseScreen { update(); } }); - addUnitAction(tileTable, "Construct Manufactory",selectedTile.unit,true, + addUnitAction(tileTable, "Construct Manufactory",true, new ClickListener(){ @Override public void clicked(InputEvent event, float x, float y) { @@ -481,7 +482,7 @@ public class WorldScreen extends com.unciv.game.utils.CameraStageBaseScreen { } if(selectedTile.unit.name.equals("Great Merchant")){ final CityConstructions cityConstructions = selectedTile.getCity().cityConstructions; - addUnitAction(tileTable, "Conduct Trade Mission",selectedTile.unit,true, + addUnitAction(tileTable, "Conduct Trade Mission",true, new ClickListener(){ @Override public void clicked(InputEvent event, float x, float y) { @@ -490,7 +491,7 @@ public class WorldScreen extends com.unciv.game.utils.CameraStageBaseScreen { update(); } }); - addUnitAction(tileTable, "Construct Customs House",selectedTile.unit,true, + addUnitAction(tileTable, "Construct Customs House",true, new ClickListener(){ @Override public void clicked(InputEvent event, float x, float y) { @@ -507,7 +508,7 @@ public class WorldScreen extends com.unciv.game.utils.CameraStageBaseScreen { tileTable.setPosition(stage.getWidth()-10- tileTable.getWidth(), 10); } - private void addUnitAction(Table tileTable, String actionText, Unit unit, boolean canAct, ClickListener action) { + private void addUnitAction(Table tileTable, String actionText, boolean canAct, ClickListener action) { TextButton actionButton = new TextButton(actionText, skin); actionButton.getLabel().setFontScale(buttonScale); actionButton.addListener(action); diff --git a/core/src/com/unciv/game/WorldTileGroup.java b/core/src/com/unciv/game/WorldTileGroup.java index 15af6e225a..1172f8e9b0 100644 --- a/core/src/com/unciv/game/WorldTileGroup.java +++ b/core/src/com/unciv/game/WorldTileGroup.java @@ -74,4 +74,3 @@ public class WorldTileGroup extends TileGroup { } } - diff --git a/core/src/com/unciv/game/utils/HexMath.java b/core/src/com/unciv/game/utils/HexMath.java index 646d190d4a..729adc85d7 100644 --- a/core/src/com/unciv/game/utils/HexMath.java +++ b/core/src/com/unciv/game/utils/HexMath.java @@ -69,11 +69,11 @@ public class HexMath } public static LinqCollection GetVectorsInDistance(Vector2 origin, int distance) { - HashSet hexesToReturn = new HashSet(); + LinqCollection hexesToReturn = new LinqCollection(); for (int i = 0; i < distance + 1; i++) { hexesToReturn.addAll(GetVectorsAtDistance(origin, i)); } - return new LinqCollection(hexesToReturn); + return hexesToReturn; } public static int GetDistance(Vector2 origin, Vector2 destination){ // Yes, this is a dumb implementation. But I can't be arsed to think of a better one right now, other stuff to do. diff --git a/core/src/com/unciv/models/gamebasics/Building.java b/core/src/com/unciv/models/gamebasics/Building.java index 28dbb52d07..b760bb2498 100644 --- a/core/src/com/unciv/models/gamebasics/Building.java +++ b/core/src/com/unciv/models/gamebasics/Building.java @@ -149,6 +149,10 @@ public class Building extends NamedStats implements IConstruction, ICivilopedia constructions.builtBuildings.add(providesFreeBuilding); if (freeTechs != 0) UnCivGame.Current.civInfo.tech.freeTechs += freeTechs; if("EmpireEntersGoldenAge".equals(unique)) CivilizationInfo.current().enterGoldenAge(); + if("WorkerConstruction".equals(unique)){ + CivilizationInfo.current().tileMap.placeUnitNearTile(constructions.cityLocation,"Worker"); + CivilizationInfo.current().tileMap.placeUnitNearTile(constructions.cityLocation,"Worker"); + } } }