134 lines
4.0 KiB
Haskell
134 lines
4.0 KiB
Haskell
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 =
|
|
cWorld
|
|
. lWorld
|
|
. lights
|
|
.:~ LSParam
|
|
( _crPos cr
|
|
+ rotate3z (_crDir cr) (translateToES 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 cr x -- . g
|
|
_ -> undefined
|
|
-- g
|
|
-- | twists cr = (+.+.+ V3 (-5) 10 0)
|
|
-- | otherwise = id
|
|
f = (+ cr ^. crPos . _xy) . stripZ . rotate3z (_crDir cr) . handtrans
|