{-# LANGUAGE TupleSections #-} module Dodge.Room.Start ( startRoom, randomChallenges, ) where import Dodge.Room.RezBox import Dodge.Item.Held.Cane import Dodge.Item.Held.Launcher import Dodge.Cleat import Dodge.Data.GenWorld import Dodge.Item.Craftable import Dodge.Room.Containing import Dodge.Room.Corridor import Dodge.Room.Door import Dodge.Room.Link --import Dodge.Room.RezBox import Dodge.Room.Room import Dodge.Room.RunPast import Dodge.Tree import RandomHelp import Control.Monad powerFakeout' :: RandomGen g => State g (MetaTree Room String) powerFakeout' = tToBTree "powerFakeout'" <$> powerFakeout powerFakeout :: RandomGen g => State g (Tree Room) powerFakeout = do ncor <- state $ randomR (0, 2) it <- takeOne [ miniGunX 6 , rLauncherX 7 ] roomwithmini <- pedestalRoom it randcors <- replicateM ncor $ shuffleLinks corridor return $ treePost $ [ corridor , door , roomwithmini , door ] ++ randcors ++ [ corridor , keyholeCorridor , corridor , cleatOnward door ] -- the i is used either for a PickOnePlacement or a room id, this is not great startRoom :: Int -> State StdGen (MetaTree Room String) startRoom i = join $ takeOne [ attachOnward "startThenWeaponRoom" <$> preCritStart <*> weaponRoom , rezBoxesWpCrit >>= rToOnward "rezBoxesWpCrit" , runPastStart i >>= rToOnward ("runPastStart " ++ show i) , attachOnward "startThenCraft" <$> preCritStart <*> (startCrafts >>= roomsContaining []) ] randomChallenges :: RandomGen g => State g (MetaTree Room String) randomChallenges = shootingRange -- join (takeOne -- [fmap (return . useAll) doubleCorridorBarrels <&> (,TreeSubLabelling "doubleCorridorBarrels" Nothing) -- ,shootingRange -- ,fmap (return . useAll) twinSlowDoorChasers <&> (,TreeSubLabelling "twinSlowDoorChasers" Nothing) -- ]) -- <&> over (_2 . topLabel) ("randomChallenges:"++) runPastStart :: RandomGen g => Int -> State g (Tree Room) runPastStart i = do s <- rezBoxStart rp <- lockedStart i return . shiftChildren $ attachTree toOnward rp $ fmap ([],) s rezBoxStart :: RandomGen g => State g (Tree Room) rezBoxStart = do ls <- rezColor return $ treePost [rezBox ls, cleatOnward door] preCritStart :: RandomGen g => State g (MetaTree Room String) preCritStart = join $ takeOneWeighted [100, 100, 1 :: Float] [ rezBoxes , rezBox' , attachOnward "rezBoxPowerFakeout" <$> rezBox' <*> powerFakeout' ] startCrafts :: RandomGen g => State g [Item] startCrafts = takeOne $ map (map makeTypeCraft) [ [PIPE, PIPE, HARDWARE] , [TUBE, PIPE, HARDWARE] , [PIPE, HARDWARE, HARDWARE] , [TUBE, TUBE, HARDWARE] , [TUBE, HARDWARE, HARDWARE] ]