Files
loop/src/Dodge/LockAndKey.hs
T

139 lines
3.9 KiB
Haskell

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