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