diff --git a/src/MainGame/MindMap.hs b/src/MainGame/MindMap.hs index e2dc766..c417085 100644 --- a/src/MainGame/MindMap.hs +++ b/src/MainGame/MindMap.hs @@ -20,29 +20,11 @@ import Types import MainGame.WorldMap (checkBoundsCollision2, drawTile) +import Util (direction) + updateMind :: Double -> Affection UserData () updateMind dt = do ud <- getAffection - let direction :: V2 Double -> Direction -> Direction - direction vel'@(V2 vr _) rot' = if sqrt (vel' `dot` vel') > 0 - then - let xuu = - acos ((vel' `dot` V2 0 1) / - sqrt (vel' `dot` vel')) / pi * 180 - xu = if vr < 0 then 360 - xuu else xuu - d - | xu < 22.5 = NE - | xu > 22.5 && xu < 67.5 = E - | xu > 67.5 && xu < 112.5 = SE - | xu > 112.5 && xu < 157.5 = S - | xu > 157.5 && xu < 202.5 = SW - | xu > 202.5 && xu < 247.5 = W - | xu > 247.5 && xu < 292.5 = NW - | xu > 292.5 && xu < 337.5 = N - | xu > 337.5 = NE - | otherwise = NE - in d - else rot' (nws, _) <- liftIO $ yieldSystemT (worldState ud) $ do emap allEnts $ do with anim @@ -97,13 +79,13 @@ updateMind dt = do | sqrt (colldpos `dot` colldpos) > 0 -> stat { asId = aId - { aiDirection = direction vel' rot' + { aiDirection = fromMaybe rot' (direction vel') } } | otherwise -> stat { asId = aId - { aiDirection = direction vel' rot' + { aiDirection = fromMaybe rot' (direction vel') , aiName = "standing" } , asCurrentFrame = 0 @@ -112,7 +94,7 @@ updateMind dt = do | sqrt (colldpos `dot` colldpos) > 0 -> stat { asId = aId - { aiDirection = direction vel' rot' + { aiDirection = fromMaybe rot' (direction vel') , aiName = "walking" } , asCurrentFrame = 0 @@ -120,7 +102,7 @@ updateMind dt = do | otherwise -> stat { asId = aId - { aiDirection = direction vel' rot' + { aiDirection = fromMaybe rot' (direction vel') } } x -> error ("unknown animation name" ++ x) @@ -154,7 +136,7 @@ updateMind dt = do ) ent = unchanged { mmpos = Set $ pos' + colldpos - , rot = Set (direction vel' rot') + , rot = Set (fromMaybe rot' $ direction vel') , anim = Set nstat } return ent diff --git a/src/MainGame/WorldMap.hs b/src/MainGame/WorldMap.hs index fa27736..f9216df 100644 --- a/src/MainGame/WorldMap.hs +++ b/src/MainGame/WorldMap.hs @@ -338,26 +338,6 @@ updateMap dt = do , stateData = mendat } else do - let direction :: V2 Double -> Direction -> Direction - direction vel'@(V2 vr _) rot' = if sqrt (vel' `dot` vel') > 0 - then - let xuu = - acos ((vel' `dot` V2 0 1) / - sqrt (vel' `dot` vel')) / pi * 180 - xu = if vr < 0 then 360 - xuu else xuu - d - | xu < 22.5 = NE - | xu > 22.5 && xu < 67.5 = E - | xu > 67.5 && xu < 112.5 = SE - | xu > 112.5 && xu < 157.5 = S - | xu > 157.5 && xu < 202.5 = SW - | xu > 202.5 && xu < 247.5 = W - | xu > 247.5 && xu < 292.5 = NW - | xu > 292.5 && xu < 337.5 = N - | xu > 337.5 = NE - | otherwise = NE - in d - else rot' (nws, _) <- liftIO $ yieldSystemT (worldState ud) $ do emap allEnts $ do with anim @@ -413,13 +393,13 @@ updateMap dt = do | sqrt (vel' `dot` vel') > 0 -> stat { asId = aId - { aiDirection = direction vel' rot' + { aiDirection = fromMaybe rot' (direction vel') } } | otherwise -> stat { asId = aId - { aiDirection = direction vel' rot' + { aiDirection = fromMaybe rot' (direction vel') , aiName = "standing" } , asCurrentFrame = 0 @@ -428,7 +408,7 @@ updateMap dt = do | sqrt (vel' `dot` vel') > 0 -> stat { asId = aId - { aiDirection = direction vel' rot' + { aiDirection = fromMaybe rot' (direction vel') , aiName = "walking" } , asCurrentFrame = 0 @@ -436,13 +416,13 @@ updateMap dt = do | otherwise -> stat { asId = aId - { aiDirection = direction vel' rot' + { aiDirection = fromMaybe rot' (direction vel') } } x -> error ("unknown animation name" ++ x) ent = unchanged { pos = Set npos - , rot = Set $ direction vel' rot' + , rot = Set $ fromMaybe rot' (direction vel') , anim = Set nstat } return ent @@ -464,13 +444,13 @@ updateMap dt = do | sqrt (colldpos `dot` colldpos) > 0 -> stat { asId = aId - { aiDirection = direction vel' rot' + { aiDirection = fromMaybe rot' (direction vel') } } | otherwise -> stat { asId = aId - { aiDirection = direction vel' rot' + { aiDirection = fromMaybe rot' (direction vel') , aiName = "standing" } , asCurrentFrame = 0 @@ -479,7 +459,7 @@ updateMap dt = do | sqrt (colldpos `dot` colldpos) > 0 -> stat { asId = aId - { aiDirection = direction vel' rot' + { aiDirection = fromMaybe rot' (direction vel') , aiName = "walking" } , asCurrentFrame = 0 @@ -487,7 +467,7 @@ updateMap dt = do | otherwise -> stat { asId = aId - { aiDirection = direction vel' rot' + { aiDirection = fromMaybe rot' (direction vel') } } x -> error ("unknown animation name" ++ x) @@ -521,7 +501,7 @@ updateMap dt = do ) ent = unchanged { pos = Set $ pos' + colldpos - , rot = Set (direction vel' rot') + , rot = Set (fromMaybe rot' $ direction vel') , anim = Set nstat } return ent diff --git a/src/Util.hs b/src/Util.hs index 3601a94..741f35c 100644 --- a/src/Util.hs +++ b/src/Util.hs @@ -15,7 +15,7 @@ import qualified Graphics.Rendering.OpenGL as GL hiding (get) import System.Exit (exitFailure) -import Linear +import Linear hiding (E(..)) import NanoVG hiding (V2(..)) import NanoVG.Internal.Image (ImageFlags(..)) @@ -225,3 +225,24 @@ loadAnimationSprites fp nvg idconfs = do , Animation dur imgs pb ) ) idconfs + +direction :: V2 Double -> Maybe Direction +direction vel'@(V2 vr _) = if sqrt (vel' `dot` vel') > 0 + then + let xuu = + acos ((vel' `dot` V2 0 1) / + sqrt (vel' `dot` vel')) / pi * 180 + xu = if vr < 0 then 360 - xuu else xuu + d + | xu < 22.5 = NE + | xu > 22.5 && xu < 67.5 = E + | xu > 67.5 && xu < 112.5 = SE + | xu > 112.5 && xu < 157.5 = S + | xu > 157.5 && xu < 202.5 = SW + | xu > 202.5 && xu < 247.5 = W + | xu > 247.5 && xu < 292.5 = NW + | xu > 292.5 && xu < 337.5 = N + | xu > 337.5 = NE + | otherwise = NE + in Just d + else Nothing