Work on chasm rooms

This commit is contained in:
2025-10-02 16:58:38 +01:00
parent 013f50f0bc
commit 7e3614c9c8
15 changed files with 301 additions and 152 deletions
+19
View File
@@ -21,8 +21,11 @@ module Dodge.RoomLink (
setLinkType,
getLinksOfType,
swapInOutLinks,
isCornerLink,
isMidEdgeLink,
) where
import Dodge.Base.CardinalPoint
import Control.Lens
import Data.List (partition)
import qualified Data.Set as S
@@ -51,6 +54,22 @@ setOutLinks = setLinkType OutLink
setInLinks :: (RoomLink -> Bool) -> [RoomLink] -> [RoomLink]
setInLinks = setLinkType InLink
isMidEdgeLink :: Room -> CardinalPoint -> RoomLink -> Bool
isMidEdgeLink r x rl
| x == North || x == South = g West (f $ r ^?! rmType . numLinkEW)
| otherwise = g South (f $ r ^?! rmType . numLinkNS)
where
f y | even y = [y `div` 2]
| otherwise = [y `div` 2, 1 + (y `div` 2)]
g a = any (\y -> FromEdge a y `S.member` (rl ^. rlType))
isCornerLink :: CardinalPointBetween -> RoomLink -> Bool
isCornerLink x rl = (OnEdge a `S.member` xs && FromEdge b 0 `S.member` xs)
|| (OnEdge b `S.member` xs && FromEdge a 0 `S.member` xs)
where
xs = rl ^. rlType
(a,b) = cardinalBetweenAdj x
setInLinksByType :: RoomLinkType -> [RoomLink] -> [RoomLink]
setInLinksByType lt = setInLinks (\rl -> lt `S.member` _rlType rl)