--{-# LANGUAGE TupleSections #-} module Dodge.LockAndKey where import Dodge.Data import Dodge.Tree import Dodge.LevelGen.Data import Dodge.Room import Dodge.RandomHelp import Dodge.Creature import Dodge.Item.Craftable import Dodge.Item.Weapon.BulletGun.Rod import Dodge.Item --import LensHelp --import Dodge.Item.Equipment import System.Random import Control.Monad.State bossKeyItems :: RandomGen g => [ (State g (SubCompTree Room), State g CombineType) ] bossKeyItems = [(return . UseAll <$> bossRoom autoCrit, takeOne [PISTOL]) ] lockRoomKeyItems :: RandomGen g => [ (Int -> State g (LabSubCompTree Room) , State g CombineType ) ] lockRoomKeyItems = [(lasCenSensEdge, takeOne [LAUNCHER,LASGUN,SPARKGUN,FLATSHIELD,FORCEFIELDGUN] ) ,(sensorRoomRunPast Electrical, takeOne [STATICMODULE,SPARKGUN] ) ,(sensorRoomRunPast Flaming, takeOne [FLAMESPITTER, INCENDIARYMODULE] ) ,(sensorRoomRunPast Lasering, return LASGUN ) ,(const slowDoorRoomRunPast, return MINIGUN) ,(const longRoomRunPast, takeOne [SNIPERRIFLE,FLATSHIELD]) ,(const glassLessonRunPast, takeOne [LASGUN]) ,(const $ lasTunnelRunPast 400, takeOne [FLATSHIELD,FORCEFIELDGUN]) ,(keyCardRoomRunPast 0, return (KEYCARD 0)) ] itemRooms :: RandomGen g => [(CombineType, State g (LabSubCompTree Room))] itemRooms = [ (LAUNCHER , join $ takeOne [corridorBoss launcherCrit , rc $ map makeTypeCraft [TUBE,TUBE,HARDWARE] ] ) , (MINIGUN , join $ takeOne [roomMiniIntro , rc $ map makeTypeCraft ([MOTOR,HARDWARE] ++ replicate 6 PIPE) ] ) , (LASGUN , join $ takeOne [rc $ map makeTypeCraft [PRISM,TRANSFORMER,PIPE] ] ) , (SPARKGUN , join $ takeOne [rc $ map makeTypeCraft [TRANSFORMER,CAN,CAN] ] ) , (FLAMESPITTER , join $ takeOne [rc $ map makeTypeCraft [LIGHTER,PUMP,CAN] ] ) , (FLATSHIELD , join $ takeOne [rc $ map makeTypeCraft [PLATE,PLATE] ,rc $ map makeTypeCraft [DRUM,DRUM,PLATE] ] ) , (SNIPERRIFLE , join $ takeOne [rc [sniperRifle] ] ) , (FORCEFIELDGUN , join $ takeOne [rc [forceFieldGun] ] ) , (KEYCARD 0 , join $ takeOne [rc [keyCard 0] ] ) , (INCENDIARYMODULE , join $ takeOne [rc [incendiaryModule] ] ) , (STATICMODULE , join $ takeOne [rc [makeModule 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 (SubCompTree 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 (LabSubCompTree Room) corridorBoss cr = do endroom <- bossRoom cr return (treeFromPost (replicate 5 $ PassDown corridor) (PassDown endroom) ,TreeSubLabelling ("corridorBoss-"++_crName cr) Nothing)