module Dodge.Equipment ( effectOnRemove, effectOnEquip, ) where import Control.Lens import Data.Maybe import Dodge.Creature.HandPos import Dodge.Data.World import Dodge.Item.Location import Dodge.Wall.Delete import Dodge.Wall.ForceField import Dodge.Wall.Move import Geometry import qualified IntMapHelp as IM import NewInt effectOnRemove :: Item -> Creature -> World -> World effectOnRemove itm = case itm ^. itType of EQUIP WRISTARMOUR -> onRemoveWristShield itm _ -> const id onRemoveWristShield :: Item -> Creature -> World -> World onRemoveWristShield itm _ = (pointerToItem itm . itParams .~ NoParams) . mremovewall where mremovewall = fromMaybe id $ do i <- itm ^? itParams . itParamID return $ deleteWallID i effectOnEquip :: Item -> Creature -> World -> World effectOnEquip itm = case itm ^. itType of EQUIP WRISTARMOUR -> onEquipWristShield itm _ -> const id onEquipWristShield :: Item -> Creature -> World -> World onEquipWristShield itm cr w = w & pointerToItem itm . itParams .~ ItemParamID{_itParamID = i} & cWorld . lWorld . walls . at i ?~ forceField{_wlID = i} & setWristShieldPos ( itm & itParams .~ ItemParamID{_itParamID = i} ) cr where i = IM.newKey (w ^. cWorld . lWorld . walls) setWristShieldPos :: Item -> Creature -> World -> World setWristShieldPos itm cr w = w & moveWallIDUnsafe i wlline where i = _itParamID $ _itParams itm wlline = (f (V3 (-10) 7 0), f (V3 10 7 0)) handtrans = case w ^? cWorld . lWorld . items . ix (itm ^. itID . unNInt) . itLocation . ilEquipSite . _Just of Just x -> translateToES cr x -- . g _ -> undefined -- g -- | twists cr = (+.+.+ V3 (-5) 10 0) -- | otherwise = id f = (+.+ _crPos cr) . stripZ . rotate3 (_crDir cr) . handtrans