module Dodge.LockAndKey where import Dodge.Cleat import Dodge.Creature import Dodge.Data.GenWorld import Dodge.Item import Dodge.Room import Dodge.Tree import RandomHelp import Control.Monad bossKeyItems :: RandomGen g => [(State g (Tree Room), State g ItemType)] bossKeyItems = [(return . cleatOnward <$> bossRoom autoCrit, takeOne [HELD PISTOL])] lockRoomMultiItems :: RandomGen g => [(State g (MetaTree Room String), State g [ItemType])] lockRoomMultiItems = [ ( blinkAcrossChallenge , takeOne [ [HELD BLINKERUNSAFE, DETECTOR WALLDETECTOR] ] ) ] lockRoomKeyItems :: [(Int -> State LayoutVars (MetaTree Room String), State LayoutVars ItemType)] lockRoomKeyItems = [ (lasCenSensEdge, takeOne [ HELD FLATSHIELD]) -- [ (lasCenSensEdge, takeOne [HELD RLAUNCHER, LASER, HELD SPARKGUN, HELD FLATSHIELD]) -- , (sensorRoomRunPast LaserSensor, return LASER) -- , (const slowDoorRoomRunPast, return $ HELD (MINIGUNX 3)) -- , (const longRoomRunPast, takeOne [HELD SNIPERRIFLE, HELD FLATSHIELD]) -- , (const glassLessonRunPast, takeOne [LASER]) -- , (const $ lasTunnelRunPast 400, takeOne [HELD FLATSHIELD]) -- , (keyCardRoomRunPast 0, return (HELD $ KEYCARD 0)) ] keyCardRunPastRand :: RandomGen g => [(Int -> State g (MetaTree Room String), State g ItemType)] keyCardRunPastRand = [(keyCardRoomRunPast 0, return (HELD $ KEYCARD 0))] itemRooms :: RandomGen g => [(ItemType, State g (MetaTree Room String))] itemRooms = [ ( HELD RLAUNCHER , join $ takeOne [ corridorBoss launcherCrit , rc $ map makeTypeCraft [TUBE, TUBE, HARDWARE] ] ) , ( HELD (MINIGUNX 3) , join $ takeOne [ roomMiniIntro , rc $ map makeTypeCraft ([MOTOR, HARDWARE] ++ replicate 6 PIPE) ] ) , ( LASER , join $ takeOne [ rc $ map makeTypeCraft [PRISM, TRANSFORMER, PIPE] ] ) , ( HELD SPARKGUN , join $ takeOne [ rc $ map makeTypeCraft [TRANSFORMER, CAN, CAN] ] ) , ( HELD FLAMESPITTER , join $ takeOne [ rc $ map makeTypeCraft [LIGHTER, PUMP, CAN] ] ) , ( HELD FLATSHIELD , join $ takeOne [ rc $ map makeTypeCraft [PLATE, PLATE] , rc $ map makeTypeCraft [STEELDRUM, STEELDRUM, PLATE] ] ) , ( HELD SNIPERRIFLE , join $ takeOne [ rc [sniperRifle] ] ) , ( HELD $ KEYCARD 0 , join $ takeOne [ rc [keyCard 0] ] ) -- , -- ( CRAFT (ENERGYBALLCRAFT IncBall) -- , join $ -- takeOne -- [ rc [incendiaryModule] -- ] -- ) -- , -- ( CRAFT (ENERGYBALLCRAFT TeslaBall) -- , join $ -- takeOne -- [ rc [makeTypeCraft (ENERGYBALLCRAFT TeslaBall)] -- ] -- ) ] where rc its = do sc <- someCrits roomsContaining sc its someCrits :: RandomGen g => State g [Creature] someCrits = do nCrits <- state $ randomR (1, 3) fmap (take nCrits) . shuffle $ [spreadGunCrit, autoCrit, armourChaseCrit] ++ replicate 20 chaseCrit --addcrits :: RandomGen g => [Item] -> State g (Tree Room) --addcrits its = do -- nCrits <- state $ randomR (1,3) -- crits <- takeN nCrits <=< shuffle $ fmap PutCrit $ [spreadGunCrit,pistolCrit,autoCrit,armourChaseCrit] -- return $ roomsContaining crits its corridorBoss :: RandomGen g => Creature -> State g (MetaTree Room String) corridorBoss cr = do endroom <- bossRoom cr rToOnward ("corridorBoss-" ++ _crName cr) $ treeFromPost (replicate 5 corridor) endroom