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