Make more sounds positional
This commit is contained in:
@@ -70,34 +70,51 @@ withSound soundid f cid w = (soundOncePos soundid p . f cid) w
|
||||
where
|
||||
p = _crPos (_creatures w IM.! cid)
|
||||
|
||||
withRecoil :: Float -> (Int -> World -> World) -> Int -> World -> World
|
||||
withRecoil
|
||||
:: Float -- ^ Recoil amount
|
||||
-> (Int -> World -> World)
|
||||
-- ^ Underlying world effect, takes creature id as input
|
||||
-> Int -- ^ Creature id
|
||||
-> World -> World
|
||||
withRecoil recoilAmount eff cid w = eff cid . over (creatures . ix cid) pushback $ w
|
||||
where pushback cr = over crPos
|
||||
(+.+ rotateV (_crDir cr) ((-recoilAmount) / _crMass cr ,0))
|
||||
cr
|
||||
withSidePush :: Float -> (Int -> World -> World) -> Int -> World -> World
|
||||
where
|
||||
pushback cr = over crPos (+.+ rotateV (_crDir cr) ((-recoilAmount) / _crMass cr ,0)) cr
|
||||
withSidePush
|
||||
:: Float -- ^ Maximal possible side push amount
|
||||
-> (Int -> World -> World)
|
||||
-- ^ Underlying world effect, takes creature id as input
|
||||
-> Int -- ^ Creature id
|
||||
-> World -> World
|
||||
withSidePush maxSide eff cid w = eff cid . over (creatures . ix cid) push $ w
|
||||
where push cr = over crPos
|
||||
(+.+ rotateV (_crDir cr) (0,(pushAmount) / _crMass cr))
|
||||
cr
|
||||
(pushAmount, _) = randomR (-maxSide,maxSide) $ _randGen w
|
||||
where
|
||||
push cr = over crPos (+.+ rotateV (_crDir cr) (0,(pushAmount) / _crMass cr)) cr
|
||||
(pushAmount, _) = randomR (-maxSide,maxSide) $ _randGen w
|
||||
|
||||
shootWithSound :: Int -> (Int -> World -> World) -> Int -> World -> World
|
||||
{-
|
||||
Applies an effect and sound with an ammo check.
|
||||
-}
|
||||
shootWithSound
|
||||
:: Int -- ^ Sound identifier
|
||||
-> (Int -> World -> World)
|
||||
-- ^ Shoot effect, takes creature id as input
|
||||
-> Int -- ^ Creature id
|
||||
-> World -> World
|
||||
shootWithSound soundid f cid w
|
||||
| fireCondition = over (pointerToItem . wpLoadedAmmo) (\ammo -> ammo-1)
|
||||
$ soundOnce soundid
|
||||
$ set (pointerToItem . wpFireState) (_wpFireRate item)
|
||||
$ f cid w
|
||||
| reloadCondition = fromMaybe w $ reloadWeapon cid w
|
||||
| otherwise = w
|
||||
where cr = (_creatures w IM.! cid)
|
||||
itRef = _crInvSel cr
|
||||
item = _crInv cr IM.! itRef
|
||||
pointerToItem = creatures . ix cid . crInv . ix itRef
|
||||
fireCondition = _wpReloadState item == 0
|
||||
&& _wpFireState item == 0
|
||||
&& _wpLoadedAmmo item > 0
|
||||
reloadCondition = _wpLoadedAmmo item == 0
|
||||
| fireCondition = over (pointerToItem . wpLoadedAmmo) (\ammo -> ammo-1)
|
||||
$ soundOncePos soundid (_crPos cr)
|
||||
$ set (pointerToItem . wpFireState) (_wpFireRate item)
|
||||
$ f cid w
|
||||
| reloadCondition = fromMaybe w $ reloadWeapon cid w
|
||||
| otherwise = w
|
||||
where
|
||||
cr = (_creatures w IM.! cid)
|
||||
itRef = _crInvSel cr
|
||||
item = _crInv cr IM.! itRef
|
||||
pointerToItem = creatures . ix cid . crInv . ix itRef
|
||||
fireCondition = _wpReloadState item == 0
|
||||
&& _wpFireState item == 0
|
||||
&& _wpLoadedAmmo item > 0
|
||||
reloadCondition = _wpLoadedAmmo item == 0
|
||||
|
||||
shoot :: (Int -> World -> World) -> Int -> World -> World
|
||||
shoot f cid w | fireCondition = over (pointerToItem . wpLoadedAmmo) (\ammo -> ammo-1)
|
||||
|
||||
Reference in New Issue
Block a user