Add PlasmaBalls
This commit is contained in:
+39
-15
@@ -277,6 +277,7 @@ functionalUpdate =
|
||||
. over uvWorld updateFlames
|
||||
. over uvWorld updateShockwaves
|
||||
. over uvWorld updateBullets
|
||||
. over uvWorld updatePlasmaBalls
|
||||
. over uvWorld updateDebris
|
||||
. over uvWorld updateEnergyBalls -- energybs can be created by bullets,
|
||||
-- so should probably be updated before bullets
|
||||
@@ -481,17 +482,13 @@ updatePulseLasers w = f w & cWorld . lWorld . pulseLasers .~ pzs
|
||||
where
|
||||
(Endo f, pzs) = foldMap updatePulseLaser (w ^. cWorld . lWorld . pulseLasers)
|
||||
|
||||
updatePulseBall :: PulseBall -> World -> World
|
||||
updatePulseBall pb w
|
||||
| Just (_, ecrwl) <- thit =
|
||||
w & cWorld . lWorld . pulseBalls . at (pb ^. pbID) .~ Nothing
|
||||
& cWorld . lWorld %~ dodam ecrwl
|
||||
| pb ^. pbTimer <= 0 =
|
||||
w & cWorld . lWorld . pulseBalls . at (pb ^. pbID) .~ Nothing
|
||||
| otherwise =
|
||||
w & cWorld . lWorld . pulseBalls . ix (pb ^. pbID) . pbTimer -~ 1
|
||||
& cWorld . lWorld . pulseBalls . ix (pb ^. pbID) . pbPos .~ ep
|
||||
& pbFlicker pb
|
||||
updatePlasmaBall :: World -> PlasmaBall -> (World, Maybe PlasmaBall)
|
||||
updatePlasmaBall w pb
|
||||
| Just (_, ecrwl) <- thit = ( w
|
||||
& cWorld . lWorld %~ dodam ecrwl, Nothing)
|
||||
| norm (pb ^. pbVel) <= 0 = (w, Nothing)
|
||||
| otherwise = ( w -- flicker?
|
||||
, Just $ pb & pbPos .~ ep )
|
||||
where
|
||||
dodam = \case
|
||||
Left cr -> creatures . ix (_crID cr) . crDamage .:~ thedam
|
||||
@@ -501,12 +498,32 @@ updatePulseBall pb w
|
||||
ep = sp + pb ^. pbVel
|
||||
thit = thingHit sp ep w
|
||||
|
||||
updatePulseBall :: PulseBall -> World -> World
|
||||
updatePulseBall pb w
|
||||
| Just (_, ecrwl) <- thit =
|
||||
w & cWorld . lWorld . pulseBalls . at (pb ^. pzbID) .~ Nothing
|
||||
& cWorld . lWorld %~ dodam ecrwl
|
||||
| pb ^. pzbTimer <= 0 =
|
||||
w & cWorld . lWorld . pulseBalls . at (pb ^. pzbID) .~ Nothing
|
||||
| otherwise =
|
||||
w & cWorld . lWorld . pulseBalls . ix (pb ^. pzbID) . pzbTimer -~ 1
|
||||
& cWorld . lWorld . pulseBalls . ix (pb ^. pzbID) . pzbPos .~ ep
|
||||
& pbFlicker pb
|
||||
where
|
||||
dodam = \case
|
||||
Left cr -> creatures . ix (_crID cr) . crDamage .:~ thedam
|
||||
Right wl -> wallDamages . at (_wlID wl) . non mempty .:~ thedam
|
||||
thedam = Lasering 100 ep (pb ^. pzbVel)
|
||||
sp = pb ^. pzbPos
|
||||
ep = sp + pb ^. pzbVel
|
||||
thit = thingHit sp ep w
|
||||
|
||||
pbFlicker :: PulseBall -> World -> World
|
||||
pbFlicker pt =
|
||||
cWorld . lWorld . lights
|
||||
.:~ LSParam (addZ 5 $ _pbPos pt) d (0.5 * xyzV4 chartreuse)
|
||||
.:~ LSParam (addZ 5 $ _pzbPos pt) d (0.5 * xyzV4 chartreuse)
|
||||
where
|
||||
d = 4 * fromIntegral (10 + abs ((_pbTimer pt `mod` 20) - 10))
|
||||
d = 4 * fromIntegral (10 + abs ((_pzbTimer pt `mod` 20) - 10))
|
||||
|
||||
zoneClouds :: World -> World
|
||||
zoneClouds w =
|
||||
@@ -605,6 +622,13 @@ updateBullets w = w' & cWorld . lWorld . bullets <>~ catMaybes ps
|
||||
mapAccumR updateBullet (w & cWorld . lWorld . bullets .~ []) $
|
||||
w ^. cWorld . lWorld . bullets
|
||||
|
||||
updatePlasmaBalls :: World -> World
|
||||
updatePlasmaBalls w = w' & cWorld . lWorld . plasmaBalls <>~ catMaybes ps
|
||||
where
|
||||
(w', ps) =
|
||||
mapAccumR updatePlasmaBall (w & cWorld . lWorld . plasmaBalls .~ []) $
|
||||
w ^. cWorld . lWorld . plasmaBalls
|
||||
|
||||
updateDebris :: World -> World
|
||||
updateDebris w = w' & cWorld . lWorld . debris <>~ catMaybes xs
|
||||
where
|
||||
@@ -665,8 +689,8 @@ updatePulseLaser pz = case pz ^. pzTimer of
|
||||
.:~ Lasering (pz ^. pzDamage) p (xp - sp)
|
||||
((_, OPulseBall pb) : xs) ->
|
||||
dodam xs
|
||||
. (cWorld . lWorld . pulseBalls . ix (_pbID pb) . pbTimer .~ 0)
|
||||
. makeExplosionAt (_pbPos pb `v2z` 20) 0
|
||||
. (cWorld . lWorld . pulseBalls . ix (_pzbID pb) . pzbTimer .~ 0)
|
||||
. makeExplosionAt (_pzbPos pb `v2z` 20) 0
|
||||
_ -> id
|
||||
phasev = _pzPhaseV pz
|
||||
sp = _pzPos pz
|
||||
|
||||
Reference in New Issue
Block a user