gameServer/HWProtoCore.hs
author koda
Sun, 16 Jan 2011 05:21:00 +0100
branchexperimental3D
changeset 4818 202eef454354
parent 4568 f85243bf890e
child 4904 0eab727d4717
permissions -rw-r--r--
rename "frame alternate" to "wiggle" as it's more appropriate move visual gears around levels to have smooth stereo effect

module HWProtoCore where

import qualified Data.IntMap as IntMap
import Data.Foldable
import Data.Maybe
--------------------------------------
import CoreTypes
import Actions
import Utils
import HWProtoNEState
import HWProtoLobbyState
import HWProtoInRoomState

handleCmd, handleCmd_loggedin :: CmdHandler

handleCmd clID _ _ ["PING"] = [AnswerThisClient ["PONG"]]

handleCmd clID clients rooms ("QUIT" : xs) =
    [ByeClient msg]
    where
        msg = if not $ null xs then head xs else ""


handleCmd clID clients _ ["PONG"] =
    if pingsQueue client == 0 then
        [ProtocolError "Protocol violation"]
    else
        [ModifyClient (\cl -> cl{pingsQueue = pingsQueue cl - 1})]
    where
        client = clients IntMap.! clID


handleCmd clID clients rooms cmd =
    if not $ logonPassed client then
        handleCmd_NotEntered clID clients rooms cmd
    else
        handleCmd_loggedin clID clients rooms cmd
    where
        client = clients IntMap.! clID


handleCmd_loggedin clID clients rooms ["INFO", asknick] =
    if noSuchClient then
        []
    else
        [AnswerThisClient
            ["INFO",
            nick client,
            "[" ++ host client ++ "]",
            protoNumber2ver $ clientProto client,
            "[" ++ roomInfo ++ "]" ++ roomStatus]]
    where
        maybeClient = find (\cl -> asknick == nick cl) clients
        noSuchClient = isNothing maybeClient
        client = fromJust maybeClient
        room = rooms IntMap.! roomID client
        roomInfo = if roomID client /= 0 then roomMasterSign ++ "room " ++ (name room) else adminSign ++ "lobby"
        roomMasterSign = if isMaster client then "@" else ""
        adminSign = if isAdministrator client then "@" else ""
        roomStatus =
            if gameinprogress room
            then if teamsInGame client > 0 then "(playing)" else "(spectating)"
            else ""


handleCmd_loggedin clID clients rooms cmd =
    if roomID client == 0 then
        handleCmd_lobby clID clients rooms cmd
    else
        handleCmd_inRoom clID clients rooms cmd
    where
        client = clients IntMap.! clID