38 lines
1.0 KiB
Haskell
38 lines
1.0 KiB
Haskell
module Dodge.StartNewGame (
|
|
startNewGameInSlot,
|
|
startSeedGame,
|
|
) where
|
|
|
|
import Dodge.Concurrent
|
|
import Dodge.Data.Universe
|
|
import Dodge.LevelGen
|
|
import Dodge.Save
|
|
import Dodge.WorldLoad
|
|
import LensHelp
|
|
import System.Random
|
|
import System.Directory
|
|
|
|
startNewGameInSlot :: Int -> Universe -> Universe
|
|
startNewGameInSlot slot u = startSeedGame slot i u
|
|
where
|
|
i = fst $ randomR (0, maxBound) (_randGen (_uvWorld u))
|
|
|
|
startSeedGame :: Int -> Int -> Universe -> Universe
|
|
startSeedGame _ i u =
|
|
blockingLoad
|
|
("GENERATING FROM SEED " ++ show i)
|
|
(startSeedGameConc i $ u ^. preloadData)
|
|
u
|
|
|
|
startSeedGameConc :: Int -> PreloadData -> IO (Universe -> Maybe Universe)
|
|
startSeedGameConc seed pdata = do
|
|
w <- generateWorldFromSeed (pdata ^?! renderData) seed
|
|
createDirectoryIfMissing True "saveSlot"
|
|
writeFile "saveSlot/seed" $ show seed
|
|
return $
|
|
Just
|
|
. saveWorldInSlot (LevelStartSlot 0)
|
|
. (uvScreenLayers .~ [])
|
|
. (uvWorld .~ w)
|
|
. postUniverseLoadSideEffect
|