From b6d235a4d0e1ddb405512af0060fbc039a23a1a9 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Mon, 22 Jan 2018 22:57:17 +0200 Subject: [PATCH] Automated actions should now choose best and closest tile to work on, differentiated pre- and post- turn actions --- android/build.gradle | 4 +- .../logic/civilization/CivilizationInfo.java | 3 + core/src/com/unciv/logic/map/MapUnit.java | 66 ++++++++----------- core/src/com/unciv/logic/map/TileInfo.java | 3 +- core/src/com/unciv/ui/WorldScreen.java | 3 +- 5 files changed, 36 insertions(+), 43 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index f400f989ec..6400380433 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -21,8 +21,8 @@ android { applicationId "com.unciv.game" minSdkVersion 9 targetSdkVersion 25 - versionCode 19 - versionName "1.1.0" + versionCode 21 + versionName "1.1.2" } buildTypes { release { diff --git a/core/src/com/unciv/logic/civilization/CivilizationInfo.java b/core/src/com/unciv/logic/civilization/CivilizationInfo.java index 469aff7179..7097166f57 100644 --- a/core/src/com/unciv/logic/civilization/CivilizationInfo.java +++ b/core/src/com/unciv/logic/civilization/CivilizationInfo.java @@ -79,6 +79,7 @@ public class CivilizationInfo { notifications.clear(); CivStats nextTurnStats = getStatsForNextTurn(); policies.nextTurn(nextTurnStats.culture); + gold+=nextTurnStats.gold; int happiness = getHappinessForNextTurn(); @@ -124,6 +125,8 @@ public class CivilizationInfo { if(policies.isAdopted("Mandate Of Heaven")) statsForTurn.culture+=getHappinessForNextTurn()/2; + + if(statsForTurn.gold<0) statsForTurn.science+=statsForTurn.gold; // negative gold hurts science return statsForTurn; } diff --git a/core/src/com/unciv/logic/map/MapUnit.java b/core/src/com/unciv/logic/map/MapUnit.java index aaecdd6eee..652feebb7a 100644 --- a/core/src/com/unciv/logic/map/MapUnit.java +++ b/core/src/com/unciv/logic/map/MapUnit.java @@ -12,7 +12,7 @@ public class MapUnit{ public float currentMovement; public String action; // work, automation, fortifying, I dunno what. - public void doAction(TileInfo tile){ + public void doPreTurnAction(TileInfo tile){ if(currentMovement==0) return; // We've already done stuff this turn, and can't do any more stuff if(action!=null && action.startsWith("moveTo")){ String[] destination = action.replace("moveTo ","").split(","); @@ -21,11 +21,14 @@ public class MapUnit{ if(gotTo==null) // we couldn't move there because another unit was in the way! return; if(gotTo.position.equals(destinationVector)) action=null; - if(currentMovement!=0) doAction(gotTo); + if(currentMovement!=0) doPreTurnAction(gotTo); return; } - if ("automation".equals(action)) {doAutomatedAction(tile);return;} + if ("automation".equals(action)) doAutomatedAction(tile); + } + + public void doPostTurnAction(TileInfo tile){ if(name.equals("Worker") && tile.improvementInProgress!=null) workOnImprovement(tile); } @@ -42,60 +45,47 @@ public class MapUnit{ } } - private boolean isTopPriorityTile(TileInfo tile){ - return tile.owner!=null && tile.improvement==null - && (tile.workingCity!=null || tile.resource!=null || tile.improvementInProgress!=null) - && tile.canBuildImprovement(GameBasics.TileImprovements.get(chooseImprovement(tile))); - } - private boolean isMediumPriorityTile(TileInfo tile){ - return tile.owner!=null && tile.improvement==null - && tile.canBuildImprovement(GameBasics.TileImprovements.get(chooseImprovement(tile))); - } - - private boolean isLowPriorityTile(TileInfo tile){ // Resource near a city's edges - return tile.improvement==null - && tile.canBuildImprovement(GameBasics.TileImprovements.get(chooseImprovement(tile))) - && tile.hasViewableResource() - && tile.getNeighbors().any(new Predicate() { + private int getPriority(TileInfo tileInfo){ + int priority =0; + if(tileInfo.workingCity!=null) priority+=2; + if(tileInfo.hasViewableResource()) priority+=1; + if(tileInfo.owner!=null) priority+=2; + else if(tileInfo.getNeighbors().any(new Predicate() { @Override public boolean evaluate(TileInfo arg0) { return arg0.owner!=null; } - }); + })) priority+=1; + return priority; } public TileInfo findTileToWork(TileInfo currentTile){ - if(isTopPriorityTile(currentTile)) return currentTile; + TileInfo selectedTile = currentTile; + int tilePriority = getPriority(currentTile); for (int i = 1; i < 5; i++) for (TileInfo tile : CivilizationInfo.current().tileMap.getTilesAtDistance(currentTile.position,i)) - if(tile.unit==null && isTopPriorityTile(tile)) - return tile; + if(tile.unit==null && tile.improvement==null && getPriority(tile)>tilePriority + && tile.canBuildImprovement(GameBasics.TileImprovements.get(chooseImprovement(tile)))){ + selectedTile = tile; + tilePriority = getPriority(tile); + } - if(isMediumPriorityTile(currentTile)) return currentTile; - for (int i = 1; i < 5; i++) - for (TileInfo tile : CivilizationInfo.current().tileMap.getTilesAtDistance(currentTile.position,i)) - if(tile.unit==null && isMediumPriorityTile(tile)) - return tile; - - if(isLowPriorityTile(currentTile)) return currentTile; - for (int i = 1; i < 5; i++) - for (TileInfo tile : CivilizationInfo.current().tileMap.getTilesAtDistance(currentTile.position,i)) - if(tile.unit==null && isLowPriorityTile(tile)) - return tile; - return null; + return selectedTile; } public void doAutomatedAction(TileInfo tile){ TileInfo toWork = findTileToWork(tile); - if(toWork==null) return; // Don't know what to do. Sorry. if(toWork!=tile) { tile = headTowards(tile.position, toWork.position); - doAction(tile); + doPreTurnAction(tile); return; } - if(tile.improvementInProgress == null) tile.startWorkingOnImprovement(chooseImprovement(tile)); - workOnImprovement(tile); + if(tile.improvementInProgress == null){ + String improvement =chooseImprovement(tile); + if(tile.canBuildImprovement(GameBasics.TileImprovements.get(improvement))) // What if we're stuck on this tile but can't build there? + tile.startWorkingOnImprovement(improvement); + } } private String chooseImprovement(final TileInfo tile){ diff --git a/core/src/com/unciv/logic/map/TileInfo.java b/core/src/com/unciv/logic/map/TileInfo.java index bf34709af2..2233f4e3df 100644 --- a/core/src/com/unciv/logic/map/TileInfo.java +++ b/core/src/com/unciv/logic/map/TileInfo.java @@ -133,8 +133,9 @@ public class TileInfo public void nextTurn() { if(unit !=null) { + unit.doPostTurnAction(this); unit.currentMovement = unit.maxMovement; - unit.doAction(this); + unit.doPreTurnAction(this); } } diff --git a/core/src/com/unciv/ui/WorldScreen.java b/core/src/com/unciv/ui/WorldScreen.java index 2a99b7bc54..cb0d1d1f6f 100644 --- a/core/src/com/unciv/ui/WorldScreen.java +++ b/core/src/com/unciv/ui/WorldScreen.java @@ -15,7 +15,6 @@ 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.Predicate; -import com.unciv.logic.civilization.CivilizationInfo; import com.unciv.logic.civilization.Notification; import com.unciv.logic.map.TileInfo; import com.unciv.ui.pickerscreens.PolicyPickerScreen; @@ -379,7 +378,7 @@ public class WorldScreen extends CameraStageBaseScreen { unitTile.moveUnitToTile(group.tileInfo, distanceToTiles.get(selectedTile)); } else { unitTile.unit.action = "moveTo " + ((int) selectedTile.position.x) + "," + ((int) selectedTile.position.y); - unitTile.unit.doAction(unitTile); + unitTile.unit.doPreTurnAction(unitTile); } unitTile = null;