packages feed

layers-game-0.3: src/Convert/ToGameData.hs

module Convert.ToGameData where
import qualified Data.List as L
import qualified Gamgine.Math.Box as B
import qualified Gamgine.Math.Vect as V
import qualified GameData.Entity as E
import qualified FileData.Data2 as FD
import qualified GameData.Player as P
import qualified GameData.Enemy as E
import qualified GameData.Star as S
import qualified GameData.Platform as PF
import qualified GameData.Animation as A
import qualified GameData.Layer as LY
import qualified GameData.Level as LV
import qualified GameData.Data as GD


toGameData :: FD.Data -> GD.Data
toGameData (FD.Data _ [])     = error $ "Invalid game data: missing levels!"
toGameData (FD.Data _ levels) = GD.newData $ L.map toLevel levels


toLevel :: FD.Level -> LV.Level
toLevel (FD.Level _        [])     = error $ "Invalid level data: missing layers!"
toLevel (FD.Level entities layers) = LV.newLevel gameEntities gameLayers
   where
      gameEntities = L.map toEntity entities
      gameLayers   = L.map toLayer layers


toLayer :: FD.Layer -> LY.Layer
toLayer (FD.Layer entities gravity) = LY.Layer (L.map toEntity entities) gravity


toEntity :: FD.Entity -> E.Entity
toEntity (FD.Player id initPos) =
   P.newPlayer id (V.fromTuple initPos)

toEntity (FD.Enemy id posOrAnim) =
   E.newEnemy id (toPosOrAnimation posOrAnim)

toEntity (FD.Platform id posOrAnim bound) =
   PF.newPlatform id (toPosOrAnimation posOrAnim) (B.fromTuples bound)

toEntity (FD.Star id pos) = 
   S.newStar id (V.fromTuple pos)


toPosOrAnimation :: FD.PositionOrAnimation -> E.PositionOrAnimation
toPosOrAnimation (Left  pos)  = Left $ V.fromTuple pos
toPosOrAnimation (Right anim) = Right $ toAnimation anim

toAnimation :: FD.Animation -> A.Animation
toAnimation (FD.Animation _    []         _    ) = error $ "Invalid animation data: missing path points!"
toAnimation (FD.Animation _    (pt : [])  _    ) = error $ "Invalid animation data: only one point in path!"
toAnimation (FD.Animation velo fpath      bidir) = A.newAnimation velo path bidir
   where
      path = L.map V.fromTuple fpath