46 lines
1.3 KiB
Haskell
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)
|