71 lines
2.1 KiB
Haskell
71 lines
2.1 KiB
Haskell
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
|