38 lines
1.0 KiB
Haskell
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
|