{-# 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 Sound.Data --import GHC.Generics data ActionPlan = Inanimate | ActionPlan {_apImpulse :: [Impulse] ,_apAction :: [Action] ,_apStrategy :: Strategy ,_apGoal :: [Goal] } deriving (Eq,Ord,Show,Read) data RandImpulse = RandImpulseList [Impulse] | RandImpulseCircMove Float deriving (Eq,Ord,Show,Read) data Impulse = Move Point2 | MoveForward Float | Turn Float | RandomTurn Float | RandomImpulse RandImpulse -- (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 deriving (Eq,Ord,Show,Read) --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" 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 (Eq,Ord,Show,Read) --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 (Eq,Ord,Show,Read) -- deriving (Eq,Ord,Show) data Goal = LiveLongAndProsper | Kill Int | SentinelAt Point2 Float deriving (Eq,Ord,Show,Read) makeLenses ''ActionPlan makeLenses ''Impulse makeLenses ''Action