Refactor and improve flamelets
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user