diff --git a/src/Dodge/Data.hs b/src/Dodge/Data.hs index a05f208cb..52954f8cf 100644 --- a/src/Dodge/Data.hs +++ b/src/Dodge/Data.hs @@ -10,6 +10,7 @@ circular imports are probably not a good idea. {-# LANGUAGE DerivingStrategies #-} module Dodge.Data ( module Dodge.Data + , module Dodge.Data.ActionPlan , module Dodge.Data.CreatureEffect , module Dodge.Data.WorldEffect , module Dodge.Data.Button @@ -71,6 +72,7 @@ module Dodge.Data , module Dodge.Data.RadarBlip , module Dodge.Data.PathGraph ) where +import Dodge.Data.ActionPlan import Dodge.Data.CreatureEffect import Dodge.Data.WorldEffect import Dodge.Data.Button @@ -118,7 +120,6 @@ import Dodge.Data.Wall import Dodge.Data.Bounds import Dodge.RoomCluster.Data import Dodge.Data.ItemAmount -import Dodge.ShortShow import Dodge.Creature.State.Data import Dodge.Creature.Stance.Data import Dodge.Creature.Perception.Data @@ -146,7 +147,6 @@ import MaybeHelp --import qualified Data.Vector as V import qualified Linear.Quaternion as Q -import GHC.Generics import Control.Lens import Control.Monad.State import System.Random @@ -330,64 +330,12 @@ data CrGroupParams = CrGroupParams , _crGroupCenter :: Point2 , _crGroupUpdate :: World -> CrGroupParams -> Maybe CrGroupParams } -data Corpse = Corpse - { _cpID :: Int - , _cpPos :: Point2 - , _cpDir :: Float - , _cpPict :: Corpse -> SPic - , _cpRes :: Maybe Creature - } data Gust = Gust { _guID :: Int , _guPos :: Point2 , _guVel :: Point2 , _guTime :: Int } -data Creature = Creature - { _crPos :: Point2 - , _crOldPos :: Point2 - , _crVel :: Point2 - , _crDir :: Float - , _crOldDir :: Float - , _crMvDir :: Float - , _crTwist :: Float - , _crType :: CreatureType - , _crID :: Int - , _crRad :: Float - , _crMass :: Float - , _crHP :: Int - , _crMaxHP :: Int - , _crInv :: IM.IntMap Item - , _crInvSel :: InvSel - , _crInvCapacity :: Int - , _crInvLock :: Bool - , _crInvEquipped :: IM.IntMap EquipPosition - , _crEquipment :: M.Map EquipPosition Int - , _crLeftInvSel :: Maybe Int - , _crState :: CreatureState - , _crCorpse :: Creature -> Corpse -> SPic - , _crMaterial :: Material - , _crPastDamage :: Int - , _crStance :: Stance - , _crActionPlan :: ActionPlan - , _crMeleeCooldown :: Int - , _crPerception :: Perception - , _crMemory :: Memory - , _crVocalization :: Vocalization - , _crFaction :: Faction - , _crGroup :: CrGroup - , _crIntention :: Intention - , _crMvType :: CrMvType - , _crHammerPosition :: HammerPosition - , _crName :: String - , _crStatistics :: CreatureStatistics - , _crCamouflage :: CamouflageStatus - } -data Intention = Intention - { _targetCr :: Maybe Creature - , _mvToPoint :: Maybe Point2 - , _viewPoint :: Maybe Point2 - } data TerminalLine = TerminalLineDisplay {_tlPause :: Int @@ -662,302 +610,6 @@ data MountedObject | MountedProp Int deriving (Eq,Ord,Show) -data ActionPlan - = Inanimate - | ActionPlan - {_apImpulse :: [Impulse] - ,_apAction :: [Action] - ,_apStrategy :: Strategy - ,_apGoal :: [Goal] - } -data RandImpulse = RandImpulseList [Impulse] -data Impulse - = Move Point2 - | MoveForward Float - | Turn Float - | RandomTurn Float - | RandomImpulse (State StdGen Impulse) - | TurnToward Point2 Float - | MvTurnToward Point2 - | MvForward - | TurnTo Point2 - | UseItem - | SwitchToItem Int - | DropItem - | Bark SoundID -- placeholder for various communication types - | Melee Int - | ChangePosture Posture - | MakeSound SoundID - | ChangeStrategy Strategy - | AddGoal Goal - | ArbitraryImpulseFunction WdCrCr - | ArbitraryImpulse CrWdImp - | ArbitraryImpulseEffect CrWdWd - | ImpulseUseTargetCID - {_impulseUseTargetCID :: IntImp - } - | ImpulseUseTarget - {_impulseUseTarget :: CrImp - } - | ImpulseUseAheadPos - {_impulseUseAheadPos :: P2Imp - } - | ImpulseNothing -instance Show Impulse where - show imp = case imp of - Move p -> "Move "++shortPoint2 p - MoveForward f -> "MoveForward "++ show f - Turn f -> "Turn "++show f - RandomTurn f -> "RandomTurn "++show f - TurnToward p f -> "TurnToward "++shortPoint2 p++show f - MvTurnToward p -> "MvTurnToward "++shortPoint2 p - MvForward -> "MvForward" - TurnTo p -> "TurnTo "++shortPoint2 p - UseItem -> "UseItem" - SwitchToItem i -> "SwitchToItem "++show i - DropItem -> "DropItem" - Bark sid -> "Bark "++show sid - Melee i -> "Melee "++show i - ChangePosture post -> "ChangePosture " ++ show post - MakeSound sid -> "MakeSound " ++ show sid - ChangeStrategy s -> "ChangeStrategy " ++ show s - AddGoal g -> "AddGoal " ++ show g - ArbitraryImpulseFunction {} -> "ArbitraryImpulseFunction" - ArbitraryImpulse {} -> "ArbitraryImpulse" - ArbitraryImpulseEffect {} -> "ArbitraryImpulseEffect" - ImpulseUseTargetCID {} -> "ImpulseUseTargetCID" - ImpulseUseTarget {} -> "ImpulseUseTarget" - ImpulseUseAheadPos {} -> "ImpulseUseAheadPos" - RandomImpulse {} -> "RandomImpulse" - ImpulseNothing -> "ImpulseNothing" --- deriving (Eq,Ord,Show) -infixr 9 `WaitThen` -infixr 9 `DoActionThen` -infixr 9 `DoActionWhile` -infixr 9 `DoReplicate` -infixr 9 `DoImpulsesAlongside` -data Action - = LabelAction - {_actLabel :: String - ,_actAction :: Action - } - | ActionNothing - | AimAt - {_targetID :: Int - ,_targetSeenAt :: Point2 - } - | PathTo - {_pathToPoint :: Point2 - } - | TurnToPoint - {_turnToPoint :: Point2 - } --- | PickupItem --- {_pickupItemID :: Int --- } - | ImpulsesList - {_impulsesListList :: [[Impulse]] - } - | DoImpulses - {_doImpulsesList :: [Impulse] - } - | WaitThen - {_waitThenTimer :: Int - ,_waitThenAction :: Action - } - | DoActionWhile - {_doActionWhileCondition :: WdCrBl - ,_doActionWhileAction :: Action - } - | DoActionWhilePartial - {_doActionWhilePartial :: Action - ,_doActionWhileCondition :: WdCrBl - ,_doActionWhileAction :: Action - } - | DoActionIf - {_doActionIfCondition :: WdCrBl - ,_doActionIfAction :: Action - } - | DoActionIfElse - {_doActionIfElseIfAction :: Action - ,_doActionIfElseCondition :: WdCrBl - ,_doActionIfElseElseAction :: Action - } - | DoActionWhileInterrupt - {_doActionWhileThenDo :: Action - ,_doActionWhileThenCondition :: WdCrBl - ,_doActionWhileThenThen :: Action - } - | DoActions - {_doActionsList :: [Action] - } - | DoActionThen - {_doActionThenFirst :: Action - ,_doActionThenSecond :: Action - } --- | DoGuardActions --- {_doGuardActionsList :: [( (World, Creature) -> Bool, Action, Maybe Action)] --- } - | DoReplicate - {_doReplicateTimes :: Int - ,_doReplicateAction :: Action - } - | DoReplicatePartial - {_partialAction :: Action - ,_doReplicateTimes :: Int - ,_doReplicateAction :: Action - } - | LeadTarget - {_leadTargetBy :: Point2 - } - | NoAction - | StartSentinelPost - | UseTarget - {_useTarget :: MCrAc - } - | UseSelf - {_useSelf :: CrAc - } - | UseAheadPos - {_useAheadPos :: P2Ac - } - | UseMvTargetPos - {_useMvTargetPos :: MP2Ac - } - | ArbitraryAction - { _arbitraryAction :: CrWdAc } - | DoImpulsesAlongside - -- ^ Repeatedly perform impulses alongside a main action until the main action terminates - {_sideImpulses :: [Impulse] - ,_mainAction :: Action - } - deriving (Generic) -instance Show Action where - show act = case act of - ActionNothing -> "ActionNothing" - LabelAction - {_actLabel = str - ,_actAction = subAct - } -> str++":"++show subAct - AimAt - {_targetID = tid - ,_targetSeenAt = p - } -> "AimAt tid:"++show tid++" seenAt:"++shortPoint2 p - PathTo - {_pathToPoint = p - } -> "PathTo:"++shortPoint2 p - TurnToPoint - {_turnToPoint = p - } -> "TurnToPoint:"++shortPoint2 p ----- | PickupItem ----- {_pickupItemID :: Int ----- } - ImpulsesList - {_impulsesListList = iss - } -> "ImpulsesList:"++show iss - DoImpulses - {_doImpulsesList = is - } -> "DoImpulses:"++show is - WaitThen - {_waitThenTimer = i - ,_waitThenAction = a - } -> "WaitThen timer:"++show i++" act:"++show a - DoActionWhile - {_doActionWhileCondition = _ - ,_doActionWhileAction = a - } -> "DoActionWhile (function) act:"++show a - DoActionWhilePartial - {_doActionWhilePartial = partact - ,_doActionWhileCondition = _ - ,_doActionWhileAction = a - } -> "DoActionWhilePartial partAct:"++show partact++" resetAct:"++show a - DoActionIf - {_doActionIfCondition = _ - ,_doActionIfAction = a - } -> "DoActionIf act:"++show a - DoActionIfElse - {_doActionIfElseIfAction = ifa - ,_doActionIfElseCondition = _ - ,_doActionIfElseElseAction = elsea - } -> "DoActionIfElse ifa:"++show ifa++" elsea:"++show elsea - DoActionWhileInterrupt - {_doActionWhileThenDo = whilea - ,_doActionWhileThenCondition = _ - ,_doActionWhileThenThen = thena - } -> "DoActionWhileInterrupt whilea:" ++show whilea++" interrupta:"++show thena - DoActions - {_doActionsList = as - } -> "DoActions " ++ foldMap show as - DoActionThen - {_doActionThenFirst = a1 - ,_doActionThenSecond = a2 - } -> "DoActionThen " ++ show a1 ++ " then:" ++ show a2 ----- | DoGuardActions ----- {_doGuardActionsList :: [( (World, Creature) -> Bool, Action, Maybe Action)] ----- } - DoReplicate - {_doReplicateTimes = i - ,_doReplicateAction = a - } -> "DoReplicate times:" ++ show i ++ " act:"++ show a - DoReplicatePartial - {_partialAction = pa - ,_doReplicateTimes = i - ,_doReplicateAction = ra - } -> "DoReplicatePartial pa:" ++ show pa ++ " times:" ++ show i ++ " reset:"++ show ra - LeadTarget - {_leadTargetBy = p - } -> "LeadTarget by:"++ show p - NoAction -> "NoAction" - StartSentinelPost -> "StartSentinelPost" - UseTarget - {_useTarget = _ - } -> "UseTarget func" - UseSelf - {_useSelf = _ - } -> "UseSelf func" - UseAheadPos - {_useAheadPos = _ - } -> "UseAheadPos func" - UseMvTargetPos - {_useMvTargetPos = _ - } -> "UseMvTargetPos func" - ArbitraryAction {} -> "ArbitraryAction func" - DoImpulsesAlongside - {_sideImpulses = is - ,_mainAction = a - } -> "DoImpulsesAlongside sideImpulses:"++show is ++ " mainA:"++show a - --- deriving (Eq,Ord,Show) -data Strategy - = Flank Int - | Ambush Int - | Lure Int Point2 - | Patrol [Point2] - | ShootAt Int - | FollowImpulses - | WatchAndWait - | WarningCry - | LookAround - | CloseToMelee Int - | StrategyActions Strategy [Action] - | GetTo Point2 - | Reload - | Flee - | MeleeStrike - deriving (Generic,Show) --- deriving (Eq,Ord,Show) -data Goal - = LiveLongAndProsper - | Kill Int - | SentinelAt Point2 Float - deriving (Show) - -data CreatureState = CrSt - { _csDamage :: [Damage] - , _csSpState :: CrSpState - , _csDropsOnDeath :: CreatureDropType - } - data EffectArguments = NoArguments {_cmdEffect :: [TerminalLine]} | OneArgument @@ -1070,8 +722,6 @@ data InPlacement = InPlacement { _ipPlacement :: [Placement] -> Placement , _ipPlacementID :: Int } - -makeLenses ''CreatureState makeLenses ''World makeLenses ''Creature makeLenses ''FloorItem @@ -1080,9 +730,6 @@ makeLenses ''Proj makeLenses ''Modification makeLenses ''Particle makeLenses ''PressPlate -makeLenses ''ActionPlan -makeLenses ''Impulse -makeLenses ''Action makeLenses ''CrGroupParams makeLenses ''Intention makeLenses ''Door diff --git a/src/Dodge/Data/ActionPlan.hs b/src/Dodge/Data/ActionPlan.hs index 7da669f6b..58bd35c29 100644 --- a/src/Dodge/Data/ActionPlan.hs +++ b/src/Dodge/Data/ActionPlan.hs @@ -1 +1,305 @@ +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE StrictData #-} +{-# LANGUAGE DeriveGeneric #-} module Dodge.Data.ActionPlan where +import Dodge.Creature.Stance.Data +import Dodge.Data.CreatureEffect +import Dodge.ShortShow +import Control.Lens +import Geometry.Data +import Control.Monad.State +import System.Random +import Sound.Data +import GHC.Generics +data ActionPlan + = Inanimate + | ActionPlan + {_apImpulse :: [Impulse] + ,_apAction :: [Action] + ,_apStrategy :: Strategy + ,_apGoal :: [Goal] + } +data RandImpulse = RandImpulseList [Impulse] +data Impulse + = Move Point2 + | MoveForward Float + | Turn Float + | RandomTurn Float + | RandomImpulse (State StdGen Impulse) + | TurnToward Point2 Float + | MvTurnToward Point2 + | MvForward + | TurnTo Point2 + | UseItem + | SwitchToItem Int + | DropItem + | Bark SoundID -- placeholder for various communication types + | Melee Int + | ChangePosture Posture + | MakeSound SoundID + | ChangeStrategy Strategy + | AddGoal Goal + | ArbitraryImpulseFunction WdCrCr + | ArbitraryImpulse CrWdImp + | ArbitraryImpulseEffect CrWdWd + | ImpulseUseTargetCID + {_impulseUseTargetCID :: IntImp + } + | ImpulseUseTarget + {_impulseUseTarget :: CrImp + } + | ImpulseUseAheadPos + {_impulseUseAheadPos :: P2Imp + } + | ImpulseNothing +instance Show Impulse where + show imp = case imp of + Move p -> "Move "++shortPoint2 p + MoveForward f -> "MoveForward "++ show f + Turn f -> "Turn "++show f + RandomTurn f -> "RandomTurn "++show f + TurnToward p f -> "TurnToward "++shortPoint2 p++show f + MvTurnToward p -> "MvTurnToward "++shortPoint2 p + MvForward -> "MvForward" + TurnTo p -> "TurnTo "++shortPoint2 p + UseItem -> "UseItem" + SwitchToItem i -> "SwitchToItem "++show i + DropItem -> "DropItem" + Bark sid -> "Bark "++show sid + Melee i -> "Melee "++show i + ChangePosture post -> "ChangePosture " ++ show post + MakeSound sid -> "MakeSound " ++ show sid + ChangeStrategy s -> "ChangeStrategy " ++ show s + AddGoal g -> "AddGoal " ++ show g + ArbitraryImpulseFunction {} -> "ArbitraryImpulseFunction" + ArbitraryImpulse {} -> "ArbitraryImpulse" + ArbitraryImpulseEffect {} -> "ArbitraryImpulseEffect" + ImpulseUseTargetCID {} -> "ImpulseUseTargetCID" + ImpulseUseTarget {} -> "ImpulseUseTarget" + ImpulseUseAheadPos {} -> "ImpulseUseAheadPos" + RandomImpulse {} -> "RandomImpulse" + ImpulseNothing -> "ImpulseNothing" +-- deriving (Eq,Ord,Show) +infixr 9 `WaitThen` +infixr 9 `DoActionThen` +infixr 9 `DoActionWhile` +infixr 9 `DoReplicate` +infixr 9 `DoImpulsesAlongside` +data Action + = LabelAction + {_actLabel :: String + ,_actAction :: Action + } + | ActionNothing + | AimAt + {_targetID :: Int + ,_targetSeenAt :: Point2 + } + | PathTo + {_pathToPoint :: Point2 + } + | TurnToPoint + {_turnToPoint :: Point2 + } +-- | PickupItem +-- {_pickupItemID :: Int +-- } + | ImpulsesList + {_impulsesListList :: [[Impulse]] + } + | DoImpulses + {_doImpulsesList :: [Impulse] + } + | WaitThen + {_waitThenTimer :: Int + ,_waitThenAction :: Action + } + | DoActionWhile + {_doActionWhileCondition :: WdCrBl + ,_doActionWhileAction :: Action + } + | DoActionWhilePartial + {_doActionWhilePartial :: Action + ,_doActionWhileCondition :: WdCrBl + ,_doActionWhileAction :: Action + } + | DoActionIf + {_doActionIfCondition :: WdCrBl + ,_doActionIfAction :: Action + } + | DoActionIfElse + {_doActionIfElseIfAction :: Action + ,_doActionIfElseCondition :: WdCrBl + ,_doActionIfElseElseAction :: Action + } + | DoActionWhileInterrupt + {_doActionWhileThenDo :: Action + ,_doActionWhileThenCondition :: WdCrBl + ,_doActionWhileThenThen :: Action + } + | DoActions + {_doActionsList :: [Action] + } + | DoActionThen + {_doActionThenFirst :: Action + ,_doActionThenSecond :: Action + } +-- | DoGuardActions +-- {_doGuardActionsList :: [( (World, Creature) -> Bool, Action, Maybe Action)] +-- } + | DoReplicate + {_doReplicateTimes :: Int + ,_doReplicateAction :: Action + } + | DoReplicatePartial + {_partialAction :: Action + ,_doReplicateTimes :: Int + ,_doReplicateAction :: Action + } + | LeadTarget + {_leadTargetBy :: Point2 + } + | NoAction + | StartSentinelPost + | UseTarget + {_useTarget :: MCrAc + } + | UseSelf + {_useSelf :: CrAc + } + | UseAheadPos + {_useAheadPos :: P2Ac + } + | UseMvTargetPos + {_useMvTargetPos :: MP2Ac + } + | ArbitraryAction + { _arbitraryAction :: CrWdAc } + | DoImpulsesAlongside + -- ^ Repeatedly perform impulses alongside a main action until the main action terminates + {_sideImpulses :: [Impulse] + ,_mainAction :: Action + } + deriving (Generic) +instance Show Action where + show act = case act of + ActionNothing -> "ActionNothing" + LabelAction + {_actLabel = str + ,_actAction = subAct + } -> str++":"++show subAct + AimAt + {_targetID = tid + ,_targetSeenAt = p + } -> "AimAt tid:"++show tid++" seenAt:"++shortPoint2 p + PathTo + {_pathToPoint = p + } -> "PathTo:"++shortPoint2 p + TurnToPoint + {_turnToPoint = p + } -> "TurnToPoint:"++shortPoint2 p +---- | PickupItem +---- {_pickupItemID :: Int +---- } + ImpulsesList + {_impulsesListList = iss + } -> "ImpulsesList:"++show iss + DoImpulses + {_doImpulsesList = is + } -> "DoImpulses:"++show is + WaitThen + {_waitThenTimer = i + ,_waitThenAction = a + } -> "WaitThen timer:"++show i++" act:"++show a + DoActionWhile + {_doActionWhileCondition = _ + ,_doActionWhileAction = a + } -> "DoActionWhile (function) act:"++show a + DoActionWhilePartial + {_doActionWhilePartial = partact + ,_doActionWhileCondition = _ + ,_doActionWhileAction = a + } -> "DoActionWhilePartial partAct:"++show partact++" resetAct:"++show a + DoActionIf + {_doActionIfCondition = _ + ,_doActionIfAction = a + } -> "DoActionIf act:"++show a + DoActionIfElse + {_doActionIfElseIfAction = ifa + ,_doActionIfElseCondition = _ + ,_doActionIfElseElseAction = elsea + } -> "DoActionIfElse ifa:"++show ifa++" elsea:"++show elsea + DoActionWhileInterrupt + {_doActionWhileThenDo = whilea + ,_doActionWhileThenCondition = _ + ,_doActionWhileThenThen = thena + } -> "DoActionWhileInterrupt whilea:" ++show whilea++" interrupta:"++show thena + DoActions + {_doActionsList = as + } -> "DoActions " ++ foldMap show as + DoActionThen + {_doActionThenFirst = a1 + ,_doActionThenSecond = a2 + } -> "DoActionThen " ++ show a1 ++ " then:" ++ show a2 +---- | DoGuardActions +---- {_doGuardActionsList :: [( (World, Creature) -> Bool, Action, Maybe Action)] +---- } + DoReplicate + {_doReplicateTimes = i + ,_doReplicateAction = a + } -> "DoReplicate times:" ++ show i ++ " act:"++ show a + DoReplicatePartial + {_partialAction = pa + ,_doReplicateTimes = i + ,_doReplicateAction = ra + } -> "DoReplicatePartial pa:" ++ show pa ++ " times:" ++ show i ++ " reset:"++ show ra + LeadTarget + {_leadTargetBy = p + } -> "LeadTarget by:"++ show p + NoAction -> "NoAction" + StartSentinelPost -> "StartSentinelPost" + UseTarget + {_useTarget = _ + } -> "UseTarget func" + UseSelf + {_useSelf = _ + } -> "UseSelf func" + UseAheadPos + {_useAheadPos = _ + } -> "UseAheadPos func" + UseMvTargetPos + {_useMvTargetPos = _ + } -> "UseMvTargetPos func" + ArbitraryAction {} -> "ArbitraryAction func" + DoImpulsesAlongside + {_sideImpulses = is + ,_mainAction = a + } -> "DoImpulsesAlongside sideImpulses:"++show is ++ " mainA:"++show a + +-- deriving (Eq,Ord,Show) +data Strategy + = Flank Int + | Ambush Int + | Lure Int Point2 + | Patrol [Point2] + | ShootAt Int + | FollowImpulses + | WatchAndWait + | WarningCry + | LookAround + | CloseToMelee Int + | StrategyActions Strategy [Action] + | GetTo Point2 + | Reload + | Flee + | MeleeStrike + deriving (Generic,Show) +-- deriving (Eq,Ord,Show) +data Goal + = LiveLongAndProsper + | Kill Int + | SentinelAt Point2 Float + deriving (Show) +makeLenses ''ActionPlan +makeLenses ''Impulse +makeLenses ''Action diff --git a/src/Dodge/Data/Creature.hs b/src/Dodge/Data/Creature.hs index de79b406e..e2aff4114 100644 --- a/src/Dodge/Data/Creature.hs +++ b/src/Dodge/Data/Creature.hs @@ -2,53 +2,74 @@ {-# LANGUAGE StrictData #-} module Dodge.Data.Creature ( module Dodge.Data.Creature - , module Dodge.Data.CamouflageStatus + , module Dodge.Data.Creature.Misc + , module Dodge.Data.Creature.State ) where -import Dodge.Data.CamouflageStatus -import Sound.Data +import Dodge.Data.Creature.Misc +import Dodge.Data.Creature.State +import Dodge.Data.Item +import Dodge.Data.LoadAction +import Dodge.Data.Material +import Dodge.Data.ActionPlan +import Dodge.Data.Hammer +import Dodge.Creature.Perception.Data +import Dodge.Creature.Memory.Data +import Dodge.Creature.Stance.Data +import Dodge.Creature.State.Data +import Dodge.Equipment.Data +import ShapePicture import Geometry.Data -import Color -import Control.Lens -data CreatureStatistics = CreatureStatistics - { _strength :: Int - , _dexterity :: Int - , _intelligence :: Int +import qualified IntMapHelp as IM +import qualified Data.Map.Strict as M +data Creature = Creature + { _crPos :: Point2 + , _crOldPos :: Point2 + , _crVel :: Point2 + , _crDir :: Float + , _crOldDir :: Float + , _crMvDir :: Float + , _crTwist :: Float + , _crType :: CreatureType + , _crID :: Int + , _crRad :: Float + , _crMass :: Float + , _crHP :: Int + , _crMaxHP :: Int + , _crInv :: IM.IntMap Item + , _crInvSel :: InvSel + , _crInvCapacity :: Int + , _crInvLock :: Bool + , _crInvEquipped :: IM.IntMap EquipPosition + , _crEquipment :: M.Map EquipPosition Int + , _crLeftInvSel :: Maybe Int + , _crState :: CreatureState + , _crCorpse :: Creature -> Corpse -> SPic + , _crMaterial :: Material + , _crPastDamage :: Int + , _crStance :: Stance + , _crActionPlan :: ActionPlan + , _crMeleeCooldown :: Int + , _crPerception :: Perception + , _crMemory :: Memory + , _crVocalization :: Vocalization + , _crFaction :: Faction + , _crGroup :: CrGroup + , _crIntention :: Intention + , _crMvType :: CrMvType + , _crHammerPosition :: HammerPosition + , _crName :: String + , _crStatistics :: CreatureStatistics + , _crCamouflage :: CamouflageStatus + } +data Corpse = Corpse + { _cpID :: Int + , _cpPos :: Point2 + , _cpDir :: Float + , _cpPict :: Corpse -> SPic + , _cpRes :: Maybe Creature + } +data Intention = Intention + { _targetCr :: Maybe Creature + , _mvToPoint :: Maybe Point2 + , _viewPoint :: Maybe Point2 } - deriving (Eq,Ord,Show) -data Vocalization - = Mute - | Vocalization - {_vcSound :: SoundID - ,_vcWarnings :: [SoundID] - ,_vcMaxCoolDown :: Int - ,_vcCoolDown :: Int - } - deriving (Eq,Ord,Show) -data CrMvType - = NoMvType - | MvWalking { _mvSpeed :: Float } - | CrMvType - { _mvSpeed :: Float - , _mvTurnRad :: Float -> Float - , _mvTurnJit :: Float - , _mvAimSpeed :: Float -> Float - } -data HumanoidAI = YourAI | ChaseAI | InanimateAI | SpreadGunAI | PistolAI - | LtAutoAI | LauncherAI | SwarmAI | AutoAI | FlockArmourChaseAI | MiniGunAI - | LongAI | MultGunAI -data CreatureType - = Humanoid - { _skinHead :: Color - , _skinUpper :: Color - , _skinLower :: Color - , _humanoidAI :: HumanoidAI - } - | Barreloid {_barrelType :: BarrelType} - | Lampoid {_lampHeight :: Float, _lampColor :: Point3, _lampLSID :: Maybe Int} - | Turretoid - | NonDrawnCreature -data BarrelType = PlainBarrel | ExplosiveBarrel -makeLenses ''CreatureStatistics -makeLenses ''Vocalization -makeLenses ''CrMvType -makeLenses ''CreatureType diff --git a/src/Dodge/Data/Creature/Misc.hs b/src/Dodge/Data/Creature/Misc.hs new file mode 100644 index 000000000..ca8b4d75e --- /dev/null +++ b/src/Dodge/Data/Creature/Misc.hs @@ -0,0 +1,54 @@ +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE StrictData #-} +module Dodge.Data.Creature.Misc + ( module Dodge.Data.Creature.Misc + , module Dodge.Data.CamouflageStatus + ) where +import Dodge.Data.CamouflageStatus +import Sound.Data +import Geometry.Data +import Color +import Control.Lens +data CreatureStatistics = CreatureStatistics + { _strength :: Int + , _dexterity :: Int + , _intelligence :: Int + } + deriving (Eq,Ord,Show) +data Vocalization + = Mute + | Vocalization + {_vcSound :: SoundID + ,_vcWarnings :: [SoundID] + ,_vcMaxCoolDown :: Int + ,_vcCoolDown :: Int + } + deriving (Eq,Ord,Show) +data CrMvType + = NoMvType + | MvWalking { _mvSpeed :: Float } + | CrMvType + { _mvSpeed :: Float + , _mvTurnRad :: Float -> Float + , _mvTurnJit :: Float + , _mvAimSpeed :: Float -> Float + } +data HumanoidAI = YourAI | ChaseAI | InanimateAI | SpreadGunAI | PistolAI + | LtAutoAI | LauncherAI | SwarmAI | AutoAI | FlockArmourChaseAI | MiniGunAI + | LongAI | MultGunAI +data CreatureType + = Humanoid + { _skinHead :: Color + , _skinUpper :: Color + , _skinLower :: Color + , _humanoidAI :: HumanoidAI + } + | Barreloid {_barrelType :: BarrelType} + | Lampoid {_lampHeight :: Float, _lampColor :: Point3, _lampLSID :: Maybe Int} + | Turretoid + | NonDrawnCreature +data BarrelType = PlainBarrel | ExplosiveBarrel +makeLenses ''CreatureStatistics +makeLenses ''Vocalization +makeLenses ''CrMvType +makeLenses ''CreatureType diff --git a/src/Dodge/Data/Creature/State.hs b/src/Dodge/Data/Creature/State.hs new file mode 100644 index 000000000..f2c98c611 --- /dev/null +++ b/src/Dodge/Data/Creature/State.hs @@ -0,0 +1,13 @@ +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE StrictData #-} +module Dodge.Data.Creature.State where +import Dodge.Data.Damage +import Dodge.Creature.State.Data +import Control.Lens + +data CreatureState = CrSt + { _csDamage :: [Damage] + , _csSpState :: CrSpState + , _csDropsOnDeath :: CreatureDropType + } +makeLenses ''CreatureState diff --git a/src/MapHelp.hs b/src/MapHelp.hs new file mode 100644 index 000000000..30a225fa6 --- /dev/null +++ b/src/MapHelp.hs @@ -0,0 +1,4 @@ +module MapHelp + ( module Data.Strict.Map + ) where +import Data.Strict.Map