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
import Data.ByteString.Char8 as B
import FactionData
import BuildingData
makePlanet :: (PlaneLocation l) => l -> PlanetInfo -> DB PlaneRef
makePlanet plane_location planet_info =
do seed <- getRandom
seed_down <- getRandom
planet_name <- liftM (`fromMaybe` planet_info_name planet_info) $
randomPlanetName PanGalacticTreatyOrganization
plane_ref <- dbNewPlane
planet_name
(TerrainGenerationData {
tg_smootheness = 3,
tg_biome = planet_info_biome planet_info,
tg_placements = [recreantFactories seed,
stairsDown seed_down 0] })
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
_ <- makeDungeons planet_name (Beneath plane_ref) 1 planet_info
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
makeDungeons :: (PlaneLocation l) =>
B.ByteString ->
l ->
Integer ->
PlanetInfo ->
DB PlaneRef
makeDungeons planet_name plane_location i planet_info =
do let n = planet_info_depth planet_info
seed_up <- getRandom
seed_down <- getRandom
plane_ref <- dbNewPlane
planet_name
(TerrainGenerationData {
tg_smootheness = 2,
tg_biome = planet_info_dungeon planet_info,
tg_placements =
[stairsUp seed_up i] ++
if i < n then [stairsDown seed_down i] else [] })
plane_location
when (i == n) $
do _ <- createTown plane_ref [Node $ planet_info_node_type planet_info]
return ()
when (i < n) $
do _ <- makeDungeons planet_name (Beneath plane_ref) (succ i) planet_info
return ()
return plane_ref
generatePlanetInfo :: (DBReadable db) => [PlanetInfo] -> db [PlanetInfo]
generatePlanetInfo planet_infos = liftM (sortBy (comparing planet_info_priority)) $ forM planet_infos $ \planet_info ->
do -- see documentation for 'PlanetData.PlanetInfo'
prio_bonus <- getRandomR (0.0,1.0)
return $ planet_info { planet_info_priority =
planet_info_priority planet_info + prio_bonus }