Split generating the map to a separate class

Fixed bug loading game when multiple cities
This commit is contained in:
Yair Morgenstern 2018-02-05 23:19:58 +02:00
parent 1c1756721a
commit 4d6b5c997d
6 changed files with 97 additions and 63 deletions

View File

@ -21,8 +21,8 @@ android {
applicationId "com.unciv.game"
minSdkVersion 9
targetSdkVersion 25
versionCode 24
versionName "1.2"
versionCode 26
versionName "1.2.2"
}
buildTypes {
release {

View File

@ -0,0 +1,85 @@
package com.unciv.logic.map;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Predicate;
import com.unciv.models.gamebasics.GameBasics;
import com.unciv.models.gamebasics.ResourceType;
import com.unciv.models.gamebasics.Terrain;
import com.unciv.models.gamebasics.TerrainType;
import com.unciv.models.gamebasics.TileResource;
import com.unciv.models.linq.Linq;
import com.unciv.models.linq.LinqHashMap;
import com.unciv.ui.utils.HexMath;
public class RandomMapGenerator{
private TileInfo addRandomTile(Vector2 position) {
final TileInfo tileInfo = new TileInfo();
tileInfo.position = position;
Linq<Terrain> Terrains = GameBasics.Terrains.linqValues();
final Terrain baseTerrain = Terrains.where(new Predicate<Terrain>() {
@Override
public boolean evaluate(Terrain arg0) {
return arg0.type == TerrainType.BaseTerrain && !arg0.name.equals("Lakes");
}
}).getRandom();
tileInfo.baseTerrain = baseTerrain.name;
if (baseTerrain.canHaveOverlay) {
if (Math.random() > 0.7f) {
Terrain SecondaryTerrain = Terrains.where(new Predicate<Terrain>() {
@Override
public boolean evaluate(Terrain arg0) {
return arg0.type == TerrainType.TerrainFeature && arg0.occursOn.contains(baseTerrain.name);
}
}).getRandom();
if (SecondaryTerrain != null) tileInfo.terrainFeature = SecondaryTerrain.name;
}
}
addRandomResourceToTile(tileInfo);
return tileInfo;
}
void addRandomResourceToTile(final TileInfo tileInfo){
Linq<TileResource> TileResources = GameBasics.TileResources.linqValues();
// Resources are placed according to TerrainFeature, if exists, otherwise according to BaseLayer.
TileResources = TileResources.where(new Predicate<TileResource>() {
@Override
public boolean evaluate(TileResource arg0) {
return arg0.terrainsCanBeFoundOn.contains(tileInfo.getLastTerrain().name);
}
});
TileResource resource = null;
if (Math.random() < 1 / 5f) {
resource = GetRandomResource(TileResources, ResourceType.Bonus);
} else if (Math.random() < 1 / 7f) {
resource = GetRandomResource(TileResources, ResourceType.Strategic);
} else if (Math.random() < 1 / 15f) {
resource = GetRandomResource(TileResources, ResourceType.Luxury);
}
if (resource != null) tileInfo.resource = resource.name;
}
TileResource GetRandomResource(Linq<TileResource> resources, final ResourceType resourceType) {
return resources.where(new Predicate<TileResource>() {
@Override
public boolean evaluate(TileResource arg0) {
return arg0.resourceType.equals(resourceType);
}
}).getRandom();
}
public LinqHashMap<String,TileInfo> generateMap(int distance) {
LinqHashMap<String,TileInfo> map = new LinqHashMap<String, TileInfo>();
for(Vector2 vector : HexMath.GetVectorsInDistance(Vector2.Zero,distance))
map.put(vector.toString(),addRandomTile(vector));
return map;
}
}

View File

@ -19,58 +19,10 @@ public class TileMap{
public TileMap(){} // for json parsing, we need to have a default constructor
public TileMap(int distance) {
for(Vector2 vector : HexMath.GetVectorsInDistance(Vector2.Zero,distance)) addRandomTile(vector);
tiles = new RandomMapGenerator().generateMap(distance);
}
private void addRandomTile(Vector2 position) {
final TileInfo tileInfo = new TileInfo();
tileInfo.position = position;
Linq<Terrain> Terrains = GameBasics.Terrains.linqValues();
final Terrain baseTerrain = Terrains.where(new Predicate<Terrain>() {
@Override
public boolean evaluate(Terrain arg0) {
return arg0.type == TerrainType.BaseTerrain && !arg0.name.equals("Lakes");
}
}).getRandom();
tileInfo.baseTerrain = baseTerrain.name;
if (baseTerrain.canHaveOverlay) {
if (Math.random() > 0.7f) {
Terrain SecondaryTerrain = Terrains.where(new Predicate<Terrain>() {
@Override
public boolean evaluate(Terrain arg0) {
return arg0.type == TerrainType.TerrainFeature && arg0.occursOn.contains(baseTerrain.name);
}
}).getRandom();
if (SecondaryTerrain != null) tileInfo.terrainFeature = SecondaryTerrain.name;
}
}
Linq<TileResource> TileResources = GameBasics.TileResources.linqValues();
// Resources are placed according to TerrainFeature, if exists, otherwise according to BaseLayer.
TileResources = TileResources.where(new Predicate<TileResource>() {
@Override
public boolean evaluate(TileResource arg0) {
return arg0.terrainsCanBeFoundOn.contains(tileInfo.getLastTerrain().name);
}
});
TileResource resource = null;
if (Math.random() < 1 / 5f) {
resource = GetRandomResource(TileResources, ResourceType.Bonus);
} else if (Math.random() < 1 / 7f) {
resource = GetRandomResource(TileResources, ResourceType.Strategic);
} else if (Math.random() < 1 / 15f) {
resource = GetRandomResource(TileResources, ResourceType.Luxury);
}
if (resource != null) tileInfo.resource = resource.name;
tiles.put(position.toString(),tileInfo);
}
public boolean contains(Vector2 vector){ return tiles.containsKey(vector.toString());}
public TileInfo get(Vector2 vector){return tiles.get(vector.toString());}
@ -155,15 +107,6 @@ public class TileMap{
public Linq<TileInfo> values(){return tiles.linqValues();}
TileResource GetRandomResource(Linq<TileResource> resources, final ResourceType resourceType) {
return resources.where(new Predicate<TileResource>() {
@Override
public boolean evaluate(TileResource arg0) {
return arg0.resourceType.equals(resourceType);
}
}).getRandom();
}
public void placeUnitNearTile(Vector2 position, final String unit){
getTilesInDistance(position,2).first(new Predicate<TileInfo>() {
@Override

View File

@ -20,6 +20,7 @@ import com.unciv.models.gamebasics.TileImprovement;
import com.unciv.models.gamebasics.TileResource;
import com.unciv.models.stats.INamed;
import com.unciv.ui.utils.GameSaver;
import com.unciv.ui.worldscreen.WorldScreen;
public class UnCivGame extends Game {
@ -27,7 +28,7 @@ public class UnCivGame extends Game {
public CivilizationInfo civInfo;
public GameSettings settings = new GameSettings();
public com.unciv.ui.worldscreen.WorldScreen worldScreen;
public WorldScreen worldScreen;
public void create() {
SetupGameBasics();
Current = this;
@ -40,7 +41,7 @@ public class UnCivGame extends Game {
}
else startNewGame();
worldScreen = new com.unciv.ui.worldscreen.WorldScreen();
worldScreen = new WorldScreen();
setWorldScreen();
}
@ -49,7 +50,7 @@ public class UnCivGame extends Game {
civInfo.tileMap.placeUnitNearTile(Vector2.Zero,"Settler");
civInfo.tileMap.placeUnitNearTile(Vector2.Zero,"Scout");
worldScreen = new com.unciv.ui.worldscreen.WorldScreen();
worldScreen = new WorldScreen();
setWorldScreen();
}

View File

@ -24,6 +24,8 @@ public class GameSaver {
cityInfo.population.cityInfo = cityInfo;
cityInfo.expansion.cityInfo = cityInfo;
cityInfo.cityStats.cityInfo = cityInfo;
}
for (CityInfo cityInfo : game.civInfo.cities){
cityInfo.cityStats.update();
}
}

View File

@ -76,7 +76,10 @@ public class HexMath
}
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.
int distance = 0;
while(true){
if(GetVectorsAtDistance(origin,distance).contains(destination)) return distance;
distance++;