{-# 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)