module Rattletrap.AttributeValue.LoadoutOnline where import Rattletrap.CompressedWord import Rattletrap.Word32 import Rattletrap.Word8 import qualified Control.Monad as Monad import qualified Data.Binary.Bits.Get as BinaryBit import qualified Data.Binary.Bits.Put as BinaryBit newtype LoadoutOnlineAttributeValue = LoadoutOnlineAttributeValue { loadoutAttributeValueValue :: [[(Word32, CompressedWord)]] } deriving (Eq, Ord, Show) getLoadoutOnlineAttributeValue :: BinaryBit.BitGet LoadoutOnlineAttributeValue getLoadoutOnlineAttributeValue = do size <- getWord8Bits values <- Monad.replicateM (fromIntegral (word8Value size)) (do innerSize <- getWord8Bits Monad.replicateM (fromIntegral (word8Value innerSize)) (do x <- getWord32Bits y <- getCompressedWord 27 pure (x, y))) pure (LoadoutOnlineAttributeValue values) putLoadoutOnlineAttributeValue :: LoadoutOnlineAttributeValue -> BinaryBit.BitPut () putLoadoutOnlineAttributeValue loadoutAttributeValue = do let values = loadoutAttributeValueValue loadoutAttributeValue putWord8Bits (Word8 (fromIntegral (length values))) mapM_ (\xs -> do putWord8Bits (Word8 (fromIntegral (length xs))) mapM_ (\(x, y) -> do putWord32Bits x putCompressedWord y) xs) values