diff --git a/src/Dodge/Item/Weapon.hs b/src/Dodge/Item/Weapon.hs index a0208a947..e743b53d2 100644 --- a/src/Dodge/Item/Weapon.hs +++ b/src/Dodge/Item/Weapon.hs @@ -643,16 +643,13 @@ retireRemoteBomb itid t pjid w = setScope w moveRemoteBomb :: Int -> Int -> Int -> World -> World moveRemoteBomb itid time pID w - | time < -4 = setScope - $ updatePicture + | time < -4 = updatePicture $ set (projectiles .ix pID.pjUpdate) (\_ -> moveRemoteBomb itid (f time) pID) w - | time < 2 - = case hitWl of + | time < 2 = case hitWl of Just _ -> soundOnce (fromIntegral tapQuiet) $ halfV updatedWorld _ -> halfV updatedWorld - | otherwise - = case hitWl of + | otherwise = case hitWl of Just _ -> soundOnce (fromIntegral tapQuiet) updatedWorld _ -> updatedWorld where @@ -660,15 +657,7 @@ moveRemoteBomb itid time pID w = updateV $ set (projectiles . ix pID . pjPos) finalPos $ updatePicture $ set (projectiles .ix pID.pjUpdate) (\_ -> moveRemoteBomb itid (time-1) pID) - $ setScope w - setScope w' = case _itemPositions w' IM.! itid of - InInv cid invid - -> w' & creatures . ix cid . crInv . ix invid . itAttachment - . _Just . scopePos .~ (newPos -.- _crPos (_creatures w' IM.! cid)) - & creatures . ix cid . crInv . ix invid . itZoom - .~ (defaultItZoom {_itAimZoomMax = 0.5, _itAimZoomMin = 0.5}) - _ -> w' pj = _projectiles w IM.! pID oldPos = _pjPos pj newPos = _pjVel pj +.+ oldPos @@ -690,6 +679,22 @@ moveRemoteBomb itid time pID w newPos (50 *.* unitVectorAtAngle (negate $ degToRad (10 * fromIntegral time))) [-0.2,-0.15,-0.1,-0.05,0,0.05,0.1,0.15,0.2] + +setRemoteScope :: Int -> Projectile -> World -> World +setRemoteScope itid pj w' = case w' ^? itemPositions . ix itid of + Just (InInv cid' invid ) + -> w' & creatures . ix cid' . crInv . ix invid . itAttachment + . _Just . scopePos .~ (_pjPos pj -.- _crPos (_creatures w' IM.! cid')) + _ -> w' + +setRemoteBombScope :: Int -> Projectile -> World -> World +setRemoteBombScope itid pj w' = case _itemPositions w' IM.! itid of + InInv cid invid + -> w' & creatures . ix cid . crInv . ix invid . itAttachment + . _Just . scopePos .~ (_pjPos pj -.- _crPos (_creatures w' IM.! cid)) + & creatures . ix cid . crInv . ix invid . itZoom + .~ (defaultItZoom {_itAimZoomMax = 0.5, _itAimZoomMin = 0.5}) + _ -> w' grenade :: Item grenade = Throwable @@ -771,7 +776,7 @@ fireRemoteLauncher cr w = setLocation , _pjVel = rotateV dir (1,0) , _pjDraw = remoteShellPic' , _pjID = i - , _pjUpdate = \pj -> decTimMvVel pj . moveRemoteShell cid itid pj + , _pjUpdate = \pj -> decTimMvVel pj . setRemoteScope itid pj . moveRemoteShell cid itid pj , _pjAcc = (0,0) , _pjDir = dir , _pjSpin = 0 @@ -795,10 +800,10 @@ moveRemoteShell :: Int -> Int -> Projectile -> World -> World moveRemoteShell cid itid pj w | time > 40 = if circOnSomeWall oldPos 4 w then doExplosion w - else w & setScope + else w | time >= 20 = case thingHit of Just _ -> doExplosion w - Nothing -> setScope w & projectiles . ix i . pjDir .~ newdir + Nothing -> w & projectiles . ix i . pjDir .~ newdir | time > -99 = case thingHit of Just _ -> doExplosion $ stopSoundFrom (ShellSound i) w Nothing -> w & set randGen g @@ -809,10 +814,9 @@ moveRemoteShell cid itid pj w & soundFromPos (ShellSound i) newPos (fromIntegral smokeTrailSound) 1 250 & smokeGen & makeFlameletTimed oldPos (0.5 *.* rotateV (pi+sparkD) accel) Nothing 3 10 - & setScope | time > -200 = case thingHit of Just _ -> doExplosion $ stopSoundFrom (ShellSound i) w - Nothing -> setScope w + Nothing -> w | otherwise = doExplosion $ stopSoundFrom (ShellSound i) w where time = _pjTimer pj @@ -821,26 +825,19 @@ moveRemoteShell cid itid pj w vel = _pjVel pj newPos = oldPos +.+ vel newdir - | SDL.ButtonRight `S.member` _mouseButtons w - && w ^? creatures . ix cid . crInvSel == w ^? itemPositions . ix itid . itInvId + | SDL.ButtonRight `S.member` _mouseButtons w + && w ^? creatures . ix cid . crInvSel == w ^? itemPositions . ix itid . itInvId = _cameraRot w + argV (_mousePos w) - | otherwise = dir + | otherwise = _pjDir pj accel = rotateV newdir (2,0) (frict,g) = randomR (0.6,0.9) $ _randGen w (sparkD,_) = randomR (-0.5,0.5) $ _randGen w - dir = argV vel hitCr = fst <$> collideCircCrsPoint oldPos newPos 4 w hitWl = fst <$> collideCircWalls' oldPos newPos 2 (wallsNearPoint newPos w) thingHit = hitCr <|> hitWl - r1 = _randGen w & evalState (randInCirc 10) smokeGen = makeSmokeCloudAt $ oldPos +.+ r1 +.+ 30 *.* normalizeV (oldPos -.- newPos) doExplosion = explodeRemoteRocket itid i - setScope w' = case _itemPositions w' IM.! itid of - InInv cid' invid - -> w' & creatures . ix cid' . crInv . ix invid . itAttachment - . _Just . scopePos .~ (newPos -.- _crPos (_creatures w' IM.! cid')) - _ -> w' explodeRemoteRocket :: Int -- ^ Item id