module Rattletrap.Decode.Replication ( decodeReplicationsBits ) where import Rattletrap.Decode.Common import Rattletrap.Decode.CompressedWord import Rattletrap.Decode.ReplicationValue import Rattletrap.Type.ClassAttributeMap import Rattletrap.Type.CompressedWord import Rattletrap.Type.Replication import Rattletrap.Type.Word32le import qualified Control.Monad.Trans.Class as Trans import qualified Control.Monad.Trans.State as State import qualified Data.Map as Map decodeReplicationsBits :: (Int, Int, Int) -> Word -> ClassAttributeMap -> State.StateT (Map.Map CompressedWord Word32le) DecodeBits [Replication] decodeReplicationsBits :: (Int, Int, Int) -> Word -> ClassAttributeMap -> StateT (Map CompressedWord Word32le) DecodeBits [Replication] decodeReplicationsBits (Int, Int, Int) version Word limit ClassAttributeMap classes = do Bool hasReplication <- BitGet Bool -> StateT (Map CompressedWord Word32le) DecodeBits Bool forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a Trans.lift BitGet Bool getBool if Bool hasReplication then (:) (Replication -> [Replication] -> [Replication]) -> StateT (Map CompressedWord Word32le) DecodeBits Replication -> StateT (Map CompressedWord Word32le) DecodeBits ([Replication] -> [Replication]) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> (Int, Int, Int) -> Word -> ClassAttributeMap -> StateT (Map CompressedWord Word32le) DecodeBits Replication decodeReplicationBits (Int, Int, Int) version Word limit ClassAttributeMap classes StateT (Map CompressedWord Word32le) DecodeBits ([Replication] -> [Replication]) -> StateT (Map CompressedWord Word32le) DecodeBits [Replication] -> StateT (Map CompressedWord Word32le) DecodeBits [Replication] forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b <*> (Int, Int, Int) -> Word -> ClassAttributeMap -> StateT (Map CompressedWord Word32le) DecodeBits [Replication] decodeReplicationsBits (Int, Int, Int) version Word limit ClassAttributeMap classes else [Replication] -> StateT (Map CompressedWord Word32le) DecodeBits [Replication] forall (f :: * -> *) a. Applicative f => a -> f a pure [] decodeReplicationBits :: (Int, Int, Int) -> Word -> ClassAttributeMap -> State.StateT (Map.Map CompressedWord Word32le) DecodeBits Replication decodeReplicationBits :: (Int, Int, Int) -> Word -> ClassAttributeMap -> StateT (Map CompressedWord Word32le) DecodeBits Replication decodeReplicationBits (Int, Int, Int) version Word limit ClassAttributeMap classes = do CompressedWord actor <- BitGet CompressedWord -> StateT (Map CompressedWord Word32le) DecodeBits CompressedWord forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a Trans.lift (Word -> BitGet CompressedWord decodeCompressedWordBits Word limit) CompressedWord -> ReplicationValue -> Replication Replication CompressedWord actor (ReplicationValue -> Replication) -> StateT (Map CompressedWord Word32le) DecodeBits ReplicationValue -> StateT (Map CompressedWord Word32le) DecodeBits Replication forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> (Int, Int, Int) -> ClassAttributeMap -> CompressedWord -> StateT (Map CompressedWord Word32le) DecodeBits ReplicationValue decodeReplicationValueBits (Int, Int, Int) version ClassAttributeMap classes CompressedWord actor