104 lines
3.0 KiB
Haskell
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
|
|
, 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]
|
|
]
|