module Planet
(makePlanets,
generatePlanetInfo)
where
import PlanetData
import DB
import Plane
import TerrainData
import Control.Monad
import Data.Maybe
import Data.Ord
import Town
import Data.List
makePlanet :: (PlaneLocation l) => l -> PlanetInfo -> DB PlaneRef
makePlanet plane_location planet_info =
do seed <- getRandom
plane_ref <- dbNewPlane
(planet_info_name planet_info)
(TerrainGenerationData {
tg_smootheness = 3,
tg_biome = planet_info_biome planet_info,
tg_placements = [recreantFactories seed] })
plane_location
town <- liftM catMaybes $ forM (planet_info_town planet_info) $ \(r,b) ->
do p <- rationalRoll r
return $ if p then Just b else Nothing
_ <- createTown plane_ref town
return plane_ref
makePlanets :: (PlaneLocation l) => l -> [PlanetInfo] -> DB PlaneRef
makePlanets _ [] = return $ error "makePlanetarySystem: empty list"
makePlanets l (planet_info:rest) =
do plane_ref <- makePlanet l planet_info
_ <- makePlanets (Subsequent plane_ref) rest
return plane_ref
generatePlanetInfo :: (DBReadable db) => [PlanetInfo] -> db [PlanetInfo]
generatePlanetInfo planet_infos = liftM (sortBy (comparing planet_info_priority)) $ forM planet_infos $ \planet_info ->
do prio_bonus <- getRandomR (0.0,1.0) -- see documentation for 'PlanetData.PlanetInfo'
return $ planet_info `addPriority` prio_bonus