Refactor gun smoke

This commit is contained in:
2021-03-24 03:28:42 +01:00
parent 48e6779503
commit 9b83afbdd0
2 changed files with 14 additions and 37 deletions
+4 -4
View File
@@ -414,7 +414,7 @@ hvAutoGun = defaultAutoGun
, _wpFireRate = 25 , _wpFireRate = 25
, _wpFireState = 0 , _wpFireState = 0
, _wpFire = rateIncAB 24 10 (torqueBeforeForced 0.1 mkHvBul) , _wpFire = rateIncAB 24 10 (torqueBeforeForced 0.1 mkHvBul)
$torqueAfter 0.2 mkHvBul $ torqueAfter 0.2 mkHvBul
, _wpSpread = autogunSpread , _wpSpread = autogunSpread
, _wpRange = 20 , _wpRange = 20
, _itFloorPict = onLayer FlItLayer $ color orange $ polygon $ rectNESW 5 5 (-5) (-5) , _itFloorPict = onLayer FlItLayer $ color orange $ polygon $ rectNESW 5 5 (-5) (-5)
@@ -789,7 +789,7 @@ moveShell time i cid rot accel w
$ (normalizeAnglePi (dir - _crDir cr)) / 20 $ (normalizeAnglePi (dir - _crDir cr)) / 20
_ -> 0 _ -> 0
r1 = _randGen w & evalState (randInCirc 10) r1 = _randGen w & evalState (randInCirc 10)
smokeGen = makeSmokeCloud (oldPos +.+ r1 +.+ 30 *.* (normalizeV (oldPos -.- newPos))) smokeGen = makeSmokeCloudAt (oldPos +.+ r1 +.+ 30 *.* (normalizeV (oldPos -.- newPos)))
normalizeAnglePi angle | normalizeAngle angle > pi = normalizeAngle angle - 2*pi normalizeAnglePi angle | normalizeAngle angle > pi = normalizeAngle angle - 2*pi
@@ -951,7 +951,7 @@ moveFlame rotd w pt
(0.2 *.* vel) (0.2 *.* vel)
scaleChange | time < 80 = 3 scaleChange | time < 80 = 3
| otherwise = 3 - (fromIntegral time - 80) * 0.2 | otherwise = 3 - (fromIntegral time - 80) * 0.2
smokeGen = makeFlamerSmoke ep smokeGen = makeFlamerSmokeAt ep
flamerAngle = 0.3 flamerAngle = 0.3
@@ -1439,7 +1439,7 @@ moveRemoteShell time i cid itid dir w
thingHit = hitCr <|> hitWl thingHit = hitCr <|> hitWl
r1 = _randGen w & evalState (randInCirc 10) r1 = _randGen w & evalState (randInCirc 10)
smokeGen = makeSmokeCloud (oldPos +.+ r1 +.+ 30 *.* (normalizeV (oldPos -.- newPos))) smokeGen = makeSmokeCloudAt (oldPos +.+ r1 +.+ 30 *.* (normalizeV (oldPos -.- newPos)))
doExplosion = explodeRemoteRocket itid i cid doExplosion = explodeRemoteRocket itid i cid
setScope w' = case _itemPositions w' IM.! itid of setScope w' = case _itemPositions w' IM.! itid of
InInv cid invid InInv cid invid
+10 -33
View File
@@ -24,47 +24,24 @@ makeCloudAt rad t drawFunc p w
, _clEffect = const id , _clEffect = const id
} }
fadeOutTime :: Color -> Float -> Cloud -> Picture drawCloudWith :: Float -> Float -> Color -> Cloud -> Picture
fadeOutTime col fadet cl = setLayer 2 drawCloudWith radMult fadet col cl = setLayer 2
. setDepth (-0.5) . setDepth (-0.5)
. color (withAlpha a col) . color (withAlpha a col)
$ circleSolid (4 * _clRad cl) $ circleSolid (radMult * _clRad cl)
where a = min 1 $ fromIntegral (_clTimer cl) / fadet where a = min 1 $ fromIntegral (_clTimer cl) / fadet
makeThickSmokeAt :: Point2 -> World -> World makeThickSmokeAt :: Point2 -> World -> World
makeThickSmokeAt = makeCloudAt 2 50 (fadeOutTime black 50) makeThickSmokeAt = makeCloudAt 3 50 (drawCloudWith 4 50 black)
makeThinSmokeAt :: Point2 -> World -> World makeThinSmokeAt :: Point2 -> World -> World
makeThinSmokeAt = makeSmokeCloud makeThinSmokeAt = makeCloudAt 5 400 (drawCloudWith 4 400 (withAlpha 0.05 black))
makeSmokeCloud :: Point2 -> World -> World makeSmokeCloudAt :: Point2 -> World -> World
makeSmokeCloud pos w = w & clouds %~ IM.insert i theCloud makeSmokeCloudAt = makeCloudAt 5 200 (drawCloudWith 4 200 (greyN 0.5))
where i = newKey $ _clouds w
theCloud = Cloud { _clID = i
, _clPos = pos
, _clVel = (0,0)
, _clPict = fadeOutPict (-0.5)
, _clRad = 5
, _clTimer = 200
, _clEffect = const id
}
fadeOutPict :: Float -> Cloud -> Picture makeFlamerSmokeAt :: Point2 -> World -> World
fadeOutPict dpth cl = setLayer 2 . setDepth dpth . color (withAlpha a $ greyN 0.5) $ circleSolid (4 * _clRad cl) makeFlamerSmokeAt = makeCloudAt 3 200 (drawCloudWith 4 200 (greyN 0.5))
where a = fromIntegral (_clTimer cl) / 200
makeFlamerSmoke :: Point2 -> World -> World
makeFlamerSmoke pos w = w & clouds %~ IM.insert i theCloud
where i = newKey $ _clouds w
theCloud = Cloud { _clID = i
, _clPos = pos
, _clVel = (0,0)
, _clPict = fadeOutPict 0
, _clRad = 5
, _clTimer = 200
, _clEffect = const id
}
spawnSmokeAtCursor :: World -> World spawnSmokeAtCursor :: World -> World
spawnSmokeAtCursor w = makeSmokeCloud (mouseWorldPos w) w spawnSmokeAtCursor w = makeSmokeCloudAt (mouseWorldPos w) w