45 lines
1.3 KiB
Haskell
45 lines
1.3 KiB
Haskell
module Dodge.Payload (
|
|
usePayload,
|
|
) where
|
|
|
|
import Dodge.Item.Weapon.Bullet
|
|
import RandomHelp
|
|
import Control.Monad
|
|
import Color
|
|
import Dodge.WorldEvent.Shockwave
|
|
import Geometry.Vector3D
|
|
import Dodge.Data.World
|
|
import Dodge.SoundLogic
|
|
import Dodge.WorldEvent.Explosion
|
|
import Geometry.Data
|
|
import LensHelp
|
|
|
|
usePayload :: Payload -> Point2 -> Point2 -> World -> World
|
|
usePayload payload = case payload of
|
|
ExplosionPayload -> makeExplosionAt
|
|
ShrapnelBomb -> makeShrapnelAt
|
|
DudPayload -> const (const id)
|
|
|
|
makeShrapnelAt :: Point2 -> Point2 -> World -> World
|
|
makeShrapnelAt p v w =
|
|
w
|
|
& soundMultiFrom [Explosion 0, Explosion 1] p bangS Nothing
|
|
& cWorld . lWorld . worldEvents
|
|
.:~ MakeTempLight (LSParam (addZ 20 p) 150 (V3 0.8 0.8 0.8)) 20
|
|
& makeShockwaveAt [] p 50 5 0 white
|
|
& cWorld . lWorld . bullets .++~ buls
|
|
where
|
|
-- speed = magV v
|
|
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
|
|
& buEffect .~ BounceBullet
|
|
& buVel .~ v + v'
|
|
& buDrag .~ drag
|
|
& buPos .~ (p - v)
|
|
& buOldPos .~ (p - v)
|
|
& buDamages .~ [Damage PIERCING 10 0 0 0 $ PushBackDamage 2]
|
|
& buWidth .~ 1
|