{-# LANGUAGE StrictData #-} {-# LANGUAGE TemplateHaskell #-} module Dodge.Data.Projectile where import Control.Lens import Data.Aeson import Data.Aeson.TH import Dodge.Data.Item.Location import Dodge.Data.Wall.Structure import Geometry.Data import NewInt import Dodge.Data.Payload data Projectile = Shell { _pjPos :: Point3 , _pjVel :: Point3 , _pjDir :: Float , _pjSpin :: Float , _pjID :: Int , _pjPayload :: Payload , _pjTimer :: Int , _pjBarrelSpin :: Maybe (Int, Float) , _pjType :: ProjectileType , _pjDetonatorID :: Maybe (NewInt ItmInt) , _pjScreenID :: Maybe (NewInt ItmInt) } deriving (Eq, Ord, Show, Read) --Generic, Flat) data ProjectileType = Grenade { _gnHitEffect :: GrenadeHitEffect } | Rocket { _rkHoming :: RocketHoming , _rkSmoke :: Maybe RocketSmoke } | RetiredProjectile deriving (Eq, Ord, Show, Read) --Generic, Flat) data RocketHoming = NoHoming | HomeUsingRemoteScreen {_phRemoteID :: NewInt ItmInt} | HomeUsingTargeting {_phTargetingID :: NewInt ItmInt} deriving (Show, Eq, Ord, Read) --Generic, Flat) data GrenadeHitEffect = GBounce {_bounceTolerance :: Float} | GStick | GStuckCreature {_stuckCrID :: Int, _stuckCrOffset :: Point3, _stuckCrRot :: Float} | GStuckWall {_stuckWlID :: WallStructure} deriving (Show, Eq, Ord, Read) --Generic, Flat) data RocketSmoke = ReducedRocketSmoke deriving (Show, Eq, Ord, Read) --Generic, Flat) makeLenses ''Projectile makeLenses ''ProjectileType makeLenses ''RocketHoming makeLenses ''GrenadeHitEffect deriveJSON defaultOptions ''GrenadeHitEffect deriveJSON defaultOptions ''RocketHoming deriveJSON defaultOptions ''RocketSmoke deriveJSON defaultOptions ''ProjectileType deriveJSON defaultOptions ''Projectile