Cleanup. Add room-wise random placement spots
This commit is contained in:
+18
-4
@@ -62,23 +62,37 @@ generateLevelFromRoomList gr w
|
||||
-- this should PutNothing if there are no links available
|
||||
-- first it takes the random placements and derandomises them
|
||||
-- then it deals with link placement spots
|
||||
-- TODO use state monad here
|
||||
assignPlacementSpots :: StdGen -> Room -> (StdGen, [((Point2,Float),Placement)])
|
||||
assignPlacementSpots g rm = (g', map (_rmShift rm,) $ plmnts ++ plmnts')
|
||||
assignPlacementSpots g rm = (g'
|
||||
, map (_rmShift rm,)
|
||||
$ plmnts ++ updatedLnkPlmnts
|
||||
)
|
||||
where
|
||||
(randPlmnts, detPlmnts) = partition isRand (_rmPS rm)
|
||||
isRand RandomPlacement{} = True
|
||||
isRand _ = False
|
||||
(unrandPlmnts, g'') = runState (mapM _unRandomPlacement randPlmnts) g
|
||||
(lnkplmnts, plmnts) = partition islnk (unrandPlmnts ++ detPlmnts)
|
||||
(unrandPlmnts, g'') = runState (mapM (derandPlacement rm) (_rmPS rm)) g
|
||||
(lnkplmnts, plmnts) = partition islnk unrandPlmnts
|
||||
--(lnkplmnts, plmnts) = partition islnk (unrandPlmnts ++ detPlmnts)
|
||||
islnk Placement{_placementSpot=PSLnk{}} = True
|
||||
islnk _ = False
|
||||
(shuffledLnks,g') = runState (shuffle $ _rmLinks rm) g''
|
||||
(_,plmnts') = mapAccumR f (map (invShiftLinkBy $ _rmShift rm) shuffledLnks) lnkplmnts
|
||||
(_,updatedLnkPlmnts) = mapAccumR f (map (invShiftLinkBy $ _rmShift rm) shuffledLnks) lnkplmnts
|
||||
f lnks plmnt =
|
||||
let (x:xs,ys) = partition (_psLinkTest $ _placementSpot plmnt) lnks
|
||||
thepair = _psLinkShift (_placementSpot plmnt) x
|
||||
in (xs++ys, updatePS (updatePSLnkUsing thepair) plmnt)
|
||||
|
||||
-- I do not see an obvious way to push randomn placement spots down into recursive placements
|
||||
-- So these currently only work for the "top" level
|
||||
derandPlacement :: Room -> Placement -> State StdGen Placement
|
||||
derandPlacement rm (RandomPlacement x) = derandPlacement rm =<< x
|
||||
derandPlacement rm (Placement (PSRoomRand i) pstype cont) = do
|
||||
ps <- _rmRandPSs rm !! i
|
||||
return (Placement (uncurry PS ps) pstype cont)
|
||||
derandPlacement _ x = return x
|
||||
|
||||
updatePSLnkUsing :: (Point2,Float) -> PlacementSpot -> PlacementSpot
|
||||
updatePSLnkUsing pf PSLnk{_psLinkShift=f} = uncurry PS $ f pf
|
||||
updatePSLnkUsing _ ps = ps
|
||||
|
||||
Reference in New Issue
Block a user