packages feed

roguestar-gl-0.2.1: src/ProtocolTypes.lhs

\section{Protocol Types}

\begin{code}
module ProtocolTypes
    (ProtocolType(..),
     TerrainTile(..),
     VisibleObject(..),
     WieldedObject(..),
     tableSelectTyped)
    where

import Data.Maybe
import Tables
import RSAGL.Angle
import Debug.Trace
\end{code}

\texttt{ProtocolType} is any type that can be constructed from a row of a \texttt{RoguestarTable}.
\texttt{formatTable} is a function from bottom to the expected format of the table row.

\begin{code}
class ProtocolType t where
    fromTable :: [TableDataFormat String Integer] -> Maybe t
    formatTable :: t -> [TableDataFormat String String]

data TerrainTile = TerrainTile {
    tt_type :: String,
    tt_xy :: (Integer,Integer) }

instance ProtocolType TerrainTile where
    formatTable = const [TDString "terrain-type",TDNumber "x",TDNumber "y"]
    fromTable [TDString t,TDNumber x,TDNumber y] = Just $ TerrainTile t (x,y)
    fromTable _ = Nothing

data VisibleObject = VisibleObject {
    vo_unique_id :: Integer,
    vo_xy :: (Integer,Integer),
    vo_facing :: BoundAngle }

instance ProtocolType VisibleObject where
    formatTable = const $ [TDNumber "object-unique-id",TDNumber "x",TDNumber "y",TDString "facing"]
    fromTable [TDNumber unique_id,TDNumber x,TDNumber y,TDString facing] = Just $
        VisibleObject unique_id (x,y) (facingToAngle facing)
    fromTable _ = Nothing

data WieldedObject = WieldedObject {
    wo_unique_id :: Integer,
    wo_creature_id :: Integer }

instance ProtocolType WieldedObject where
    formatTable = const $ [TDNumber "uid",TDNumber "creature"]
    fromTable [TDNumber unique_id,TDNumber creature_id] = Just $
        WieldedObject unique_id creature_id
    fromTable _ = Nothing

facingToAngle :: String -> BoundAngle
facingToAngle "south" = BoundAngle $ fromDegrees 0
facingToAngle "southeast" = BoundAngle $ fromDegrees 45
facingToAngle "east" = BoundAngle $ fromDegrees 90
facingToAngle "northeast" = BoundAngle $ fromDegrees 135
facingToAngle "north" = BoundAngle $ fromDegrees 180
facingToAngle "northwest" = BoundAngle $ fromDegrees 225
facingToAngle "west" = BoundAngle $ fromDegrees 270
facingToAngle "southwest" = BoundAngle $ fromDegrees 315
facingToAngle "here" = BoundAngle $ fromDegrees 0
facingToAngle s = trace ("facingToAngle: what is " ++ s ++ "?") $ BoundAngle $ fromDegrees 180

tableSelectTyped :: (ProtocolType t) => RoguestarTable -> [t]
tableSelectTyped the_table = result
    where result = mapMaybe fromTable $ tableSelectFormatted the_table the_format 
          the_format = formatTable $ (error "tableSelectTyped: undefined" :: (a -> a)) (head result)
\end{code}