Automated actions should now choose best and closest tile to work on, differentiated pre- and post- turn actions

This commit is contained in:
Yair Morgenstern 2018-01-22 22:57:17 +02:00
parent dd6805d179
commit b6d235a4d0
5 changed files with 36 additions and 43 deletions

View File

@ -21,8 +21,8 @@ android {
applicationId "com.unciv.game" applicationId "com.unciv.game"
minSdkVersion 9 minSdkVersion 9
targetSdkVersion 25 targetSdkVersion 25
versionCode 19 versionCode 21
versionName "1.1.0" versionName "1.1.2"
} }
buildTypes { buildTypes {
release { release {

View File

@ -79,6 +79,7 @@ public class CivilizationInfo {
notifications.clear(); notifications.clear();
CivStats nextTurnStats = getStatsForNextTurn(); CivStats nextTurnStats = getStatsForNextTurn();
policies.nextTurn(nextTurnStats.culture); policies.nextTurn(nextTurnStats.culture);
gold+=nextTurnStats.gold;
int happiness = getHappinessForNextTurn(); int happiness = getHappinessForNextTurn();
@ -124,6 +125,8 @@ public class CivilizationInfo {
if(policies.isAdopted("Mandate Of Heaven")) if(policies.isAdopted("Mandate Of Heaven"))
statsForTurn.culture+=getHappinessForNextTurn()/2; statsForTurn.culture+=getHappinessForNextTurn()/2;
if(statsForTurn.gold<0) statsForTurn.science+=statsForTurn.gold; // negative gold hurts science
return statsForTurn; return statsForTurn;
} }

View File

@ -12,7 +12,7 @@ public class MapUnit{
public float currentMovement; public float currentMovement;
public String action; // work, automation, fortifying, I dunno what. 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(currentMovement==0) return; // We've already done stuff this turn, and can't do any more stuff
if(action!=null && action.startsWith("moveTo")){ if(action!=null && action.startsWith("moveTo")){
String[] destination = action.replace("moveTo ","").split(","); 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! if(gotTo==null) // we couldn't move there because another unit was in the way!
return; return;
if(gotTo.position.equals(destinationVector)) action=null; if(gotTo.position.equals(destinationVector)) action=null;
if(currentMovement!=0) doAction(gotTo); if(currentMovement!=0) doPreTurnAction(gotTo);
return; 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); 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){ private int getPriority(TileInfo tileInfo){
return tile.owner!=null && tile.improvement==null int priority =0;
&& tile.canBuildImprovement(GameBasics.TileImprovements.get(chooseImprovement(tile))); if(tileInfo.workingCity!=null) priority+=2;
} if(tileInfo.hasViewableResource()) priority+=1;
if(tileInfo.owner!=null) priority+=2;
private boolean isLowPriorityTile(TileInfo tile){ // Resource near a city's edges else if(tileInfo.getNeighbors().any(new Predicate<TileInfo>() {
return tile.improvement==null
&& tile.canBuildImprovement(GameBasics.TileImprovements.get(chooseImprovement(tile)))
&& tile.hasViewableResource()
&& tile.getNeighbors().any(new Predicate<TileInfo>() {
@Override @Override
public boolean evaluate(TileInfo arg0) { public boolean evaluate(TileInfo arg0) {
return arg0.owner!=null; return arg0.owner!=null;
} }
}); })) priority+=1;
return priority;
} }
public TileInfo findTileToWork(TileInfo currentTile){ 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 (int i = 1; i < 5; i++)
for (TileInfo tile : CivilizationInfo.current().tileMap.getTilesAtDistance(currentTile.position,i)) for (TileInfo tile : CivilizationInfo.current().tileMap.getTilesAtDistance(currentTile.position,i))
if(tile.unit==null && isTopPriorityTile(tile)) if(tile.unit==null && tile.improvement==null && getPriority(tile)>tilePriority
return tile; && tile.canBuildImprovement(GameBasics.TileImprovements.get(chooseImprovement(tile)))){
selectedTile = tile;
tilePriority = getPriority(tile);
}
if(isMediumPriorityTile(currentTile)) return currentTile; return selectedTile;
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;
} }
public void doAutomatedAction(TileInfo tile){ public void doAutomatedAction(TileInfo tile){
TileInfo toWork = findTileToWork(tile); TileInfo toWork = findTileToWork(tile);
if(toWork==null) return; // Don't know what to do. Sorry.
if(toWork!=tile) { if(toWork!=tile) {
tile = headTowards(tile.position, toWork.position); tile = headTowards(tile.position, toWork.position);
doAction(tile); doPreTurnAction(tile);
return; return;
} }
if(tile.improvementInProgress == null) tile.startWorkingOnImprovement(chooseImprovement(tile)); if(tile.improvementInProgress == null){
workOnImprovement(tile); 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){ private String chooseImprovement(final TileInfo tile){

View File

@ -133,8 +133,9 @@ public class TileInfo
public void nextTurn() public void nextTurn()
{ {
if(unit !=null) { if(unit !=null) {
unit.doPostTurnAction(this);
unit.currentMovement = unit.maxMovement; unit.currentMovement = unit.maxMovement;
unit.doAction(this); unit.doPreTurnAction(this);
} }
} }

View File

@ -15,7 +15,6 @@ import com.badlogic.gdx.scenes.scene2d.utils.Drawable;
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Align;
import com.badlogic.gdx.utils.Predicate; import com.badlogic.gdx.utils.Predicate;
import com.unciv.logic.civilization.CivilizationInfo;
import com.unciv.logic.civilization.Notification; import com.unciv.logic.civilization.Notification;
import com.unciv.logic.map.TileInfo; import com.unciv.logic.map.TileInfo;
import com.unciv.ui.pickerscreens.PolicyPickerScreen; import com.unciv.ui.pickerscreens.PolicyPickerScreen;
@ -379,7 +378,7 @@ public class WorldScreen extends CameraStageBaseScreen {
unitTile.moveUnitToTile(group.tileInfo, distanceToTiles.get(selectedTile)); unitTile.moveUnitToTile(group.tileInfo, distanceToTiles.get(selectedTile));
} else { } else {
unitTile.unit.action = "moveTo " + ((int) selectedTile.position.x) + "," + ((int) selectedTile.position.y); unitTile.unit.action = "moveTo " + ((int) selectedTile.position.x) + "," + ((int) selectedTile.position.y);
unitTile.unit.doAction(unitTile); unitTile.unit.doPreTurnAction(unitTile);
} }
unitTile = null; unitTile = null;