64 lines
1.9 KiB
Haskell
64 lines
1.9 KiB
Haskell
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
|