Files
loop/src/Dodge/Room/Start.hs
T

104 lines
3.0 KiB
Haskell

{-# LANGUAGE TupleSections #-}
module Dodge.Room.Start (
startRoom,
randomChallenges,
) where
import Dodge.Room.RezBox
import Dodge.Item.Held.Cane
import Dodge.Item.Held.Launcher
import Dodge.Cleat
import Dodge.Data.GenWorld
import Dodge.Item.Craftable
import Dodge.Room.Containing
import Dodge.Room.Corridor
import Dodge.Room.Door
import Dodge.Room.Link
--import Dodge.Room.RezBox
import Dodge.Room.Room
import Dodge.Room.RunPast
import Dodge.Tree
import RandomHelp
import Control.Monad
powerFakeout' :: RandomGen g => State g (MetaTree Room String)
powerFakeout' = tToBTree "powerFakeout'" <$> powerFakeout
powerFakeout :: RandomGen g => State g (Tree Room)
powerFakeout = do
ncor <- state $ randomR (0, 2)
it <-
takeOne
[ miniGunX 6
, rLauncherX 7
]
roomwithmini <- pedestalRoom it
randcors <- replicateM ncor $ shuffleLinks corridor
return $
treePost $
[ corridor
, door
, roomwithmini
, door
]
++ randcors
++ [ corridor
, keyholeCorridor
, corridor
, cleatOnward door
]
-- the i is used either for a PickOnePlacement or a room id, this is not great
startRoom :: Int -> State StdGen (MetaTree Room String)
startRoom i =
join $
takeOne
[ attachOnward "startThenWeaponRoom" <$> preCritStart <*> weaponRoom i
, rezBoxesWpCrit >>= rToOnward "rezBoxesWpCrit"
, runPastStart i >>= rToOnward ("runPastStart " ++ show i)
, attachOnward "startThenCraft" <$> preCritStart <*> (startCrafts >>= roomsContaining [])
]
randomChallenges :: RandomGen g => State g (MetaTree Room String)
randomChallenges = shootingRange
-- join (takeOne
-- [fmap (return . useAll) doubleCorridorBarrels <&> (,TreeSubLabelling "doubleCorridorBarrels" Nothing)
-- ,shootingRange
-- ,fmap (return . useAll) twinSlowDoorChasers <&> (,TreeSubLabelling "twinSlowDoorChasers" Nothing)
-- ]) -- <&> over (_2 . topLabel) ("randomChallenges:"++)
runPastStart :: RandomGen g => Int -> State g (Tree Room)
runPastStart i = do
s <- rezBoxStart
rp <- lockedStart i
return . shiftChildren $ attachTree toOnward rp $ fmap ([],) s
rezBoxStart :: RandomGen g => State g (Tree Room)
rezBoxStart = do
ls <- rezColor
return $ treePost [rezBox ls, cleatOnward door]
preCritStart :: RandomGen g => State g (MetaTree Room String)
preCritStart =
join $
takeOneWeighted
[100, 100, 1 :: Float]
[ rezBoxes
, rezBox'
, attachOnward "rezBoxPowerFakeout" <$> rezBox' <*> powerFakeout'
]
startCrafts :: RandomGen g => State g [Item]
startCrafts =
takeOne $
map
(map makeTypeCraft)
[ [PIPE, PIPE, HARDWARE]
, [TUBE, PIPE, HARDWARE]
, [PIPE, HARDWARE, HARDWARE]
, [TUBE, TUBE, HARDWARE]
, [TUBE, HARDWARE, HARDWARE]
]