{-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE StrictData #-} {-# LANGUAGE TemplateHaskell #-} module Dodge.Data.ComposedItem where import Control.Lens import Data.Aeson import Data.Aeson.TH import Dodge.Data.Item import Geometry.Data import Linear.Quaternion (Quaternion (..)) data ComposeLinkType = AmmoInLink Int AmmoType | TriggerLink | AmmoModLink | AmmoTargetingLink | AmmoPayloadLink | AmmoEffectLink | WeaponScopeLink | WeaponTargetingLink | RemoteScreenLink | RemoteDetonatorLink | AugmentedHUDLink | FunctionChangeLink | MakeAutoLink deriving (Eq, Ord, Show, Read) data ItemStructuralFunction = HeldPlatformSF | EquipmentPlatformSF | GadgetPlatformSF | WeaponScopeSF | WeaponTargetingSF | TriggerSF | AugmentedHUDSF | AmmoMagSF AmmoType | RemoteScreenSF | RemoteDetonatorSF | UncomposableIsolateSF | AmmoModifierSF AmmoType | AmmoTargetingSF AmmoType | AmmoPayloadSF AmmoType | AmmoEffectSF AmmoType | FunctionChangeSF | MakeAutoSF deriving (Eq, Ord, Show, Read) type ComposedItem = (Item, ItemStructuralFunction, LinkTest) data ItemLink = ILink { _iatType :: ComposeLinkType , _iatOrient :: Item -> ComposeLinkType -> Item -> (Point3, Quaternion Float) } data LinkTest = LTest { _tryLeftLink :: ComposedItem -> Maybe LinkUpdate , _tryRightLink :: ComposedItem -> Maybe LinkUpdate } data LinkUpdate = LUpdate { _luLinkType :: ItemLink , _luParentUpdate :: ComposedItem -> ComposedItem , _luChildUpdate :: ComposedItem -> ComposedItem } makeLenses ''ItemLink makeLenses ''LinkTest makeLenses ''LinkUpdate deriveJSON defaultOptions ''ItemStructuralFunction deriveJSON defaultOptions ''ComposeLinkType