Refactor and improve flamelets

This commit is contained in:
2021-03-24 22:42:43 +01:00
parent baecb8e15a
commit bc5ad33652
4 changed files with 76 additions and 86 deletions
+6 -7
View File
@@ -94,18 +94,17 @@ reducePastDamage = over (crState . crPastDamage) rdpdam
| x > 0 = x - 1 | x > 0 = x - 1
| otherwise = 0 | otherwise = 0
movementSideEff :: Creature -> World -> World movementSideEff :: Creature -> World -> World
movementSideEff cr w movementSideEff cr w
| hasJetPack | hasJetPack
= case cr ^? crState . stance . carriage of = case cr ^? crState . stance . carriage of
Just (Boosting v) Just (Boosting v)
-> makeFlamelet (oldPos +.+ (_crRad cr + 3) *.* (unitVectorAtAngle $ _crDir cr + pi)) -> makeFlameletTimed
(momentum +.+ 1 *.* rotateV randDir (vInverse v)) (oldPos +.+ (_crRad cr + 3) *.* (unitVectorAtAngle $ _crDir cr + pi))
66 (momentum +.+ 1 *.* rotateV randDir (vInverse v))
Nothing Nothing
1 1
20
$ set randGen g $ set randGen g
w w
_ -> w _ -> w
+4 -7
View File
@@ -130,7 +130,7 @@ autoFireMode = shootWithSound (fromIntegral autoGunSound)
. withRandomDir (autogunSpread/2) . withRandomDir (autogunSpread/2)
. withMuzFlare . withMuzFlare
. withVelWthHiteff (50,0) 3 . withVelWthHiteff (50,0) 3
$ destroyOnImpact bulHitCr' bulHitWall' bulHitFF' $ destroyOnImpact bulIncCr' bulIncWall' bulHitFF'
singleFireMode = shootWithSound (fromIntegral autoGunSound) singleFireMode = shootWithSound (fromIntegral autoGunSound)
. withRecoil 40 . withRecoil 40
. torqueAfter 0.03 . torqueAfter 0.03
@@ -139,6 +139,7 @@ singleFireMode = shootWithSound (fromIntegral autoGunSound)
. withVelWthHiteff (50,0) 3 . withVelWthHiteff (50,0) 3
$ destroyOnImpact bulHitCr' bulHitWall' bulHitFF' $ destroyOnImpact bulHitCr' bulHitWall' bulHitFF'
incMode :: Int -> World -> World incMode :: Int -> World -> World
incMode _ w incMode _ w
= case newMode of = case newMode of
@@ -754,9 +755,7 @@ moveShell time i cid rot accel w
$ over (projectiles . ix i . ptVel) (\v -> accel +.+ frict *.* v) $ over (projectiles . ix i . ptVel) (\v -> accel +.+ frict *.* v)
$ soundFrom (ShellSound i) (fromIntegral smokeTrailSound) (1) 250 $ soundFrom (ShellSound i) (fromIntegral smokeTrailSound) (1) 250
$ makeFlameletTimed oldPos $ makeFlameletTimed oldPos
(0.5 *.* rotateV (pi+sparkD) accel) (levLayer UPtLayer) Nothing 3 20 (0.5 *.* rotateV (pi+sparkD) accel) Nothing 3 10
$ makeFlameletTimed (0.5 *.* (newPos +.+ oldPos))
(0.5 *.* rotateV (pi+sparkD) accel) (levLayer UPtLayer) Nothing 3 20
$ smokeGen $ smokeGen
w w
| time > -200 = case thingHit of | time > -200 = case thingHit of
@@ -1394,9 +1393,7 @@ moveRemoteShell time i cid itid dir w
$ soundFrom (ShellSound i) (fromIntegral smokeTrailSound) (1) 250 $ soundFrom (ShellSound i) (fromIntegral smokeTrailSound) (1) 250
$ smokeGen $ smokeGen
$ makeFlameletTimed oldPos $ makeFlameletTimed oldPos
(0.5 *.* rotateV (pi+sparkD) accel) (levLayer UPtLayer) Nothing 3 20 (0.5 *.* rotateV (pi+sparkD) accel) Nothing 3 10
$ makeFlameletTimed (0.5 *.* (newPos +.+ oldPos))
(0.5 *.* rotateV (pi+sparkD) accel) (levLayer UPtLayer) Nothing 3 20
$ setScope $ setScope
w w
| time > -200 = case thingHit of | time > -200 = case thingHit of
+2 -2
View File
@@ -106,7 +106,7 @@ bulIncCr' bt p cr w
sp = head $ _btTrail' bt sp = head $ _btTrail' bt
ep = sp +.+ _btVel' bt ep = sp +.+ _btVel' bt
v = evalState (randInCirc 1) $ _randGen w v = evalState (randInCirc 1) $ _randGen w
incFlamelets = over worldEvents $ (.) (makeFlamelet p v (levLayer UPtLayer) Nothing 3) incFlamelets = over worldEvents $ (.) (makeFlameletTimed p v Nothing 3 20)
bulConCr' :: Particle' -> Point2 -> Creature -> World -> World bulConCr' :: Particle' -> Point2 -> Creature -> World -> World
bulConCr' bt p cr w bulConCr' bt p cr w
@@ -175,7 +175,7 @@ bulIncWall' bt p wl w = damageBlocks wl
_ -> w _ -> w
wallV = (_wlLine wl !! 1 -.- _wlLine wl !! 0) wallV = (_wlLine wl !! 1 -.- _wlLine wl !! 0)
reflectVel = safeNormalizeV $ reflectIn wallV (_btVel' bt) reflectVel = safeNormalizeV $ reflectIn wallV (_btVel' bt)
incFlamelets = over worldEvents $ (.) (makeFlamelet pOut reflectVel (levLayer UPtLayer) Nothing 3) incFlamelets = over worldEvents $ (.) (makeFlameletTimed pOut reflectVel Nothing 3 20)
bulConWall' :: Particle' -> Point2 -> Wall -> World -> World bulConWall' :: Particle' -> Point2 -> Wall -> World -> World
bulConWall' bt p wl w = damageBlocks wl bulConWall' bt p wl w = damageBlocks wl
+64 -70
View File
@@ -48,7 +48,7 @@ makeExplosionAt p w = soundOnce grenadeBang
fVs' = zipWith (+.+) fVs $ map inversePushOut fPs' fVs' = zipWith (+.+) fVs $ map inversePushOut fPs'
sizes = randomRs (2,6) $ _randGen w sizes = randomRs (2,6) $ _randGen w
times = randomRs (20,25) $ _randGen w times = randomRs (20,25) $ _randGen w
mF q v size time = makeFlameletTimed q v (levLayer GloomLayer - 1) Nothing size time mF q v size time = makeFlameletTimed q v Nothing size time
newFs = zipWith4 mF fPs (fmap (3 *.*) fVs') sizes times newFs = zipWith4 mF fPs (fmap (3 *.*) fVs') sizes times
addFlames w = foldr ($) w newFs addFlames w = foldr ($) w newFs
pushAgainstWalls q = fromMaybe q $ fmap (\(x,y)-> x +.+ y) pushAgainstWalls q = fromMaybe q $ fmap (\(x,y)-> x +.+ y)
@@ -219,79 +219,73 @@ createBarrelSpark time colid pos dir maycid w = over worldEvents
noEff _ _ _ = id noEff _ _ _ = id
makeFlameletTimed :: Point2 -> Point2 -> Int -> Maybe Int -> Float -> Int -> World -> World makeFlameletTimed :: Point2 -> Point2 -> Maybe Int -> Float -> Int -> World -> World
makeFlameletTimed pos vel levelInt maycid size time w makeFlameletTimed pos vel maycid size time w
= set randGen g $ over particles' ((:) theFlamelet) w = set randGen g $ over particles' ((:) theFlamelet) w
-- $ flareAt' white 0.01 0.1 pos w
where theFlamelet = where theFlamelet =
Pt' { _ptDraw = const blank Pt' { _ptDraw = drawFlamelet rot
, _ptUpdate' = moveFlamelet levelInt rot , _ptUpdate' = moveFlamelet
, _btVel' = vel , _btVel' = vel
, _btColor' = red , _btColor' = red
, _btPos' = pos , _btPos' = pos
, _btPassThrough' = maycid , _btPassThrough' = maycid
, _btWidth' = size , _btWidth' = size
, _btTimer' = time , _btTimer' = time
, _btHitEffect' = destroyOnImpact (doFlameDam 1) noEff noEff , _btHitEffect' = destroyOnImpact (doFlameDam 1) noEff noEff
} }
(rot ,g) = randomR (0,3) $ _randGen w (rot ,g) = randomR (0,3) $ _randGen w
makeFlamelet :: Point2 -> Point2 -> Int -> Maybe Int -> Float -> World -> World drawFlamelet :: Float -> Particle' -> Picture
makeFlamelet pos vel levelInt maycid size w = set randGen g $ over particles' ((:) theFlamelet) w drawFlamelet rot pt = setLayer 1 $ pictures [pic , piu , pi2 , glow]
where theFlamelet = where
Pt' { _ptDraw = const blank sp = _btPos' pt
, _ptUpdate' = moveFlamelet levelInt rot vel = _btVel' pt
, _btVel' = vel ep = sp +.+ vel
, _btColor' = red size = _btWidth' pt
, _btPos' = pos siz2 = size + 0.2
, _btPassThrough' = maycid time = _btTimer' pt
, _btWidth' = size glow = setDepth 0.336 $ uncurry translate ep
, _btTimer' = 20 $ circleSolidCol (withAlpha 0 red) (withAlpha 0.05 red) 30
, _btHitEffect' = destroyOnImpact (doFlameDam 1) noEff noEff piu = setDepth 0.334 $ uncurry translate ep
} $ color (dark red) $ rotate (0 - (rot - 0.1 * fromIntegral time))
(rot ,g) = randomR (0.5,1.5) $ _randGen w $ scale s1 s1
moveFlamelet :: Int -> Float -> World -> Particle' -> (World, Maybe Particle') $ polygon $ rectNSWE (siz2) (-siz2) (-siz2) (siz2)
moveFlamelet levelInt rot w pt = pi2 = setDepth 0.332 $ uncurry translate ep
case _btTimer' pt of $ color (mixColors (fromIntegral (max 0 (time-2))) (10-fromIntegral time)
time | time <= 0 -> (w, Nothing) orange (dark red)
| otherwise -> (damcrs, mvPt) )
where sp = _btPos' pt $ rotate (0 - (rot + 0.2 * fromIntegral time))
vel = _btVel' pt $ scale s2 s2
ep = sp +.+ vel $ polygon $ rectNSWE (siz2) (-siz2) (-siz2) (siz2)
size = _btWidth' pt pic = setDepth 0.33 $ uncurry translate ep
siz2 = size + 0.2 $ color (mixColors (fromIntegral (max 0 (time-2))) (10-fromIntegral time)
mvPt = Just $ pt {_btTimer' = time - 1, _btPos' = ep, _ptDraw = const thepicture white (dark red)
, _btPassThrough' = Nothing )
,_btVel' = 0.8 *.* vel} $ rotate (0 - ( 0.1 * fromIntegral time + rot))
damcrs = foldr ($) w $ map dodam $ filter closeCrs $ IM.elems $ _creatures w $ scale sc sc
closeCrs cr = dist ep (_crPos cr) < _crRad cr + size $ polygon [(-size,-size),(size,-size),(size,size),(-size,size)]
dodam cr = over (creatures . ix (_crID cr) . crState . crDamage) sc = (*) 2 $ log $ 1 + fromIntegral time / 20
((:) $ Flaming 3 sp ep ep) s1 = (*) 2 $ log $ 2 + fromIntegral time / 40
pic = onLayerL [levelInt,3] $ uncurry translate ep s2 = 0.5 * (sc + s1)
$ color (mixColors (fromIntegral (max 0 (time-2))) (10-fromIntegral time) thepicture = pictures [pic , piu , pi2 , glow]
white (dark red)
) moveFlamelet :: World -> Particle' -> (World, Maybe Particle')
$ rotate (0 - ( 0.1 * fromIntegral time + rot)) moveFlamelet w pt
$ scale sc sc | _btTimer' pt <= 0 = ( w, Nothing)
$ polygon [(-size,-size),(size,-size),(size,size),(-size,size)] | otherwise = (damcrs, mvPt)
piu = onLayerL [levelInt,1] $ uncurry translate ep where
$ color (dark red) $ rotate (0 - (rot - 0.1 * fromIntegral time)) sp = _btPos' pt
$ scale s1 s1 vel = _btVel' pt
$ polygon $ rectNSWE (siz2) (-siz2) (-siz2) (siz2) ep = sp +.+ vel
glow = onLayerL [levelInt,0] $ uncurry translate ep size = _btWidth' pt
$ color (withAlpha 0.01 red) mvPt = Just $ pt & btTimer' -~ 1
$ circleSolid 30 & btPos' .~ ep
sc = (*) 2 $ log $ 1 + fromIntegral time / 20 & btPassThrough' .~ Nothing
s1 = (*) 2 $ log $ 2 + fromIntegral time / 40 & btVel' .~ 0.8 *.* vel
s2 = 0.5 * (sc + s1) damcrs = foldr ($) w $ map dodam $ filter closeCrs $ IM.elems $ _creatures w
thepicture = pictures [pic , piu , pi2 , glow] closeCrs cr = dist ep (_crPos cr) < _crRad cr + size
pi2 = onLayerL [levelInt,2] $ uncurry translate ep dodam cr = over (creatures . ix (_crID cr) . crState . crDamage)
$ color (mixColors (fromIntegral (max 0 (time-2))) (10-fromIntegral time) ((:) $ Flaming 3 sp ep ep)
orange (dark red)
)
$ rotate (0 - (rot + 0.2 * fromIntegral time))
$ scale s2 s2
$ polygon $ rectNSWE (siz2) (-siz2) (-siz2) (siz2)
doFlameDam :: Int -> Particle' -> Point2 -> Creature -> World -> World doFlameDam :: Int -> Particle' -> Point2 -> Creature -> World -> World