{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE FlexibleInstances #-}
-------------------------------------------------------------------------------
-- Animation
-- 2018 Francesco Ariis GPLv3
-------------------------------------------------------------------------------

module Terminal.Game.Animation (module Terminal.Game.Animation,
                                module T
                               ) where

import Terminal.Game.Plane

import Control.Timer.Tick as T

import Data.Serialize
import GHC.Generics

import qualified Data.ByteString as BS
import qualified Data.Bifunctor as BF

-- todo missing: creaani, creaframe, fetchcurrframe, etc.

type Animation = T.Timed Plane

creaAni :: Loop -> [(Integer, Plane)] -> Animation
creaAni = creaTimedRes

-------------------
-- SERIALISATION --
-------------------

-- deriving instance Generic loc => Generic (Frame loc)
-- instance (Generic loc, Serialize loc) => Serialize (Frame loc Integer)

instance Serialize ExpBehaviour
instance Serialize Loop
instance Serialize Cell
instance Serialize Plane
instance Serialize Animation

encodeAni :: FilePath -> Animation -> IO ()
encodeAni fp fs = BS.writeFile fp (encode fs)

decodeAni :: FilePath -> IO (Either String Animation)
decodeAni fp = fmap decode (BS.readFile fp) >>=
                  return . BF.bimap err id
    where
          err se = fp ++ ": " ++ se