145 lines
4.1 KiB
Haskell
145 lines
4.1 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
|
|
|
|
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
|
|
[ [LEFT BLINKERUNSAFE, EQUIP $ AUTODETECTOR WALLDETECTOR]
|
|
, [LEFT BLINKERUNSAFE, HELD $ HELDDETECTOR WALLDETECTOR]
|
|
]
|
|
)
|
|
]
|
|
|
|
lockRoomKeyItems :: RandomGen g => [(Int -> State g (MetaTree Room String), State g ItemType)]
|
|
lockRoomKeyItems =
|
|
[ (lasCenSensEdge, takeOne [HELD LAUNCHER, HELD LASGUN, HELD SPARKGUN, HELD FLATSHIELD, HELD FORCEFIELDGUN])
|
|
, (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 (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 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 [STEELDRUM, STEELDRUM, PLATE]
|
|
]
|
|
)
|
|
,
|
|
( HELD SNIPERRIFLE
|
|
, join $
|
|
takeOne
|
|
[ rc [sniperRifle]
|
|
]
|
|
)
|
|
,
|
|
( HELD FORCEFIELDGUN
|
|
, join $
|
|
takeOne
|
|
[ rc [forceFieldGun]
|
|
]
|
|
)
|
|
,
|
|
( 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, 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
|