Add PlasmaBalls

This commit is contained in:
2026-03-17 10:45:58 +00:00
parent 0ca3bf33c9
commit 902d8e0c00
9 changed files with 245 additions and 172 deletions
+39 -15
View File
@@ -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