rattletrap-2.2.2: library/Rattletrap/Attribute/Reservation.hs
module Rattletrap.Attribute.Reservation where
import Rattletrap.Attribute.UniqueId
import Rattletrap.Primitive
import qualified Data.Binary.Bits.Get as BinaryBit
import qualified Data.Binary.Bits.Put as BinaryBit
import qualified Data.Word as Word
data ReservationAttribute = ReservationAttribute
{ reservationAttributeNumber :: CompressedWord
, reservationAttributeUniqueId :: UniqueIdAttribute
, reservationAttributeName :: Maybe Text
, reservationAttributeUnknown1 :: Bool
, reservationAttributeUnknown2 :: Bool
, reservationAttributeUnknown3 :: Maybe Word.Word8
} deriving (Eq, Ord, Show)
getReservationAttribute :: (Int, Int) -> BinaryBit.BitGet ReservationAttribute
getReservationAttribute version = do
number <- getCompressedWord 7
uniqueId <- getUniqueIdAttribute
name <-
if uniqueIdAttributeSystemId uniqueId == Word8 0
then pure Nothing
else do
name <- getTextBits
pure (Just name)
a <- BinaryBit.getBool
b <- BinaryBit.getBool
mc <-
if version < (868, 12)
then pure Nothing
else do
c <- BinaryBit.getWord8 6
pure (Just c)
pure (ReservationAttribute number uniqueId name a b mc)
putReservationAttribute :: ReservationAttribute -> BinaryBit.BitPut ()
putReservationAttribute reservationAttribute = do
putCompressedWord (reservationAttributeNumber reservationAttribute)
putUniqueIdAttribute (reservationAttributeUniqueId reservationAttribute)
case reservationAttributeName reservationAttribute of
Nothing -> pure ()
Just name -> putTextBits name
BinaryBit.putBool (reservationAttributeUnknown1 reservationAttribute)
BinaryBit.putBool (reservationAttributeUnknown2 reservationAttribute)
case reservationAttributeUnknown3 reservationAttribute of
Nothing -> pure ()
Just c -> BinaryBit.putWord8 6 c