--{-# LANGUAGE TupleSections #-} module Dodge.LockAndKey where import Dodge.Cleat import Dodge.Data import Dodge.Tree --import Dodge.LevelGen.Data import Dodge.Room import RandomHelp import Dodge.Creature import Dodge.Item.Craftable import Dodge.Item.Weapon.BulletGun.Rod import Dodge.Item --import LensHelp --import Dodge.Item.Equipment bossKeyItems :: RandomGen g => [ (State g (Tree Room), State g ItemBaseType) ] bossKeyItems = [(return . cleatOnward <$> bossRoom autoCrit, takeOne [HELD PISTOL]) ] lockRoomMultiItems :: RandomGen g => [ ( State g (MetaTree Room String) , State g [ItemBaseType] ) ] lockRoomMultiItems = [ (blinkAcrossChallenge, takeOne [[LEFT BLINKERUNSAFE,EQUIP $ AUTODETECTOR WALLDETECTOR] ,[LEFT BLINKERUNSAFE,HELD $ HELDDETECTOR WALLDETECTOR] ] ) ] lockRoomKeyItems :: RandomGen g => [ (Int -> State g (MetaTree Room String) , State g ItemBaseType ) ] lockRoomKeyItems = [(lasCenSensEdge, takeOne [HELD LAUNCHER,HELD LASGUN,HELD SPARKGUN,HELD FLATSHIELD,HELD FORCEFIELDGUN] ) ,(sensorRoomRunPast ELECTRICAL, takeOne [CRAFT STATICMODULE,HELD SPARKGUN] ) ,(sensorRoomRunPast FLAMING, takeOne [HELD FLAMESPITTER, CRAFT INCENDIARYMODULE] ) ,(sensorRoomRunPast LASERING, return $ HELD LASGUN ) ,(const slowDoorRoomRunPast, return $ HELD (MINIGUNX 3)) ,(const longRoomRunPast, takeOne [HELD SNIPERRIFLE,HELD FLATSHIELD]) ,(const glassLessonRunPast, takeOne [HELD LASGUN]) ,(const $ lasTunnelRunPast 400, takeOne [HELD FLATSHIELD,HELD FORCEFIELDGUN]) ,(keyCardRoomRunPast 0, return (KEYCARD 0)) ] keyCardRunPastRand :: RandomGen g => [ (Int -> State g (MetaTree Room String) , State g ItemBaseType ) ] keyCardRunPastRand = [(keyCardRoomRunPast 0, return (KEYCARD 0)) ] itemRooms :: RandomGen g => [(ItemBaseType, State g (MetaTree Room String))] itemRooms = [ (HELD LAUNCHER , join $ takeOne [corridorBoss launcherCrit , rc $ map makeTypeCraft [TUBE,TUBE,HARDWARE] ] ) , (HELD (MINIGUNX 3) , join $ takeOne [roomMiniIntro , rc $ map makeTypeCraft ([MOTOR,HARDWARE] ++ replicate 6 PIPE) ] ) , (HELD LASGUN , 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 [DRUM,DRUM,PLATE] ] ) , (HELD SNIPERRIFLE , join $ takeOne [rc [sniperRifle] ] ) , (HELD FORCEFIELDGUN , join $ takeOne [rc [forceFieldGun] ] ) , (KEYCARD 0 , join $ takeOne [rc [keyCard 0] ] ) , (CRAFT INCENDIARYMODULE , join $ takeOne [rc [incendiaryModule] ] ) , (CRAFT STATICMODULE , join $ takeOne [rc [makeTypeCraft STATICMODULE] ] ) ] 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,pistolCrit,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