layers-game-0.3: src/Convert/ToFileData.hs
module Convert.ToFileData where
import qualified Data.List as L
import qualified Gamgine.Math.Box as B
import qualified Gamgine.Math.Vect as V
import qualified FileData.Data2 as FD
import qualified GameData.Entity as E
import qualified GameData.Layer as LY
import qualified GameData.Level as LV
import qualified GameData.Data as D
import qualified GameData.Animation as A
toFileData :: D.Data -> FD.Data
toFileData dat =
FD.Data FD.dataVersion $ L.map toLevel (D.allLevels dat)
toLevel :: LV.Level -> FD.Level
toLevel l@LV.Level {LV.entities = entities} =
FD.Level fileEntities fileLayers
where
fileEntities = L.map toEntity entities
fileLayers = L.map toLayer $ LV.allLayers l
toLayer :: LY.Layer -> FD.Layer
toLayer LY.Layer {LY.entities = entities, LY.gravity = g} = FD.Layer fileEntities g
where
fileEntities = L.map toEntity entities
toEntity :: E.Entity -> FD.Entity
toEntity E.Player {E.playerId = id, E.playerInitialPos = initPos} =
FD.Player id (V.toTuple initPos)
toEntity E.Enemy {E.enemyId = id, E.enemyPosition = pos} =
FD.Enemy id (toPosOrAnimation pos)
toEntity E.Platform {E.platformId = id, E.platformPosition = pos, E.platformBound = bound} =
FD.Platform id (toPosOrAnimation pos) (B.toTuples bound)
toEntity E.Star {E.starId = id, E.starPosition = pos} =
FD.Star id (V.toTuple pos)
toPosOrAnimation :: E.PositionOrAnimation -> FD.PositionOrAnimation
toPosOrAnimation (Left pos) = Left $ V.toTuple pos
toPosOrAnimation (Right anim) = Right $ toAnimation anim
toAnimation :: A.Animation -> FD.Animation
toAnimation anim = FD.Animation velo path bidir
where
velo = A.velocity anim
path = L.map V.toTuple (A.path anim)
bidir = A.bidirectional anim