59 lines
2.0 KiB
Haskell
59 lines
2.0 KiB
Haskell
module Dodge.Room.RunPast (
|
|
lockedStart,
|
|
) where
|
|
|
|
import Color
|
|
import qualified Data.Set as S
|
|
import Dodge.Cleat
|
|
import Dodge.Data.GenWorld
|
|
import Dodge.Item.Random
|
|
import Dodge.LevelGen.PlacementHelper
|
|
import Dodge.LightSource
|
|
import Dodge.Placement.Instance
|
|
import Dodge.PlacementSpot
|
|
import Dodge.Room.Corridor
|
|
import Dodge.Room.Door
|
|
import Dodge.Room.Link
|
|
import Dodge.Room.Procedural
|
|
import Dodge.Tree
|
|
import Geometry.Data
|
|
import Geometry.Polygon
|
|
import LensHelp
|
|
import RandomHelp
|
|
|
|
roomCritLS :: RandomGen g => State g LightSource
|
|
roomCritLS = do
|
|
col <- takeOne [0.5, 0.6]
|
|
h <- takeOne [30, 35]
|
|
rad <- takeOne [300]
|
|
return $ lsColPosRad col (V3 0 0 h) rad
|
|
|
|
smallRoom :: Room
|
|
smallRoom = corridorWallN & rmRandPSs .~ [psRandRanges (15, 25) (30, 45) (pi, 2 * pi)]
|
|
|
|
lockedStart :: RandomGen g => Int -> State g (Tree Room)
|
|
lockedStart i = do
|
|
h <- state $ randomR (200, 400 :: Float)
|
|
thels <- roomCritLS
|
|
theweapon <- randBlockBreakWeapon
|
|
cenroom <- shuffleLinks =<< (roomRectAutoLinks 40 h <&> rmPmnts .~ [])
|
|
theedge <- takeOne $ map OnEdge [West, East]
|
|
let linkcor = smallRoom & rmPmnts .~ [spanLS thels (V2 0 65) (V2 40 65)]
|
|
n = length $ filter (elem theedge . _rlType) (_rmLinks cenroom)
|
|
doorrooms =
|
|
map (treePost . (triggerDoorRoom i :)) $
|
|
[linkcor & rmPmnts .:~ plRRpt 0 randC1] :
|
|
[linkcor, corridor, corridor, cleatOnward door] :
|
|
replicate (n -2) [linkcor]
|
|
return $
|
|
Node cenroom $
|
|
map (over root $ rmConnectsTo .~ S.member theedge) doorrooms
|
|
++ [ return
|
|
smallRoom
|
|
{ --_rmOutPmnt = IM.singleton i (putLitButOnPosExtTrig red useUnusedLnk)
|
|
_rmPmnts = [plRRpt 0 (PutFlIt theweapon)
|
|
,putLitButOnPosExtTrig red useUnusedLnk & plExternalID ?~ i]
|
|
, _rmBound = [rectNSWE 70 30 0 40]
|
|
}
|
|
]
|