module Dodge.Item.Weapon.Remote ( pointToItem , retireRemoteProj , setRemoteScope , setRemoteBombScope ) where import Dodge.Data import Dodge.Default import Geometry import Dodge.Item.Location import qualified Data.IntMap.Strict as IM import Control.Lens import Data.Maybe retireRemoteProj :: (Item -> Creature -> World -> World) -> Int -> Int -> Int -> World -> World retireRemoteProj resetFire itid 0 pjid w = w & pointToItem (_itemPositions w IM.! itid) %~ ( (itScope . scopePos .~ V2 0 0) . (itUse . rUse .~ resetFire) ) & props %~ IM.delete pjid retireRemoteProj resetFire itid t pjid w = setScope w & props . ix pjid . pjUpdate .~ (\_ -> retireRemoteProj resetFire itid (t-1) pjid) where setScope w' = case _itemPositions w' IM.! itid of InInv cid invid -> w' & creatures . ix cid . crInv . ix invid . itScope . scopePos .~ (pos -.- _crPos (_creatures w' IM.! cid)) _ -> w' pos = fromMaybe (V2 0 0) $ w ^? props . ix pjid . pjPos setRemoteBombScope :: Int -> Prop -> World -> World setRemoteBombScope itid pj w' = case _itemPositions w' IM.! itid of InInv cid invid -> w' & creatures . ix cid . crInv . ix invid . itScope . scopePos .~ (_pjPos pj -.- _crPos (_creatures w' IM.! cid)) & creatures . ix cid . crInv . ix invid . itUse . useAim . aimZoom .~ (defaultItZoom {_itZoomMax = 0.5, _itZoomMin = 0.5}) _ -> w' setRemoteScope :: Int -> Prop -> World -> World setRemoteScope itid pj w' = case w' ^? itemPositions . ix itid of Just (InInv cid' invid ) -> w' & creatures . ix cid' . crInv . ix invid . itScope . scopePos .~ (_pjPos pj -.- _crPos (_creatures w' IM.! cid')) _ -> w'