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