module Dodge.Projectile.Create where import Dodge.Data.World import Geometry import qualified IntMapHelp as IM import LensHelp createProjectile :: ProjectileCreate -> Item -> Creature -> World -> World createProjectile pt = case pt of CreateShell -> fireShell CreateTrackingShell -> fireTrackingShell fireShell :: Item -> Creature -> World -> World fireShell it cr = makeShell it cr [ PJShellCollisionCheck , PJDecTimMvVel , PJSpin 335 (_crID cr) spinamount , PJThrust (350 - thrustdelay) 0 , PJReduceSpin (1 - fromIntegral spindrag * 2 / 200) ] where params = _itParams it spindrag = _shellSpinDrag params spinamount = _shellSpinAmount params thrustdelay = _shellThrustDelay params makeShell :: Item -> Creature -> [ProjectileUpdate] -> World -> World makeShell it cr theupdate w = w & cWorld . lWorld . projectiles . at i ?~ Shell { _prjPos = pos , _prjZ = 20 , _prjStartPos = pos , _prjVel = rotateV dir (V2 1 0) , _prjDraw = DrawShell , _prjID = i , _prjAcc = rotateV dir (V2 3 0) , _prjDir = dir , _prjSpin = 0 , _prjPayload = _amPayload $ _laAmmoType am , _prjTimer = 350 , _prjUpdates = theupdate , _prjMITID = Just $ _itID it } where i = IM.newKey $ w ^. cWorld . lWorld . props-- _props (_cWorld w) dir = _crDir cr pos = _crPos cr +.+ rotateV dir (V2 (_crRad cr + 1) 0) am = _heldConsumption $ _itUse it fireTrackingShell :: Item -> Creature -> World -> World fireTrackingShell it cr = makeShell it cr [ PJRemoteShellCollisionCheck , PJDecTimMvVel , PJSpin 335 (_crID cr) spinamount , PJTrack (350 - thrustdelay) 0 (_itID it) , PJThrust (350 - thrustdelay) 0 , PJReduceSpin (1 - fromIntegral spindrag * 2 / 200) ] where spinamount = _shellSpinAmount params thrustdelay = _shellThrustDelay params spindrag = _shellSpinDrag params params = _itParams it