module Dodge.Prop.Update where import Control.Lens import Data.Foldable import Dodge.Data.World import Dodge.PrWdLsLs --import Dodge.Prop.Moving import Dodge.WdP2f import Dodge.WorldBool updateProp :: Prop -> World -> World updateProp pr = case _prUpdate pr of PropUpdateId -> id PropRotate x -> rotateProp x pr PropSetToggleAnd wb pu -> propSetToggleAnd wb pu pr PropUpdates pus -> doPropUpdates pr pus PropUpdateLS lsid x -> \w -> w & cWorld . lWorld . lightSources . ix lsid %~ doPrWdLsLs x pr w PropUpdatePosition x -> propUpdatePosition x pr PropUpdateWhen t x -> propUpdateIf t x PropUpdateId pr PropUpdateAnd x y -> doPropUpdates pr [x, y] PropUpdateIf t x y -> propUpdateIf t x y pr propUpdateIf :: WdBl -> PropUpdate -> PropUpdate -> Prop -> World -> World propUpdateIf wb x y pr w | doWdBl wb w = updateProp (pr & prUpdate .~ x) w | otherwise = updateProp (pr & prUpdate .~ y) w propUpdatePosition :: WdP2f -> Prop -> World -> World propUpdatePosition x pr w = w & cWorld . lWorld . props . ix (_prID pr) . prPos .~ fst (doWdP2f x w) & cWorld . lWorld . props . ix (_prID pr) . prRot .~ snd (doWdP2f x w) doPropUpdates :: Prop -> [PropUpdate] -> World -> World doPropUpdates pr pus w = foldl' f w pus where f w' pu = updateProp (pr & prUpdate .~ pu) w' propSetToggleAnd :: WdBl -> PropUpdate -> Prop -> World -> World propSetToggleAnd wb pu pr = setToggle (doWdBl wb) pr . updateProp (pr & prUpdate .~ pu) -- fugly setToggle :: (World -> Bool) -> Prop -> World -> World setToggle cond pr w = w & cWorld . lWorld . props . ix (_prID pr) . prToggle .~ cond w rotateProp :: Float -> Prop -> World -> World rotateProp rotAmount pr w = w & cWorld . lWorld . props . ix (_prID pr) . prRot +~ rotAmount