module Dodge.Euse ( equipBackgroundEffect, effectOnRemove, effectOnEquip, ) where import Dodge.Creature.HandPos import Dodge.Data.ComposedItem import Dodge.Data.DoubleTree import Dodge.Data.Equipment.Misc 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 LensHelp import Linear import NewInt equipBackgroundEffect :: LocationDT OItem -> Creature -> EquipSite -> World -> World equipBackgroundEffect loc cr = case eo of EQUIP (MAGSHIELD mt) -> const $ useMagShield mt itm cr EQUIP WRISTARMOUR -> setWristShieldPos itm cr EQUIP HEADLAMP -> const $ createHeadLamp itm cr _ -> const id where itm = loc ^. locDT . dtValue . _1 eo = itm ^. itType -- this should probably drain energy useMagShield :: MagnetBuBu -> Item -> Creature -> World -> World useMagShield mt _ cr w = w & cWorld . lWorld . magnets .:~ Magnet { _mgPos = cr ^. crPos . _xy , _mgField = mt } -- setWristShieldPos :: Item -> Creature -> EquipSite -> World -> World -- setWristShieldPos itm cr x = moveWallIDUnsafe i wlline -- where -- i = _itParamID $ _itParams itm -- wlline = (f (V3 (-10) 7 0), f (V3 10 7 0)) -- handtrans = case x of -- OnLeftWrist -> \cr' -> translatePointToLeftHand cr' . g -- _ -> translatePointToRightHand -- g -- | twists cr = (+.+.+ V3 (-5) 10 0) -- | otherwise = id -- f = (+.+ cr ^. crPos . _xy) . stripZ . rotate3 (_crDir cr) . handtrans cr -- TODO the reflection should be controled by the particle -- shieldWallDamage :: Damage -> Wall -> Int -> World -> World -- shieldWallDamage dm _ crid w = case _dmType dm of ---- Lasering -> w -- _ | isMovementDam dm -> w & creatures . ix crid . crState . crDamage .:~ dm -- _ -> w createHeadLamp :: Item -> Creature -> World -> World createHeadLamp _ cr w = w & cWorld . lWorld . lights .:~ LSParam (_crPos cr + rotate3z (_crDir cr) (translateToES w cr OnHead (V3 5 0 3))) 200 0.7 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) . maybe id deleteWallID (itm ^? itParams . itParamID) 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 i & cWorld . lWorld . walls . at i ?~ forceField{_wlID = i} & setWristShieldPos (itm & itParams .~ ItemParamID{_itParamID = i}) cr esite where i = IM.newKey (w ^. cWorld . lWorld . walls) esite = w ^?! cWorld . lWorld . items . ix (itm ^. itID . unNInt) . itLocation . ilEquipSite . _Just setWristShieldPos :: Item -> Creature -> EquipSite -> World -> World setWristShieldPos itm cr esite w = w & moveWallIDUnsafe i wlline where i = _itParamID $ _itParams itm wlline = (f (V3 (-10) y 0), f (V3 10 y 0)) y = case esite of OnLeftWrist -> 7 OnRightWrist -> -7 _ -> error "setWristShieldPos esite is not a wrist" handtrans = case w ^? cWorld . lWorld . items . ix (itm ^. itID . unNInt) . itLocation . ilEquipSite . _Just of Just x -> translateToES w cr x -- . g _ -> undefined -- g -- | twists cr = (+.+.+ V3 (-5) 10 0) -- | otherwise = id f = (+ cr ^. crPos . _xy) . stripZ . rotate3z (_crDir cr) . handtrans