fix and optimization
This commit is contained in:
parent
2911514578
commit
0e5486f048
2 changed files with 119 additions and 124 deletions
|
@ -675,13 +675,6 @@ updateMap dt = do
|
||||||
}
|
}
|
||||||
-- liftIO $ A.logIO A.Debug ("player position: " ++ show (pos' + colldpos))
|
-- liftIO $ A.logIO A.Debug ("player position: " ++ show (pos' + colldpos))
|
||||||
return ent
|
return ent
|
||||||
updateNPCs
|
|
||||||
(imgMat $ stateData ud)
|
|
||||||
(Prelude.filter
|
|
||||||
(\p -> pointType p /= RoomExit)
|
|
||||||
(reachPoints $ stateData ud)
|
|
||||||
)
|
|
||||||
dt
|
|
||||||
tses <- efor allEnts $ do
|
tses <- efor allEnts $ do
|
||||||
with objType
|
with objType
|
||||||
with objState
|
with objState
|
||||||
|
@ -692,8 +685,16 @@ updateMap dt = do
|
||||||
mapM_ (\(t, s, e) ->
|
mapM_ (\(t, s, e) ->
|
||||||
objectAction dt t s e
|
objectAction dt t s e
|
||||||
) tses
|
) tses
|
||||||
|
(nws2, _) <- yieldSystemT nws $ updateNPCs
|
||||||
|
(imgMat $ stateData ud)
|
||||||
|
(Prelude.filter
|
||||||
|
(\p -> pointType p /= RoomExit)
|
||||||
|
(reachPoints $ stateData ud)
|
||||||
|
)
|
||||||
|
dt
|
||||||
|
nws
|
||||||
putAffection ud
|
putAffection ud
|
||||||
{ worldState = nws
|
{ worldState = nws2
|
||||||
}
|
}
|
||||||
|
|
||||||
checkBoundsCollision2
|
checkBoundsCollision2
|
||||||
|
|
226
src/NPC.hs
226
src/NPC.hs
|
@ -6,9 +6,10 @@ import Affection as A
|
||||||
|
|
||||||
import qualified Data.Matrix as M
|
import qualified Data.Matrix as M
|
||||||
import Data.Ecstasy as E
|
import Data.Ecstasy as E
|
||||||
import Data.Maybe (fromMaybe, fromJust)
|
import Data.Maybe
|
||||||
import Data.List (find)
|
import Data.List (find)
|
||||||
|
|
||||||
|
import Control.Monad.Trans
|
||||||
import Control.Monad.IO.Class (MonadIO(..))
|
import Control.Monad.IO.Class (MonadIO(..))
|
||||||
import Control.Concurrent.MVar
|
import Control.Concurrent.MVar
|
||||||
import Control.Concurrent (forkIO)
|
import Control.Concurrent (forkIO)
|
||||||
|
@ -61,141 +62,129 @@ updateNPCs
|
||||||
:: M.Matrix (Maybe ImgId)
|
:: M.Matrix (Maybe ImgId)
|
||||||
-> [ReachPoint]
|
-> [ReachPoint]
|
||||||
-> Double
|
-> Double
|
||||||
|
-> SystemState Entity (AffectionState (AffectionData UserData) IO)
|
||||||
-> SystemT Entity (AffectionState (AffectionData UserData) IO) ()
|
-> SystemT Entity (AffectionState (AffectionData UserData) IO) ()
|
||||||
updateNPCs imgmat rp dt = do
|
updateNPCs imgmat rp dt ws = do
|
||||||
posbounds <- efor allEnts $ do
|
posbounds <- efor allEnts $ do
|
||||||
with pos
|
with pos
|
||||||
with obstacle
|
with obstacle
|
||||||
pos' <- query pos
|
pos' <- query pos
|
||||||
bnds <- query obstacle
|
bnds <- query obstacle
|
||||||
return (pos', bnds)
|
return (pos', bnds)
|
||||||
npcs <- efor allEnts $ do
|
npcposs <- efor allEnts $ do
|
||||||
|
with pos
|
||||||
with npcMoveState
|
with npcMoveState
|
||||||
with vel
|
with vel
|
||||||
|
with rot
|
||||||
|
with anim
|
||||||
|
pos' <- query pos
|
||||||
|
e <- queryEnt
|
||||||
|
return (e, pos')
|
||||||
|
eaccess <- getObjects npcposs
|
||||||
|
moent <- catMaybes <$> (eover allEnts $ do
|
||||||
with pos
|
with pos
|
||||||
|
with npcMoveState
|
||||||
|
with vel
|
||||||
with rot
|
with rot
|
||||||
with anim
|
with anim
|
||||||
pos' <- query pos
|
pos' <- query pos
|
||||||
rot' <- query rot
|
rot' <- query rot
|
||||||
let mdir =
|
let mdir =
|
||||||
(pointDir <$> find (\a -> pointCoord a == fmap floor pos') rp)
|
(pointDir <$> find (\a -> pointCoord a == fmap floor pos') rp)
|
||||||
e <- queryEnt
|
e <- queryEnt
|
||||||
return (e, pos', rot', mdir)
|
npcState' <- query npcMoveState
|
||||||
mapM_ (\(e, pos', rot', mdir) -> do
|
case npcState' of
|
||||||
accessibles <- getObjects pos'
|
NPCStanding ttl future -> do
|
||||||
moent <- runQueryT e $ do
|
let nttl = ttl - dt
|
||||||
npcState' <- query npcMoveState
|
if nttl > 0
|
||||||
case npcState' of
|
then
|
||||||
NPCStanding ttl future -> do
|
return $ (Nothing, unchanged
|
||||||
let nttl = ttl - dt
|
{ npcMoveState = Set $ NPCStanding nttl future
|
||||||
if nttl > 0
|
, vel = Set $ V2 0 0
|
||||||
|
})
|
||||||
|
else do
|
||||||
|
mpath <- liftIO $ tryTakeMVar future
|
||||||
|
case mpath of
|
||||||
|
Just path ->
|
||||||
|
return $ (Nothing, unchanged
|
||||||
|
{ npcMoveState = Set $ NPCWalking path
|
||||||
|
})
|
||||||
|
Nothing ->
|
||||||
|
return $ (Nothing, unchanged
|
||||||
|
{ npcMoveState = Set $ NPCStanding 1 future
|
||||||
|
})
|
||||||
|
NPCWalking path -> do
|
||||||
|
pos' <- query pos
|
||||||
|
if not (null path)
|
||||||
|
then do
|
||||||
|
let itarget = V2 0.5 0.5 + (fromIntegral <$> head path) :: V2 Double
|
||||||
|
if distance pos' itarget < 0.1
|
||||||
then
|
then
|
||||||
return $ (Nothing, unchanged
|
return $ (Nothing, unchanged
|
||||||
{ npcMoveState = Set $ NPCStanding nttl future
|
{ npcMoveState = Set $ NPCWalking (tail path)
|
||||||
, vel = Set $ V2 0 0
|
|
||||||
})
|
})
|
||||||
else do
|
else
|
||||||
mpath <- liftIO $ tryTakeMVar future
|
return $ (Nothing, unchanged
|
||||||
case mpath of
|
{ vel = Set $ (* 2) <$> signorm (itarget - pos')
|
||||||
Just path ->
|
})
|
||||||
return $ (Nothing, unchanged
|
else do
|
||||||
{ npcMoveState = Set $ NPCWalking path
|
future <- liftIO $ newEmptyMVar
|
||||||
})
|
stat <- query anim
|
||||||
Nothing ->
|
_ <- liftIO $ forkIO $
|
||||||
return $ (Nothing, unchanged
|
getPath (fmap floor pos') future rp imgmat posbounds
|
||||||
{ npcMoveState = Set $ NPCStanding 1 future
|
e <- queryEnt
|
||||||
})
|
let mdir =
|
||||||
NPCWalking path -> do
|
(pointDir <$> find (\a -> pointCoord a == fmap floor pos') rp)
|
||||||
pos' <- query pos
|
accessibles = fromMaybe [] $ lookup e eaccess
|
||||||
if not (null path)
|
case accessibles of
|
||||||
then do
|
[] -> do
|
||||||
let itarget = V2 0.5 0.5 + (fromIntegral <$> head path) :: V2 Double
|
ttl <- liftIO $ randomRIO (5, 30)
|
||||||
if distance pos' itarget < 0.1
|
|
||||||
then
|
|
||||||
return $ (Nothing, unchanged
|
return $ (Nothing, unchanged
|
||||||
{ npcMoveState = Set $ NPCWalking (tail path)
|
{ npcMoveState = Set $ NPCStanding ttl future
|
||||||
})
|
, vel = Set $ V2 0 0
|
||||||
else
|
, rot = Set $ fromMaybe rot' mdir
|
||||||
return $ (Nothing, unchanged
|
, anim = Set stat
|
||||||
{ vel = Set $ (* 2) <$> signorm (itarget - pos')
|
{ asId = (asId stat)
|
||||||
})
|
{ aiDirection = fromMaybe rot' mdir
|
||||||
else do
|
|
||||||
future <- liftIO $ newEmptyMVar
|
|
||||||
stat <- query anim
|
|
||||||
rot' <- query rot
|
|
||||||
pos' <- query pos
|
|
||||||
_ <- liftIO $ forkIO $
|
|
||||||
getPath (fmap floor pos') future rp imgmat posbounds
|
|
||||||
let mdir =
|
|
||||||
(pointDir <$> find (\a -> pointCoord a == fmap floor pos') rp)
|
|
||||||
-- ttl <- liftIO $ randomRIO (5, 30)
|
|
||||||
-- return $ (Nothing, unchanged
|
|
||||||
-- { npcMoveState = Set $ NPCStanding ttl future
|
|
||||||
-- , vel = Set $ V2 0 0
|
|
||||||
-- , rot = Set $ fromMaybe rot' mdir
|
|
||||||
-- , anim = Set stat
|
|
||||||
-- { asId = (asId stat)
|
|
||||||
-- { aiDirection = fromMaybe rot' mdir
|
|
||||||
-- }
|
|
||||||
-- }
|
|
||||||
-- })
|
|
||||||
case accessibles of
|
|
||||||
[] -> do
|
|
||||||
ttl <- liftIO $ randomRIO (5, 30)
|
|
||||||
return $ (Nothing, unchanged
|
|
||||||
{ npcMoveState = Set $ NPCStanding ttl future
|
|
||||||
, vel = Set $ V2 0 0
|
|
||||||
, rot = Set $ fromMaybe rot' mdir
|
|
||||||
, anim = Set stat
|
|
||||||
{ asId = (asId stat)
|
|
||||||
{ aiDirection = fromMaybe rot' mdir
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
objects -> do
|
})
|
||||||
liftIO $ logIO Debug ("applicable objects: " ++ show objects)
|
objects -> do
|
||||||
rind <- liftIO $ randomRIO (0, length objects - 1)
|
liftIO $ logIO Debug ("applicable objects: " ++ show objects)
|
||||||
npcent <- queryEnt
|
rind <- liftIO $ randomRIO (0, length objects - 1)
|
||||||
let (oent, _, _) = objects !! rind
|
npcent <- queryEnt
|
||||||
return (Just (oent, npcent), unchanged
|
let (oent, _, _) = objects !! rind
|
||||||
{ rot = Set $ fromMaybe rot' mdir
|
return (Just (oent, npcent, future), unchanged
|
||||||
, anim = Set stat
|
{ rot = Set $ fromMaybe rot' mdir
|
||||||
{ asId = (asId stat)
|
, anim = Set stat
|
||||||
{ aiDirection = fromMaybe rot' mdir
|
{ asId = (asId stat)
|
||||||
}
|
{ aiDirection = fromMaybe rot' mdir
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
(\(_, ent) ->
|
, vel = Set $ V2 0 0
|
||||||
setEntity e ent
|
}))
|
||||||
) (fromJust moent)
|
mapM_ (\(oent, npcent, future) -> do
|
||||||
maybe (return()) (\(oent, npcent) -> do
|
Just (t, s) <- runQueryT oent $ do
|
||||||
Just (t, s) <- runQueryT oent $ do
|
with objType
|
||||||
with objType
|
with objState
|
||||||
with objState
|
otyp <- query objType
|
||||||
otyp <- query objType
|
ostat <- query objState
|
||||||
ostat <- query objState
|
return (otyp, ostat)
|
||||||
return (otyp, ostat)
|
setEntity oent =<< objectTransition t s False oent
|
||||||
setEntity oent =<< objectTransition t s False oent
|
Just (nt, ns) <- runQueryT oent $ do
|
||||||
Just (nt, ns) <- runQueryT oent $ do
|
with objType
|
||||||
with objType
|
with objState
|
||||||
with objState
|
otyp <- query objType
|
||||||
otyp <- query objType
|
ostat <- query objState
|
||||||
ostat <- query objState
|
return (otyp, ostat)
|
||||||
return (otyp, ostat)
|
emap (anEnt npcent) $ do
|
||||||
Just npc <- runQueryT npcent $ do
|
let ttl = actionTime nt ns
|
||||||
let ttl = actionTime nt ns
|
return unchanged
|
||||||
future <- liftIO $ newEmptyMVar
|
{ npcMoveState = Set $ NPCStanding ttl future
|
||||||
_ <- liftIO $ forkIO $
|
}
|
||||||
getPath (fmap floor pos') future rp imgmat posbounds
|
) moent
|
||||||
return unchanged
|
|
||||||
{ npcMoveState = Set $ NPCStanding ttl future
|
|
||||||
, vel = Set $ V2 0 0
|
|
||||||
}
|
|
||||||
setEntity npcent npc
|
|
||||||
) (fromJust (fst <$> moent))
|
|
||||||
) npcs
|
|
||||||
|
|
||||||
getObjects npos = do
|
getObjects npcposs = do
|
||||||
candidates <- efor allEnts $ do
|
candidates <- efor allEnts $ do
|
||||||
with pos
|
with pos
|
||||||
with objType
|
with objType
|
||||||
|
@ -205,9 +194,14 @@ getObjects npos = do
|
||||||
oacc <- query objAccess
|
oacc <- query objAccess
|
||||||
ent <- queryEnt
|
ent <- queryEnt
|
||||||
return (ent, pos', oacc)
|
return (ent, pos', oacc)
|
||||||
return $ filter (\(_, p, (delta, _)) ->
|
mapM (\(e, pos) ->
|
||||||
fmap floor p + delta == fmap floor npos
|
return
|
||||||
) candidates
|
( e
|
||||||
|
, filter (\(_, p, (delta, _)) ->
|
||||||
|
fmap floor p + delta == fmap floor pos
|
||||||
|
) candidates
|
||||||
|
)
|
||||||
|
) npcposs
|
||||||
|
|
||||||
getPath
|
getPath
|
||||||
:: V2 Int
|
:: V2 Int
|
||||||
|
|
Loading…
Reference in a new issue