mirror of
https://github.com/yairm210/Unciv.git
synced 2025-09-23 03:23:17 -04:00
Split generating the map to a separate class
Fixed bug loading game when multiple cities
This commit is contained in:
parent
1c1756721a
commit
4d6b5c997d
@ -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 {
|
||||
|
85
core/src/com/unciv/logic/map/RandomMapGenerator.java
Normal file
85
core/src/com/unciv/logic/map/RandomMapGenerator.java
Normal 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;
|
||||
}
|
||||
}
|
@ -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
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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++;
|
||||
|
Loading…
x
Reference in New Issue
Block a user