begin synchronisation primitives
This commit is contained in:
parent
14fd41ef04
commit
6587f97312
2 changed files with 43 additions and 53 deletions
|
@ -26,6 +26,8 @@ import Data.Maybe
|
||||||
import Data.UUID hiding (null)
|
import Data.UUID hiding (null)
|
||||||
import Data.UUID.V4
|
import Data.UUID.V4
|
||||||
|
|
||||||
|
import Data.Time
|
||||||
|
|
||||||
import qualified Data.Vector.Storable as VS
|
import qualified Data.Vector.Storable as VS
|
||||||
|
|
||||||
import Foreign hiding (void)
|
import Foreign hiding (void)
|
||||||
|
@ -78,7 +80,10 @@ terminateGameOnSigint path = do
|
||||||
-- raiseSignal sigINT
|
-- raiseSignal sigINT
|
||||||
)
|
)
|
||||||
Nothing
|
Nothing
|
||||||
where
|
|
||||||
|
disconnectClients
|
||||||
|
:: [Client]
|
||||||
|
-> IO ()
|
||||||
disconnectClients = mapM_
|
disconnectClients = mapM_
|
||||||
(\(_, clientSocket) -> do
|
(\(_, clientSocket) -> do
|
||||||
sendMessage ServerQuit clientSocket
|
sendMessage ServerQuit clientSocket
|
||||||
|
@ -178,11 +183,11 @@ handleMessage stateContainer readerContainer msg = do
|
||||||
case msg of
|
case msg of
|
||||||
IdRequest -> do
|
IdRequest -> do
|
||||||
clientId <- nextRandom
|
clientId <- nextRandom
|
||||||
let clientIdx = findIndex (\a -> fst a == Nothing) clients
|
let clientIdx = findIndex (isNothing . fst) clients
|
||||||
let clientSock = snd $ clients !! fromJust clientIdx
|
let clientSock = snd $ clients !! fromJust clientIdx
|
||||||
let newClients = map
|
let newClients = map
|
||||||
(\old@(muuid, oldClientSock) ->
|
(\old@(muuid, oldClientSock) ->
|
||||||
if oldClientSock == clientSock && muuid == Nothing
|
if oldClientSock == clientSock && isNothing muuid
|
||||||
then
|
then
|
||||||
(Just clientId, clientSock)
|
(Just clientId, clientSock)
|
||||||
else
|
else
|
||||||
|
@ -224,48 +229,28 @@ handleMessage stateContainer readerContainer msg = do
|
||||||
(head thisPlayers) {playerReady = True} : otherPlayers
|
(head thisPlayers) {playerReady = True} : otherPlayers
|
||||||
_ -> pure ()
|
_ -> pure ()
|
||||||
|
|
||||||
sendUpdates :: Game ()
|
sendPings :: Game ()
|
||||||
sendUpdates = do
|
sendPings = do
|
||||||
|
now <- liftIO getCurrentTime
|
||||||
tileMap <- asks rcMap
|
tileMap <- asks rcMap
|
||||||
|
maxTimeout <- asks rcClientMaxTimeout
|
||||||
|
framesPerPing <- asks rcFramesPerPing
|
||||||
|
fps <- asks rcFPS
|
||||||
stateContainer <- get
|
stateContainer <- get
|
||||||
players <- liftIO $ STM.atomically $ STM.readTMVar (scPlayers stateContainer)
|
players <- liftIO $ STM.atomically $ STM.readTMVar (scPlayers stateContainer)
|
||||||
sockets <- liftIO $ STM.atomically $ STM.readTMVar (scClientSockets stateContainer)
|
sockets <- liftIO $ STM.atomically $ STM.readTMVar (scClientSockets stateContainer)
|
||||||
mapM_
|
mapM_
|
||||||
(\(Player playerId wizard@(Wizard {..}) readiness) -> do
|
(\(Player playerId (Wizard {}) readiness lastPong) -> do
|
||||||
when readiness $ do
|
let timeDiff = realToFrac $ diffUTCTime now lastPong
|
||||||
let V2 wr wc = wizardPos
|
when (readiness && timeDiff > (framesPerPing * recip fps)) $ do
|
||||||
subCoords = (,) <$> [floor wr - 4 .. floor wr + 4] <*> [floor wc - 4 .. floor wc + 4]
|
let clientSock = fromJust (lookup (Just playerId) sockets)
|
||||||
leftBound = wizardRot + (pi / 4)
|
if timeDiff > maxTimeout
|
||||||
rightBound = wizardRot - (pi / 4)
|
|
||||||
leftLine row = cos leftBound * row
|
|
||||||
rightLine row = sin rightBound * row
|
|
||||||
correctionLeft = if wizardRot < pi / 2 || wizardRot > 4 * pi / 2
|
|
||||||
then floor
|
|
||||||
else ceiling
|
|
||||||
correctionRight = if wizardRot < pi / 2 || wizardRot > 4 * pi / 2
|
|
||||||
then ceiling
|
|
||||||
else floor
|
|
||||||
viewMatrix = M.fromList 9 9 $ map
|
|
||||||
(\(qr, qc) ->
|
|
||||||
if qc - floor wc <= correctionLeft (leftLine (wr - fromIntegral qr))
|
|
||||||
&& qc - floor wc >= correctionRight (rightLine (wr - fromIntegral qr))
|
|
||||||
then
|
then
|
||||||
M.safeGet qr qc tileMap
|
liftIO $ disconnectClients [clientSock]
|
||||||
else
|
else do
|
||||||
Nothing
|
random <- liftIO $ nextRandom
|
||||||
)
|
|
||||||
subCoords
|
|
||||||
clientSock = fromJust $ lookup (Just playerId) sockets
|
|
||||||
-- liftIO $ print $ leftLine . (\x -> x - wr) . fromIntegral .fst <$> subCoords
|
|
||||||
-- liftIO $ print initViewMatrix
|
|
||||||
liftIO $ sendMessage
|
liftIO $ sendMessage
|
||||||
(TickUpdate
|
( Ping random
|
||||||
{ tuWizard = wizard
|
|
||||||
, tuMapSlice = MapSlice
|
|
||||||
{ msViewMap = viewMatrix
|
|
||||||
, msContents = []
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
clientSock
|
clientSock
|
||||||
)
|
)
|
||||||
|
|
|
@ -27,6 +27,8 @@ data Settings = Settings
|
||||||
, setMapColumns :: Int
|
, setMapColumns :: Int
|
||||||
, setSpawnerProbability :: Float
|
, setSpawnerProbability :: Float
|
||||||
, setFPS :: Int
|
, setFPS :: Int
|
||||||
|
, setClientMaxTimeout :: Float
|
||||||
|
, setFramesPerPing :: Int
|
||||||
}
|
}
|
||||||
deriving (Show, Generic)
|
deriving (Show, Generic)
|
||||||
|
|
||||||
|
@ -48,6 +50,8 @@ options = Options
|
||||||
data ReaderContainer = ReaderContainer
|
data ReaderContainer = ReaderContainer
|
||||||
{ rcMap :: ServerMap
|
{ rcMap :: ServerMap
|
||||||
, rcFPS :: Int
|
, rcFPS :: Int
|
||||||
|
, rcFramesPerPing :: Int
|
||||||
|
, rcClientMaxTimeout :: Float
|
||||||
, rcMainSocket :: Socket
|
, rcMainSocket :: Socket
|
||||||
}
|
}
|
||||||
deriving (Eq, Show)
|
deriving (Eq, Show)
|
||||||
|
@ -65,6 +69,7 @@ data Player = Player
|
||||||
{ playerId :: UUID
|
{ playerId :: UUID
|
||||||
, playerWizard :: Wizard
|
, playerWizard :: Wizard
|
||||||
, playerReady :: Bool
|
, playerReady :: Bool
|
||||||
|
, playerLastPong :: UTCTime
|
||||||
}
|
}
|
||||||
deriving (Eq, Show)
|
deriving (Eq, Show)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue