Files
loop/src/Dodge/Placement/PlaceSpot/TriggerDoor.hs
T
2025-10-25 10:17:59 +01:00

38 lines
1.0 KiB
Haskell

module Dodge.Placement.PlaceSpot.TriggerDoor (
plDoor,
) where
import Dodge.Door.DoorLerp
import Dodge.Data.GenWorld
import Dodge.Placement.PlaceSpot.Block
import Dodge.ShiftPoint
import qualified IntMapHelp as IM
import LensHelp
plDoor ::
Door ->
Wall ->
GenWorld ->
(Int, GenWorld)
plDoor dr wl gw =
( drid
, over gwWorld addWalls $ gw & gwWorld . cWorld . lWorld . doors . at drid ?~ newdr
-- carefull with the ordering of addWalls
)
where
isauto = case dr ^. drTrigger of
WdBlCrFilterNearPoint{} -> True
_ -> False
drid = IM.newKey $ gw ^. gwWorld . cWorld . lWorld . doors
wlid = IM.newKey $ gw ^. gwWorld . cWorld . lWorld . walls
pps = IM.elems $ dr ^. drFootPrint
newdr = dr & drID .~ drid & drFootPrint .~ IM.fromList (zip [wlid ..] pps)
lerposa = doDoorLerp dr (dr ^. drLerp)
addWalls =
insertStructureWalls
(`DoorPart` isauto)
wl
(map fst pps & each %~ shiftPointBy lerposa)
drid
wlid