module Dodge.Projectile.Create ( createShell, PJStabiliser (..), ) where --import Dodge.Data.ComposedItem --import Dodge.Data.DoubleTree import qualified Quaternion as Q import Dodge.Data.Muzzle import Data.Maybe import Dodge.Data.World import Dodge.Item.Location import Geometry import qualified IntMapHelp as IM import LensHelp import NewInt data PJStabiliser = StabOrthReduce | StabSpinIncrease -- assumes the mscreen is in your inventory createShell :: (Point3, Q.Quaternion Float) -> Maybe (NewInt ItmInt) -> Maybe (NewInt ItmInt) -> Maybe PJStabiliser -> ProjectileType -> Payload -> Muzzle -> Creature -> World -> World createShell (p,q) mdetonator mscreen stab pjtype payload muz cr w = w & updatescreen & updatedetonator & cWorld . lWorld . projectiles . at i ?~ Shell { _pjPos = pos , _pjZ = 20 , _pjZVel = 5 , _pjVel = rotateV dir (V2 speed 0) + crvelcomponent , _pjID = i , _pjDir = dir , _pjSpin = 0 , _pjSpinFactor = spinfactor , _pjPayload = payload , _pjTimer = lifespan , _pjUpdates = anyspin <> [ RemoteDirectionPU (lifespan - thrustdelay) 0 ] <> thrustorgrav , _pjType = pjtype , _pjDetonatorID = mdetonator , _pjScreenID = mscreen } where crvelcomponent = case stab of Just StabOrthReduce -> projV (cr ^. crPos - cr ^. crOldPos) (unitVectorAtAngle dir) _ -> cr ^. crPos - cr ^. crOldPos anyspin = case stab of Just StabOrthReduce -> [] Just StabSpinIncrease -> [StartSpinPU (lifespan - 15) (_crID cr) 4] _ -> [StartSpinPU (lifespan - 15) (_crID cr) 2] spinfactor = case stab of Just StabOrthReduce -> 0 Just StabSpinIncrease -> 2 _ -> 1 speed = case pjtype of Grenade{} -> 4 Rocket{} -> 1 RetiredProjectile -> 0 lifespan = 350 thrustorgrav = case pjtype of Grenade{} -> [] Rocket{} -> [ThrustPU (lifespan - thrustdelay) 0] RetiredProjectile -> [] thrustdelay = 20 updatedetonator = fromMaybe id $ do screenid <- mdetonator return $ pointerToItemID screenid . itUse . uaParams . apProjectiles .:~ i updatescreen = fromMaybe id $ do screenid <- mscreen return $ pointerToItemID screenid . itUse . uaParams . apProjectiles .:~ i i = IM.newKey $ w ^. cWorld . lWorld . projectiles dir = _crDir cr + _mzRot muz pos = _crPos cr + xyV3 p + rotateV dir (_mzPos muz)