79 lines
2.8 KiB
Haskell
79 lines
2.8 KiB
Haskell
module Dodge.Creature.YourControl
|
|
where
|
|
import Dodge.Data
|
|
--import Dodge.Base
|
|
import Dodge.Creature.Action
|
|
--import Dodge.Creature.State
|
|
--import Dodge.Creature.State.Data
|
|
import Dodge.Creature.Stance.Data
|
|
import Dodge.Update.UsingInput
|
|
import Dodge.Config.KeyConfig
|
|
import Dodge.Item.Attachment.Data
|
|
import Geometry
|
|
|
|
import Control.Lens
|
|
import qualified SDL
|
|
--import Data.Maybe
|
|
import qualified Data.Set as S
|
|
import qualified Data.IntMap.Strict as IM
|
|
import System.Random
|
|
{- | The AI equivalent for your control. -}
|
|
yourControl :: World -> (World -> World,StdGen) -> Creature -> ((World -> World,StdGen), Maybe Creature)
|
|
yourControl w (f,g) cr =
|
|
( (updateUsingInput . f, g)
|
|
, Just . mouseActionsCr (_mouseButtons w) $ wasdWithAiming w speed 0 cr
|
|
)
|
|
where
|
|
speed = 4
|
|
{- | Turn key presses into creature movement. -}
|
|
wasdWithAiming
|
|
:: World
|
|
-> Float -- ^ Base speed
|
|
-> Int -- ^ Creature id
|
|
-> Creature
|
|
-> Creature
|
|
wasdWithAiming w speed i cr
|
|
| isAiming = set crDir mouseDir $ theMovement cr
|
|
| otherwise = theTurn $ theMovement cr
|
|
where
|
|
theMovement
|
|
| movDir == (V2 0 0) = id
|
|
| otherwise = crMvAbsolute (speed *.* movAbs) . set crMvDir dir
|
|
theTurn cr' = creatureTurnTowardDir (_crMvDir cr') 0.2 cr'
|
|
movDir = wasdDir w
|
|
dir = _cameraRot w + argV movDir
|
|
movAbs = rotateV (_cameraRot w) $ normalizeV movDir
|
|
isAiming = _posture (_crStance cr) == Aiming
|
|
mouseDir = case w ^? creatures . ix i . crInv . ix (_crInvSel (_creatures w IM.! i))
|
|
. itAttachment of
|
|
Just (Just ItScope{_scopePos = p}) -> normalizeAngle $ argV
|
|
$ p +.+ 2 / _cameraZoom w
|
|
*.* rotateV (_cameraRot w) (_mousePos w)
|
|
_ -> normalizeAngle $ argV (_mousePos w) + _cameraRot w
|
|
|
|
wasdM :: World -> SDL.Scancode -> Point2
|
|
wasdM w scancode
|
|
| scancode == moveUpKey (_keyConfig w) = ( V2 (0) ( 1))
|
|
| scancode == moveDownKey (_keyConfig w) = (V2 ( 0) (-1))
|
|
| scancode == moveRightKey (_keyConfig w) = (V2 ( 1) ( 0))
|
|
| scancode == moveLeftKey (_keyConfig w) = (V2 (-1) ( 0))
|
|
wasdM _ _ = (V2 0 0)
|
|
|
|
wasdDir :: World -> Point2
|
|
wasdDir w = foldr ((+.+) . wasdM w) (V2 0 0) $ _keys w
|
|
|
|
wasdComp :: S.Set SDL.Scancode -> World -> (Point2,Maybe Float)
|
|
wasdComp ks w = f $ foldr ( (+.+) . wasdM w ) (V2 0 0) ks
|
|
where
|
|
f (V2 0 0) = ((V2 0 0), Nothing)
|
|
f p = (errorNormalizeV 46 p, Just $ argV p)
|
|
|
|
{- | Set posture according to mouse presses. -}
|
|
mouseActionsCr :: S.Set SDL.MouseButton -> Creature -> Creature
|
|
mouseActionsCr pkeys
|
|
| rbPressed = crStance . posture .~ Aiming
|
|
| otherwise = crStance . posture .~ AtEase
|
|
where
|
|
--lbPressed = SDL.ButtonLeft `S.member` pkeys
|
|
rbPressed = SDL.ButtonRight `S.member` pkeys
|