mirror of
https://github.com/yairm210/Unciv.git
synced 2025-09-24 03:53:12 -04:00
Automated actions should now choose best and closest tile to work on, differentiated pre- and post- turn actions
This commit is contained in:
parent
dd6805d179
commit
b6d235a4d0
@ -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 {
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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){
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user