35 lines
1.0 KiB
Haskell
35 lines
1.0 KiB
Haskell
module Dodge.Room.Ngon where
|
|
|
|
import Data.List
|
|
import Data.Maybe
|
|
import Data.Tile
|
|
import Dodge.Data.GenWorld
|
|
import Dodge.Default.Room
|
|
import Dodge.Placement.Instance
|
|
import Dodge.PlacementSpot
|
|
import Dodge.RoomLink
|
|
import Geometry
|
|
import Tile
|
|
|
|
roomNgon :: Int -> Float -> Room
|
|
roomNgon n x =
|
|
defaultRoom
|
|
{ _rmPolys = [poly]
|
|
, _rmLinks = map toBothLnk lnks -- muout (init lnks) ++ muin[last lnks]
|
|
, _rmPath = mempty -- TODO
|
|
, _rmPmnts = [mntLightLnkCond $ resetPLUse $ rprBool $ const . isInLnk]
|
|
, _rmBound = [poly]
|
|
, _rmFloor = Tiled [makeTileFromPoly poly 2]
|
|
, _rmName = show n ++ "gon"
|
|
}
|
|
where
|
|
rot = 2 * pi / fromIntegral n
|
|
rots = map ((rot *) . fromIntegral) [0 .. n -1]
|
|
poly =
|
|
mapMaybe
|
|
(\(ra, rb) -> intersectLineLine' (rotateV ra bl) (rotateV ra br) (rotateV rb bl) (rotateV rb br))
|
|
$ loopPairs rots
|
|
bl = V2 x x
|
|
br = V2 (- x) x
|
|
lnks = sortOn ((\(V2 a b) -> (negate b, a)) . fst) $ map (\r -> (rotateV r (V2 0 x), r)) rots
|