Files
loop/src/Dodge/Payload.hs
T
2025-08-05 08:30:57 +01:00

46 lines
1.3 KiB
Haskell

{-# LANGUAGE LambdaCase #-}
module Dodge.Payload (
usePayload,
) where
import Dodge.Item.Weapon.Bullet
import RandomHelp
import Control.Monad
import Color
import Dodge.WorldEvent.Shockwave
import Dodge.Data.World
import Dodge.SoundLogic
import Dodge.WorldEvent.Explosion
import Geometry.Data
import LensHelp
import Linear.V3
usePayload :: Payload -> Point3 -> Point3 -> World -> World
usePayload = \case
ExplosionPayload -> makeExplosionAt
ShrapnelBomb -> makeShrapnelAt
DudPayload -> const (const id)
makeShrapnelAt :: Point3 -> Point3 -> World -> World
makeShrapnelAt p' vel' w =
w
& soundMultiFrom [Explosion 0, Explosion 1] p bangS Nothing
& cWorld . lWorld . worldEvents
.:~ MakeTempLight (LSParam p' 150 (V3 0.8 0.8 0.8)) 20
& makeShockwaveAt [] p' 50 5 0 white
& cWorld . lWorld . bullets .++~ buls
where
p = p' ^. _xy
v = vel' ^. _xy
vs = replicateM 75 (randInCirc 10) & evalState $ _randGen w
drags :: [Float]
drags = replicateM 75 (state $ randomR (0.85,0.9)) & evalState $ _randGen w
buls = zipWith f vs drags
f v' drag = defaultBullet
& buPayload .~ BulPlain 10
& buEffect .~ BounceBullet
& buVel .~ v + v'
& buDrag .~ drag
& buPos .~ (p - v)
& buOldPos .~ (p - v)