
module FileData.Data1 where

dataVersion :: Int
dataVersion = 1

type Tuple3d = (Double,Double,Double)

length :: Tuple3d -> Double
length (x, y, z) = sqrt $ (x * x) + (y * y) + (z * z)

type Box     = (Tuple3d,Tuple3d)

data Moving = Moving {
   velocity      :: Tuple3d,
   path          :: [Tuple3d],
   bidirectional :: Bool
   } deriving (Show, Read)


data Platform = Platform {
   platformId :: Int,
   size       :: Box,
   position   :: Either Tuple3d Moving
   } deriving (Show, Read)

data Star = Star {
   starId       :: Int,
   starPosition :: Tuple3d
   } deriving (Show, Read)

data Layer = Layer {
   layerId   :: Int,
   gravity   :: Double,
   platforms :: [Platform]
   } deriving (Show, Read)

data Player = Player {
   playerId        :: Int,
   initialPosition :: Tuple3d
   } deriving (Show, Read)

data Level = Level {
   levelId          :: Int,
   player           :: Player,
   activeLayer      :: Layer,
   otherLayer       :: Layer,
   stars            :: [Star]
   } deriving (Show, Read)

data Data = Data {
   version :: Int,
   levels  :: [Level]
   } deriving (Show, Read)
