2018-05-29 22:01:22 +03:00
package com.unciv
2018-07-20 15:58:03 +03:00
import com.badlogic.gdx.math.Vector2
2018-05-29 22:01:22 +03:00
import com.unciv.logic.GameInfo
import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.logic.map.TileMap
import com.unciv.models.gamebasics.GameBasics
import com.unciv.ui.utils.getRandom
class GameStarter ( ) {
2018-07-25 22:56:25 +03:00
fun startNewGame ( mapRadius : Int , numberOfCivs : Int , civilization : String , difficulty : String ) : GameInfo {
2018-05-29 22:01:22 +03:00
val gameInfo = GameInfo ( )
gameInfo . tileMap = TileMap ( mapRadius )
2018-05-31 17:23:46 +03:00
gameInfo . tileMap . gameInfo = gameInfo // need to set this transient before placing units in the map
2018-07-18 18:45:37 +03:00
2018-05-29 22:01:22 +03:00
2018-07-20 15:58:03 +03:00
fun vectorIsWithinNTilesOfEdge ( vector : Vector2 , n : Int ) : Boolean {
return vector . x < mapRadius - n
&& vector . x > n - mapRadius
&& vector . y < mapRadius - n
&& vector . y > n - mapRadius
}
2018-07-26 23:16:56 +03:00
val distanceAroundStartingPointNoOneElseWillStartIn = 5
2018-07-20 15:58:03 +03:00
val freeTiles = gameInfo . tileMap . values . toMutableList ( ) . filter { vectorIsWithinNTilesOfEdge ( it . position , 3 ) } . toMutableList ( )
val playerPosition = freeTiles . getRandom ( ) . position
2018-08-22 13:30:37 +03:00
val playerCiv = CivilizationInfo ( civilization , gameInfo )
2018-07-25 22:56:25 +03:00
playerCiv . difficulty = difficulty
gameInfo . civilizations . add ( playerCiv ) // first one is player civ
2018-07-18 18:45:37 +03:00
2018-07-27 10:03:44 +03:00
freeTiles . removeAll ( gameInfo . tileMap . getTilesInDistance ( playerPosition , distanceAroundStartingPointNoOneElseWillStartIn ) )
2018-05-29 22:01:22 +03:00
val barbarianCivilization = CivilizationInfo ( )
gameInfo . civilizations . add ( barbarianCivilization ) // second is barbarian civ
2018-08-09 18:44:43 +03:00
for ( civname in GameBasics . Nations . keys . filterNot { it == " Barbarians " || it == civilization } . take ( numberOfCivs ) ) {
2018-08-22 13:30:37 +03:00
val civ = CivilizationInfo ( civname , gameInfo )
2018-07-25 22:56:25 +03:00
civ . tech . techsResearched . addAll ( playerCiv . getDifficulty ( ) . aiFreeTechs )
gameInfo . civilizations . add ( civ )
2018-05-29 22:01:22 +03:00
}
2018-08-22 13:30:37 +03:00
2018-05-29 22:01:22 +03:00
barbarianCivilization . civName = " Barbarians "
gameInfo . setTransients ( ) // needs to be before placeBarbarianUnit because it depends on the tilemap having its gameinfo set
2018-08-22 13:30:37 +03:00
// and only now do we add units for everyone, because otherwise both the gameIngo.setTransients() and the placeUnit will both add the unit to the civ's unit list!
for ( civ in gameInfo . civilizations . toList ( ) . filter { ! it . isBarbarianCivilization ( ) } ) {
if ( freeTiles . isEmpty ( ) ) gameInfo . civilizations . remove ( civ ) // we can't add any more civs.
val startingLocation = freeTiles . toList ( ) . getRandom ( ) . position
civ . placeUnitNearTile ( startingLocation , " Settler " )
civ . placeUnitNearTile ( startingLocation , " Scout " )
freeTiles . removeAll ( gameInfo . tileMap . getTilesInDistance ( startingLocation , distanceAroundStartingPointNoOneElseWillStartIn ) )
}
2018-06-10 17:30:49 +03:00
( 1. . 5 ) . forEach {
val freeTilesList = freeTiles . toList ( )
if ( freeTilesList . isNotEmpty ( ) ) {
val placedTile = freeTilesList . getRandom ( )
gameInfo . placeBarbarianUnit ( placedTile )
freeTiles . remove ( placedTile )
}
}
2018-05-29 22:01:22 +03:00
return gameInfo
}
}