Add door mechanism code
This commit is contained in:
@@ -0,0 +1,48 @@
|
|||||||
|
{-# LANGUAGE BangPatterns #-}
|
||||||
|
module Dodge.LevelGen.MoveDoor
|
||||||
|
where
|
||||||
|
import Dodge.Data
|
||||||
|
import Dodge.Base
|
||||||
|
import Geometry
|
||||||
|
|
||||||
|
import qualified Data.IntMap.Strict as IM
|
||||||
|
import Control.Lens
|
||||||
|
-- This deserves a clean up
|
||||||
|
mvP :: Point2 -> Point2 -> Point2
|
||||||
|
{-# INLINE mvP #-}
|
||||||
|
mvP !ep !p = mvPointTowardAtSpeed 2 ep p
|
||||||
|
|
||||||
|
mvPs :: (Point2,Point2) -> (Point2,Point2) -> (Point2,Point2)
|
||||||
|
{-# INLINE mvPs #-}
|
||||||
|
mvPs !(!ex,!ey) !(!sx,!sy) = (mvP ex sx,mvP ey sy)
|
||||||
|
|
||||||
|
moveDoorToward :: (Point2,Point2) -> Wall -> Wall
|
||||||
|
{-# INLINE moveDoorToward #-}
|
||||||
|
moveDoorToward (ex,ey) wls = wls & wlLine %~ mvPs (ex,ey)
|
||||||
|
|
||||||
|
zoneps :: (Point2, Point2) -> [(Int,Int)]
|
||||||
|
zoneps (a,b)
|
||||||
|
| dist a b <= 2 * zoneSize = [zoneOfPoint $ pHalf a b]
|
||||||
|
| otherwise = map zoneOfPoint $ divideLine (2*zoneSize) a b
|
||||||
|
|
||||||
|
doorMechan
|
||||||
|
:: Int
|
||||||
|
-> [(Int,Int)]
|
||||||
|
-> (Wall -> Wall)
|
||||||
|
-> (Wall -> Wall)
|
||||||
|
-> (World -> Bool)
|
||||||
|
-> World
|
||||||
|
-> World
|
||||||
|
doorMechan n zonePs openEff closeEff cond w
|
||||||
|
| cond w = flip (foldr $ changeZonedWall'' openEff n) zonePs
|
||||||
|
$ over walls (IM.adjust openEff n) w
|
||||||
|
| otherwise = flip (foldr $ changeZonedWall'' closeEff n) zonePs
|
||||||
|
$ over walls (IM.adjust closeEff n) w
|
||||||
|
|
||||||
|
changeZonedWall''
|
||||||
|
:: (Wall -> Wall)
|
||||||
|
-> Int
|
||||||
|
-> (Int,Int)
|
||||||
|
-> World
|
||||||
|
-> World
|
||||||
|
changeZonedWall'' eff n (x,y) = over wallsZone $ adjustIMZone eff x y n
|
||||||
Reference in New Issue
Block a user