107 lines
3.2 KiB
Haskell
107 lines
3.2 KiB
Haskell
{-# 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] )
|
|
,(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, return FLATSHIELD)
|
|
,(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]
|
|
]
|
|
)
|
|
, (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)
|
|
|