|
|
|
@@ -4,9 +4,6 @@
|
|
|
|
|
Weapon effects when pulling the trigger.
|
|
|
|
|
-}
|
|
|
|
|
module Dodge.Item.Weapon.TriggerType (
|
|
|
|
|
useAmmoAmount,
|
|
|
|
|
useAllAmmo,
|
|
|
|
|
-- useAmmoUpTo,
|
|
|
|
|
lockInvFor,
|
|
|
|
|
withFlare,
|
|
|
|
|
withMuzFlare,
|
|
|
|
@@ -16,16 +13,6 @@ module Dodge.Item.Weapon.TriggerType (
|
|
|
|
|
trigDoAlso,
|
|
|
|
|
withTempLight,
|
|
|
|
|
withItem,
|
|
|
|
|
-- withItemUpdate,
|
|
|
|
|
-- withItemUpdateFirst,
|
|
|
|
|
-- rateIncAB,
|
|
|
|
|
-- torqueBefore,
|
|
|
|
|
-- torqueBeforeAtLeast,
|
|
|
|
|
-- withTorqueAfter,
|
|
|
|
|
-- torqueSideEffect,
|
|
|
|
|
withRandomItemParams,
|
|
|
|
|
withRandomItem,
|
|
|
|
|
withRandomItemUpdate,
|
|
|
|
|
withSoundStart,
|
|
|
|
|
withSoundItemChoiceStart,
|
|
|
|
|
withSoundContinue,
|
|
|
|
@@ -37,21 +24,7 @@ module Dodge.Item.Weapon.TriggerType (
|
|
|
|
|
withPositionOffset,
|
|
|
|
|
withPositionWallCheck,
|
|
|
|
|
withPosDirWallCheck,
|
|
|
|
|
withRandomOffset,
|
|
|
|
|
withRandomDirI,
|
|
|
|
|
withRecoil,
|
|
|
|
|
afterRecoil,
|
|
|
|
|
withSidePushAfterI,
|
|
|
|
|
withSidePushI,
|
|
|
|
|
withWarmUp,
|
|
|
|
|
repeatOnFrames,
|
|
|
|
|
sideEffectOnFrame,
|
|
|
|
|
duplicateItem,
|
|
|
|
|
duplicateLoadedBarrels,
|
|
|
|
|
duplicateNumBarrels,
|
|
|
|
|
duplicateLoaded,
|
|
|
|
|
duplicateOffsetsV2,
|
|
|
|
|
duplicateOffsetsFocus,
|
|
|
|
|
hammerCheckL,
|
|
|
|
|
hammerCheck,
|
|
|
|
|
shootL,
|
|
|
|
@@ -292,86 +265,6 @@ withSoundForVol vol soundid playTime f item cr =
|
|
|
|
|
soundContinueVol vol (CrWeaponSound (_crID cr) 0) (_crPos cr) soundid (Just playTime)
|
|
|
|
|
. f item cr
|
|
|
|
|
|
|
|
|
|
afterRecoil ::
|
|
|
|
|
-- | Recoil amount
|
|
|
|
|
Float ->
|
|
|
|
|
ChainEffect
|
|
|
|
|
afterRecoil recoilAmount eff item cr = eff item (pushback cr) . over (cWorld . lWorld . creatures . ix cid) pushback
|
|
|
|
|
where
|
|
|
|
|
cid = _crID cr
|
|
|
|
|
pushback = over crPos (+.+ rotateV (_crDir cr) (V2 ((- recoilAmount) / _crMass cr) 0))
|
|
|
|
|
|
|
|
|
|
withRecoil :: ChainEffect
|
|
|
|
|
withRecoil eff it cr = eff it cr . over (cWorld . lWorld . creatures . ix cid) pushback
|
|
|
|
|
where
|
|
|
|
|
cid = _crID cr
|
|
|
|
|
recoilAmount = fromMaybe 0 $ it ^? ldtValue . itUse . heldParams . recoil
|
|
|
|
|
pushback = over crPos (+.+ rotateV (_crDir cr) (V2 ((- recoilAmount) / _crMass cr) 0))
|
|
|
|
|
|
|
|
|
|
{- | Pushes a creature sideways by a random amount.
|
|
|
|
|
Applied before the underlying effect.
|
|
|
|
|
-}
|
|
|
|
|
withSidePushI ::
|
|
|
|
|
-- | Maximal possible side push amount
|
|
|
|
|
Float ->
|
|
|
|
|
ChainEffect
|
|
|
|
|
withSidePushI maxSide eff item cr w =
|
|
|
|
|
eff item (push cr) $
|
|
|
|
|
w
|
|
|
|
|
& cWorld . lWorld . creatures . ix cid %~ push
|
|
|
|
|
& randGen .~ g
|
|
|
|
|
where
|
|
|
|
|
cid = _crID cr
|
|
|
|
|
push = over crPos (+.+ rotateV (_crDir cr) (V2 0 (pushAmount / _crMass cr)))
|
|
|
|
|
(pushAmount, g) = randomR (- maxSide, maxSide) $ _randGen w
|
|
|
|
|
|
|
|
|
|
-- consider unifying the pushes using a direction vector
|
|
|
|
|
|
|
|
|
|
{- | Pushes a creature sideways by a random amount.
|
|
|
|
|
Applied after the underlying effect.
|
|
|
|
|
-}
|
|
|
|
|
withSidePushAfterI ::
|
|
|
|
|
-- | Maximal possible side push amount
|
|
|
|
|
Float ->
|
|
|
|
|
ChainEffect
|
|
|
|
|
withSidePushAfterI maxSide eff item cr w =
|
|
|
|
|
over (cWorld . lWorld . creatures . ix cid) push . eff item cr $
|
|
|
|
|
w
|
|
|
|
|
& randGen .~ g
|
|
|
|
|
where
|
|
|
|
|
cid = _crID cr
|
|
|
|
|
push = over crPos (+.+ rotateV (_crDir cr) (V2 0 (pushAmount / _crMass cr)))
|
|
|
|
|
(pushAmount, g) = randomR (- maxSide, maxSide) $ _randGen w
|
|
|
|
|
|
|
|
|
|
useAllAmmo :: ChainEffect
|
|
|
|
|
useAllAmmo = error "use all ammo"
|
|
|
|
|
--useAllAmmo eff ams item cr w = fromMaybe w $ do
|
|
|
|
|
-- let invids = ams ^.. traverse . itLocation . ipInvID
|
|
|
|
|
-- return . eff ams item cr $ foldl' f w invids
|
|
|
|
|
-- where
|
|
|
|
|
-- f w' invid = w' & cWorld . lWorld . creatures . ix (_crID cr) . crInv . ix invid
|
|
|
|
|
-- . itUse . amagLoadStatus . iaLoaded .~ 0
|
|
|
|
|
|
|
|
|
|
--useAmmoUpTo :: Int -> ChainEffect
|
|
|
|
|
--useAmmoUpTo amAmount eff ams itm cr = fromMaybe id $ do
|
|
|
|
|
-- _ <- ams ^? ix 0 . itUse . amagLoadStatus . iaLoaded
|
|
|
|
|
-- invid <- ams ^? ix 0 . itLocation . ipInvID
|
|
|
|
|
-- return $ eff ams itm cr
|
|
|
|
|
-- . ( cWorld . lWorld . creatures . ix (_crID cr) . crInv . ix invid . itUse . amagLoadStatus . iaLoaded
|
|
|
|
|
-- %~ (max 0 . subtract amAmount)
|
|
|
|
|
-- )
|
|
|
|
|
|
|
|
|
|
useAmmoAmount :: Int -> ChainEffect
|
|
|
|
|
useAmmoAmount amAmount eff item cr = fromMaybe id $ do
|
|
|
|
|
atype <- item ^? ldtValue . itUse . heldAmmoTypes . ix 0
|
|
|
|
|
leftitms <- item ^? ldtLeft
|
|
|
|
|
mag <- lookup (AmmoInLink 0 atype) leftitms
|
|
|
|
|
magid <- mag ^? ldtValue . itLocation . ilInvID
|
|
|
|
|
return $ eff item cr
|
|
|
|
|
. (cWorld . lWorld . creatures . ix (_crID cr) . crInv . ix magid . itUse . amagLoadStatus . iaLoaded -~ amAmount)
|
|
|
|
|
|
|
|
|
|
-- . crInv . ix itRef . itUse . heldConsumption . laSource
|
|
|
|
|
|
|
|
|
|
{- |
|
|
|
|
|
Applies a world effect after an item use cooldown check.
|
|
|
|
|
-}
|
|
|
|
@@ -516,15 +409,6 @@ withCrPosShift p g f it cr = g thepos . f it cr
|
|
|
|
|
where
|
|
|
|
|
thepos = (_crPos cr +.+ rotateV (_crDir cr) p) `v2z` 20
|
|
|
|
|
|
|
|
|
|
-- | Applies the effect to a randomly rotated creature.
|
|
|
|
|
withRandomDirI ::
|
|
|
|
|
-- | Max possible rotation
|
|
|
|
|
Float ->
|
|
|
|
|
ChainEffect
|
|
|
|
|
withRandomDirI acc f it cr w = f it (cr & crDir +~ a) $ set randGen g w
|
|
|
|
|
where
|
|
|
|
|
(a, g) = randomR (- acc, acc) $ _randGen w
|
|
|
|
|
|
|
|
|
|
withOldDir ::
|
|
|
|
|
-- | The fraction of the old direction
|
|
|
|
|
Float ->
|
|
|
|
@@ -532,23 +416,6 @@ withOldDir ::
|
|
|
|
|
withOldDir aFrac eff item cr =
|
|
|
|
|
eff item (cr & crDir %~ tweenAngles aFrac (_crOldDir cr))
|
|
|
|
|
|
|
|
|
|
withRandomItemUpdate ::
|
|
|
|
|
State StdGen (Item -> Item) ->
|
|
|
|
|
ChainEffect
|
|
|
|
|
withRandomItemUpdate randItUp eff it cr w = eff (over ldtValue f it) cr $ w & randGen .~ g
|
|
|
|
|
where
|
|
|
|
|
(f, g) = runState randItUp (_randGen w)
|
|
|
|
|
|
|
|
|
|
withRandomItemParams :: State StdGen (ItemParams -> ItemParams) -> ChainEffect
|
|
|
|
|
withRandomItemParams rip eff it cr w = eff (it & ldtValue . itParams %~ f) cr $ w & randGen .~ g
|
|
|
|
|
where
|
|
|
|
|
(f, g) = runState rip (_randGen w)
|
|
|
|
|
|
|
|
|
|
withRandomItem :: State StdGen (Item -> Item) -> ChainEffect
|
|
|
|
|
withRandomItem rip eff it cr w = eff (over ldtValue f it) cr $ w & randGen .~ g
|
|
|
|
|
where
|
|
|
|
|
(f, g) = runState rip (_randGen w)
|
|
|
|
|
|
|
|
|
|
withPositionOffset ::
|
|
|
|
|
(Item -> Creature -> World -> (Point2, Float)) ->
|
|
|
|
|
ChainEffect
|
|
|
|
@@ -573,179 +440,3 @@ withPosDirWallCheck h f it cr w
|
|
|
|
|
| otherwise = w
|
|
|
|
|
where
|
|
|
|
|
(p, a) = h (_ldtValue it) cr w
|
|
|
|
|
|
|
|
|
|
-- | Apply the effect to a translated creature.
|
|
|
|
|
withRandomOffset :: ChainEffect
|
|
|
|
|
withRandomOffset f item cr w = f item (cr & crPos %~ (+.+ offV)) $ set randGen g w
|
|
|
|
|
where
|
|
|
|
|
(offsetVal, g) = randomR (- offsetAmount, offsetAmount) $ _randGen w
|
|
|
|
|
offV = rotateV (_crDir cr) (V2 0 offsetVal)
|
|
|
|
|
offsetAmount = fromMaybe 0 $ item ^? ldtValue . itUse . heldParams . randomOffset
|
|
|
|
|
|
|
|
|
|
---- | Rotates a creature
|
|
|
|
|
--torqueBefore ::
|
|
|
|
|
-- -- | Max possible rotation
|
|
|
|
|
-- Float ->
|
|
|
|
|
-- ChainEffect
|
|
|
|
|
--torqueBefore torque feff item cr w
|
|
|
|
|
-- | cid == 0 =
|
|
|
|
|
-- feff item (cr & crDir +~ rot) $
|
|
|
|
|
-- w
|
|
|
|
|
-- & randGen .~ g
|
|
|
|
|
-- & cWorld . lWorld . creatures . ix cid . crDir +~ rot
|
|
|
|
|
-- & wCam . camRot +~ rot
|
|
|
|
|
-- & rotateScope
|
|
|
|
|
-- | otherwise = feff item cr $ set randGen g $ over (cWorld . lWorld . creatures . ix cid . crDir) (+ rot) w
|
|
|
|
|
-- where
|
|
|
|
|
-- cid = _crID cr
|
|
|
|
|
-- (rot, g) = randomR (- torque, torque) $ _randGen w
|
|
|
|
|
-- rotateScope = fromMaybe id $ do
|
|
|
|
|
-- i <- yourScopeInvID w
|
|
|
|
|
-- return $ cWorld . lWorld . creatures . ix cid . crInv . ix i . itUse . attachParams . scrollAttachParams . opticPos %~ rotateV rot
|
|
|
|
|
|
|
|
|
|
--{- | Rotates a creature with minimum rotation
|
|
|
|
|
-- Rotates the player creature before applying the effect, other creatures after.
|
|
|
|
|
---}
|
|
|
|
|
--torqueBeforeAtLeast ::
|
|
|
|
|
-- -- | Minimal possible rotation
|
|
|
|
|
-- Float ->
|
|
|
|
|
-- -- | Extra possible rotation
|
|
|
|
|
-- Float ->
|
|
|
|
|
-- ChainEffect
|
|
|
|
|
--torqueBeforeAtLeast minTorque exTorque feff item cr w
|
|
|
|
|
-- | cid == 0 =
|
|
|
|
|
-- feff item (cr & crDir +~ rot') $
|
|
|
|
|
-- w
|
|
|
|
|
-- & randGen .~ g
|
|
|
|
|
-- & cWorld . lWorld . creatures . ix cid . crDir +~ rot'
|
|
|
|
|
-- & wCam . camRot +~ rot'
|
|
|
|
|
-- & rotateScope
|
|
|
|
|
-- | otherwise = feff item cr $ set randGen g $ over (cWorld . lWorld . creatures . ix cid . crDir) (+ rot') w
|
|
|
|
|
-- where
|
|
|
|
|
-- cid = _crID cr
|
|
|
|
|
-- (rot, g) = randomR (- exTorque, exTorque) $ _randGen w
|
|
|
|
|
-- rot'
|
|
|
|
|
-- | rot < 0 = rot - minTorque
|
|
|
|
|
-- | otherwise = rot + minTorque
|
|
|
|
|
-- rotateScope = fromMaybe id $ do
|
|
|
|
|
-- i <- yourScopeInvID w
|
|
|
|
|
-- return $ cWorld . lWorld . creatures . ix cid . crInv . ix i . itUse . attachParams . scrollAttachParams . opticPos %~ rotateV rot
|
|
|
|
|
|
|
|
|
|
---- | Rotate a randomly creature after applying an effect.
|
|
|
|
|
--withTorqueAfter :: ChainEffect
|
|
|
|
|
--withTorqueAfter feff item cr w
|
|
|
|
|
---- | cid == 0 = rotateScope . set randGen g $ over (wCam . camRot) (+ rot) $ feff item cr w
|
|
|
|
|
---- | otherwise = set randGen g $ over (cWorld . lWorld . creatures . ix cid . crDir) (+ rot) $ feff item cr w
|
|
|
|
|
-- | cid == 0 = w
|
|
|
|
|
-- & feff item cr
|
|
|
|
|
-- & wCam . camRot +~ rot
|
|
|
|
|
-- & rotateScope
|
|
|
|
|
-- & randGen .~ g
|
|
|
|
|
-- | otherwise = w
|
|
|
|
|
-- & cWorld . lWorld . creatures . ix cid . crDir +~ rot
|
|
|
|
|
-- & randGen .~ g
|
|
|
|
|
-- where
|
|
|
|
|
-- cid = _crID cr
|
|
|
|
|
-- (rot, g) = randomR (- torque, torque) $ _randGen w
|
|
|
|
|
-- torque = fromMaybe 0 $ item ^? ldtValue . itUse . heldParams . torqueAfter
|
|
|
|
|
-- rotateScope = fromMaybe id $ do
|
|
|
|
|
-- i <- yourScopeInvID w
|
|
|
|
|
-- return $ cWorld . lWorld . creatures . ix cid . crInv . ix i . itUse . attachParams . scrollAttachParams . opticPos %~ rotateV rot
|
|
|
|
|
---- rotateScope = pointerYourItem . itScope . scopePos %~ rotateV rot
|
|
|
|
|
|
|
|
|
|
sideEffectOnFrame ::
|
|
|
|
|
Int ->
|
|
|
|
|
(Item -> Creature -> WdWd) ->
|
|
|
|
|
ChainEffect
|
|
|
|
|
sideEffectOnFrame i sf f it cr w =
|
|
|
|
|
f it cr w
|
|
|
|
|
& cWorld . lWorld . delayedEvents .:~ (i, sf (_ldtValue it) cr)
|
|
|
|
|
|
|
|
|
|
--torqueSideEffect :: Float -> Item -> Creature -> World -> World
|
|
|
|
|
--torqueSideEffect torque _ cr w
|
|
|
|
|
-- | cid == 0 = set randGen g . rotateScope $ over (wCam . camRot) (+ rot) w
|
|
|
|
|
-- | otherwise = set randGen g $ over (cWorld . lWorld . creatures . ix cid . crDir) (+ rot) w
|
|
|
|
|
-- where
|
|
|
|
|
-- cid = _crID cr
|
|
|
|
|
-- (rot, g) = randomR (- torque, torque) $ _randGen w
|
|
|
|
|
-- rotateScope = fromMaybe id $ do
|
|
|
|
|
-- i <- yourScopeInvID w
|
|
|
|
|
-- return $ cWorld . lWorld . creatures . ix cid . crInv . ix i . itUse . attachParams . scrollAttachParams . opticPos %~ rotateV rot
|
|
|
|
|
|
|
|
|
|
-- pump the updated creature into the chain in later frames
|
|
|
|
|
repeatOnFrames :: [Int] -> HeldMod -> ChainEffect
|
|
|
|
|
--repeatOnFrames is hm f it cr w = f it cr w
|
|
|
|
|
repeatOnFrames is hm f it cr w =
|
|
|
|
|
f it cr $
|
|
|
|
|
w
|
|
|
|
|
& cWorld . lWorld . delayedEvents .++~ (is <&> (,WdWdFromItCrixWdWd (it & ldtValue . itUse . heldMods .~ hm) (_crID cr) ItCrWdItemEffect))
|
|
|
|
|
|
|
|
|
|
-- where
|
|
|
|
|
-- f' = fromMaybe w' $ do
|
|
|
|
|
-- cr' <- w' ^? creatures . ix (_crID cr)
|
|
|
|
|
-- return $ f it cr' w'
|
|
|
|
|
|
|
|
|
|
duplicateLoaded :: ChainEffect
|
|
|
|
|
duplicateLoaded = error "duplicateLoaded"
|
|
|
|
|
--duplicateLoaded :: ChainEffect
|
|
|
|
|
--duplicateLoaded eff ams it cr w = foldr f w (take numbul [1::Int .. ])
|
|
|
|
|
-- where
|
|
|
|
|
-- f _ = eff ams it cr
|
|
|
|
|
-- numbul = fromMaybe 0 $ do
|
|
|
|
|
-- i <- ams ^? ix 0 . itLocation . ipInvID
|
|
|
|
|
-- cr ^? crInv . ix i . itUse . amagLoadStatus . iaLoaded
|
|
|
|
|
|
|
|
|
|
duplicateNumBarrels :: Int -> ChainEffect
|
|
|
|
|
duplicateNumBarrels = error "duplicateNumBarrels"
|
|
|
|
|
--duplicateNumBarrels :: Int -> ChainEffect
|
|
|
|
|
--duplicateNumBarrels n eff ams itm cr w = foldr f w (take n $ itm ^?! itUse . heldAim . aimMuzzles)
|
|
|
|
|
-- where
|
|
|
|
|
-- f brl w' =
|
|
|
|
|
-- eff ams
|
|
|
|
|
-- itm
|
|
|
|
|
-- ( cr & crPos +~ rotateV (_crDir cr) (_mzPos brl + aimingWeaponZeroPos cr itm)
|
|
|
|
|
-- & crDir +~ (_mzRot brl + a)
|
|
|
|
|
-- )
|
|
|
|
|
-- (w' & randGen .~ g)
|
|
|
|
|
-- where
|
|
|
|
|
-- inacc = _mzInaccuracy brl
|
|
|
|
|
-- (a,g) = randomR (-inacc,inacc) $ _randGen w'
|
|
|
|
|
|
|
|
|
|
duplicateLoadedBarrels :: ChainEffect
|
|
|
|
|
duplicateLoadedBarrels eff itm cr = eff itm cr
|
|
|
|
|
-- = duplicateNumBarrels numbul eff ams itm cr
|
|
|
|
|
-- where
|
|
|
|
|
-- numbul :: Int
|
|
|
|
|
-- numbul = fromMaybe 0 $ do
|
|
|
|
|
-- i <- ams ^? ix 0 . itLocation . ipInvID
|
|
|
|
|
-- cr ^? crInv . ix i . itUse . amagLoadStatus . iaLoaded
|
|
|
|
|
|
|
|
|
|
duplicateOffsetsFocus :: [Float] -> ChainEffect
|
|
|
|
|
duplicateOffsetsFocus xs eff item cr w = foldr f w poss
|
|
|
|
|
where
|
|
|
|
|
poss :: [V2 Float]
|
|
|
|
|
poss = map (rotateV (_crDir cr) . V2 0) xs
|
|
|
|
|
f pos =
|
|
|
|
|
eff item $
|
|
|
|
|
cr
|
|
|
|
|
& crPos %~ (+.+ pos)
|
|
|
|
|
& crDir .~ thedir pos
|
|
|
|
|
--thedir pos
|
|
|
|
|
-- | dist (mouseWorldPos (w ^. input) (w ^. wCam)) (_crPos cr) < aimingMuzzlePos cr item =
|
|
|
|
|
-- argV
|
|
|
|
|
-- ( _crPos cr +.+ aimingMuzzlePos cr item *.* unitVectorAtAngle (_crDir cr)
|
|
|
|
|
-- -.- (_crPos cr +.+ pos)
|
|
|
|
|
-- )
|
|
|
|
|
-- | otherwise = argV (mouseWorldPos (w ^. input) (w ^. wCam) -.- (_crPos cr +.+ pos))
|
|
|
|
|
thedir pos = argV (mouseWorldPos (w ^. input) (w ^. wCam) -.- (_crPos cr +.+ pos))
|
|
|
|
|
|
|
|
|
|
duplicateItem :: (Item -> [Item]) -> ChainEffect
|
|
|
|
|
duplicateItem fit eff itm cr w = foldr f w (ldtValue fit itm)
|
|
|
|
|
where
|
|
|
|
|
f itm' = eff itm' cr
|
|
|
|
|
|
|
|
|
|
duplicateOffsetsV2 :: [Point2] -> ChainEffect
|
|
|
|
|
duplicateOffsetsV2 xs eff item cr w = foldr f w poss
|
|
|
|
|
where
|
|
|
|
|
poss = map (rotateV (_crDir cr)) xs
|
|
|
|
|
f pos = eff item (cr & crPos +.+.~ pos)
|
|
|
|
|