packages feed

rattletrap 3.1.2 → 4.0.0

raw patch · 359 files changed

+5800/−4173 lines, 359 filesdep +HUnitdep +aeson-prettydep +transformersdep −bimapdep −data-binary-ieee754dep −hspecdep ~aesondep ~basedep ~binaryPVP ok

version bump matches the API change (PVP)

Dependencies added: HUnit, aeson-pretty, transformers

Dependencies removed: bimap, data-binary-ieee754, hspec, vector

Dependency ranges changed: aeson, base, binary, bytestring, containers, filepath, http-client, http-client-tls, template-haskell, temporary, text

API changes (from Hackage documentation)

- Rattletrap.ActorMap: makeActorMap :: ActorMap
- Rattletrap.ActorMap: type ActorMap = Map CompressedWord Word32
- Rattletrap.ActorMap: updateActorMap :: CompressedWord -> Word32 -> ActorMap -> ActorMap
- Rattletrap.Attribute: Attribute :: CompressedWord -> Text -> AttributeValue -> Attribute
- Rattletrap.Attribute: [attributeId] :: Attribute -> CompressedWord
- Rattletrap.Attribute: [attributeName] :: Attribute -> Text
- Rattletrap.Attribute: [attributeValue] :: Attribute -> AttributeValue
- Rattletrap.Attribute: data Attribute
- Rattletrap.Attribute: getAttribute :: (Int, Int, Int) -> ClassAttributeMap -> ActorMap -> CompressedWord -> BitGet Attribute
- Rattletrap.Attribute: getAttributes :: (Int, Int, Int) -> ClassAttributeMap -> ActorMap -> CompressedWord -> BitGet [Attribute]
- Rattletrap.Attribute: instance GHC.Classes.Eq Rattletrap.Attribute.Attribute
- Rattletrap.Attribute: instance GHC.Classes.Ord Rattletrap.Attribute.Attribute
- Rattletrap.Attribute: instance GHC.Show.Show Rattletrap.Attribute.Attribute
- Rattletrap.Attribute: putAttribute :: Attribute -> BitPut ()
- Rattletrap.Attribute: putAttributes :: [Attribute] -> BitPut ()
- Rattletrap.Attribute.AppliedDamage: AppliedDamageAttribute :: Word8 -> Vector -> Int32 -> Int32 -> AppliedDamageAttribute
- Rattletrap.Attribute.AppliedDamage: [appliedDamageAttributeLocation] :: AppliedDamageAttribute -> Vector
- Rattletrap.Attribute.AppliedDamage: [appliedDamageAttributeUnknown1] :: AppliedDamageAttribute -> Word8
- Rattletrap.Attribute.AppliedDamage: [appliedDamageAttributeUnknown3] :: AppliedDamageAttribute -> Int32
- Rattletrap.Attribute.AppliedDamage: [appliedDamageAttributeUnknown4] :: AppliedDamageAttribute -> Int32
- Rattletrap.Attribute.AppliedDamage: data AppliedDamageAttribute
- Rattletrap.Attribute.AppliedDamage: getAppliedDamageAttribute :: BitGet AppliedDamageAttribute
- Rattletrap.Attribute.AppliedDamage: instance GHC.Classes.Eq Rattletrap.Attribute.AppliedDamage.AppliedDamageAttribute
- Rattletrap.Attribute.AppliedDamage: instance GHC.Classes.Ord Rattletrap.Attribute.AppliedDamage.AppliedDamageAttribute
- Rattletrap.Attribute.AppliedDamage: instance GHC.Show.Show Rattletrap.Attribute.AppliedDamage.AppliedDamageAttribute
- Rattletrap.Attribute.AppliedDamage: putAppliedDamageAttribute :: AppliedDamageAttribute -> BitPut ()
- Rattletrap.Attribute.Boolean: BooleanAttribute :: Bool -> BooleanAttribute
- Rattletrap.Attribute.Boolean: [booleanAttributeValue] :: BooleanAttribute -> Bool
- Rattletrap.Attribute.Boolean: getBooleanAttribute :: BitGet BooleanAttribute
- Rattletrap.Attribute.Boolean: instance GHC.Classes.Eq Rattletrap.Attribute.Boolean.BooleanAttribute
- Rattletrap.Attribute.Boolean: instance GHC.Classes.Ord Rattletrap.Attribute.Boolean.BooleanAttribute
- Rattletrap.Attribute.Boolean: instance GHC.Show.Show Rattletrap.Attribute.Boolean.BooleanAttribute
- Rattletrap.Attribute.Boolean: newtype BooleanAttribute
- Rattletrap.Attribute.Boolean: putBooleanAttribute :: BooleanAttribute -> BitPut ()
- Rattletrap.Attribute.Byte: ByteAttribute :: Word8 -> ByteAttribute
- Rattletrap.Attribute.Byte: [byteAttributeValue] :: ByteAttribute -> Word8
- Rattletrap.Attribute.Byte: getByteAttribute :: BitGet ByteAttribute
- Rattletrap.Attribute.Byte: instance GHC.Classes.Eq Rattletrap.Attribute.Byte.ByteAttribute
- Rattletrap.Attribute.Byte: instance GHC.Classes.Ord Rattletrap.Attribute.Byte.ByteAttribute
- Rattletrap.Attribute.Byte: instance GHC.Show.Show Rattletrap.Attribute.Byte.ByteAttribute
- Rattletrap.Attribute.Byte: newtype ByteAttribute
- Rattletrap.Attribute.Byte: putByteAttribute :: ByteAttribute -> BitPut ()
- Rattletrap.Attribute.CamSettings: CamSettingsAttribute :: Float32 -> Float32 -> Float32 -> Float32 -> Float32 -> Float32 -> Maybe Float32 -> CamSettingsAttribute
- Rattletrap.Attribute.CamSettings: [camSettingsAttributeAngle] :: CamSettingsAttribute -> Float32
- Rattletrap.Attribute.CamSettings: [camSettingsAttributeDistance] :: CamSettingsAttribute -> Float32
- Rattletrap.Attribute.CamSettings: [camSettingsAttributeFov] :: CamSettingsAttribute -> Float32
- Rattletrap.Attribute.CamSettings: [camSettingsAttributeHeight] :: CamSettingsAttribute -> Float32
- Rattletrap.Attribute.CamSettings: [camSettingsAttributeStiffness] :: CamSettingsAttribute -> Float32
- Rattletrap.Attribute.CamSettings: [camSettingsAttributeSwivelSpeed] :: CamSettingsAttribute -> Float32
- Rattletrap.Attribute.CamSettings: [camSettingsAttributeTransitionSpeed] :: CamSettingsAttribute -> Maybe Float32
- Rattletrap.Attribute.CamSettings: data CamSettingsAttribute
- Rattletrap.Attribute.CamSettings: getCamSettingsAttribute :: (Int, Int, Int) -> BitGet CamSettingsAttribute
- Rattletrap.Attribute.CamSettings: instance GHC.Classes.Eq Rattletrap.Attribute.CamSettings.CamSettingsAttribute
- Rattletrap.Attribute.CamSettings: instance GHC.Classes.Ord Rattletrap.Attribute.CamSettings.CamSettingsAttribute
- Rattletrap.Attribute.CamSettings: instance GHC.Show.Show Rattletrap.Attribute.CamSettings.CamSettingsAttribute
- Rattletrap.Attribute.CamSettings: putCamSettingsAttribute :: CamSettingsAttribute -> BitPut ()
- Rattletrap.Attribute.ClubColors: ClubColorsAttribute :: Bool -> Word8 -> Bool -> Word8 -> ClubColorsAttribute
- Rattletrap.Attribute.ClubColors: [clubColorsAttributeBlueColor] :: ClubColorsAttribute -> Word8
- Rattletrap.Attribute.ClubColors: [clubColorsAttributeBlueFlag] :: ClubColorsAttribute -> Bool
- Rattletrap.Attribute.ClubColors: [clubColorsAttributeOrangeColor] :: ClubColorsAttribute -> Word8
- Rattletrap.Attribute.ClubColors: [clubColorsAttributeOrangeFlag] :: ClubColorsAttribute -> Bool
- Rattletrap.Attribute.ClubColors: data ClubColorsAttribute
- Rattletrap.Attribute.ClubColors: getClubColorsAttribute :: BitGet ClubColorsAttribute
- Rattletrap.Attribute.ClubColors: instance GHC.Classes.Eq Rattletrap.Attribute.ClubColors.ClubColorsAttribute
- Rattletrap.Attribute.ClubColors: instance GHC.Classes.Ord Rattletrap.Attribute.ClubColors.ClubColorsAttribute
- Rattletrap.Attribute.ClubColors: instance GHC.Show.Show Rattletrap.Attribute.ClubColors.ClubColorsAttribute
- Rattletrap.Attribute.ClubColors: putClubColorsAttribute :: ClubColorsAttribute -> BitPut ()
- Rattletrap.Attribute.DamageState: DamageStateAttribute :: Word8 -> Bool -> Int32 -> Vector -> Bool -> Bool -> DamageStateAttribute
- Rattletrap.Attribute.DamageState: [damageStateAttributeUnknown1] :: DamageStateAttribute -> Word8
- Rattletrap.Attribute.DamageState: [damageStateAttributeUnknown2] :: DamageStateAttribute -> Bool
- Rattletrap.Attribute.DamageState: [damageStateAttributeUnknown3] :: DamageStateAttribute -> Int32
- Rattletrap.Attribute.DamageState: [damageStateAttributeUnknown4] :: DamageStateAttribute -> Vector
- Rattletrap.Attribute.DamageState: [damageStateAttributeUnknown5] :: DamageStateAttribute -> Bool
- Rattletrap.Attribute.DamageState: [damageStateAttributeUnknown6] :: DamageStateAttribute -> Bool
- Rattletrap.Attribute.DamageState: data DamageStateAttribute
- Rattletrap.Attribute.DamageState: getDamageStateAttribute :: BitGet DamageStateAttribute
- Rattletrap.Attribute.DamageState: instance GHC.Classes.Eq Rattletrap.Attribute.DamageState.DamageStateAttribute
- Rattletrap.Attribute.DamageState: instance GHC.Classes.Ord Rattletrap.Attribute.DamageState.DamageStateAttribute
- Rattletrap.Attribute.DamageState: instance GHC.Show.Show Rattletrap.Attribute.DamageState.DamageStateAttribute
- Rattletrap.Attribute.DamageState: putDamageStateAttribute :: DamageStateAttribute -> BitPut ()
- Rattletrap.Attribute.Demolish: DemolishAttribute :: Bool -> Word32 -> Bool -> Word32 -> Vector -> Vector -> DemolishAttribute
- Rattletrap.Attribute.Demolish: [demolishAttributeAttackerActorId] :: DemolishAttribute -> Word32
- Rattletrap.Attribute.Demolish: [demolishAttributeAttackerFlag] :: DemolishAttribute -> Bool
- Rattletrap.Attribute.Demolish: [demolishAttributeAttackerVelocity] :: DemolishAttribute -> Vector
- Rattletrap.Attribute.Demolish: [demolishAttributeVictimActorId] :: DemolishAttribute -> Word32
- Rattletrap.Attribute.Demolish: [demolishAttributeVictimFlag] :: DemolishAttribute -> Bool
- Rattletrap.Attribute.Demolish: [demolishAttributeVictimVelocity] :: DemolishAttribute -> Vector
- Rattletrap.Attribute.Demolish: data DemolishAttribute
- Rattletrap.Attribute.Demolish: getDemolishAttribute :: BitGet DemolishAttribute
- Rattletrap.Attribute.Demolish: instance GHC.Classes.Eq Rattletrap.Attribute.Demolish.DemolishAttribute
- Rattletrap.Attribute.Demolish: instance GHC.Classes.Ord Rattletrap.Attribute.Demolish.DemolishAttribute
- Rattletrap.Attribute.Demolish: instance GHC.Show.Show Rattletrap.Attribute.Demolish.DemolishAttribute
- Rattletrap.Attribute.Demolish: putDemolishAttribute :: DemolishAttribute -> BitPut ()
- Rattletrap.Attribute.Enum: EnumAttribute :: Word16 -> EnumAttribute
- Rattletrap.Attribute.Enum: [enumAttributeValue] :: EnumAttribute -> Word16
- Rattletrap.Attribute.Enum: getEnumAttribute :: BitGet EnumAttribute
- Rattletrap.Attribute.Enum: instance GHC.Classes.Eq Rattletrap.Attribute.Enum.EnumAttribute
- Rattletrap.Attribute.Enum: instance GHC.Classes.Ord Rattletrap.Attribute.Enum.EnumAttribute
- Rattletrap.Attribute.Enum: instance GHC.Show.Show Rattletrap.Attribute.Enum.EnumAttribute
- Rattletrap.Attribute.Enum: newtype EnumAttribute
- Rattletrap.Attribute.Enum: putEnumAttribute :: EnumAttribute -> BitPut ()
- Rattletrap.Attribute.Explosion: ExplosionAttribute :: Int32 -> Vector -> ExplosionAttribute
- Rattletrap.Attribute.Explosion: [explosionAttributeActorId] :: ExplosionAttribute -> Int32
- Rattletrap.Attribute.Explosion: [explosionAttributeLocation] :: ExplosionAttribute -> Vector
- Rattletrap.Attribute.Explosion: data ExplosionAttribute
- Rattletrap.Attribute.Explosion: getExplosionAttribute :: BitGet ExplosionAttribute
- Rattletrap.Attribute.Explosion: instance GHC.Classes.Eq Rattletrap.Attribute.Explosion.ExplosionAttribute
- Rattletrap.Attribute.Explosion: instance GHC.Classes.Ord Rattletrap.Attribute.Explosion.ExplosionAttribute
- Rattletrap.Attribute.Explosion: instance GHC.Show.Show Rattletrap.Attribute.Explosion.ExplosionAttribute
- Rattletrap.Attribute.Explosion: putExplosionAttribute :: ExplosionAttribute -> BitPut ()
- Rattletrap.Attribute.ExtendedExplosion: ExtendedExplosionAttribute :: Int32 -> Vector -> Bool -> Int32 -> ExtendedExplosionAttribute
- Rattletrap.Attribute.ExtendedExplosion: [extendedExplosionAttributeActorId] :: ExtendedExplosionAttribute -> Int32
- Rattletrap.Attribute.ExtendedExplosion: [extendedExplosionAttributeLocation] :: ExtendedExplosionAttribute -> Vector
- Rattletrap.Attribute.ExtendedExplosion: [extendedExplosionAttributeUnknown1] :: ExtendedExplosionAttribute -> Bool
- Rattletrap.Attribute.ExtendedExplosion: [extendedExplosionAttributeUnknown2] :: ExtendedExplosionAttribute -> Int32
- Rattletrap.Attribute.ExtendedExplosion: data ExtendedExplosionAttribute
- Rattletrap.Attribute.ExtendedExplosion: getExtendedExplosionAttribute :: BitGet ExtendedExplosionAttribute
- Rattletrap.Attribute.ExtendedExplosion: instance GHC.Classes.Eq Rattletrap.Attribute.ExtendedExplosion.ExtendedExplosionAttribute
- Rattletrap.Attribute.ExtendedExplosion: instance GHC.Classes.Ord Rattletrap.Attribute.ExtendedExplosion.ExtendedExplosionAttribute
- Rattletrap.Attribute.ExtendedExplosion: instance GHC.Show.Show Rattletrap.Attribute.ExtendedExplosion.ExtendedExplosionAttribute
- Rattletrap.Attribute.ExtendedExplosion: putExtendedExplosionAttribute :: ExtendedExplosionAttribute -> BitPut ()
- Rattletrap.Attribute.FlaggedInt: FlaggedIntAttribute :: Bool -> Int32 -> FlaggedIntAttribute
- Rattletrap.Attribute.FlaggedInt: [flaggedIntAttributeFlag] :: FlaggedIntAttribute -> Bool
- Rattletrap.Attribute.FlaggedInt: [flaggedIntAttributeInt] :: FlaggedIntAttribute -> Int32
- Rattletrap.Attribute.FlaggedInt: data FlaggedIntAttribute
- Rattletrap.Attribute.FlaggedInt: getFlaggedIntAttribute :: BitGet FlaggedIntAttribute
- Rattletrap.Attribute.FlaggedInt: instance GHC.Classes.Eq Rattletrap.Attribute.FlaggedInt.FlaggedIntAttribute
- Rattletrap.Attribute.FlaggedInt: instance GHC.Classes.Ord Rattletrap.Attribute.FlaggedInt.FlaggedIntAttribute
- Rattletrap.Attribute.FlaggedInt: instance GHC.Show.Show Rattletrap.Attribute.FlaggedInt.FlaggedIntAttribute
- Rattletrap.Attribute.FlaggedInt: putFlaggedIntAttribute :: FlaggedIntAttribute -> BitPut ()
- Rattletrap.Attribute.Float: FloatAttribute :: Float32 -> FloatAttribute
- Rattletrap.Attribute.Float: [floatAttributeValue] :: FloatAttribute -> Float32
- Rattletrap.Attribute.Float: getFloatAttribute :: BitGet FloatAttribute
- Rattletrap.Attribute.Float: instance GHC.Classes.Eq Rattletrap.Attribute.Float.FloatAttribute
- Rattletrap.Attribute.Float: instance GHC.Classes.Ord Rattletrap.Attribute.Float.FloatAttribute
- Rattletrap.Attribute.Float: instance GHC.Show.Show Rattletrap.Attribute.Float.FloatAttribute
- Rattletrap.Attribute.Float: newtype FloatAttribute
- Rattletrap.Attribute.Float: putFloatAttribute :: FloatAttribute -> BitPut ()
- Rattletrap.Attribute.GameMode: GameModeAttribute :: Int -> Word8 -> GameModeAttribute
- Rattletrap.Attribute.GameMode: [gameModeAttributeNumBits] :: GameModeAttribute -> Int
- Rattletrap.Attribute.GameMode: [gameModeAttributeWord] :: GameModeAttribute -> Word8
- Rattletrap.Attribute.GameMode: data GameModeAttribute
- Rattletrap.Attribute.GameMode: getGameModeAttribute :: (Int, Int, Int) -> BitGet GameModeAttribute
- Rattletrap.Attribute.GameMode: instance GHC.Classes.Eq Rattletrap.Attribute.GameMode.GameModeAttribute
- Rattletrap.Attribute.GameMode: instance GHC.Classes.Ord Rattletrap.Attribute.GameMode.GameModeAttribute
- Rattletrap.Attribute.GameMode: instance GHC.Show.Show Rattletrap.Attribute.GameMode.GameModeAttribute
- Rattletrap.Attribute.GameMode: putGameModeAttribute :: GameModeAttribute -> BitPut ()
- Rattletrap.Attribute.Int: IntAttribute :: Int32 -> IntAttribute
- Rattletrap.Attribute.Int: [intAttributeValue] :: IntAttribute -> Int32
- Rattletrap.Attribute.Int: getIntAttribute :: BitGet IntAttribute
- Rattletrap.Attribute.Int: instance GHC.Classes.Eq Rattletrap.Attribute.Int.IntAttribute
- Rattletrap.Attribute.Int: instance GHC.Classes.Ord Rattletrap.Attribute.Int.IntAttribute
- Rattletrap.Attribute.Int: instance GHC.Show.Show Rattletrap.Attribute.Int.IntAttribute
- Rattletrap.Attribute.Int: newtype IntAttribute
- Rattletrap.Attribute.Int: putIntAttribute :: IntAttribute -> BitPut ()
- Rattletrap.Attribute.Loadout: LoadoutAttribute :: Word8 -> Word32 -> Word32 -> Word32 -> Word32 -> Word32 -> Word32 -> Word32 -> Maybe Word32 -> Maybe Word32 -> Maybe Word32 -> Maybe Word32 -> Maybe Word32 -> LoadoutAttribute
- Rattletrap.Attribute.Loadout: [loadoutAttributeAntenna] :: LoadoutAttribute -> Word32
- Rattletrap.Attribute.Loadout: [loadoutAttributeBanner] :: LoadoutAttribute -> Maybe Word32
- Rattletrap.Attribute.Loadout: [loadoutAttributeBody] :: LoadoutAttribute -> Word32
- Rattletrap.Attribute.Loadout: [loadoutAttributeDecal] :: LoadoutAttribute -> Word32
- Rattletrap.Attribute.Loadout: [loadoutAttributeEngineAudio] :: LoadoutAttribute -> Maybe Word32
- Rattletrap.Attribute.Loadout: [loadoutAttributeGoalExplosion] :: LoadoutAttribute -> Maybe Word32
- Rattletrap.Attribute.Loadout: [loadoutAttributeRocketTrail] :: LoadoutAttribute -> Word32
- Rattletrap.Attribute.Loadout: [loadoutAttributeTopper] :: LoadoutAttribute -> Word32
- Rattletrap.Attribute.Loadout: [loadoutAttributeTrail] :: LoadoutAttribute -> Maybe Word32
- Rattletrap.Attribute.Loadout: [loadoutAttributeUnknown1] :: LoadoutAttribute -> Word32
- Rattletrap.Attribute.Loadout: [loadoutAttributeUnknown2] :: LoadoutAttribute -> Maybe Word32
- Rattletrap.Attribute.Loadout: [loadoutAttributeVersion] :: LoadoutAttribute -> Word8
- Rattletrap.Attribute.Loadout: [loadoutAttributeWheels] :: LoadoutAttribute -> Word32
- Rattletrap.Attribute.Loadout: data LoadoutAttribute
- Rattletrap.Attribute.Loadout: getLoadoutAttribute :: BitGet LoadoutAttribute
- Rattletrap.Attribute.Loadout: getOptional :: Bool -> BitGet a -> BitGet (Maybe a)
- Rattletrap.Attribute.Loadout: instance GHC.Classes.Eq Rattletrap.Attribute.Loadout.LoadoutAttribute
- Rattletrap.Attribute.Loadout: instance GHC.Classes.Ord Rattletrap.Attribute.Loadout.LoadoutAttribute
- Rattletrap.Attribute.Loadout: instance GHC.Show.Show Rattletrap.Attribute.Loadout.LoadoutAttribute
- Rattletrap.Attribute.Loadout: putLoadoutAttribute :: LoadoutAttribute -> BitPut ()
- Rattletrap.Attribute.Loadout: putOptional :: Maybe a -> (a -> BitPut ()) -> BitPut ()
- Rattletrap.Attribute.LoadoutOnline: LoadoutOnlineAttribute :: [[ProductAttribute]] -> LoadoutOnlineAttribute
- Rattletrap.Attribute.LoadoutOnline: [loadoutAttributeValue] :: LoadoutOnlineAttribute -> [[ProductAttribute]]
- Rattletrap.Attribute.LoadoutOnline: getLoadoutOnlineAttribute :: (Int, Int, Int) -> Map Word32 Text -> BitGet LoadoutOnlineAttribute
- Rattletrap.Attribute.LoadoutOnline: instance GHC.Classes.Eq Rattletrap.Attribute.LoadoutOnline.LoadoutOnlineAttribute
- Rattletrap.Attribute.LoadoutOnline: instance GHC.Classes.Ord Rattletrap.Attribute.LoadoutOnline.LoadoutOnlineAttribute
- Rattletrap.Attribute.LoadoutOnline: instance GHC.Show.Show Rattletrap.Attribute.LoadoutOnline.LoadoutOnlineAttribute
- Rattletrap.Attribute.LoadoutOnline: newtype LoadoutOnlineAttribute
- Rattletrap.Attribute.LoadoutOnline: putLoadoutOnlineAttribute :: LoadoutOnlineAttribute -> BitPut ()
- Rattletrap.Attribute.Loadouts: LoadoutsAttribute :: LoadoutAttribute -> LoadoutAttribute -> LoadoutsAttribute
- Rattletrap.Attribute.Loadouts: [loadoutsAttributeBlue] :: LoadoutsAttribute -> LoadoutAttribute
- Rattletrap.Attribute.Loadouts: [loadoutsAttributeOrange] :: LoadoutsAttribute -> LoadoutAttribute
- Rattletrap.Attribute.Loadouts: data LoadoutsAttribute
- Rattletrap.Attribute.Loadouts: getLoadoutsAttribute :: BitGet LoadoutsAttribute
- Rattletrap.Attribute.Loadouts: instance GHC.Classes.Eq Rattletrap.Attribute.Loadouts.LoadoutsAttribute
- Rattletrap.Attribute.Loadouts: instance GHC.Classes.Ord Rattletrap.Attribute.Loadouts.LoadoutsAttribute
- Rattletrap.Attribute.Loadouts: instance GHC.Show.Show Rattletrap.Attribute.Loadouts.LoadoutsAttribute
- Rattletrap.Attribute.Loadouts: putLoadoutsAttribute :: LoadoutsAttribute -> BitPut ()
- Rattletrap.Attribute.LoadoutsOnline: LoadoutsOnlineAttribute :: LoadoutOnlineAttribute -> LoadoutOnlineAttribute -> Bool -> Bool -> LoadoutsOnlineAttribute
- Rattletrap.Attribute.LoadoutsOnline: [loadoutsOnlineAttributeBlue] :: LoadoutsOnlineAttribute -> LoadoutOnlineAttribute
- Rattletrap.Attribute.LoadoutsOnline: [loadoutsOnlineAttributeOrange] :: LoadoutsOnlineAttribute -> LoadoutOnlineAttribute
- Rattletrap.Attribute.LoadoutsOnline: [loadoutsOnlineAttributeUnknown1] :: LoadoutsOnlineAttribute -> Bool
- Rattletrap.Attribute.LoadoutsOnline: [loadoutsOnlineAttributeUnknown2] :: LoadoutsOnlineAttribute -> Bool
- Rattletrap.Attribute.LoadoutsOnline: data LoadoutsOnlineAttribute
- Rattletrap.Attribute.LoadoutsOnline: getLoadoutsOnlineAttribute :: (Int, Int, Int) -> Map Word32 Text -> BitGet LoadoutsOnlineAttribute
- Rattletrap.Attribute.LoadoutsOnline: instance GHC.Classes.Eq Rattletrap.Attribute.LoadoutsOnline.LoadoutsOnlineAttribute
- Rattletrap.Attribute.LoadoutsOnline: instance GHC.Classes.Ord Rattletrap.Attribute.LoadoutsOnline.LoadoutsOnlineAttribute
- Rattletrap.Attribute.LoadoutsOnline: instance GHC.Show.Show Rattletrap.Attribute.LoadoutsOnline.LoadoutsOnlineAttribute
- Rattletrap.Attribute.LoadoutsOnline: putLoadoutsOnlineAttribute :: LoadoutsOnlineAttribute -> BitPut ()
- Rattletrap.Attribute.Location: LocationAttribute :: Vector -> LocationAttribute
- Rattletrap.Attribute.Location: [locationAttributeValue] :: LocationAttribute -> Vector
- Rattletrap.Attribute.Location: getLocationAttribute :: BitGet LocationAttribute
- Rattletrap.Attribute.Location: instance GHC.Classes.Eq Rattletrap.Attribute.Location.LocationAttribute
- Rattletrap.Attribute.Location: instance GHC.Classes.Ord Rattletrap.Attribute.Location.LocationAttribute
- Rattletrap.Attribute.Location: instance GHC.Show.Show Rattletrap.Attribute.Location.LocationAttribute
- Rattletrap.Attribute.Location: newtype LocationAttribute
- Rattletrap.Attribute.Location: putLocationAttribute :: LocationAttribute -> BitPut ()
- Rattletrap.Attribute.MusicStinger: MusicStingerAttribute :: Bool -> Word32 -> Word8 -> MusicStingerAttribute
- Rattletrap.Attribute.MusicStinger: [musicStingerAttributeCue] :: MusicStingerAttribute -> Word32
- Rattletrap.Attribute.MusicStinger: [musicStingerAttributeFlag] :: MusicStingerAttribute -> Bool
- Rattletrap.Attribute.MusicStinger: [musicStingerAttributeTrigger] :: MusicStingerAttribute -> Word8
- Rattletrap.Attribute.MusicStinger: data MusicStingerAttribute
- Rattletrap.Attribute.MusicStinger: getMusicStingerAttribute :: BitGet MusicStingerAttribute
- Rattletrap.Attribute.MusicStinger: instance GHC.Classes.Eq Rattletrap.Attribute.MusicStinger.MusicStingerAttribute
- Rattletrap.Attribute.MusicStinger: instance GHC.Classes.Ord Rattletrap.Attribute.MusicStinger.MusicStingerAttribute
- Rattletrap.Attribute.MusicStinger: instance GHC.Show.Show Rattletrap.Attribute.MusicStinger.MusicStingerAttribute
- Rattletrap.Attribute.MusicStinger: putMusicStingerAttribute :: MusicStingerAttribute -> BitPut ()
- Rattletrap.Attribute.PartyLeader: PartyLeaderAttribute :: Word8 -> Maybe (RemoteId, Word8) -> PartyLeaderAttribute
- Rattletrap.Attribute.PartyLeader: [partyLeaderAttributeId] :: PartyLeaderAttribute -> Maybe (RemoteId, Word8)
- Rattletrap.Attribute.PartyLeader: [partyLeaderAttributeSystemId] :: PartyLeaderAttribute -> Word8
- Rattletrap.Attribute.PartyLeader: data PartyLeaderAttribute
- Rattletrap.Attribute.PartyLeader: getPartyLeaderAttribute :: (Int, Int, Int) -> BitGet PartyLeaderAttribute
- Rattletrap.Attribute.PartyLeader: instance GHC.Classes.Eq Rattletrap.Attribute.PartyLeader.PartyLeaderAttribute
- Rattletrap.Attribute.PartyLeader: instance GHC.Classes.Ord Rattletrap.Attribute.PartyLeader.PartyLeaderAttribute
- Rattletrap.Attribute.PartyLeader: instance GHC.Show.Show Rattletrap.Attribute.PartyLeader.PartyLeaderAttribute
- Rattletrap.Attribute.PartyLeader: putPartyLeaderAttribute :: PartyLeaderAttribute -> BitPut ()
- Rattletrap.Attribute.Pickup: PickupAttribute :: Maybe Word32 -> Bool -> PickupAttribute
- Rattletrap.Attribute.Pickup: [pickupAttributeInstigatorId] :: PickupAttribute -> Maybe Word32
- Rattletrap.Attribute.Pickup: [pickupAttributePickedUp] :: PickupAttribute -> Bool
- Rattletrap.Attribute.Pickup: data PickupAttribute
- Rattletrap.Attribute.Pickup: getPickupAttribute :: BitGet PickupAttribute
- Rattletrap.Attribute.Pickup: instance GHC.Classes.Eq Rattletrap.Attribute.Pickup.PickupAttribute
- Rattletrap.Attribute.Pickup: instance GHC.Classes.Ord Rattletrap.Attribute.Pickup.PickupAttribute
- Rattletrap.Attribute.Pickup: instance GHC.Show.Show Rattletrap.Attribute.Pickup.PickupAttribute
- Rattletrap.Attribute.Pickup: putPickupAttribute :: PickupAttribute -> BitPut ()
- Rattletrap.Attribute.PrivateMatchSettings: PrivateMatchSettingsAttribute :: Text -> Word32 -> Word32 -> Text -> Text -> Bool -> PrivateMatchSettingsAttribute
- Rattletrap.Attribute.PrivateMatchSettings: [privateMatchSettingsAttributeFlag] :: PrivateMatchSettingsAttribute -> Bool
- Rattletrap.Attribute.PrivateMatchSettings: [privateMatchSettingsAttributeGameName] :: PrivateMatchSettingsAttribute -> Text
- Rattletrap.Attribute.PrivateMatchSettings: [privateMatchSettingsAttributeJoinableBy] :: PrivateMatchSettingsAttribute -> Word32
- Rattletrap.Attribute.PrivateMatchSettings: [privateMatchSettingsAttributeMaxPlayers] :: PrivateMatchSettingsAttribute -> Word32
- Rattletrap.Attribute.PrivateMatchSettings: [privateMatchSettingsAttributeMutators] :: PrivateMatchSettingsAttribute -> Text
- Rattletrap.Attribute.PrivateMatchSettings: [privateMatchSettingsAttributePassword] :: PrivateMatchSettingsAttribute -> Text
- Rattletrap.Attribute.PrivateMatchSettings: data PrivateMatchSettingsAttribute
- Rattletrap.Attribute.PrivateMatchSettings: getPrivateMatchSettingsAttribute :: BitGet PrivateMatchSettingsAttribute
- Rattletrap.Attribute.PrivateMatchSettings: instance GHC.Classes.Eq Rattletrap.Attribute.PrivateMatchSettings.PrivateMatchSettingsAttribute
- Rattletrap.Attribute.PrivateMatchSettings: instance GHC.Classes.Ord Rattletrap.Attribute.PrivateMatchSettings.PrivateMatchSettingsAttribute
- Rattletrap.Attribute.PrivateMatchSettings: instance GHC.Show.Show Rattletrap.Attribute.PrivateMatchSettings.PrivateMatchSettingsAttribute
- Rattletrap.Attribute.PrivateMatchSettings: putPrivateMatchSettingsAttribute :: PrivateMatchSettingsAttribute -> BitPut ()
- Rattletrap.Attribute.Product: ProductAttribute :: Bool -> Word32 -> Maybe Text -> Maybe (Either CompressedWord Word32) -> ProductAttribute
- Rattletrap.Attribute.Product: [productAttributeObjectId] :: ProductAttribute -> Word32
- Rattletrap.Attribute.Product: [productAttributeObjectName] :: ProductAttribute -> Maybe Text
- Rattletrap.Attribute.Product: [productAttributeUnknown] :: ProductAttribute -> Bool
- Rattletrap.Attribute.Product: [productAttributeValue] :: ProductAttribute -> Maybe (Either CompressedWord Word32)
- Rattletrap.Attribute.Product: data ProductAttribute
- Rattletrap.Attribute.Product: getProductAttribute :: (Int, Int, Int) -> Map Word32 Text -> BitGet ProductAttribute
- Rattletrap.Attribute.Product: getProductAttributes :: (Int, Int, Int) -> Map Word32 Text -> BitGet [ProductAttribute]
- Rattletrap.Attribute.Product: instance GHC.Classes.Eq Rattletrap.Attribute.Product.ProductAttribute
- Rattletrap.Attribute.Product: instance GHC.Classes.Ord Rattletrap.Attribute.Product.ProductAttribute
- Rattletrap.Attribute.Product: instance GHC.Show.Show Rattletrap.Attribute.Product.ProductAttribute
- Rattletrap.Attribute.Product: putProductAttribute :: ProductAttribute -> BitPut ()
- Rattletrap.Attribute.Product: putProductAttributes :: [ProductAttribute] -> BitPut ()
- Rattletrap.Attribute.QWord: QWordAttribute :: Word64 -> QWordAttribute
- Rattletrap.Attribute.QWord: [qWordAttributeValue] :: QWordAttribute -> Word64
- Rattletrap.Attribute.QWord: getQWordAttribute :: BitGet QWordAttribute
- Rattletrap.Attribute.QWord: instance GHC.Classes.Eq Rattletrap.Attribute.QWord.QWordAttribute
- Rattletrap.Attribute.QWord: instance GHC.Classes.Ord Rattletrap.Attribute.QWord.QWordAttribute
- Rattletrap.Attribute.QWord: instance GHC.Show.Show Rattletrap.Attribute.QWord.QWordAttribute
- Rattletrap.Attribute.QWord: newtype QWordAttribute
- Rattletrap.Attribute.QWord: putQWordAttribute :: QWordAttribute -> BitPut ()
- Rattletrap.Attribute.Reservation: ReservationAttribute :: CompressedWord -> UniqueIdAttribute -> Maybe Text -> Bool -> Bool -> Maybe Word8 -> ReservationAttribute
- Rattletrap.Attribute.Reservation: [reservationAttributeName] :: ReservationAttribute -> Maybe Text
- Rattletrap.Attribute.Reservation: [reservationAttributeNumber] :: ReservationAttribute -> CompressedWord
- Rattletrap.Attribute.Reservation: [reservationAttributeUniqueId] :: ReservationAttribute -> UniqueIdAttribute
- Rattletrap.Attribute.Reservation: [reservationAttributeUnknown1] :: ReservationAttribute -> Bool
- Rattletrap.Attribute.Reservation: [reservationAttributeUnknown2] :: ReservationAttribute -> Bool
- Rattletrap.Attribute.Reservation: [reservationAttributeUnknown3] :: ReservationAttribute -> Maybe Word8
- Rattletrap.Attribute.Reservation: data ReservationAttribute
- Rattletrap.Attribute.Reservation: getReservationAttribute :: (Int, Int, Int) -> BitGet ReservationAttribute
- Rattletrap.Attribute.Reservation: instance GHC.Classes.Eq Rattletrap.Attribute.Reservation.ReservationAttribute
- Rattletrap.Attribute.Reservation: instance GHC.Classes.Ord Rattletrap.Attribute.Reservation.ReservationAttribute
- Rattletrap.Attribute.Reservation: instance GHC.Show.Show Rattletrap.Attribute.Reservation.ReservationAttribute
- Rattletrap.Attribute.Reservation: putReservationAttribute :: ReservationAttribute -> BitPut ()
- Rattletrap.Attribute.RigidBodyState: RigidBodyStateAttribute :: Bool -> Vector -> CompressedWordVector -> Maybe Vector -> Maybe Vector -> RigidBodyStateAttribute
- Rattletrap.Attribute.RigidBodyState: [rigidBodyStateAttributeAngularVelocity] :: RigidBodyStateAttribute -> Maybe Vector
- Rattletrap.Attribute.RigidBodyState: [rigidBodyStateAttributeLinearVelocity] :: RigidBodyStateAttribute -> Maybe Vector
- Rattletrap.Attribute.RigidBodyState: [rigidBodyStateAttributeLocation] :: RigidBodyStateAttribute -> Vector
- Rattletrap.Attribute.RigidBodyState: [rigidBodyStateAttributeRotation] :: RigidBodyStateAttribute -> CompressedWordVector
- Rattletrap.Attribute.RigidBodyState: [rigidBodyStateAttributeSleeping] :: RigidBodyStateAttribute -> Bool
- Rattletrap.Attribute.RigidBodyState: data RigidBodyStateAttribute
- Rattletrap.Attribute.RigidBodyState: getRigidBodyStateAttribute :: BitGet RigidBodyStateAttribute
- Rattletrap.Attribute.RigidBodyState: instance GHC.Classes.Eq Rattletrap.Attribute.RigidBodyState.RigidBodyStateAttribute
- Rattletrap.Attribute.RigidBodyState: instance GHC.Classes.Ord Rattletrap.Attribute.RigidBodyState.RigidBodyStateAttribute
- Rattletrap.Attribute.RigidBodyState: instance GHC.Show.Show Rattletrap.Attribute.RigidBodyState.RigidBodyStateAttribute
- Rattletrap.Attribute.RigidBodyState: putRigidBodyStateAttribute :: RigidBodyStateAttribute -> BitPut ()
- Rattletrap.Attribute.String: StringAttribute :: Text -> StringAttribute
- Rattletrap.Attribute.String: [stringAttributeValue] :: StringAttribute -> Text
- Rattletrap.Attribute.String: getStringAttribute :: BitGet StringAttribute
- Rattletrap.Attribute.String: instance GHC.Classes.Eq Rattletrap.Attribute.String.StringAttribute
- Rattletrap.Attribute.String: instance GHC.Classes.Ord Rattletrap.Attribute.String.StringAttribute
- Rattletrap.Attribute.String: instance GHC.Show.Show Rattletrap.Attribute.String.StringAttribute
- Rattletrap.Attribute.String: newtype StringAttribute
- Rattletrap.Attribute.String: putStringAttribute :: StringAttribute -> BitPut ()
- Rattletrap.Attribute.TeamPaint: TeamPaintAttribute :: Word8 -> Word8 -> Word8 -> Word32 -> Word32 -> TeamPaintAttribute
- Rattletrap.Attribute.TeamPaint: [teamPaintAttributeAccentColor] :: TeamPaintAttribute -> Word8
- Rattletrap.Attribute.TeamPaint: [teamPaintAttributeAccentFinish] :: TeamPaintAttribute -> Word32
- Rattletrap.Attribute.TeamPaint: [teamPaintAttributePrimaryColor] :: TeamPaintAttribute -> Word8
- Rattletrap.Attribute.TeamPaint: [teamPaintAttributePrimaryFinish] :: TeamPaintAttribute -> Word32
- Rattletrap.Attribute.TeamPaint: [teamPaintAttributeTeam] :: TeamPaintAttribute -> Word8
- Rattletrap.Attribute.TeamPaint: data TeamPaintAttribute
- Rattletrap.Attribute.TeamPaint: getTeamPaintAttribute :: BitGet TeamPaintAttribute
- Rattletrap.Attribute.TeamPaint: instance GHC.Classes.Eq Rattletrap.Attribute.TeamPaint.TeamPaintAttribute
- Rattletrap.Attribute.TeamPaint: instance GHC.Classes.Ord Rattletrap.Attribute.TeamPaint.TeamPaintAttribute
- Rattletrap.Attribute.TeamPaint: instance GHC.Show.Show Rattletrap.Attribute.TeamPaint.TeamPaintAttribute
- Rattletrap.Attribute.TeamPaint: putTeamPaintAttribute :: TeamPaintAttribute -> BitPut ()
- Rattletrap.Attribute.UniqueId: UniqueIdAttribute :: Word8 -> RemoteId -> Word8 -> UniqueIdAttribute
- Rattletrap.Attribute.UniqueId: [uniqueIdAttributeLocalId] :: UniqueIdAttribute -> Word8
- Rattletrap.Attribute.UniqueId: [uniqueIdAttributeRemoteId] :: UniqueIdAttribute -> RemoteId
- Rattletrap.Attribute.UniqueId: [uniqueIdAttributeSystemId] :: UniqueIdAttribute -> Word8
- Rattletrap.Attribute.UniqueId: data UniqueIdAttribute
- Rattletrap.Attribute.UniqueId: getUniqueIdAttribute :: (Int, Int, Int) -> BitGet UniqueIdAttribute
- Rattletrap.Attribute.UniqueId: instance GHC.Classes.Eq Rattletrap.Attribute.UniqueId.UniqueIdAttribute
- Rattletrap.Attribute.UniqueId: instance GHC.Classes.Ord Rattletrap.Attribute.UniqueId.UniqueIdAttribute
- Rattletrap.Attribute.UniqueId: instance GHC.Show.Show Rattletrap.Attribute.UniqueId.UniqueIdAttribute
- Rattletrap.Attribute.UniqueId: putUniqueIdAttribute :: UniqueIdAttribute -> BitPut ()
- Rattletrap.Attribute.WeldedInfo: WeldedInfoAttribute :: Bool -> Int32 -> Vector -> Float32 -> Int8Vector -> WeldedInfoAttribute
- Rattletrap.Attribute.WeldedInfo: [weldedInfoAttributeActive] :: WeldedInfoAttribute -> Bool
- Rattletrap.Attribute.WeldedInfo: [weldedInfoAttributeActorId] :: WeldedInfoAttribute -> Int32
- Rattletrap.Attribute.WeldedInfo: [weldedInfoAttributeMass] :: WeldedInfoAttribute -> Float32
- Rattletrap.Attribute.WeldedInfo: [weldedInfoAttributeOffset] :: WeldedInfoAttribute -> Vector
- Rattletrap.Attribute.WeldedInfo: [weldedInfoAttributeRotation] :: WeldedInfoAttribute -> Int8Vector
- Rattletrap.Attribute.WeldedInfo: data WeldedInfoAttribute
- Rattletrap.Attribute.WeldedInfo: getWeldedInfoAttribute :: BitGet WeldedInfoAttribute
- Rattletrap.Attribute.WeldedInfo: instance GHC.Classes.Eq Rattletrap.Attribute.WeldedInfo.WeldedInfoAttribute
- Rattletrap.Attribute.WeldedInfo: instance GHC.Classes.Ord Rattletrap.Attribute.WeldedInfo.WeldedInfoAttribute
- Rattletrap.Attribute.WeldedInfo: instance GHC.Show.Show Rattletrap.Attribute.WeldedInfo.WeldedInfoAttribute
- Rattletrap.Attribute.WeldedInfo: putWeldedInfoAttribute :: WeldedInfoAttribute -> BitPut ()
- Rattletrap.AttributeMapping: AttributeMapping :: Word32 -> Word32 -> AttributeMapping
- Rattletrap.AttributeMapping: [attributeMappingObjectId] :: AttributeMapping -> Word32
- Rattletrap.AttributeMapping: [attributeMappingStreamId] :: AttributeMapping -> Word32
- Rattletrap.AttributeMapping: data AttributeMapping
- Rattletrap.AttributeMapping: getAttributeMapping :: Get AttributeMapping
- Rattletrap.AttributeMapping: instance GHC.Classes.Eq Rattletrap.AttributeMapping.AttributeMapping
- Rattletrap.AttributeMapping: instance GHC.Classes.Ord Rattletrap.AttributeMapping.AttributeMapping
- Rattletrap.AttributeMapping: instance GHC.Show.Show Rattletrap.AttributeMapping.AttributeMapping
- Rattletrap.AttributeMapping: putAttributeMapping :: AttributeMapping -> Put
- Rattletrap.AttributeType: AppliedDamageAttributeType :: AttributeType
- Rattletrap.AttributeType: BooleanAttributeType :: AttributeType
- Rattletrap.AttributeType: ByteAttributeType :: AttributeType
- Rattletrap.AttributeType: CamSettingsAttributeType :: AttributeType
- Rattletrap.AttributeType: ClubColorsAttributeType :: AttributeType
- Rattletrap.AttributeType: DamageStateAttributeType :: AttributeType
- Rattletrap.AttributeType: DemolishAttributeType :: AttributeType
- Rattletrap.AttributeType: EnumAttributeType :: AttributeType
- Rattletrap.AttributeType: ExplosionAttributeType :: AttributeType
- Rattletrap.AttributeType: ExtendedExplosionAttributeType :: AttributeType
- Rattletrap.AttributeType: FlaggedIntAttributeType :: AttributeType
- Rattletrap.AttributeType: FloatAttributeType :: AttributeType
- Rattletrap.AttributeType: GameModeAttributeType :: AttributeType
- Rattletrap.AttributeType: IntAttributeType :: AttributeType
- Rattletrap.AttributeType: LoadoutAttributeType :: AttributeType
- Rattletrap.AttributeType: LoadoutOnlineAttributeType :: AttributeType
- Rattletrap.AttributeType: LoadoutsAttributeType :: AttributeType
- Rattletrap.AttributeType: LoadoutsOnlineAttributeType :: AttributeType
- Rattletrap.AttributeType: LocationAttributeType :: AttributeType
- Rattletrap.AttributeType: MusicStingerAttributeType :: AttributeType
- Rattletrap.AttributeType: PartyLeaderAttributeType :: AttributeType
- Rattletrap.AttributeType: PickupAttributeType :: AttributeType
- Rattletrap.AttributeType: PrivateMatchSettingsAttributeType :: AttributeType
- Rattletrap.AttributeType: QWordAttributeType :: AttributeType
- Rattletrap.AttributeType: ReservationAttributeType :: AttributeType
- Rattletrap.AttributeType: RigidBodyStateAttributeType :: AttributeType
- Rattletrap.AttributeType: StringAttributeType :: AttributeType
- Rattletrap.AttributeType: TeamPaintAttributeType :: AttributeType
- Rattletrap.AttributeType: UniqueIdAttributeType :: AttributeType
- Rattletrap.AttributeType: WeldedInfoAttributeType :: AttributeType
- Rattletrap.AttributeType: data AttributeType
- Rattletrap.AttributeType: instance GHC.Classes.Eq Rattletrap.AttributeType.AttributeType
- Rattletrap.AttributeType: instance GHC.Classes.Ord Rattletrap.AttributeType.AttributeType
- Rattletrap.AttributeType: instance GHC.Show.Show Rattletrap.AttributeType.AttributeType
- Rattletrap.AttributeValue: AppliedDamageAttributeValue :: AppliedDamageAttribute -> AttributeValue
- Rattletrap.AttributeValue: BooleanAttributeValue :: BooleanAttribute -> AttributeValue
- Rattletrap.AttributeValue: ByteAttributeValue :: ByteAttribute -> AttributeValue
- Rattletrap.AttributeValue: CamSettingsAttributeValue :: CamSettingsAttribute -> AttributeValue
- Rattletrap.AttributeValue: ClubColorsAttributeValue :: ClubColorsAttribute -> AttributeValue
- Rattletrap.AttributeValue: DamageStateAttributeValue :: DamageStateAttribute -> AttributeValue
- Rattletrap.AttributeValue: DemolishAttributeValue :: DemolishAttribute -> AttributeValue
- Rattletrap.AttributeValue: EnumAttributeValue :: EnumAttribute -> AttributeValue
- Rattletrap.AttributeValue: ExplosionAttributeValue :: ExplosionAttribute -> AttributeValue
- Rattletrap.AttributeValue: ExtendedExplosionAttributeValue :: ExtendedExplosionAttribute -> AttributeValue
- Rattletrap.AttributeValue: FlaggedIntAttributeValue :: FlaggedIntAttribute -> AttributeValue
- Rattletrap.AttributeValue: FloatAttributeValue :: FloatAttribute -> AttributeValue
- Rattletrap.AttributeValue: GameModeAttributeValue :: GameModeAttribute -> AttributeValue
- Rattletrap.AttributeValue: IntAttributeValue :: IntAttribute -> AttributeValue
- Rattletrap.AttributeValue: LoadoutAttributeValue :: LoadoutAttribute -> AttributeValue
- Rattletrap.AttributeValue: LoadoutOnlineAttributeValue :: LoadoutOnlineAttribute -> AttributeValue
- Rattletrap.AttributeValue: LoadoutsAttributeValue :: LoadoutsAttribute -> AttributeValue
- Rattletrap.AttributeValue: LoadoutsOnlineAttributeValue :: LoadoutsOnlineAttribute -> AttributeValue
- Rattletrap.AttributeValue: LocationAttributeValue :: LocationAttribute -> AttributeValue
- Rattletrap.AttributeValue: MusicStingerAttributeValue :: MusicStingerAttribute -> AttributeValue
- Rattletrap.AttributeValue: PartyLeaderAttributeValue :: PartyLeaderAttribute -> AttributeValue
- Rattletrap.AttributeValue: PickupAttributeValue :: PickupAttribute -> AttributeValue
- Rattletrap.AttributeValue: PrivateMatchSettingsAttributeValue :: PrivateMatchSettingsAttribute -> AttributeValue
- Rattletrap.AttributeValue: QWordAttributeValue :: QWordAttribute -> AttributeValue
- Rattletrap.AttributeValue: ReservationAttributeValue :: ReservationAttribute -> AttributeValue
- Rattletrap.AttributeValue: RigidBodyStateAttributeValue :: RigidBodyStateAttribute -> AttributeValue
- Rattletrap.AttributeValue: StringAttributeValue :: StringAttribute -> AttributeValue
- Rattletrap.AttributeValue: TeamPaintAttributeValue :: TeamPaintAttribute -> AttributeValue
- Rattletrap.AttributeValue: UniqueIdAttributeValue :: UniqueIdAttribute -> AttributeValue
- Rattletrap.AttributeValue: WeldedInfoAttributeValue :: WeldedInfoAttribute -> AttributeValue
- Rattletrap.AttributeValue: attributeTypes :: Map Text AttributeType
- Rattletrap.AttributeValue: data AttributeValue
- Rattletrap.AttributeValue: getAttributeValue :: (Int, Int, Int) -> Map Word32 Text -> Text -> BitGet AttributeValue
- Rattletrap.AttributeValue: instance GHC.Classes.Eq Rattletrap.AttributeValue.AttributeValue
- Rattletrap.AttributeValue: instance GHC.Classes.Ord Rattletrap.AttributeValue.AttributeValue
- Rattletrap.AttributeValue: instance GHC.Show.Show Rattletrap.AttributeValue.AttributeValue
- Rattletrap.AttributeValue: putAttributeValue :: AttributeValue -> BitPut ()
- Rattletrap.Cache: Cache :: Word32 -> Word32 -> Word32 -> List AttributeMapping -> Cache
- Rattletrap.Cache: [cacheAttributeMappings] :: Cache -> List AttributeMapping
- Rattletrap.Cache: [cacheCacheId] :: Cache -> Word32
- Rattletrap.Cache: [cacheClassId] :: Cache -> Word32
- Rattletrap.Cache: [cacheParentCacheId] :: Cache -> Word32
- Rattletrap.Cache: data Cache
- Rattletrap.Cache: getCache :: Get Cache
- Rattletrap.Cache: instance GHC.Classes.Eq Rattletrap.Cache.Cache
- Rattletrap.Cache: instance GHC.Classes.Ord Rattletrap.Cache.Cache
- Rattletrap.Cache: instance GHC.Show.Show Rattletrap.Cache.Cache
- Rattletrap.Cache: putCache :: Cache -> Put
- Rattletrap.ClassAttributeMap: ClassAttributeMap :: Map Word32 Text -> Map Word32 Word32 -> Map Word32 (Map Word32 Word32) -> IntMap Text -> ClassAttributeMap
- Rattletrap.ClassAttributeMap: [classAttributeMapNameMap] :: ClassAttributeMap -> IntMap Text
- Rattletrap.ClassAttributeMap: [classAttributeMapObjectClassMap] :: ClassAttributeMap -> Map Word32 Word32
- Rattletrap.ClassAttributeMap: [classAttributeMapObjectMap] :: ClassAttributeMap -> Map Word32 Text
- Rattletrap.ClassAttributeMap: [classAttributeMapValue] :: ClassAttributeMap -> Map Word32 (Map Word32 Word32)
- Rattletrap.ClassAttributeMap: classHasLocation :: Text -> Bool
- Rattletrap.ClassAttributeMap: classHasRotation :: Text -> Bool
- Rattletrap.ClassAttributeMap: classesWithLocation :: Set Text
- Rattletrap.ClassAttributeMap: classesWithRotation :: Set Text
- Rattletrap.ClassAttributeMap: data ClassAttributeMap
- Rattletrap.ClassAttributeMap: getAttributeIdLimit :: Map Word32 Word32 -> Maybe Word
- Rattletrap.ClassAttributeMap: getAttributeMap :: ClassAttributeMap -> ActorMap -> CompressedWord -> Maybe (Map Word32 Word32)
- Rattletrap.ClassAttributeMap: getAttributeName :: ClassAttributeMap -> Map Word32 Word32 -> CompressedWord -> Maybe Text
- Rattletrap.ClassAttributeMap: getClassId :: Map Word32 Text -> Bimap Word32 Text -> Word32 -> Maybe Word32
- Rattletrap.ClassAttributeMap: getClassName :: Text -> Maybe Text
- Rattletrap.ClassAttributeMap: getName :: IntMap Text -> Word32 -> Maybe Text
- Rattletrap.ClassAttributeMap: getObjectName :: Map Word32 Text -> Word32 -> Maybe Text
- Rattletrap.ClassAttributeMap: getParentClass :: Maybe Text -> Word32 -> [(Maybe Text, Word32, Word32, Word32)] -> Maybe Word32
- Rattletrap.ClassAttributeMap: getParentClassById :: Word32 -> [(Maybe Text, Word32, Word32, Word32)] -> Maybe Word32
- Rattletrap.ClassAttributeMap: getParentClassByName :: Text -> Word32 -> [(Maybe Text, Word32, Word32, Word32)] -> Maybe Word32
- Rattletrap.ClassAttributeMap: getParentClasses :: Map Word32 Word32 -> Word32 -> [Word32]
- Rattletrap.ClassAttributeMap: instance GHC.Classes.Eq Rattletrap.ClassAttributeMap.ClassAttributeMap
- Rattletrap.ClassAttributeMap: instance GHC.Classes.Ord Rattletrap.ClassAttributeMap.ClassAttributeMap
- Rattletrap.ClassAttributeMap: instance GHC.Show.Show Rattletrap.ClassAttributeMap.ClassAttributeMap
- Rattletrap.ClassAttributeMap: makeAttributeMap :: List Cache -> Map Word32 (Map Word32 Word32)
- Rattletrap.ClassAttributeMap: makeClassAttributeMap :: List Text -> List ClassMapping -> List Cache -> List Text -> ClassAttributeMap
- Rattletrap.ClassAttributeMap: makeClassCache :: Bimap Word32 Text -> List Cache -> [(Maybe Text, Word32, Word32, Word32)]
- Rattletrap.ClassAttributeMap: makeClassMap :: List ClassMapping -> Bimap Word32 Text
- Rattletrap.ClassAttributeMap: makeNameMap :: List Text -> IntMap Text
- Rattletrap.ClassAttributeMap: makeObjectClassMap :: Map Word32 Text -> Bimap Word32 Text -> Map Word32 Word32
- Rattletrap.ClassAttributeMap: makeObjectMap :: List Text -> Map Word32 Text
- Rattletrap.ClassAttributeMap: makeParentMap :: [(Maybe Text, Word32, Word32, Word32)] -> Map Word32 [Word32]
- Rattletrap.ClassAttributeMap: makeShallowParentMap :: [(Maybe Text, Word32, Word32, Word32)] -> Map Word32 Word32
- Rattletrap.ClassAttributeMap: normalizeObjectName :: Text -> Text
- Rattletrap.ClassAttributeMap: objectClasses :: Map Text Text
- Rattletrap.ClassAttributeMap: parentClasses :: Map Text Text
- Rattletrap.ClassMapping: ClassMapping :: Text -> Word32 -> ClassMapping
- Rattletrap.ClassMapping: [classMappingName] :: ClassMapping -> Text
- Rattletrap.ClassMapping: [classMappingStreamId] :: ClassMapping -> Word32
- Rattletrap.ClassMapping: data ClassMapping
- Rattletrap.ClassMapping: getClassMapping :: Get ClassMapping
- Rattletrap.ClassMapping: instance GHC.Classes.Eq Rattletrap.ClassMapping.ClassMapping
- Rattletrap.ClassMapping: instance GHC.Classes.Ord Rattletrap.ClassMapping.ClassMapping
- Rattletrap.ClassMapping: instance GHC.Show.Show Rattletrap.ClassMapping.ClassMapping
- Rattletrap.ClassMapping: putClassMapping :: ClassMapping -> Put
- Rattletrap.Content: Content :: List Text -> List KeyFrame -> Word32 -> [Frame] -> List Message -> List Mark -> List Text -> List Text -> List Text -> List ClassMapping -> List Cache -> Content
- Rattletrap.Content: [contentCaches] :: Content -> List Cache
- Rattletrap.Content: [contentClassMappings] :: Content -> List ClassMapping
- Rattletrap.Content: [contentFrames] :: Content -> [Frame]
- Rattletrap.Content: [contentKeyFrames] :: Content -> List KeyFrame
- Rattletrap.Content: [contentLevels] :: Content -> List Text
- Rattletrap.Content: [contentMarks] :: Content -> List Mark
- Rattletrap.Content: [contentMessages] :: Content -> List Message
- Rattletrap.Content: [contentNames] :: Content -> List Text
- Rattletrap.Content: [contentObjects] :: Content -> List Text
- Rattletrap.Content: [contentPackages] :: Content -> List Text
- Rattletrap.Content: [contentStreamSize] :: Content -> Word32
- Rattletrap.Content: data Content
- Rattletrap.Content: getContent :: (Int, Int, Int) -> Int -> Word -> Get Content
- Rattletrap.Content: instance GHC.Classes.Eq Rattletrap.Content.Content
- Rattletrap.Content: instance GHC.Classes.Ord Rattletrap.Content.Content
- Rattletrap.Content: instance GHC.Show.Show Rattletrap.Content.Content
- Rattletrap.Content: putContent :: Content -> Put
- Rattletrap.Crc: crc32Initial :: Word32
- Rattletrap.Crc: crc32Table :: Vector Word32
- Rattletrap.Crc: crc32Update :: Vector Word32 -> Word32 -> Word8 -> Word32
- Rattletrap.Crc: getCrc32 :: ByteString -> Word32
- Rattletrap.Frame: Frame :: Float32 -> Float32 -> [Replication] -> Frame
- Rattletrap.Frame: [frameDelta] :: Frame -> Float32
- Rattletrap.Frame: [frameReplications] :: Frame -> [Replication]
- Rattletrap.Frame: [frameTime] :: Frame -> Float32
- Rattletrap.Frame: data Frame
- Rattletrap.Frame: getFrame :: (Int, Int, Int) -> Word -> ClassAttributeMap -> ActorMap -> BitGet (Frame, ActorMap)
- Rattletrap.Frame: getFrames :: (Int, Int, Int) -> Int -> Word -> ClassAttributeMap -> ActorMap -> BitGet ([Frame], ActorMap)
- Rattletrap.Frame: instance GHC.Classes.Eq Rattletrap.Frame.Frame
- Rattletrap.Frame: instance GHC.Classes.Ord Rattletrap.Frame.Frame
- Rattletrap.Frame: instance GHC.Show.Show Rattletrap.Frame.Frame
- Rattletrap.Frame: putFrame :: Frame -> BitPut ()
- Rattletrap.Frame: putFrames :: [Frame] -> BitPut ()
- Rattletrap.Header: Header :: Word32 -> Word32 -> Maybe Word32 -> Text -> Dictionary Property -> Header
- Rattletrap.Header: [headerEngineVersion] :: Header -> Word32
- Rattletrap.Header: [headerLabel] :: Header -> Text
- Rattletrap.Header: [headerLicenseeVersion] :: Header -> Word32
- Rattletrap.Header: [headerPatchVersion] :: Header -> Maybe Word32
- Rattletrap.Header: [headerProperties] :: Header -> Dictionary Property
- Rattletrap.Header: data Header
- Rattletrap.Header: getHeader :: Get Header
- Rattletrap.Header: getMaxChannels :: Header -> Word
- Rattletrap.Header: getNumFrames :: Header -> Int
- Rattletrap.Header: getPatchVersion :: Word32 -> Word32 -> Get (Maybe Word32)
- Rattletrap.Header: getVersion :: Header -> (Int, Int, Int)
- Rattletrap.Header: hasPatchVersion :: Word32 -> Word32 -> Bool
- Rattletrap.Header: instance GHC.Classes.Eq Rattletrap.Header.Header
- Rattletrap.Header: instance GHC.Classes.Ord Rattletrap.Header.Header
- Rattletrap.Header: instance GHC.Show.Show Rattletrap.Header.Header
- Rattletrap.Header: putHeader :: Header -> Put
- Rattletrap.Helper: decodeJson :: ByteString -> Either String Replay
- Rattletrap.Helper: decodeJsonFile :: FilePath -> IO (Either String Replay)
- Rattletrap.Helper: decodeJsonHandle :: Handle -> IO (Either String Replay)
- Rattletrap.Helper: decodeReplay :: ByteString -> Either String Replay
- Rattletrap.Helper: decodeReplayFile :: FilePath -> IO (Either String Replay)
- Rattletrap.Helper: decodeReplayHandle :: Handle -> IO (Either String Replay)
- Rattletrap.Helper: encodeJson :: Replay -> ByteString
- Rattletrap.Helper: encodeJsonFile :: Replay -> FilePath -> IO ()
- Rattletrap.Helper: encodeJsonHandle :: Replay -> Handle -> IO ()
- Rattletrap.Helper: encodeReplay :: Replay -> ByteString
- Rattletrap.Helper: encodeReplayFile :: Replay -> FilePath -> IO ()
- Rattletrap.Helper: encodeReplayHandle :: Replay -> Handle -> IO ()
- Rattletrap.Initialization: Initialization :: Maybe Vector -> Maybe Int8Vector -> Initialization
- Rattletrap.Initialization: [initializationLocation] :: Initialization -> Maybe Vector
- Rattletrap.Initialization: [initializationRotation] :: Initialization -> Maybe Int8Vector
- Rattletrap.Initialization: data Initialization
- Rattletrap.Initialization: getInitialization :: Bool -> Bool -> BitGet Initialization
- Rattletrap.Initialization: instance GHC.Classes.Eq Rattletrap.Initialization.Initialization
- Rattletrap.Initialization: instance GHC.Classes.Ord Rattletrap.Initialization.Initialization
- Rattletrap.Initialization: instance GHC.Show.Show Rattletrap.Initialization.Initialization
- Rattletrap.Initialization: putInitialization :: Initialization -> BitPut ()
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.AppliedDamage.AppliedDamageAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.Attribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.Boolean.BooleanAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.Byte.ByteAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.CamSettings.CamSettingsAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.ClubColors.ClubColorsAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.DamageState.DamageStateAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.Demolish.DemolishAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.Enum.EnumAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.Explosion.ExplosionAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.ExtendedExplosion.ExtendedExplosionAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.FlaggedInt.FlaggedIntAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.Float.FloatAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.GameMode.GameModeAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.Int.IntAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.Loadout.LoadoutAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.LoadoutOnline.LoadoutOnlineAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.Loadouts.LoadoutsAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.LoadoutsOnline.LoadoutsOnlineAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.Location.LocationAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.MusicStinger.MusicStingerAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.PartyLeader.PartyLeaderAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.Pickup.PickupAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.PrivateMatchSettings.PrivateMatchSettingsAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.Product.ProductAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.QWord.QWordAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.Reservation.ReservationAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.RigidBodyState.RigidBodyStateAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.String.StringAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.TeamPaint.TeamPaintAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.UniqueId.UniqueIdAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Attribute.WeldedInfo.WeldedInfoAttribute
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.AttributeMapping.AttributeMapping
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.AttributeValue.AttributeValue
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Cache.Cache
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.ClassMapping.ClassMapping
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Content.Content
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Frame.Frame
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Header.Header
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Initialization.Initialization
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.KeyFrame.KeyFrame
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Mark.Mark
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Message.Message
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Primitive.CompressedWord.CompressedWord
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Primitive.CompressedWordVector.CompressedWordVector
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Primitive.Float32.Float32
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Primitive.Int32.Int32
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Primitive.Int8.Int8
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Primitive.Int8Vector.Int8Vector
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Primitive.Text.Text
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Primitive.Vector.Vector
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Primitive.Word32.Word32
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Primitive.Word64.Word64
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Primitive.Word8.Word8
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Property.Property
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.RemoteId.RemoteId
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Replay.Replay
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Replication.Destroyed.DestroyedReplication
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Replication.Replication
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Replication.Spawned.SpawnedReplication
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Replication.Updated.UpdatedReplication
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.ReplicationValue.ReplicationValue
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON a => Data.Aeson.Types.FromJSON.FromJSON (Rattletrap.Primitive.Dictionary.Dictionary a)
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON a => Data.Aeson.Types.FromJSON.FromJSON (Rattletrap.Primitive.List.List a)
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON a => Data.Aeson.Types.FromJSON.FromJSON (Rattletrap.Primitive.Section.Section a)
- Rattletrap.Json: instance Data.Aeson.Types.FromJSON.FromJSON a => Data.Aeson.Types.FromJSON.FromJSON (Rattletrap.PropertyValue.PropertyValue a)
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.AppliedDamage.AppliedDamageAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.Attribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.Boolean.BooleanAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.Byte.ByteAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.CamSettings.CamSettingsAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.ClubColors.ClubColorsAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.DamageState.DamageStateAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.Demolish.DemolishAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.Enum.EnumAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.Explosion.ExplosionAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.ExtendedExplosion.ExtendedExplosionAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.FlaggedInt.FlaggedIntAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.Float.FloatAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.GameMode.GameModeAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.Int.IntAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.Loadout.LoadoutAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.LoadoutOnline.LoadoutOnlineAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.Loadouts.LoadoutsAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.LoadoutsOnline.LoadoutsOnlineAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.Location.LocationAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.MusicStinger.MusicStingerAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.PartyLeader.PartyLeaderAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.Pickup.PickupAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.PrivateMatchSettings.PrivateMatchSettingsAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.Product.ProductAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.QWord.QWordAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.Reservation.ReservationAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.RigidBodyState.RigidBodyStateAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.String.StringAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.TeamPaint.TeamPaintAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.UniqueId.UniqueIdAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Attribute.WeldedInfo.WeldedInfoAttribute
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.AttributeMapping.AttributeMapping
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.AttributeValue.AttributeValue
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Cache.Cache
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.ClassMapping.ClassMapping
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Content.Content
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Frame.Frame
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Header.Header
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Initialization.Initialization
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.KeyFrame.KeyFrame
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Mark.Mark
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Message.Message
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Primitive.CompressedWord.CompressedWord
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Primitive.CompressedWordVector.CompressedWordVector
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Primitive.Float32.Float32
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Primitive.Int32.Int32
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Primitive.Int8.Int8
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Primitive.Int8Vector.Int8Vector
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Primitive.Text.Text
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Primitive.Vector.Vector
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Primitive.Word32.Word32
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Primitive.Word64.Word64
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Primitive.Word8.Word8
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Property.Property
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.RemoteId.RemoteId
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Replay.Replay
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Replication.Destroyed.DestroyedReplication
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Replication.Replication
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Replication.Spawned.SpawnedReplication
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Replication.Updated.UpdatedReplication
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.ReplicationValue.ReplicationValue
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON a => Data.Aeson.Types.ToJSON.ToJSON (Rattletrap.Primitive.Dictionary.Dictionary a)
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON a => Data.Aeson.Types.ToJSON.ToJSON (Rattletrap.Primitive.List.List a)
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON a => Data.Aeson.Types.ToJSON.ToJSON (Rattletrap.Primitive.Section.Section a)
- Rattletrap.Json: instance Data.Aeson.Types.ToJSON.ToJSON a => Data.Aeson.Types.ToJSON.ToJSON (Rattletrap.PropertyValue.PropertyValue a)
- Rattletrap.KeyFrame: KeyFrame :: Float32 -> Word32 -> Word32 -> KeyFrame
- Rattletrap.KeyFrame: [keyFrameFrame] :: KeyFrame -> Word32
- Rattletrap.KeyFrame: [keyFramePosition] :: KeyFrame -> Word32
- Rattletrap.KeyFrame: [keyFrameTime] :: KeyFrame -> Float32
- Rattletrap.KeyFrame: data KeyFrame
- Rattletrap.KeyFrame: getKeyFrame :: Get KeyFrame
- Rattletrap.KeyFrame: instance GHC.Classes.Eq Rattletrap.KeyFrame.KeyFrame
- Rattletrap.KeyFrame: instance GHC.Classes.Ord Rattletrap.KeyFrame.KeyFrame
- Rattletrap.KeyFrame: instance GHC.Show.Show Rattletrap.KeyFrame.KeyFrame
- Rattletrap.KeyFrame: putKeyFrame :: KeyFrame -> Put
- Rattletrap.Main: getIO :: [FilePath] -> IO (IO ByteString, ByteString -> IO ())
- Rattletrap.Main: main :: IO ()
- Rattletrap.Main: mainWithArgs :: [String] -> IO ()
- Rattletrap.Main: readUrlOrFile :: FilePath -> IO ByteString
- Rattletrap.Mark: Mark :: Text -> Word32 -> Mark
- Rattletrap.Mark: [markFrame] :: Mark -> Word32
- Rattletrap.Mark: [markValue] :: Mark -> Text
- Rattletrap.Mark: data Mark
- Rattletrap.Mark: getMark :: Get Mark
- Rattletrap.Mark: instance GHC.Classes.Eq Rattletrap.Mark.Mark
- Rattletrap.Mark: instance GHC.Classes.Ord Rattletrap.Mark.Mark
- Rattletrap.Mark: instance GHC.Show.Show Rattletrap.Mark.Mark
- Rattletrap.Mark: putMark :: Mark -> Put
- Rattletrap.Message: Message :: Word32 -> Text -> Text -> Message
- Rattletrap.Message: [messageFrame] :: Message -> Word32
- Rattletrap.Message: [messageName] :: Message -> Text
- Rattletrap.Message: [messageValue] :: Message -> Text
- Rattletrap.Message: data Message
- Rattletrap.Message: getMessage :: Get Message
- Rattletrap.Message: instance GHC.Classes.Eq Rattletrap.Message.Message
- Rattletrap.Message: instance GHC.Classes.Ord Rattletrap.Message.Message
- Rattletrap.Message: instance GHC.Show.Show Rattletrap.Message.Message
- Rattletrap.Message: putMessage :: Message -> Put
- Rattletrap.Primitive.CompressedWord: CompressedWord :: Word -> Word -> CompressedWord
- Rattletrap.Primitive.CompressedWord: [compressedWordLimit] :: CompressedWord -> Word
- Rattletrap.Primitive.CompressedWord: [compressedWordValue] :: CompressedWord -> Word
- Rattletrap.Primitive.CompressedWord: data CompressedWord
- Rattletrap.Primitive.CompressedWord: getCompressedWord :: Word -> BitGet CompressedWord
- Rattletrap.Primitive.CompressedWord: getCompressedWordStep :: Word -> Word -> Word -> Word -> BitGet Word
- Rattletrap.Primitive.CompressedWord: getMaxBits :: (Integral a, Integral b) => a -> b
- Rattletrap.Primitive.CompressedWord: instance GHC.Classes.Eq Rattletrap.Primitive.CompressedWord.CompressedWord
- Rattletrap.Primitive.CompressedWord: instance GHC.Classes.Ord Rattletrap.Primitive.CompressedWord.CompressedWord
- Rattletrap.Primitive.CompressedWord: instance GHC.Show.Show Rattletrap.Primitive.CompressedWord.CompressedWord
- Rattletrap.Primitive.CompressedWord: putCompressedWord :: CompressedWord -> BitPut ()
- Rattletrap.Primitive.CompressedWordVector: CompressedWordVector :: CompressedWord -> CompressedWord -> CompressedWord -> CompressedWordVector
- Rattletrap.Primitive.CompressedWordVector: [compressedWordVectorX] :: CompressedWordVector -> CompressedWord
- Rattletrap.Primitive.CompressedWordVector: [compressedWordVectorY] :: CompressedWordVector -> CompressedWord
- Rattletrap.Primitive.CompressedWordVector: [compressedWordVectorZ] :: CompressedWordVector -> CompressedWord
- Rattletrap.Primitive.CompressedWordVector: data CompressedWordVector
- Rattletrap.Primitive.CompressedWordVector: getCompressedWordVector :: BitGet CompressedWordVector
- Rattletrap.Primitive.CompressedWordVector: instance GHC.Classes.Eq Rattletrap.Primitive.CompressedWordVector.CompressedWordVector
- Rattletrap.Primitive.CompressedWordVector: instance GHC.Classes.Ord Rattletrap.Primitive.CompressedWordVector.CompressedWordVector
- Rattletrap.Primitive.CompressedWordVector: instance GHC.Show.Show Rattletrap.Primitive.CompressedWordVector.CompressedWordVector
- Rattletrap.Primitive.CompressedWordVector: putCompressedWordVector :: CompressedWordVector -> BitPut ()
- Rattletrap.Primitive.Dictionary: Dictionary :: [Text] -> Text -> Map Text a -> Dictionary a
- Rattletrap.Primitive.Dictionary: [dictionaryKeys] :: Dictionary a -> [Text]
- Rattletrap.Primitive.Dictionary: [dictionaryLastKey] :: Dictionary a -> Text
- Rattletrap.Primitive.Dictionary: [dictionaryValue] :: Dictionary a -> Map Text a
- Rattletrap.Primitive.Dictionary: data Dictionary a
- Rattletrap.Primitive.Dictionary: getDictionary :: Get a -> Get (Dictionary a)
- Rattletrap.Primitive.Dictionary: getElement :: Get a -> Get (Text, Maybe a)
- Rattletrap.Primitive.Dictionary: getElements :: Get a -> Get ([(Text, a)], Text)
- Rattletrap.Primitive.Dictionary: instance GHC.Classes.Eq a => GHC.Classes.Eq (Rattletrap.Primitive.Dictionary.Dictionary a)
- Rattletrap.Primitive.Dictionary: instance GHC.Classes.Ord a => GHC.Classes.Ord (Rattletrap.Primitive.Dictionary.Dictionary a)
- Rattletrap.Primitive.Dictionary: instance GHC.Show.Show a => GHC.Show.Show (Rattletrap.Primitive.Dictionary.Dictionary a)
- Rattletrap.Primitive.Dictionary: isNoneKey :: Text -> Bool
- Rattletrap.Primitive.Dictionary: putDictionary :: (a -> Put) -> Dictionary a -> Put
- Rattletrap.Primitive.Float32: Float32 :: Float -> Float32
- Rattletrap.Primitive.Float32: [float32Value] :: Float32 -> Float
- Rattletrap.Primitive.Float32: getFloat32 :: Get Float32
- Rattletrap.Primitive.Float32: getFloat32Bits :: BitGet Float32
- Rattletrap.Primitive.Float32: instance GHC.Classes.Eq Rattletrap.Primitive.Float32.Float32
- Rattletrap.Primitive.Float32: instance GHC.Classes.Ord Rattletrap.Primitive.Float32.Float32
- Rattletrap.Primitive.Float32: instance GHC.Show.Show Rattletrap.Primitive.Float32.Float32
- Rattletrap.Primitive.Float32: newtype Float32
- Rattletrap.Primitive.Float32: putFloat32 :: Float32 -> Put
- Rattletrap.Primitive.Float32: putFloat32Bits :: Float32 -> BitPut ()
- Rattletrap.Primitive.Int32: Int32 :: Int32 -> Int32
- Rattletrap.Primitive.Int32: [int32Value] :: Int32 -> Int32
- Rattletrap.Primitive.Int32: getInt32 :: Get Int32
- Rattletrap.Primitive.Int32: getInt32Bits :: BitGet Int32
- Rattletrap.Primitive.Int32: instance GHC.Classes.Eq Rattletrap.Primitive.Int32.Int32
- Rattletrap.Primitive.Int32: instance GHC.Classes.Ord Rattletrap.Primitive.Int32.Int32
- Rattletrap.Primitive.Int32: instance GHC.Show.Show Rattletrap.Primitive.Int32.Int32
- Rattletrap.Primitive.Int32: newtype Int32
- Rattletrap.Primitive.Int32: putInt32 :: Int32 -> Put
- Rattletrap.Primitive.Int32: putInt32Bits :: Int32 -> BitPut ()
- Rattletrap.Primitive.Int8: Int8 :: Int8 -> Int8
- Rattletrap.Primitive.Int8: [int8Value] :: Int8 -> Int8
- Rattletrap.Primitive.Int8: getInt8 :: Get Int8
- Rattletrap.Primitive.Int8: getInt8Bits :: BitGet Int8
- Rattletrap.Primitive.Int8: instance GHC.Classes.Eq Rattletrap.Primitive.Int8.Int8
- Rattletrap.Primitive.Int8: instance GHC.Classes.Ord Rattletrap.Primitive.Int8.Int8
- Rattletrap.Primitive.Int8: instance GHC.Show.Show Rattletrap.Primitive.Int8.Int8
- Rattletrap.Primitive.Int8: newtype Int8
- Rattletrap.Primitive.Int8: putInt8 :: Int8 -> Put
- Rattletrap.Primitive.Int8: putInt8Bits :: Int8 -> BitPut ()
- Rattletrap.Primitive.Int8Vector: Int8Vector :: Maybe Int8 -> Maybe Int8 -> Maybe Int8 -> Int8Vector
- Rattletrap.Primitive.Int8Vector: [int8VectorX] :: Int8Vector -> Maybe Int8
- Rattletrap.Primitive.Int8Vector: [int8VectorY] :: Int8Vector -> Maybe Int8
- Rattletrap.Primitive.Int8Vector: [int8VectorZ] :: Int8Vector -> Maybe Int8
- Rattletrap.Primitive.Int8Vector: data Int8Vector
- Rattletrap.Primitive.Int8Vector: getInt8Vector :: BitGet Int8Vector
- Rattletrap.Primitive.Int8Vector: getInt8VectorField :: BitGet (Maybe Int8)
- Rattletrap.Primitive.Int8Vector: instance GHC.Classes.Eq Rattletrap.Primitive.Int8Vector.Int8Vector
- Rattletrap.Primitive.Int8Vector: instance GHC.Classes.Ord Rattletrap.Primitive.Int8Vector.Int8Vector
- Rattletrap.Primitive.Int8Vector: instance GHC.Show.Show Rattletrap.Primitive.Int8Vector.Int8Vector
- Rattletrap.Primitive.Int8Vector: putInt8Vector :: Int8Vector -> BitPut ()
- Rattletrap.Primitive.Int8Vector: putInt8VectorField :: Maybe Int8 -> BitPut ()
- Rattletrap.Primitive.List: List :: [a] -> List a
- Rattletrap.Primitive.List: [listValue] :: List a -> [a]
- Rattletrap.Primitive.List: getList :: Get a -> Get (List a)
- Rattletrap.Primitive.List: instance GHC.Classes.Eq a => GHC.Classes.Eq (Rattletrap.Primitive.List.List a)
- Rattletrap.Primitive.List: instance GHC.Classes.Ord a => GHC.Classes.Ord (Rattletrap.Primitive.List.List a)
- Rattletrap.Primitive.List: instance GHC.Show.Show a => GHC.Show.Show (Rattletrap.Primitive.List.List a)
- Rattletrap.Primitive.List: newtype List a
- Rattletrap.Primitive.List: putList :: (a -> Put) -> List a -> Put
- Rattletrap.Primitive.Section: Section :: a -> Section a
- Rattletrap.Primitive.Section: [sectionBody] :: Section a -> a
- Rattletrap.Primitive.Section: crcMessage :: Word32 -> Word32 -> String
- Rattletrap.Primitive.Section: getSection :: Get a -> Get (Section a)
- Rattletrap.Primitive.Section: instance GHC.Classes.Eq a => GHC.Classes.Eq (Rattletrap.Primitive.Section.Section a)
- Rattletrap.Primitive.Section: instance GHC.Classes.Ord a => GHC.Classes.Ord (Rattletrap.Primitive.Section.Section a)
- Rattletrap.Primitive.Section: instance GHC.Show.Show a => GHC.Show.Show (Rattletrap.Primitive.Section.Section a)
- Rattletrap.Primitive.Section: newtype Section a
- Rattletrap.Primitive.Section: putSection :: (a -> Put) -> Section a -> Put
- Rattletrap.Primitive.Text: Text :: Text -> Text
- Rattletrap.Primitive.Text: [textValue] :: Text -> Text
- Rattletrap.Primitive.Text: addNull :: Text -> Text
- Rattletrap.Primitive.Text: dropNull :: Text -> Text
- Rattletrap.Primitive.Text: getText :: Get Text
- Rattletrap.Primitive.Text: getTextBits :: BitGet Text
- Rattletrap.Primitive.Text: getTextDecoder :: Int32 -> ByteString -> Text
- Rattletrap.Primitive.Text: getTextEncoder :: Int32 -> Text -> ByteString
- Rattletrap.Primitive.Text: getTextSize :: Text -> Int32
- Rattletrap.Primitive.Text: instance GHC.Classes.Eq Rattletrap.Primitive.Text.Text
- Rattletrap.Primitive.Text: instance GHC.Classes.Ord Rattletrap.Primitive.Text.Text
- Rattletrap.Primitive.Text: instance GHC.Show.Show Rattletrap.Primitive.Text.Text
- Rattletrap.Primitive.Text: newtype Text
- Rattletrap.Primitive.Text: normalizeTextSize :: Integral a => Int32 -> a
- Rattletrap.Primitive.Text: putText :: Text -> Put
- Rattletrap.Primitive.Text: putTextBits :: Text -> BitPut ()
- Rattletrap.Primitive.Text: stringToText :: String -> Text
- Rattletrap.Primitive.Text: textToString :: Text -> String
- Rattletrap.Primitive.Vector: Vector :: Word -> Int -> Int -> Int -> Vector
- Rattletrap.Primitive.Vector: [vectorBias] :: Vector -> Word
- Rattletrap.Primitive.Vector: [vectorX] :: Vector -> Int
- Rattletrap.Primitive.Vector: [vectorY] :: Vector -> Int
- Rattletrap.Primitive.Vector: [vectorZ] :: Vector -> Int
- Rattletrap.Primitive.Vector: data Vector
- Rattletrap.Primitive.Vector: getVector :: BitGet Vector
- Rattletrap.Primitive.Vector: instance GHC.Classes.Eq Rattletrap.Primitive.Vector.Vector
- Rattletrap.Primitive.Vector: instance GHC.Classes.Ord Rattletrap.Primitive.Vector.Vector
- Rattletrap.Primitive.Vector: instance GHC.Show.Show Rattletrap.Primitive.Vector.Vector
- Rattletrap.Primitive.Vector: putVector :: Vector -> BitPut ()
- Rattletrap.Primitive.Word32: Word32 :: Word32 -> Word32
- Rattletrap.Primitive.Word32: [word32Value] :: Word32 -> Word32
- Rattletrap.Primitive.Word32: getWord32 :: Get Word32
- Rattletrap.Primitive.Word32: getWord32Bits :: BitGet Word32
- Rattletrap.Primitive.Word32: instance GHC.Classes.Eq Rattletrap.Primitive.Word32.Word32
- Rattletrap.Primitive.Word32: instance GHC.Classes.Ord Rattletrap.Primitive.Word32.Word32
- Rattletrap.Primitive.Word32: instance GHC.Show.Show Rattletrap.Primitive.Word32.Word32
- Rattletrap.Primitive.Word32: newtype Word32
- Rattletrap.Primitive.Word32: putWord32 :: Word32 -> Put
- Rattletrap.Primitive.Word32: putWord32Bits :: Word32 -> BitPut ()
- Rattletrap.Primitive.Word64: Word64 :: Word64 -> Word64
- Rattletrap.Primitive.Word64: [word64Value] :: Word64 -> Word64
- Rattletrap.Primitive.Word64: getWord64 :: Get Word64
- Rattletrap.Primitive.Word64: getWord64Bits :: BitGet Word64
- Rattletrap.Primitive.Word64: instance GHC.Classes.Eq Rattletrap.Primitive.Word64.Word64
- Rattletrap.Primitive.Word64: instance GHC.Classes.Ord Rattletrap.Primitive.Word64.Word64
- Rattletrap.Primitive.Word64: instance GHC.Show.Show Rattletrap.Primitive.Word64.Word64
- Rattletrap.Primitive.Word64: newtype Word64
- Rattletrap.Primitive.Word64: putWord64 :: Word64 -> Put
- Rattletrap.Primitive.Word64: putWord64Bits :: Word64 -> BitPut ()
- Rattletrap.Primitive.Word8: Word8 :: Word8 -> Word8
- Rattletrap.Primitive.Word8: [word8Value] :: Word8 -> Word8
- Rattletrap.Primitive.Word8: getWord8 :: Get Word8
- Rattletrap.Primitive.Word8: getWord8Bits :: BitGet Word8
- Rattletrap.Primitive.Word8: instance GHC.Classes.Eq Rattletrap.Primitive.Word8.Word8
- Rattletrap.Primitive.Word8: instance GHC.Classes.Ord Rattletrap.Primitive.Word8.Word8
- Rattletrap.Primitive.Word8: instance GHC.Show.Show Rattletrap.Primitive.Word8.Word8
- Rattletrap.Primitive.Word8: newtype Word8
- Rattletrap.Primitive.Word8: putWord8 :: Word8 -> Put
- Rattletrap.Primitive.Word8: putWord8Bits :: Word8 -> BitPut ()
- Rattletrap.Property: Property :: Text -> Word64 -> PropertyValue Property -> Property
- Rattletrap.Property: [propertyKind] :: Property -> Text
- Rattletrap.Property: [propertySize] :: Property -> Word64
- Rattletrap.Property: [propertyValue] :: Property -> PropertyValue Property
- Rattletrap.Property: data Property
- Rattletrap.Property: getProperty :: Get Property
- Rattletrap.Property: instance GHC.Classes.Eq Rattletrap.Property.Property
- Rattletrap.Property: instance GHC.Classes.Ord Rattletrap.Property.Property
- Rattletrap.Property: instance GHC.Show.Show Rattletrap.Property.Property
- Rattletrap.Property: putProperty :: Property -> Put
- Rattletrap.PropertyValue: ArrayProperty :: (List (Dictionary a)) -> PropertyValue a
- Rattletrap.PropertyValue: BoolProperty :: Word8 -> PropertyValue a
- Rattletrap.PropertyValue: ByteProperty :: Text -> (Maybe Text) -> PropertyValue a
- Rattletrap.PropertyValue: FloatProperty :: Float32 -> PropertyValue a
- Rattletrap.PropertyValue: IntProperty :: Int32 -> PropertyValue a
- Rattletrap.PropertyValue: NameProperty :: Text -> PropertyValue a
- Rattletrap.PropertyValue: QWordProperty :: Word64 -> PropertyValue a
- Rattletrap.PropertyValue: StrProperty :: Text -> PropertyValue a
- Rattletrap.PropertyValue: data PropertyValue a
- Rattletrap.PropertyValue: getPropertyValue :: Get a -> Text -> Get (PropertyValue a)
- Rattletrap.PropertyValue: instance GHC.Classes.Eq a => GHC.Classes.Eq (Rattletrap.PropertyValue.PropertyValue a)
- Rattletrap.PropertyValue: instance GHC.Classes.Ord a => GHC.Classes.Ord (Rattletrap.PropertyValue.PropertyValue a)
- Rattletrap.PropertyValue: instance GHC.Show.Show a => GHC.Show.Show (Rattletrap.PropertyValue.PropertyValue a)
- Rattletrap.PropertyValue: putPropertyValue :: (a -> Put) -> PropertyValue a -> Put
- Rattletrap.RemoteId: PlayStationId :: Text -> [Word8] -> RemoteId
- Rattletrap.RemoteId: SplitscreenId :: Word32 -> RemoteId
- Rattletrap.RemoteId: SteamId :: Word64 -> RemoteId
- Rattletrap.RemoteId: XboxId :: Word64 -> RemoteId
- Rattletrap.RemoteId: data RemoteId
- Rattletrap.RemoteId: getRemoteId :: (Int, Int, Int) -> Word8 -> BitGet RemoteId
- Rattletrap.RemoteId: instance GHC.Classes.Eq Rattletrap.RemoteId.RemoteId
- Rattletrap.RemoteId: instance GHC.Classes.Ord Rattletrap.RemoteId.RemoteId
- Rattletrap.RemoteId: instance GHC.Show.Show Rattletrap.RemoteId.RemoteId
- Rattletrap.RemoteId: putRemoteId :: RemoteId -> BitPut ()
- Rattletrap.Replay: Replay :: Section Header -> Section Content -> Replay
- Rattletrap.Replay: [replayContent] :: Replay -> Section Content
- Rattletrap.Replay: [replayHeader] :: Replay -> Section Header
- Rattletrap.Replay: data Replay
- Rattletrap.Replay: getReplay :: Get Replay
- Rattletrap.Replay: instance GHC.Classes.Eq Rattletrap.Replay.Replay
- Rattletrap.Replay: instance GHC.Classes.Ord Rattletrap.Replay.Replay
- Rattletrap.Replay: instance GHC.Show.Show Rattletrap.Replay.Replay
- Rattletrap.Replay: putReplay :: Replay -> Put
- Rattletrap.Replication: Replication :: CompressedWord -> ReplicationValue -> Replication
- Rattletrap.Replication: [replicationActorId] :: Replication -> CompressedWord
- Rattletrap.Replication: [replicationValue] :: Replication -> ReplicationValue
- Rattletrap.Replication: data Replication
- Rattletrap.Replication: getReplication :: (Int, Int, Int) -> Word -> ClassAttributeMap -> ActorMap -> BitGet (Maybe (Replication, ActorMap))
- Rattletrap.Replication: getReplications :: (Int, Int, Int) -> Word -> ClassAttributeMap -> ActorMap -> BitGet ([Replication], ActorMap)
- Rattletrap.Replication: instance GHC.Classes.Eq Rattletrap.Replication.Replication
- Rattletrap.Replication: instance GHC.Classes.Ord Rattletrap.Replication.Replication
- Rattletrap.Replication: instance GHC.Show.Show Rattletrap.Replication.Replication
- Rattletrap.Replication: putReplication :: Replication -> BitPut ()
- Rattletrap.Replication: putReplications :: [Replication] -> BitPut ()
- Rattletrap.Replication.Destroyed: DestroyedReplication :: DestroyedReplication
- Rattletrap.Replication.Destroyed: data DestroyedReplication
- Rattletrap.Replication.Destroyed: getDestroyedReplication :: BitGet DestroyedReplication
- Rattletrap.Replication.Destroyed: instance GHC.Classes.Eq Rattletrap.Replication.Destroyed.DestroyedReplication
- Rattletrap.Replication.Destroyed: instance GHC.Classes.Ord Rattletrap.Replication.Destroyed.DestroyedReplication
- Rattletrap.Replication.Destroyed: instance GHC.Show.Show Rattletrap.Replication.Destroyed.DestroyedReplication
- Rattletrap.Replication.Destroyed: putDestroyedReplication :: DestroyedReplication -> BitPut ()
- Rattletrap.Replication.Spawned: SpawnedReplication :: Bool -> Maybe Word32 -> Maybe Text -> Word32 -> Text -> Text -> Initialization -> SpawnedReplication
- Rattletrap.Replication.Spawned: [spawnedReplicationClassName] :: SpawnedReplication -> Text
- Rattletrap.Replication.Spawned: [spawnedReplicationFlag] :: SpawnedReplication -> Bool
- Rattletrap.Replication.Spawned: [spawnedReplicationInitialization] :: SpawnedReplication -> Initialization
- Rattletrap.Replication.Spawned: [spawnedReplicationNameIndex] :: SpawnedReplication -> Maybe Word32
- Rattletrap.Replication.Spawned: [spawnedReplicationName] :: SpawnedReplication -> Maybe Text
- Rattletrap.Replication.Spawned: [spawnedReplicationObjectId] :: SpawnedReplication -> Word32
- Rattletrap.Replication.Spawned: [spawnedReplicationObjectName] :: SpawnedReplication -> Text
- Rattletrap.Replication.Spawned: data SpawnedReplication
- Rattletrap.Replication.Spawned: getSpawnedReplication :: (Int, Int, Int) -> ClassAttributeMap -> ActorMap -> CompressedWord -> BitGet (SpawnedReplication, ActorMap)
- Rattletrap.Replication.Spawned: instance GHC.Classes.Eq Rattletrap.Replication.Spawned.SpawnedReplication
- Rattletrap.Replication.Spawned: instance GHC.Classes.Ord Rattletrap.Replication.Spawned.SpawnedReplication
- Rattletrap.Replication.Spawned: instance GHC.Show.Show Rattletrap.Replication.Spawned.SpawnedReplication
- Rattletrap.Replication.Spawned: lookupClassName :: Monad m => Text -> m Text
- Rattletrap.Replication.Spawned: lookupName :: Monad m => ClassAttributeMap -> Maybe Word32 -> m (Maybe Text)
- Rattletrap.Replication.Spawned: lookupObjectName :: Monad m => ClassAttributeMap -> Word32 -> m Text
- Rattletrap.Replication.Spawned: putSpawnedReplication :: SpawnedReplication -> BitPut ()
- Rattletrap.Replication.Updated: UpdatedReplication :: [Attribute] -> UpdatedReplication
- Rattletrap.Replication.Updated: [updatedReplicationAttributes] :: UpdatedReplication -> [Attribute]
- Rattletrap.Replication.Updated: getUpdatedReplication :: (Int, Int, Int) -> ClassAttributeMap -> ActorMap -> CompressedWord -> BitGet UpdatedReplication
- Rattletrap.Replication.Updated: instance GHC.Classes.Eq Rattletrap.Replication.Updated.UpdatedReplication
- Rattletrap.Replication.Updated: instance GHC.Classes.Ord Rattletrap.Replication.Updated.UpdatedReplication
- Rattletrap.Replication.Updated: instance GHC.Show.Show Rattletrap.Replication.Updated.UpdatedReplication
- Rattletrap.Replication.Updated: newtype UpdatedReplication
- Rattletrap.Replication.Updated: putUpdatedReplication :: UpdatedReplication -> BitPut ()
- Rattletrap.ReplicationValue: DestroyedReplicationValue :: DestroyedReplication -> ReplicationValue
- Rattletrap.ReplicationValue: SpawnedReplicationValue :: SpawnedReplication -> ReplicationValue
- Rattletrap.ReplicationValue: UpdatedReplicationValue :: UpdatedReplication -> ReplicationValue
- Rattletrap.ReplicationValue: data ReplicationValue
- Rattletrap.ReplicationValue: getReplicationValue :: (Int, Int, Int) -> ClassAttributeMap -> ActorMap -> CompressedWord -> BitGet (ReplicationValue, ActorMap)
- Rattletrap.ReplicationValue: instance GHC.Classes.Eq Rattletrap.ReplicationValue.ReplicationValue
- Rattletrap.ReplicationValue: instance GHC.Classes.Ord Rattletrap.ReplicationValue.ReplicationValue
- Rattletrap.ReplicationValue: instance GHC.Show.Show Rattletrap.ReplicationValue.ReplicationValue
- Rattletrap.ReplicationValue: putReplicationValue :: ReplicationValue -> BitPut ()
- Rattletrap.Utility: encodeLatin1 :: Text -> ByteString
- Rattletrap.Utility: padBytes :: Integral a => a -> ByteString -> ByteString
- Rattletrap.Utility: reverseByte :: Word8 -> Word8
- Rattletrap.Utility: reverseBytes :: ByteString -> ByteString
- Rattletrap.Version: version :: Version
+ Rattletrap: AppliedDamageAttribute :: Word8le -> Vector -> Int32le -> Int32le -> AppliedDamageAttribute
+ Rattletrap: Attribute :: CompressedWord -> Str -> AttributeValue -> Attribute
+ Rattletrap: AttributeMapping :: Word32le -> Word32le -> AttributeMapping
+ Rattletrap: AttributeValueAppliedDamage :: AppliedDamageAttribute -> AttributeValue
+ Rattletrap: AttributeValueBoolean :: BooleanAttribute -> AttributeValue
+ Rattletrap: AttributeValueByte :: ByteAttribute -> AttributeValue
+ Rattletrap: AttributeValueCamSettings :: CamSettingsAttribute -> AttributeValue
+ Rattletrap: AttributeValueClubColors :: ClubColorsAttribute -> AttributeValue
+ Rattletrap: AttributeValueDamageState :: DamageStateAttribute -> AttributeValue
+ Rattletrap: AttributeValueDemolish :: DemolishAttribute -> AttributeValue
+ Rattletrap: AttributeValueEnum :: EnumAttribute -> AttributeValue
+ Rattletrap: AttributeValueExplosion :: ExplosionAttribute -> AttributeValue
+ Rattletrap: AttributeValueExtendedExplosion :: ExtendedExplosionAttribute -> AttributeValue
+ Rattletrap: AttributeValueFlaggedInt :: FlaggedIntAttribute -> AttributeValue
+ Rattletrap: AttributeValueFloat :: FloatAttribute -> AttributeValue
+ Rattletrap: AttributeValueGameMode :: GameModeAttribute -> AttributeValue
+ Rattletrap: AttributeValueInt :: IntAttribute -> AttributeValue
+ Rattletrap: AttributeValueLoadout :: LoadoutAttribute -> AttributeValue
+ Rattletrap: AttributeValueLoadoutOnline :: LoadoutOnlineAttribute -> AttributeValue
+ Rattletrap: AttributeValueLoadouts :: LoadoutsAttribute -> AttributeValue
+ Rattletrap: AttributeValueLoadoutsOnline :: LoadoutsOnlineAttribute -> AttributeValue
+ Rattletrap: AttributeValueLocation :: LocationAttribute -> AttributeValue
+ Rattletrap: AttributeValueMusicStinger :: MusicStingerAttribute -> AttributeValue
+ Rattletrap: AttributeValuePartyLeader :: PartyLeaderAttribute -> AttributeValue
+ Rattletrap: AttributeValuePickup :: PickupAttribute -> AttributeValue
+ Rattletrap: AttributeValuePlayerHistoryKey :: PlayerHistoryKeyAttribute -> AttributeValue
+ Rattletrap: AttributeValuePrivateMatchSettings :: PrivateMatchSettingsAttribute -> AttributeValue
+ Rattletrap: AttributeValueQWord :: QWordAttribute -> AttributeValue
+ Rattletrap: AttributeValueReservation :: ReservationAttribute -> AttributeValue
+ Rattletrap: AttributeValueRigidBodyState :: RigidBodyStateAttribute -> AttributeValue
+ Rattletrap: AttributeValueString :: StringAttribute -> AttributeValue
+ Rattletrap: AttributeValueTeamPaint :: TeamPaintAttribute -> AttributeValue
+ Rattletrap: AttributeValueUniqueId :: UniqueIdAttribute -> AttributeValue
+ Rattletrap: AttributeValueWeldedInfo :: WeldedInfoAttribute -> AttributeValue
+ Rattletrap: BooleanAttribute :: Bool -> BooleanAttribute
+ Rattletrap: ByteAttribute :: Word8le -> ByteAttribute
+ Rattletrap: Cache :: Word32le -> Word32le -> Word32le -> List AttributeMapping -> Cache
+ Rattletrap: CamSettingsAttribute :: Float32le -> Float32le -> Float32le -> Float32le -> Float32le -> Float32le -> Maybe Float32le -> CamSettingsAttribute
+ Rattletrap: ClassMapping :: Str -> Word32le -> ClassMapping
+ Rattletrap: ClubColorsAttribute :: Bool -> Word8le -> Bool -> Word8le -> ClubColorsAttribute
+ Rattletrap: CompressedWord :: Word -> Word -> CompressedWord
+ Rattletrap: CompressedWordVector :: CompressedWord -> CompressedWord -> CompressedWord -> CompressedWordVector
+ Rattletrap: Content :: List Str -> List KeyFrame -> Word32le -> [Frame] -> List Message -> List Mark -> List Str -> List Str -> List Str -> List ClassMapping -> List Cache -> Content
+ Rattletrap: DamageStateAttribute :: Word8le -> Bool -> Int32le -> Vector -> Bool -> Bool -> DamageStateAttribute
+ Rattletrap: DemolishAttribute :: Bool -> Word32le -> Bool -> Word32le -> Vector -> Vector -> DemolishAttribute
+ Rattletrap: DestroyedReplication :: DestroyedReplication
+ Rattletrap: DictionaryElement :: Str -> a -> (Dictionary a) -> Dictionary a
+ Rattletrap: DictionaryEnd :: Str -> Dictionary a
+ Rattletrap: EnumAttribute :: Word16 -> EnumAttribute
+ Rattletrap: ExplosionAttribute :: Bool -> Int32le -> Vector -> ExplosionAttribute
+ Rattletrap: ExtendedExplosionAttribute :: ExplosionAttribute -> FlaggedIntAttribute -> ExtendedExplosionAttribute
+ Rattletrap: FlaggedIntAttribute :: Bool -> Int32le -> FlaggedIntAttribute
+ Rattletrap: Float32le :: Float -> Float32le
+ Rattletrap: FloatAttribute :: Float32le -> FloatAttribute
+ Rattletrap: Frame :: Float32le -> Float32le -> [Replication] -> Frame
+ Rattletrap: GameModeAttribute :: Int -> Word8 -> GameModeAttribute
+ Rattletrap: Header :: Word32le -> Word32le -> Maybe Word32le -> Str -> Dictionary Property -> Header
+ Rattletrap: Initialization :: Maybe Vector -> Maybe Int8Vector -> Initialization
+ Rattletrap: Int32le :: Int32 -> Int32le
+ Rattletrap: Int8Vector :: Maybe Int8le -> Maybe Int8le -> Maybe Int8le -> Int8Vector
+ Rattletrap: Int8le :: Int8 -> Int8le
+ Rattletrap: IntAttribute :: Int32le -> IntAttribute
+ Rattletrap: KeyFrame :: Float32le -> Word32le -> Word32le -> KeyFrame
+ Rattletrap: List :: [a] -> List a
+ Rattletrap: LoadoutAttribute :: Word8le -> Word32le -> Word32le -> Word32le -> Word32le -> Word32le -> Word32le -> Word32le -> Maybe Word32le -> Maybe Word32le -> Maybe Word32le -> Maybe Word32le -> Maybe Word32le -> LoadoutAttribute
+ Rattletrap: LoadoutOnlineAttribute :: [[ProductAttribute]] -> LoadoutOnlineAttribute
+ Rattletrap: LoadoutsAttribute :: LoadoutAttribute -> LoadoutAttribute -> LoadoutsAttribute
+ Rattletrap: LoadoutsOnlineAttribute :: LoadoutOnlineAttribute -> LoadoutOnlineAttribute -> Bool -> Bool -> LoadoutsOnlineAttribute
+ Rattletrap: LocationAttribute :: Vector -> LocationAttribute
+ Rattletrap: Mark :: Str -> Word32le -> Mark
+ Rattletrap: Message :: Word32le -> Str -> Str -> Message
+ Rattletrap: MusicStingerAttribute :: Bool -> Word32le -> Word8le -> MusicStingerAttribute
+ Rattletrap: PartyLeaderAttribute :: Word8le -> Maybe (RemoteId, Word8le) -> PartyLeaderAttribute
+ Rattletrap: PickupAttribute :: Maybe Word32le -> Bool -> PickupAttribute
+ Rattletrap: PrivateMatchSettingsAttribute :: Str -> Word32le -> Word32le -> Str -> Str -> Bool -> PrivateMatchSettingsAttribute
+ Rattletrap: ProductAttribute :: Bool -> Word32le -> Maybe Str -> Maybe (Either CompressedWord Word32) -> ProductAttribute
+ Rattletrap: Property :: Str -> Word64le -> PropertyValue Property -> Property
+ Rattletrap: PropertyValueArray :: (List (Dictionary a)) -> PropertyValue a
+ Rattletrap: PropertyValueBool :: Word8le -> PropertyValue a
+ Rattletrap: PropertyValueByte :: Str -> (Maybe Str) -> PropertyValue a
+ Rattletrap: PropertyValueFloat :: Float32le -> PropertyValue a
+ Rattletrap: PropertyValueInt :: Int32le -> PropertyValue a
+ Rattletrap: PropertyValueName :: Str -> PropertyValue a
+ Rattletrap: PropertyValueQWord :: Word64le -> PropertyValue a
+ Rattletrap: PropertyValueStr :: Str -> PropertyValue a
+ Rattletrap: QWordAttribute :: Word64le -> QWordAttribute
+ Rattletrap: RemoteIdPlayStation :: Text -> [Word8] -> RemoteId
+ Rattletrap: RemoteIdSplitscreen :: Word32 -> RemoteId
+ Rattletrap: RemoteIdSteam :: Word64le -> RemoteId
+ Rattletrap: RemoteIdSwitch :: Bitstream -> RemoteId
+ Rattletrap: RemoteIdXbox :: Word64le -> RemoteId
+ Rattletrap: Replay :: Section Header -> Section Content -> Replay
+ Rattletrap: Replication :: CompressedWord -> ReplicationValue -> Replication
+ Rattletrap: ReplicationValueDestroyed :: DestroyedReplication -> ReplicationValue
+ Rattletrap: ReplicationValueSpawned :: SpawnedReplication -> ReplicationValue
+ Rattletrap: ReplicationValueUpdated :: UpdatedReplication -> ReplicationValue
+ Rattletrap: ReservationAttribute :: CompressedWord -> UniqueIdAttribute -> Maybe Str -> Bool -> Bool -> Maybe Word8 -> ReservationAttribute
+ Rattletrap: RigidBodyStateAttribute :: Bool -> Vector -> CompressedWordVector -> Maybe Vector -> Maybe Vector -> RigidBodyStateAttribute
+ Rattletrap: Section :: Word32le -> Word32le -> a -> Section a
+ Rattletrap: SpawnedReplication :: Bool -> Maybe Word32le -> Maybe Str -> Word32le -> Str -> Str -> Initialization -> SpawnedReplication
+ Rattletrap: Str :: Text -> Str
+ Rattletrap: StringAttribute :: Str -> StringAttribute
+ Rattletrap: TeamPaintAttribute :: Word8le -> Word8le -> Word8le -> Word32le -> Word32le -> TeamPaintAttribute
+ Rattletrap: UniqueIdAttribute :: Word8le -> RemoteId -> Word8le -> UniqueIdAttribute
+ Rattletrap: UpdatedReplication :: [Attribute] -> UpdatedReplication
+ Rattletrap: Vector :: Word -> Int -> Int -> Int -> Vector
+ Rattletrap: WeldedInfoAttribute :: Bool -> Int32le -> Vector -> Float32le -> Int8Vector -> WeldedInfoAttribute
+ Rattletrap: Word32le :: Word32 -> Word32le
+ Rattletrap: Word64le :: Word64 -> Word64le
+ Rattletrap: Word8le :: Word8 -> Word8le
+ Rattletrap: [appliedDamageAttributeLocation] :: AppliedDamageAttribute -> Vector
+ Rattletrap: [appliedDamageAttributeUnknown1] :: AppliedDamageAttribute -> Word8le
+ Rattletrap: [appliedDamageAttributeUnknown3] :: AppliedDamageAttribute -> Int32le
+ Rattletrap: [appliedDamageAttributeUnknown4] :: AppliedDamageAttribute -> Int32le
+ Rattletrap: [attributeId] :: Attribute -> CompressedWord
+ Rattletrap: [attributeMappingObjectId] :: AttributeMapping -> Word32le
+ Rattletrap: [attributeMappingStreamId] :: AttributeMapping -> Word32le
+ Rattletrap: [attributeName] :: Attribute -> Str
+ Rattletrap: [attributeValue] :: Attribute -> AttributeValue
+ Rattletrap: [booleanAttributeValue] :: BooleanAttribute -> Bool
+ Rattletrap: [byteAttributeValue] :: ByteAttribute -> Word8le
+ Rattletrap: [cacheAttributeMappings] :: Cache -> List AttributeMapping
+ Rattletrap: [cacheCacheId] :: Cache -> Word32le
+ Rattletrap: [cacheClassId] :: Cache -> Word32le
+ Rattletrap: [cacheParentCacheId] :: Cache -> Word32le
+ Rattletrap: [camSettingsAttributeAngle] :: CamSettingsAttribute -> Float32le
+ Rattletrap: [camSettingsAttributeDistance] :: CamSettingsAttribute -> Float32le
+ Rattletrap: [camSettingsAttributeFov] :: CamSettingsAttribute -> Float32le
+ Rattletrap: [camSettingsAttributeHeight] :: CamSettingsAttribute -> Float32le
+ Rattletrap: [camSettingsAttributeStiffness] :: CamSettingsAttribute -> Float32le
+ Rattletrap: [camSettingsAttributeSwivelSpeed] :: CamSettingsAttribute -> Float32le
+ Rattletrap: [camSettingsAttributeTransitionSpeed] :: CamSettingsAttribute -> Maybe Float32le
+ Rattletrap: [classMappingName] :: ClassMapping -> Str
+ Rattletrap: [classMappingStreamId] :: ClassMapping -> Word32le
+ Rattletrap: [clubColorsAttributeBlueColor] :: ClubColorsAttribute -> Word8le
+ Rattletrap: [clubColorsAttributeBlueFlag] :: ClubColorsAttribute -> Bool
+ Rattletrap: [clubColorsAttributeOrangeColor] :: ClubColorsAttribute -> Word8le
+ Rattletrap: [clubColorsAttributeOrangeFlag] :: ClubColorsAttribute -> Bool
+ Rattletrap: [compressedWordLimit] :: CompressedWord -> Word
+ Rattletrap: [compressedWordValue] :: CompressedWord -> Word
+ Rattletrap: [compressedWordVectorX] :: CompressedWordVector -> CompressedWord
+ Rattletrap: [compressedWordVectorY] :: CompressedWordVector -> CompressedWord
+ Rattletrap: [compressedWordVectorZ] :: CompressedWordVector -> CompressedWord
+ Rattletrap: [contentCaches] :: Content -> List Cache
+ Rattletrap: [contentClassMappings] :: Content -> List ClassMapping
+ Rattletrap: [contentFrames] :: Content -> [Frame]
+ Rattletrap: [contentKeyFrames] :: Content -> List KeyFrame
+ Rattletrap: [contentLevels] :: Content -> List Str
+ Rattletrap: [contentMarks] :: Content -> List Mark
+ Rattletrap: [contentMessages] :: Content -> List Message
+ Rattletrap: [contentNames] :: Content -> List Str
+ Rattletrap: [contentObjects] :: Content -> List Str
+ Rattletrap: [contentPackages] :: Content -> List Str
+ Rattletrap: [contentStreamSize] :: Content -> Word32le
+ Rattletrap: [damageStateAttributeUnknown1] :: DamageStateAttribute -> Word8le
+ Rattletrap: [damageStateAttributeUnknown2] :: DamageStateAttribute -> Bool
+ Rattletrap: [damageStateAttributeUnknown3] :: DamageStateAttribute -> Int32le
+ Rattletrap: [damageStateAttributeUnknown4] :: DamageStateAttribute -> Vector
+ Rattletrap: [damageStateAttributeUnknown5] :: DamageStateAttribute -> Bool
+ Rattletrap: [damageStateAttributeUnknown6] :: DamageStateAttribute -> Bool
+ Rattletrap: [demolishAttributeAttackerActorId] :: DemolishAttribute -> Word32le
+ Rattletrap: [demolishAttributeAttackerFlag] :: DemolishAttribute -> Bool
+ Rattletrap: [demolishAttributeAttackerVelocity] :: DemolishAttribute -> Vector
+ Rattletrap: [demolishAttributeVictimActorId] :: DemolishAttribute -> Word32le
+ Rattletrap: [demolishAttributeVictimFlag] :: DemolishAttribute -> Bool
+ Rattletrap: [demolishAttributeVictimVelocity] :: DemolishAttribute -> Vector
+ Rattletrap: [enumAttributeValue] :: EnumAttribute -> Word16
+ Rattletrap: [explosionAttributeActorId] :: ExplosionAttribute -> Int32le
+ Rattletrap: [explosionAttributeFlag] :: ExplosionAttribute -> Bool
+ Rattletrap: [explosionAttributeLocation] :: ExplosionAttribute -> Vector
+ Rattletrap: [extendedExplosionAttributeExplosion] :: ExtendedExplosionAttribute -> ExplosionAttribute
+ Rattletrap: [extendedExplosionAttributeUnknown] :: ExtendedExplosionAttribute -> FlaggedIntAttribute
+ Rattletrap: [flaggedIntAttributeFlag] :: FlaggedIntAttribute -> Bool
+ Rattletrap: [flaggedIntAttributeInt] :: FlaggedIntAttribute -> Int32le
+ Rattletrap: [float32leValue] :: Float32le -> Float
+ Rattletrap: [floatAttributeValue] :: FloatAttribute -> Float32le
+ Rattletrap: [frameDelta] :: Frame -> Float32le
+ Rattletrap: [frameReplications] :: Frame -> [Replication]
+ Rattletrap: [frameTime] :: Frame -> Float32le
+ Rattletrap: [gameModeAttributeNumBits] :: GameModeAttribute -> Int
+ Rattletrap: [gameModeAttributeWord] :: GameModeAttribute -> Word8
+ Rattletrap: [headerEngineVersion] :: Header -> Word32le
+ Rattletrap: [headerLabel] :: Header -> Str
+ Rattletrap: [headerLicenseeVersion] :: Header -> Word32le
+ Rattletrap: [headerPatchVersion] :: Header -> Maybe Word32le
+ Rattletrap: [headerProperties] :: Header -> Dictionary Property
+ Rattletrap: [initializationLocation] :: Initialization -> Maybe Vector
+ Rattletrap: [initializationRotation] :: Initialization -> Maybe Int8Vector
+ Rattletrap: [int32leValue] :: Int32le -> Int32
+ Rattletrap: [int8VectorX] :: Int8Vector -> Maybe Int8le
+ Rattletrap: [int8VectorY] :: Int8Vector -> Maybe Int8le
+ Rattletrap: [int8VectorZ] :: Int8Vector -> Maybe Int8le
+ Rattletrap: [int8leValue] :: Int8le -> Int8
+ Rattletrap: [intAttributeValue] :: IntAttribute -> Int32le
+ Rattletrap: [keyFrameFrame] :: KeyFrame -> Word32le
+ Rattletrap: [keyFramePosition] :: KeyFrame -> Word32le
+ Rattletrap: [keyFrameTime] :: KeyFrame -> Float32le
+ Rattletrap: [listValue] :: List a -> [a]
+ Rattletrap: [loadoutAttributeAntenna] :: LoadoutAttribute -> Word32le
+ Rattletrap: [loadoutAttributeBanner] :: LoadoutAttribute -> Maybe Word32le
+ Rattletrap: [loadoutAttributeBody] :: LoadoutAttribute -> Word32le
+ Rattletrap: [loadoutAttributeDecal] :: LoadoutAttribute -> Word32le
+ Rattletrap: [loadoutAttributeEngineAudio] :: LoadoutAttribute -> Maybe Word32le
+ Rattletrap: [loadoutAttributeGoalExplosion] :: LoadoutAttribute -> Maybe Word32le
+ Rattletrap: [loadoutAttributeRocketTrail] :: LoadoutAttribute -> Word32le
+ Rattletrap: [loadoutAttributeTopper] :: LoadoutAttribute -> Word32le
+ Rattletrap: [loadoutAttributeTrail] :: LoadoutAttribute -> Maybe Word32le
+ Rattletrap: [loadoutAttributeUnknown1] :: LoadoutAttribute -> Word32le
+ Rattletrap: [loadoutAttributeUnknown2] :: LoadoutAttribute -> Maybe Word32le
+ Rattletrap: [loadoutAttributeValue] :: LoadoutOnlineAttribute -> [[ProductAttribute]]
+ Rattletrap: [loadoutAttributeVersion] :: LoadoutAttribute -> Word8le
+ Rattletrap: [loadoutAttributeWheels] :: LoadoutAttribute -> Word32le
+ Rattletrap: [loadoutsAttributeBlue] :: LoadoutsAttribute -> LoadoutAttribute
+ Rattletrap: [loadoutsAttributeOrange] :: LoadoutsAttribute -> LoadoutAttribute
+ Rattletrap: [loadoutsOnlineAttributeBlue] :: LoadoutsOnlineAttribute -> LoadoutOnlineAttribute
+ Rattletrap: [loadoutsOnlineAttributeOrange] :: LoadoutsOnlineAttribute -> LoadoutOnlineAttribute
+ Rattletrap: [loadoutsOnlineAttributeUnknown1] :: LoadoutsOnlineAttribute -> Bool
+ Rattletrap: [loadoutsOnlineAttributeUnknown2] :: LoadoutsOnlineAttribute -> Bool
+ Rattletrap: [locationAttributeValue] :: LocationAttribute -> Vector
+ Rattletrap: [markFrame] :: Mark -> Word32le
+ Rattletrap: [markValue] :: Mark -> Str
+ Rattletrap: [messageFrame] :: Message -> Word32le
+ Rattletrap: [messageName] :: Message -> Str
+ Rattletrap: [messageValue] :: Message -> Str
+ Rattletrap: [musicStingerAttributeCue] :: MusicStingerAttribute -> Word32le
+ Rattletrap: [musicStingerAttributeFlag] :: MusicStingerAttribute -> Bool
+ Rattletrap: [musicStingerAttributeTrigger] :: MusicStingerAttribute -> Word8le
+ Rattletrap: [partyLeaderAttributeId] :: PartyLeaderAttribute -> Maybe (RemoteId, Word8le)
+ Rattletrap: [partyLeaderAttributeSystemId] :: PartyLeaderAttribute -> Word8le
+ Rattletrap: [pickupAttributeInstigatorId] :: PickupAttribute -> Maybe Word32le
+ Rattletrap: [pickupAttributePickedUp] :: PickupAttribute -> Bool
+ Rattletrap: [privateMatchSettingsAttributeFlag] :: PrivateMatchSettingsAttribute -> Bool
+ Rattletrap: [privateMatchSettingsAttributeGameName] :: PrivateMatchSettingsAttribute -> Str
+ Rattletrap: [privateMatchSettingsAttributeJoinableBy] :: PrivateMatchSettingsAttribute -> Word32le
+ Rattletrap: [privateMatchSettingsAttributeMaxPlayers] :: PrivateMatchSettingsAttribute -> Word32le
+ Rattletrap: [privateMatchSettingsAttributeMutators] :: PrivateMatchSettingsAttribute -> Str
+ Rattletrap: [privateMatchSettingsAttributePassword] :: PrivateMatchSettingsAttribute -> Str
+ Rattletrap: [productAttributeObjectId] :: ProductAttribute -> Word32le
+ Rattletrap: [productAttributeObjectName] :: ProductAttribute -> Maybe Str
+ Rattletrap: [productAttributeUnknown] :: ProductAttribute -> Bool
+ Rattletrap: [productAttributeValue] :: ProductAttribute -> Maybe (Either CompressedWord Word32)
+ Rattletrap: [propertyKind] :: Property -> Str
+ Rattletrap: [propertySize] :: Property -> Word64le
+ Rattletrap: [propertyValue] :: Property -> PropertyValue Property
+ Rattletrap: [qWordAttributeValue] :: QWordAttribute -> Word64le
+ Rattletrap: [replayContent] :: Replay -> Section Content
+ Rattletrap: [replayHeader] :: Replay -> Section Header
+ Rattletrap: [replicationActorId] :: Replication -> CompressedWord
+ Rattletrap: [replicationValue] :: Replication -> ReplicationValue
+ Rattletrap: [reservationAttributeName] :: ReservationAttribute -> Maybe Str
+ Rattletrap: [reservationAttributeNumber] :: ReservationAttribute -> CompressedWord
+ Rattletrap: [reservationAttributeUniqueId] :: ReservationAttribute -> UniqueIdAttribute
+ Rattletrap: [reservationAttributeUnknown1] :: ReservationAttribute -> Bool
+ Rattletrap: [reservationAttributeUnknown2] :: ReservationAttribute -> Bool
+ Rattletrap: [reservationAttributeUnknown3] :: ReservationAttribute -> Maybe Word8
+ Rattletrap: [rigidBodyStateAttributeAngularVelocity] :: RigidBodyStateAttribute -> Maybe Vector
+ Rattletrap: [rigidBodyStateAttributeLinearVelocity] :: RigidBodyStateAttribute -> Maybe Vector
+ Rattletrap: [rigidBodyStateAttributeLocation] :: RigidBodyStateAttribute -> Vector
+ Rattletrap: [rigidBodyStateAttributeRotation] :: RigidBodyStateAttribute -> CompressedWordVector
+ Rattletrap: [rigidBodyStateAttributeSleeping] :: RigidBodyStateAttribute -> Bool
+ Rattletrap: [sectionBody] :: Section a -> a
+ Rattletrap: [sectionCrc] :: Section a -> Word32le
+ Rattletrap: [sectionSize] :: Section a -> Word32le
+ Rattletrap: [spawnedReplicationClassName] :: SpawnedReplication -> Str
+ Rattletrap: [spawnedReplicationFlag] :: SpawnedReplication -> Bool
+ Rattletrap: [spawnedReplicationInitialization] :: SpawnedReplication -> Initialization
+ Rattletrap: [spawnedReplicationNameIndex] :: SpawnedReplication -> Maybe Word32le
+ Rattletrap: [spawnedReplicationName] :: SpawnedReplication -> Maybe Str
+ Rattletrap: [spawnedReplicationObjectId] :: SpawnedReplication -> Word32le
+ Rattletrap: [spawnedReplicationObjectName] :: SpawnedReplication -> Str
+ Rattletrap: [strValue] :: Str -> Text
+ Rattletrap: [stringAttributeValue] :: StringAttribute -> Str
+ Rattletrap: [teamPaintAttributeAccentColor] :: TeamPaintAttribute -> Word8le
+ Rattletrap: [teamPaintAttributeAccentFinish] :: TeamPaintAttribute -> Word32le
+ Rattletrap: [teamPaintAttributePrimaryColor] :: TeamPaintAttribute -> Word8le
+ Rattletrap: [teamPaintAttributePrimaryFinish] :: TeamPaintAttribute -> Word32le
+ Rattletrap: [teamPaintAttributeTeam] :: TeamPaintAttribute -> Word8le
+ Rattletrap: [uniqueIdAttributeLocalId] :: UniqueIdAttribute -> Word8le
+ Rattletrap: [uniqueIdAttributeRemoteId] :: UniqueIdAttribute -> RemoteId
+ Rattletrap: [uniqueIdAttributeSystemId] :: UniqueIdAttribute -> Word8le
+ Rattletrap: [updatedReplicationAttributes] :: UpdatedReplication -> [Attribute]
+ Rattletrap: [vectorBias] :: Vector -> Word
+ Rattletrap: [vectorX] :: Vector -> Int
+ Rattletrap: [vectorY] :: Vector -> Int
+ Rattletrap: [vectorZ] :: Vector -> Int
+ Rattletrap: [weldedInfoAttributeActive] :: WeldedInfoAttribute -> Bool
+ Rattletrap: [weldedInfoAttributeActorId] :: WeldedInfoAttribute -> Int32le
+ Rattletrap: [weldedInfoAttributeMass] :: WeldedInfoAttribute -> Float32le
+ Rattletrap: [weldedInfoAttributeOffset] :: WeldedInfoAttribute -> Vector
+ Rattletrap: [weldedInfoAttributeRotation] :: WeldedInfoAttribute -> Int8Vector
+ Rattletrap: [word32leValue] :: Word32le -> Word32
+ Rattletrap: [word64leValue] :: Word64le -> Word64
+ Rattletrap: [word8leValue] :: Word8le -> Word8
+ Rattletrap: data AppliedDamageAttribute
+ Rattletrap: data Attribute
+ Rattletrap: data AttributeMapping
+ Rattletrap: data AttributeValue
+ Rattletrap: data Cache
+ Rattletrap: data CamSettingsAttribute
+ Rattletrap: data ClassMapping
+ Rattletrap: data ClubColorsAttribute
+ Rattletrap: data CompressedWord
+ Rattletrap: data CompressedWordVector
+ Rattletrap: data Content
+ Rattletrap: data DamageStateAttribute
+ Rattletrap: data DemolishAttribute
+ Rattletrap: data DestroyedReplication
+ Rattletrap: data Dictionary a
+ Rattletrap: data ExplosionAttribute
+ Rattletrap: data ExtendedExplosionAttribute
+ Rattletrap: data FlaggedIntAttribute
+ Rattletrap: data Frame
+ Rattletrap: data GameModeAttribute
+ Rattletrap: data Header
+ Rattletrap: data Initialization
+ Rattletrap: data Int8Vector
+ Rattletrap: data KeyFrame
+ Rattletrap: data LoadoutAttribute
+ Rattletrap: data LoadoutsAttribute
+ Rattletrap: data LoadoutsOnlineAttribute
+ Rattletrap: data Mark
+ Rattletrap: data Message
+ Rattletrap: data MusicStingerAttribute
+ Rattletrap: data PartyLeaderAttribute
+ Rattletrap: data PickupAttribute
+ Rattletrap: data PrivateMatchSettingsAttribute
+ Rattletrap: data ProductAttribute
+ Rattletrap: data Property
+ Rattletrap: data PropertyValue a
+ Rattletrap: data RemoteId
+ Rattletrap: data Replay
+ Rattletrap: data Replication
+ Rattletrap: data ReplicationValue
+ Rattletrap: data ReservationAttribute
+ Rattletrap: data RigidBodyStateAttribute
+ Rattletrap: data Section a
+ Rattletrap: data SpawnedReplication
+ Rattletrap: data TeamPaintAttribute
+ Rattletrap: data UniqueIdAttribute
+ Rattletrap: data Vector
+ Rattletrap: data WeldedInfoAttribute
+ Rattletrap: decodeReplayFile :: ByteString -> Either String Replay
+ Rattletrap: decodeReplayJson :: ByteString -> Either String Replay
+ Rattletrap: encodeReplayFile :: Replay -> ByteString
+ Rattletrap: encodeReplayJson :: Replay -> ByteString
+ Rattletrap: newtype BooleanAttribute
+ Rattletrap: newtype ByteAttribute
+ Rattletrap: newtype EnumAttribute
+ Rattletrap: newtype Float32le
+ Rattletrap: newtype FloatAttribute
+ Rattletrap: newtype Int32le
+ Rattletrap: newtype Int8le
+ Rattletrap: newtype IntAttribute
+ Rattletrap: newtype List a
+ Rattletrap: newtype LoadoutOnlineAttribute
+ Rattletrap: newtype LocationAttribute
+ Rattletrap: newtype QWordAttribute
+ Rattletrap: newtype Str
+ Rattletrap: newtype StringAttribute
+ Rattletrap: newtype UpdatedReplication
+ Rattletrap: newtype Word32le
+ Rattletrap: newtype Word64le
+ Rattletrap: newtype Word8le
+ Rattletrap.Console.Main: instance GHC.Show.Show Rattletrap.Console.Main.Config
+ Rattletrap.Console.Main: instance GHC.Show.Show Rattletrap.Console.Main.Mode
+ Rattletrap.Console.Main: main :: IO ()
+ Rattletrap.Console.Main: rattletrap :: String -> [String] -> IO ()
+ Rattletrap.Decode.AppliedDamageAttribute: decodeAppliedDamageAttributeBits :: DecodeBits AppliedDamageAttribute
+ Rattletrap.Decode.Attribute: decodeAttributeBits :: (Int, Int, Int) -> ClassAttributeMap -> Map CompressedWord Word32le -> CompressedWord -> DecodeBits Attribute
+ Rattletrap.Decode.Attribute: decodeAttributesBits :: (Int, Int, Int) -> ClassAttributeMap -> Map CompressedWord Word32le -> CompressedWord -> DecodeBits [Attribute]
+ Rattletrap.Decode.AttributeMapping: decodeAttributeMapping :: Decode AttributeMapping
+ Rattletrap.Decode.AttributeValue: decodeAttributeValueBits :: (Int, Int, Int) -> Map Word32le Str -> Str -> DecodeBits AttributeValue
+ Rattletrap.Decode.Bitstream: decodeBitstreamBits :: Int -> DecodeBits Bitstream
+ Rattletrap.Decode.BooleanAttribute: decodeBooleanAttributeBits :: DecodeBits BooleanAttribute
+ Rattletrap.Decode.ByteAttribute: decodeByteAttributeBits :: DecodeBits ByteAttribute
+ Rattletrap.Decode.Cache: decodeCache :: Decode Cache
+ Rattletrap.Decode.CamSettingsAttribute: decodeCamSettingsAttributeBits :: (Int, Int, Int) -> DecodeBits CamSettingsAttribute
+ Rattletrap.Decode.ClassMapping: decodeClassMapping :: Decode ClassMapping
+ Rattletrap.Decode.ClubColorsAttribute: decodeClubColorsAttributeBits :: DecodeBits ClubColorsAttribute
+ Rattletrap.Decode.Common: decodeWhen :: (Applicative m, Alternative f) => Bool -> m a -> m (f a)
+ Rattletrap.Decode.Common: getBool :: BitGet Bool
+ Rattletrap.Decode.Common: getFloatle :: Get Float
+ Rattletrap.Decode.Common: getInt32le :: Get Int32
+ Rattletrap.Decode.Common: getInt8 :: Get Int8
+ Rattletrap.Decode.Common: getLazyByteString :: Int64 -> Get ByteString
+ Rattletrap.Decode.Common: getLazyByteStringBits :: Int -> DecodeBits ByteString
+ Rattletrap.Decode.Common: getWord16be :: Int -> BitGet Word16
+ Rattletrap.Decode.Common: getWord32be :: Int -> BitGet Word32
+ Rattletrap.Decode.Common: getWord32le :: Get Word32
+ Rattletrap.Decode.Common: getWord64le :: Get Word64
+ Rattletrap.Decode.Common: getWord8 :: Get Word8
+ Rattletrap.Decode.Common: getWord8Bits :: Int -> DecodeBits Word8
+ Rattletrap.Decode.Common: runDecode :: Decode a -> ByteString -> Either String a
+ Rattletrap.Decode.Common: runDecodeBits :: DecodeBits a -> ByteString -> Either String a
+ Rattletrap.Decode.Common: toBits :: Decode a -> Int -> DecodeBits a
+ Rattletrap.Decode.Common: type Decode = Get
+ Rattletrap.Decode.Common: type DecodeBits = BitGet
+ Rattletrap.Decode.CompressedWord: decodeCompressedWordBits :: Word -> DecodeBits CompressedWord
+ Rattletrap.Decode.CompressedWordVector: decodeCompressedWordVectorBits :: DecodeBits CompressedWordVector
+ Rattletrap.Decode.Content: decodeContent :: (Int, Int, Int) -> Int -> Word -> Decode Content
+ Rattletrap.Decode.DamageStateAttribute: decodeDamageStateAttributeBits :: DecodeBits DamageStateAttribute
+ Rattletrap.Decode.DemolishAttribute: decodeDemolishAttributeBits :: DecodeBits DemolishAttribute
+ Rattletrap.Decode.DestroyedReplication: decodeDestroyedReplicationBits :: DecodeBits DestroyedReplication
+ Rattletrap.Decode.Dictionary: decodeDictionary :: Decode a -> Decode (Dictionary a)
+ Rattletrap.Decode.EnumAttribute: decodeEnumAttributeBits :: DecodeBits EnumAttribute
+ Rattletrap.Decode.ExplosionAttribute: decodeExplosionAttributeBits :: DecodeBits ExplosionAttribute
+ Rattletrap.Decode.ExtendedExplosionAttribute: decodeExtendedExplosionAttributeBits :: DecodeBits ExtendedExplosionAttribute
+ Rattletrap.Decode.FlaggedIntAttribute: decodeFlaggedIntAttributeBits :: DecodeBits FlaggedIntAttribute
+ Rattletrap.Decode.Float32le: decodeFloat32le :: Decode Float32le
+ Rattletrap.Decode.Float32le: decodeFloat32leBits :: DecodeBits Float32le
+ Rattletrap.Decode.FloatAttribute: decodeFloatAttributeBits :: DecodeBits FloatAttribute
+ Rattletrap.Decode.Frame: decodeFrameBits :: (Int, Int, Int) -> Word -> ClassAttributeMap -> StateT (Map CompressedWord Word32le) DecodeBits Frame
+ Rattletrap.Decode.Frame: decodeFramesBits :: (Int, Int, Int) -> Int -> Word -> ClassAttributeMap -> StateT (Map CompressedWord Word32le) DecodeBits [Frame]
+ Rattletrap.Decode.GameModeAttribute: decodeGameModeAttributeBits :: (Int, Int, Int) -> DecodeBits GameModeAttribute
+ Rattletrap.Decode.Header: decodeHeader :: Decode Header
+ Rattletrap.Decode.Initialization: decodeInitializationBits :: Bool -> Bool -> DecodeBits Initialization
+ Rattletrap.Decode.Int32le: decodeInt32le :: Decode Int32le
+ Rattletrap.Decode.Int32le: decodeInt32leBits :: DecodeBits Int32le
+ Rattletrap.Decode.Int8Vector: decodeInt8VectorBits :: DecodeBits Int8Vector
+ Rattletrap.Decode.Int8le: decodeInt8le :: Decode Int8le
+ Rattletrap.Decode.Int8le: decodeInt8leBits :: DecodeBits Int8le
+ Rattletrap.Decode.IntAttribute: decodeIntAttributeBits :: DecodeBits IntAttribute
+ Rattletrap.Decode.KeyFrame: decodeKeyFrame :: Decode KeyFrame
+ Rattletrap.Decode.List: decodeList :: Decode a -> Decode (List a)
+ Rattletrap.Decode.LoadoutAttribute: decodeLoadoutAttributeBits :: DecodeBits LoadoutAttribute
+ Rattletrap.Decode.LoadoutOnlineAttribute: decodeLoadoutOnlineAttributeBits :: (Int, Int, Int) -> Map Word32le Str -> DecodeBits LoadoutOnlineAttribute
+ Rattletrap.Decode.LoadoutsAttribute: decodeLoadoutsAttributeBits :: DecodeBits LoadoutsAttribute
+ Rattletrap.Decode.LoadoutsOnlineAttribute: decodeLoadoutsOnlineAttributeBits :: (Int, Int, Int) -> Map Word32le Str -> DecodeBits LoadoutsOnlineAttribute
+ Rattletrap.Decode.LocationAttribute: decodeLocationAttributeBits :: DecodeBits LocationAttribute
+ Rattletrap.Decode.Mark: decodeMark :: Decode Mark
+ Rattletrap.Decode.Message: decodeMessage :: Decode Message
+ Rattletrap.Decode.MusicStingerAttribute: decodeMusicStingerAttributeBits :: DecodeBits MusicStingerAttribute
+ Rattletrap.Decode.PartyLeaderAttribute: decodePartyLeaderAttributeBits :: (Int, Int, Int) -> DecodeBits PartyLeaderAttribute
+ Rattletrap.Decode.PickupAttribute: decodePickupAttributeBits :: DecodeBits PickupAttribute
+ Rattletrap.Decode.PlayerHistoryKeyAttribute: decodePlayerHistoryKeyAttributeBits :: DecodeBits PlayerHistoryKeyAttribute
+ Rattletrap.Decode.PrivateMatchSettingsAttribute: decodePrivateMatchSettingsAttributeBits :: DecodeBits PrivateMatchSettingsAttribute
+ Rattletrap.Decode.ProductAttribute: decodeProductAttributeBits :: (Int, Int, Int) -> Map Word32le Str -> DecodeBits ProductAttribute
+ Rattletrap.Decode.ProductAttribute: decodeProductAttributesBits :: (Int, Int, Int) -> Map Word32le Str -> DecodeBits [ProductAttribute]
+ Rattletrap.Decode.Property: decodeProperty :: Decode Property
+ Rattletrap.Decode.PropertyValue: decodePropertyValue :: Decode a -> Str -> Decode (PropertyValue a)
+ Rattletrap.Decode.QWordAttribute: decodeQWordAttributeBits :: DecodeBits QWordAttribute
+ Rattletrap.Decode.RemoteId: decodeRemoteIdBits :: (Int, Int, Int) -> Word8le -> DecodeBits RemoteId
+ Rattletrap.Decode.Replay: decodeReplay :: Decode Replay
+ Rattletrap.Decode.Replication: decodeReplicationBits :: (Int, Int, Int) -> Word -> ClassAttributeMap -> StateT (Map CompressedWord Word32le) DecodeBits Replication
+ Rattletrap.Decode.Replication: decodeReplicationsBits :: (Int, Int, Int) -> Word -> ClassAttributeMap -> StateT (Map CompressedWord Word32le) DecodeBits [Replication]
+ Rattletrap.Decode.ReplicationValue: decodeReplicationValueBits :: (Int, Int, Int) -> ClassAttributeMap -> CompressedWord -> StateT (Map CompressedWord Word32le) DecodeBits ReplicationValue
+ Rattletrap.Decode.ReservationAttribute: decodeReservationAttributeBits :: (Int, Int, Int) -> DecodeBits ReservationAttribute
+ Rattletrap.Decode.RigidBodyStateAttribute: decodeRigidBodyStateAttributeBits :: DecodeBits RigidBodyStateAttribute
+ Rattletrap.Decode.Section: decodeSection :: Decode a -> Decode (Section a)
+ Rattletrap.Decode.SpawnedReplication: decodeSpawnedReplicationBits :: (Int, Int, Int) -> ClassAttributeMap -> CompressedWord -> StateT (Map CompressedWord Word32le) DecodeBits SpawnedReplication
+ Rattletrap.Decode.Str: decodeStr :: Decode Str
+ Rattletrap.Decode.Str: decodeStrBits :: DecodeBits Str
+ Rattletrap.Decode.StringAttribute: decodeStringAttributeBits :: DecodeBits StringAttribute
+ Rattletrap.Decode.TeamPaintAttribute: decodeTeamPaintAttributeBits :: DecodeBits TeamPaintAttribute
+ Rattletrap.Decode.UniqueIdAttribute: decodeUniqueIdAttributeBits :: (Int, Int, Int) -> DecodeBits UniqueIdAttribute
+ Rattletrap.Decode.UpdatedReplication: decodeUpdatedReplicationBits :: (Int, Int, Int) -> ClassAttributeMap -> Map CompressedWord Word32le -> CompressedWord -> DecodeBits UpdatedReplication
+ Rattletrap.Decode.Vector: decodeVectorBits :: DecodeBits Vector
+ Rattletrap.Decode.WeldedInfoAttribute: decodeWeldedInfoAttributeBits :: DecodeBits WeldedInfoAttribute
+ Rattletrap.Decode.Word32le: decodeWord32le :: Decode Word32le
+ Rattletrap.Decode.Word32le: decodeWord32leBits :: DecodeBits Word32le
+ Rattletrap.Decode.Word64le: decodeWord64le :: Decode Word64le
+ Rattletrap.Decode.Word64le: decodeWord64leBits :: DecodeBits Word64le
+ Rattletrap.Decode.Word8le: decodeWord8le :: Decode Word8le
+ Rattletrap.Decode.Word8le: decodeWord8leBits :: DecodeBits Word8le
+ Rattletrap.Encode.AppliedDamageAttribute: putAppliedDamageAttribute :: AppliedDamageAttribute -> BitPut ()
+ Rattletrap.Encode.Attribute: putAttribute :: Attribute -> BitPut ()
+ Rattletrap.Encode.Attribute: putAttributes :: [Attribute] -> BitPut ()
+ Rattletrap.Encode.AttributeMapping: putAttributeMapping :: AttributeMapping -> Put
+ Rattletrap.Encode.AttributeValue: putAttributeValue :: AttributeValue -> BitPut ()
+ Rattletrap.Encode.Bitstream: putBitstream :: Bitstream -> BitPut ()
+ Rattletrap.Encode.BooleanAttribute: putBooleanAttribute :: BooleanAttribute -> BitPut ()
+ Rattletrap.Encode.ByteAttribute: putByteAttribute :: ByteAttribute -> BitPut ()
+ Rattletrap.Encode.Cache: putCache :: Cache -> Put
+ Rattletrap.Encode.CamSettingsAttribute: putCamSettingsAttribute :: CamSettingsAttribute -> BitPut ()
+ Rattletrap.Encode.ClassMapping: putClassMapping :: ClassMapping -> Put
+ Rattletrap.Encode.ClubColorsAttribute: putClubColorsAttribute :: ClubColorsAttribute -> BitPut ()
+ Rattletrap.Encode.CompressedWord: putCompressedWord :: CompressedWord -> BitPut ()
+ Rattletrap.Encode.CompressedWordVector: putCompressedWordVector :: CompressedWordVector -> BitPut ()
+ Rattletrap.Encode.Content: putContent :: Content -> Put
+ Rattletrap.Encode.DamageStateAttribute: putDamageStateAttribute :: DamageStateAttribute -> BitPut ()
+ Rattletrap.Encode.DemolishAttribute: putDemolishAttribute :: DemolishAttribute -> BitPut ()
+ Rattletrap.Encode.DestroyedReplication: putDestroyedReplication :: DestroyedReplication -> BitPut ()
+ Rattletrap.Encode.Dictionary: putDictionary :: (a -> Put) -> Dictionary a -> Put
+ Rattletrap.Encode.EnumAttribute: putEnumAttribute :: EnumAttribute -> BitPut ()
+ Rattletrap.Encode.ExplosionAttribute: putExplosionAttribute :: ExplosionAttribute -> BitPut ()
+ Rattletrap.Encode.ExtendedExplosionAttribute: putExtendedExplosionAttribute :: ExtendedExplosionAttribute -> BitPut ()
+ Rattletrap.Encode.FlaggedIntAttribute: putFlaggedIntAttribute :: FlaggedIntAttribute -> BitPut ()
+ Rattletrap.Encode.Float32le: putFloat32 :: Float32le -> Put
+ Rattletrap.Encode.Float32le: putFloat32Bits :: Float32le -> BitPut ()
+ Rattletrap.Encode.FloatAttribute: putFloatAttribute :: FloatAttribute -> BitPut ()
+ Rattletrap.Encode.Frame: putFrame :: Frame -> BitPut ()
+ Rattletrap.Encode.Frame: putFrames :: [Frame] -> BitPut ()
+ Rattletrap.Encode.GameModeAttribute: putGameModeAttribute :: GameModeAttribute -> BitPut ()
+ Rattletrap.Encode.Header: putHeader :: Header -> Put
+ Rattletrap.Encode.Initialization: putInitialization :: Initialization -> BitPut ()
+ Rattletrap.Encode.Int32le: putInt32 :: Int32le -> Put
+ Rattletrap.Encode.Int32le: putInt32Bits :: Int32le -> BitPut ()
+ Rattletrap.Encode.Int8Vector: putInt8Vector :: Int8Vector -> BitPut ()
+ Rattletrap.Encode.Int8le: putInt8 :: Int8le -> Put
+ Rattletrap.Encode.Int8le: putInt8Bits :: Int8le -> BitPut ()
+ Rattletrap.Encode.IntAttribute: putIntAttribute :: IntAttribute -> BitPut ()
+ Rattletrap.Encode.KeyFrame: putKeyFrame :: KeyFrame -> Put
+ Rattletrap.Encode.List: putList :: (a -> Put) -> List a -> Put
+ Rattletrap.Encode.LoadoutAttribute: putLoadoutAttribute :: LoadoutAttribute -> BitPut ()
+ Rattletrap.Encode.LoadoutOnlineAttribute: putLoadoutOnlineAttribute :: LoadoutOnlineAttribute -> BitPut ()
+ Rattletrap.Encode.LoadoutsAttribute: putLoadoutsAttribute :: LoadoutsAttribute -> BitPut ()
+ Rattletrap.Encode.LoadoutsOnlineAttribute: putLoadoutsOnlineAttribute :: LoadoutsOnlineAttribute -> BitPut ()
+ Rattletrap.Encode.LocationAttribute: putLocationAttribute :: LocationAttribute -> BitPut ()
+ Rattletrap.Encode.Mark: putMark :: Mark -> Put
+ Rattletrap.Encode.Message: putMessage :: Message -> Put
+ Rattletrap.Encode.MusicStingerAttribute: putMusicStingerAttribute :: MusicStingerAttribute -> BitPut ()
+ Rattletrap.Encode.PartyLeaderAttribute: putPartyLeaderAttribute :: PartyLeaderAttribute -> BitPut ()
+ Rattletrap.Encode.PickupAttribute: putPickupAttribute :: PickupAttribute -> BitPut ()
+ Rattletrap.Encode.PlayerHistoryKeyAttribute: putPlayerHistoryKeyAttribute :: PlayerHistoryKeyAttribute -> BitPut ()
+ Rattletrap.Encode.PrivateMatchSettingsAttribute: putPrivateMatchSettingsAttribute :: PrivateMatchSettingsAttribute -> BitPut ()
+ Rattletrap.Encode.ProductAttribute: putProductAttribute :: ProductAttribute -> BitPut ()
+ Rattletrap.Encode.ProductAttribute: putProductAttributes :: [ProductAttribute] -> BitPut ()
+ Rattletrap.Encode.Property: putProperty :: Property -> Put
+ Rattletrap.Encode.PropertyValue: putPropertyValue :: (a -> Put) -> PropertyValue a -> Put
+ Rattletrap.Encode.QWordAttribute: putQWordAttribute :: QWordAttribute -> BitPut ()
+ Rattletrap.Encode.RemoteId: putRemoteId :: RemoteId -> BitPut ()
+ Rattletrap.Encode.Replay: putReplay :: Replay -> Put
+ Rattletrap.Encode.Replication: putReplication :: Replication -> BitPut ()
+ Rattletrap.Encode.Replication: putReplications :: [Replication] -> BitPut ()
+ Rattletrap.Encode.ReplicationValue: putReplicationValue :: ReplicationValue -> BitPut ()
+ Rattletrap.Encode.ReservationAttribute: putReservationAttribute :: ReservationAttribute -> BitPut ()
+ Rattletrap.Encode.RigidBodyStateAttribute: putRigidBodyStateAttribute :: RigidBodyStateAttribute -> BitPut ()
+ Rattletrap.Encode.Section: putSection :: (a -> Put) -> Section a -> Put
+ Rattletrap.Encode.SpawnedReplication: putSpawnedReplication :: SpawnedReplication -> BitPut ()
+ Rattletrap.Encode.Str: putText :: Str -> Put
+ Rattletrap.Encode.Str: putTextBits :: Str -> BitPut ()
+ Rattletrap.Encode.StringAttribute: putStringAttribute :: StringAttribute -> BitPut ()
+ Rattletrap.Encode.TeamPaintAttribute: putTeamPaintAttribute :: TeamPaintAttribute -> BitPut ()
+ Rattletrap.Encode.UniqueIdAttribute: putUniqueIdAttribute :: UniqueIdAttribute -> BitPut ()
+ Rattletrap.Encode.UpdatedReplication: putUpdatedReplication :: UpdatedReplication -> BitPut ()
+ Rattletrap.Encode.Vector: putVector :: Vector -> BitPut ()
+ Rattletrap.Encode.WeldedInfoAttribute: putWeldedInfoAttribute :: WeldedInfoAttribute -> BitPut ()
+ Rattletrap.Encode.Word32le: putWord32 :: Word32le -> Put
+ Rattletrap.Encode.Word32le: putWord32Bits :: Word32le -> BitPut ()
+ Rattletrap.Encode.Word64le: putWord64 :: Word64le -> Put
+ Rattletrap.Encode.Word64le: putWord64Bits :: Word64le -> BitPut ()
+ Rattletrap.Encode.Word8le: putWord8 :: Word8le -> Put
+ Rattletrap.Encode.Word8le: putWord8Bits :: Word8le -> BitPut ()
+ Rattletrap.Type.AppliedDamageAttribute: AppliedDamageAttribute :: Word8le -> Vector -> Int32le -> Int32le -> AppliedDamageAttribute
+ Rattletrap.Type.AppliedDamageAttribute: [appliedDamageAttributeLocation] :: AppliedDamageAttribute -> Vector
+ Rattletrap.Type.AppliedDamageAttribute: [appliedDamageAttributeUnknown1] :: AppliedDamageAttribute -> Word8le
+ Rattletrap.Type.AppliedDamageAttribute: [appliedDamageAttributeUnknown3] :: AppliedDamageAttribute -> Int32le
+ Rattletrap.Type.AppliedDamageAttribute: [appliedDamageAttributeUnknown4] :: AppliedDamageAttribute -> Int32le
+ Rattletrap.Type.AppliedDamageAttribute: data AppliedDamageAttribute
+ Rattletrap.Type.AppliedDamageAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.AppliedDamageAttribute.AppliedDamageAttribute
+ Rattletrap.Type.AppliedDamageAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.AppliedDamageAttribute.AppliedDamageAttribute
+ Rattletrap.Type.AppliedDamageAttribute: instance GHC.Classes.Eq Rattletrap.Type.AppliedDamageAttribute.AppliedDamageAttribute
+ Rattletrap.Type.AppliedDamageAttribute: instance GHC.Classes.Ord Rattletrap.Type.AppliedDamageAttribute.AppliedDamageAttribute
+ Rattletrap.Type.AppliedDamageAttribute: instance GHC.Show.Show Rattletrap.Type.AppliedDamageAttribute.AppliedDamageAttribute
+ Rattletrap.Type.Attribute: Attribute :: CompressedWord -> Str -> AttributeValue -> Attribute
+ Rattletrap.Type.Attribute: [attributeId] :: Attribute -> CompressedWord
+ Rattletrap.Type.Attribute: [attributeName] :: Attribute -> Str
+ Rattletrap.Type.Attribute: [attributeValue] :: Attribute -> AttributeValue
+ Rattletrap.Type.Attribute: data Attribute
+ Rattletrap.Type.Attribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.Attribute.Attribute
+ Rattletrap.Type.Attribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.Attribute.Attribute
+ Rattletrap.Type.Attribute: instance GHC.Classes.Eq Rattletrap.Type.Attribute.Attribute
+ Rattletrap.Type.Attribute: instance GHC.Classes.Ord Rattletrap.Type.Attribute.Attribute
+ Rattletrap.Type.Attribute: instance GHC.Show.Show Rattletrap.Type.Attribute.Attribute
+ Rattletrap.Type.AttributeMapping: AttributeMapping :: Word32le -> Word32le -> AttributeMapping
+ Rattletrap.Type.AttributeMapping: [attributeMappingObjectId] :: AttributeMapping -> Word32le
+ Rattletrap.Type.AttributeMapping: [attributeMappingStreamId] :: AttributeMapping -> Word32le
+ Rattletrap.Type.AttributeMapping: data AttributeMapping
+ Rattletrap.Type.AttributeMapping: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.AttributeMapping.AttributeMapping
+ Rattletrap.Type.AttributeMapping: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.AttributeMapping.AttributeMapping
+ Rattletrap.Type.AttributeMapping: instance GHC.Classes.Eq Rattletrap.Type.AttributeMapping.AttributeMapping
+ Rattletrap.Type.AttributeMapping: instance GHC.Classes.Ord Rattletrap.Type.AttributeMapping.AttributeMapping
+ Rattletrap.Type.AttributeMapping: instance GHC.Show.Show Rattletrap.Type.AttributeMapping.AttributeMapping
+ Rattletrap.Type.AttributeType: AttributeTypeAppliedDamage :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeBoolean :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeByte :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeCamSettings :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeClubColors :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeDamageState :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeDemolish :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeEnum :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeExplosion :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeExtendedExplosion :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeFlaggedInt :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeFloat :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeGameMode :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeInt :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeLoadout :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeLoadoutOnline :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeLoadouts :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeLoadoutsOnline :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeLocation :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeMusicStinger :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypePartyLeader :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypePickup :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypePlayerHistoryKey :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypePrivateMatchSettings :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeQWord :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeReservation :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeRigidBodyState :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeString :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeTeamPaint :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeUniqueId :: AttributeType
+ Rattletrap.Type.AttributeType: AttributeTypeWeldedInfo :: AttributeType
+ Rattletrap.Type.AttributeType: data AttributeType
+ Rattletrap.Type.AttributeType: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.AttributeType.AttributeType
+ Rattletrap.Type.AttributeType: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.AttributeType.AttributeType
+ Rattletrap.Type.AttributeType: instance GHC.Classes.Eq Rattletrap.Type.AttributeType.AttributeType
+ Rattletrap.Type.AttributeType: instance GHC.Classes.Ord Rattletrap.Type.AttributeType.AttributeType
+ Rattletrap.Type.AttributeType: instance GHC.Show.Show Rattletrap.Type.AttributeType.AttributeType
+ Rattletrap.Type.AttributeValue: AttributeValueAppliedDamage :: AppliedDamageAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueBoolean :: BooleanAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueByte :: ByteAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueCamSettings :: CamSettingsAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueClubColors :: ClubColorsAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueDamageState :: DamageStateAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueDemolish :: DemolishAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueEnum :: EnumAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueExplosion :: ExplosionAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueExtendedExplosion :: ExtendedExplosionAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueFlaggedInt :: FlaggedIntAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueFloat :: FloatAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueGameMode :: GameModeAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueInt :: IntAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueLoadout :: LoadoutAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueLoadoutOnline :: LoadoutOnlineAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueLoadouts :: LoadoutsAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueLoadoutsOnline :: LoadoutsOnlineAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueLocation :: LocationAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueMusicStinger :: MusicStingerAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValuePartyLeader :: PartyLeaderAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValuePickup :: PickupAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValuePlayerHistoryKey :: PlayerHistoryKeyAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValuePrivateMatchSettings :: PrivateMatchSettingsAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueQWord :: QWordAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueReservation :: ReservationAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueRigidBodyState :: RigidBodyStateAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueString :: StringAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueTeamPaint :: TeamPaintAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueUniqueId :: UniqueIdAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: AttributeValueWeldedInfo :: WeldedInfoAttribute -> AttributeValue
+ Rattletrap.Type.AttributeValue: data AttributeValue
+ Rattletrap.Type.AttributeValue: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.AttributeValue.AttributeValue
+ Rattletrap.Type.AttributeValue: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.AttributeValue.AttributeValue
+ Rattletrap.Type.AttributeValue: instance GHC.Classes.Eq Rattletrap.Type.AttributeValue.AttributeValue
+ Rattletrap.Type.AttributeValue: instance GHC.Classes.Ord Rattletrap.Type.AttributeValue.AttributeValue
+ Rattletrap.Type.AttributeValue: instance GHC.Show.Show Rattletrap.Type.AttributeValue.AttributeValue
+ Rattletrap.Type.Bitstream: Bitstream :: [Bool] -> Bitstream
+ Rattletrap.Type.Bitstream: [bitstreamValue] :: Bitstream -> [Bool]
+ Rattletrap.Type.Bitstream: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.Bitstream.Bitstream
+ Rattletrap.Type.Bitstream: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.Bitstream.Bitstream
+ Rattletrap.Type.Bitstream: instance GHC.Classes.Eq Rattletrap.Type.Bitstream.Bitstream
+ Rattletrap.Type.Bitstream: instance GHC.Classes.Ord Rattletrap.Type.Bitstream.Bitstream
+ Rattletrap.Type.Bitstream: instance GHC.Show.Show Rattletrap.Type.Bitstream.Bitstream
+ Rattletrap.Type.Bitstream: newtype Bitstream
+ Rattletrap.Type.BooleanAttribute: BooleanAttribute :: Bool -> BooleanAttribute
+ Rattletrap.Type.BooleanAttribute: [booleanAttributeValue] :: BooleanAttribute -> Bool
+ Rattletrap.Type.BooleanAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.BooleanAttribute.BooleanAttribute
+ Rattletrap.Type.BooleanAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.BooleanAttribute.BooleanAttribute
+ Rattletrap.Type.BooleanAttribute: instance GHC.Classes.Eq Rattletrap.Type.BooleanAttribute.BooleanAttribute
+ Rattletrap.Type.BooleanAttribute: instance GHC.Classes.Ord Rattletrap.Type.BooleanAttribute.BooleanAttribute
+ Rattletrap.Type.BooleanAttribute: instance GHC.Show.Show Rattletrap.Type.BooleanAttribute.BooleanAttribute
+ Rattletrap.Type.BooleanAttribute: newtype BooleanAttribute
+ Rattletrap.Type.ByteAttribute: ByteAttribute :: Word8le -> ByteAttribute
+ Rattletrap.Type.ByteAttribute: [byteAttributeValue] :: ByteAttribute -> Word8le
+ Rattletrap.Type.ByteAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.ByteAttribute.ByteAttribute
+ Rattletrap.Type.ByteAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.ByteAttribute.ByteAttribute
+ Rattletrap.Type.ByteAttribute: instance GHC.Classes.Eq Rattletrap.Type.ByteAttribute.ByteAttribute
+ Rattletrap.Type.ByteAttribute: instance GHC.Classes.Ord Rattletrap.Type.ByteAttribute.ByteAttribute
+ Rattletrap.Type.ByteAttribute: instance GHC.Show.Show Rattletrap.Type.ByteAttribute.ByteAttribute
+ Rattletrap.Type.ByteAttribute: newtype ByteAttribute
+ Rattletrap.Type.Cache: Cache :: Word32le -> Word32le -> Word32le -> List AttributeMapping -> Cache
+ Rattletrap.Type.Cache: [cacheAttributeMappings] :: Cache -> List AttributeMapping
+ Rattletrap.Type.Cache: [cacheCacheId] :: Cache -> Word32le
+ Rattletrap.Type.Cache: [cacheClassId] :: Cache -> Word32le
+ Rattletrap.Type.Cache: [cacheParentCacheId] :: Cache -> Word32le
+ Rattletrap.Type.Cache: data Cache
+ Rattletrap.Type.Cache: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.Cache.Cache
+ Rattletrap.Type.Cache: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.Cache.Cache
+ Rattletrap.Type.Cache: instance GHC.Classes.Eq Rattletrap.Type.Cache.Cache
+ Rattletrap.Type.Cache: instance GHC.Classes.Ord Rattletrap.Type.Cache.Cache
+ Rattletrap.Type.Cache: instance GHC.Show.Show Rattletrap.Type.Cache.Cache
+ Rattletrap.Type.CamSettingsAttribute: CamSettingsAttribute :: Float32le -> Float32le -> Float32le -> Float32le -> Float32le -> Float32le -> Maybe Float32le -> CamSettingsAttribute
+ Rattletrap.Type.CamSettingsAttribute: [camSettingsAttributeAngle] :: CamSettingsAttribute -> Float32le
+ Rattletrap.Type.CamSettingsAttribute: [camSettingsAttributeDistance] :: CamSettingsAttribute -> Float32le
+ Rattletrap.Type.CamSettingsAttribute: [camSettingsAttributeFov] :: CamSettingsAttribute -> Float32le
+ Rattletrap.Type.CamSettingsAttribute: [camSettingsAttributeHeight] :: CamSettingsAttribute -> Float32le
+ Rattletrap.Type.CamSettingsAttribute: [camSettingsAttributeStiffness] :: CamSettingsAttribute -> Float32le
+ Rattletrap.Type.CamSettingsAttribute: [camSettingsAttributeSwivelSpeed] :: CamSettingsAttribute -> Float32le
+ Rattletrap.Type.CamSettingsAttribute: [camSettingsAttributeTransitionSpeed] :: CamSettingsAttribute -> Maybe Float32le
+ Rattletrap.Type.CamSettingsAttribute: data CamSettingsAttribute
+ Rattletrap.Type.CamSettingsAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.CamSettingsAttribute.CamSettingsAttribute
+ Rattletrap.Type.CamSettingsAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.CamSettingsAttribute.CamSettingsAttribute
+ Rattletrap.Type.CamSettingsAttribute: instance GHC.Classes.Eq Rattletrap.Type.CamSettingsAttribute.CamSettingsAttribute
+ Rattletrap.Type.CamSettingsAttribute: instance GHC.Classes.Ord Rattletrap.Type.CamSettingsAttribute.CamSettingsAttribute
+ Rattletrap.Type.CamSettingsAttribute: instance GHC.Show.Show Rattletrap.Type.CamSettingsAttribute.CamSettingsAttribute
+ Rattletrap.Type.ClassAttributeMap: ClassAttributeMap :: Map Word32le Str -> Map Word32le Word32le -> Map Word32le (Map Word32le Word32le) -> IntMap Str -> ClassAttributeMap
+ Rattletrap.Type.ClassAttributeMap: [classAttributeMapNameMap] :: ClassAttributeMap -> IntMap Str
+ Rattletrap.Type.ClassAttributeMap: [classAttributeMapObjectClassMap] :: ClassAttributeMap -> Map Word32le Word32le
+ Rattletrap.Type.ClassAttributeMap: [classAttributeMapObjectMap] :: ClassAttributeMap -> Map Word32le Str
+ Rattletrap.Type.ClassAttributeMap: [classAttributeMapValue] :: ClassAttributeMap -> Map Word32le (Map Word32le Word32le)
+ Rattletrap.Type.ClassAttributeMap: classHasLocation :: Str -> Bool
+ Rattletrap.Type.ClassAttributeMap: classHasRotation :: Str -> Bool
+ Rattletrap.Type.ClassAttributeMap: data ClassAttributeMap
+ Rattletrap.Type.ClassAttributeMap: getAttributeIdLimit :: Map Word32le Word32le -> Maybe Word
+ Rattletrap.Type.ClassAttributeMap: getAttributeMap :: ClassAttributeMap -> Map CompressedWord Word32le -> CompressedWord -> Maybe (Map Word32le Word32le)
+ Rattletrap.Type.ClassAttributeMap: getAttributeName :: ClassAttributeMap -> Map Word32le Word32le -> CompressedWord -> Maybe Str
+ Rattletrap.Type.ClassAttributeMap: getClassName :: Str -> Maybe Str
+ Rattletrap.Type.ClassAttributeMap: getName :: IntMap Str -> Word32le -> Maybe Str
+ Rattletrap.Type.ClassAttributeMap: getObjectName :: Map Word32le Str -> Word32le -> Maybe Str
+ Rattletrap.Type.ClassAttributeMap: instance GHC.Classes.Eq Rattletrap.Type.ClassAttributeMap.ClassAttributeMap
+ Rattletrap.Type.ClassAttributeMap: instance GHC.Classes.Ord Rattletrap.Type.ClassAttributeMap.ClassAttributeMap
+ Rattletrap.Type.ClassAttributeMap: instance GHC.Show.Show Rattletrap.Type.ClassAttributeMap.ClassAttributeMap
+ Rattletrap.Type.ClassAttributeMap: makeClassAttributeMap :: List Str -> List ClassMapping -> List Cache -> List Str -> ClassAttributeMap
+ Rattletrap.Type.ClassMapping: ClassMapping :: Str -> Word32le -> ClassMapping
+ Rattletrap.Type.ClassMapping: [classMappingName] :: ClassMapping -> Str
+ Rattletrap.Type.ClassMapping: [classMappingStreamId] :: ClassMapping -> Word32le
+ Rattletrap.Type.ClassMapping: data ClassMapping
+ Rattletrap.Type.ClassMapping: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.ClassMapping.ClassMapping
+ Rattletrap.Type.ClassMapping: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.ClassMapping.ClassMapping
+ Rattletrap.Type.ClassMapping: instance GHC.Classes.Eq Rattletrap.Type.ClassMapping.ClassMapping
+ Rattletrap.Type.ClassMapping: instance GHC.Classes.Ord Rattletrap.Type.ClassMapping.ClassMapping
+ Rattletrap.Type.ClassMapping: instance GHC.Show.Show Rattletrap.Type.ClassMapping.ClassMapping
+ Rattletrap.Type.ClubColorsAttribute: ClubColorsAttribute :: Bool -> Word8le -> Bool -> Word8le -> ClubColorsAttribute
+ Rattletrap.Type.ClubColorsAttribute: [clubColorsAttributeBlueColor] :: ClubColorsAttribute -> Word8le
+ Rattletrap.Type.ClubColorsAttribute: [clubColorsAttributeBlueFlag] :: ClubColorsAttribute -> Bool
+ Rattletrap.Type.ClubColorsAttribute: [clubColorsAttributeOrangeColor] :: ClubColorsAttribute -> Word8le
+ Rattletrap.Type.ClubColorsAttribute: [clubColorsAttributeOrangeFlag] :: ClubColorsAttribute -> Bool
+ Rattletrap.Type.ClubColorsAttribute: data ClubColorsAttribute
+ Rattletrap.Type.ClubColorsAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.ClubColorsAttribute.ClubColorsAttribute
+ Rattletrap.Type.ClubColorsAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.ClubColorsAttribute.ClubColorsAttribute
+ Rattletrap.Type.ClubColorsAttribute: instance GHC.Classes.Eq Rattletrap.Type.ClubColorsAttribute.ClubColorsAttribute
+ Rattletrap.Type.ClubColorsAttribute: instance GHC.Classes.Ord Rattletrap.Type.ClubColorsAttribute.ClubColorsAttribute
+ Rattletrap.Type.ClubColorsAttribute: instance GHC.Show.Show Rattletrap.Type.ClubColorsAttribute.ClubColorsAttribute
+ Rattletrap.Type.Common: data Int32 :: *
+ Rattletrap.Type.Common: data Int64 :: *
+ Rattletrap.Type.Common: data Int8 :: *
+ Rattletrap.Type.Common: data Map k a :: * -> * -> *
+ Rattletrap.Type.Common: data Text :: *
+ Rattletrap.Type.Common: data Word16 :: *
+ Rattletrap.Type.Common: data Word32 :: *
+ Rattletrap.Type.Common: data Word64 :: *
+ Rattletrap.Type.Common: data Word8 :: *
+ Rattletrap.Type.Common: deriveJson :: Name -> Q [Dec]
+ Rattletrap.Type.CompressedWord: CompressedWord :: Word -> Word -> CompressedWord
+ Rattletrap.Type.CompressedWord: [compressedWordLimit] :: CompressedWord -> Word
+ Rattletrap.Type.CompressedWord: [compressedWordValue] :: CompressedWord -> Word
+ Rattletrap.Type.CompressedWord: data CompressedWord
+ Rattletrap.Type.CompressedWord: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.CompressedWord.CompressedWord
+ Rattletrap.Type.CompressedWord: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.CompressedWord.CompressedWord
+ Rattletrap.Type.CompressedWord: instance GHC.Classes.Eq Rattletrap.Type.CompressedWord.CompressedWord
+ Rattletrap.Type.CompressedWord: instance GHC.Classes.Ord Rattletrap.Type.CompressedWord.CompressedWord
+ Rattletrap.Type.CompressedWord: instance GHC.Show.Show Rattletrap.Type.CompressedWord.CompressedWord
+ Rattletrap.Type.CompressedWordVector: CompressedWordVector :: CompressedWord -> CompressedWord -> CompressedWord -> CompressedWordVector
+ Rattletrap.Type.CompressedWordVector: [compressedWordVectorX] :: CompressedWordVector -> CompressedWord
+ Rattletrap.Type.CompressedWordVector: [compressedWordVectorY] :: CompressedWordVector -> CompressedWord
+ Rattletrap.Type.CompressedWordVector: [compressedWordVectorZ] :: CompressedWordVector -> CompressedWord
+ Rattletrap.Type.CompressedWordVector: data CompressedWordVector
+ Rattletrap.Type.CompressedWordVector: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.CompressedWordVector.CompressedWordVector
+ Rattletrap.Type.CompressedWordVector: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.CompressedWordVector.CompressedWordVector
+ Rattletrap.Type.CompressedWordVector: instance GHC.Classes.Eq Rattletrap.Type.CompressedWordVector.CompressedWordVector
+ Rattletrap.Type.CompressedWordVector: instance GHC.Classes.Ord Rattletrap.Type.CompressedWordVector.CompressedWordVector
+ Rattletrap.Type.CompressedWordVector: instance GHC.Show.Show Rattletrap.Type.CompressedWordVector.CompressedWordVector
+ Rattletrap.Type.Content: Content :: List Str -> List KeyFrame -> Word32le -> [Frame] -> List Message -> List Mark -> List Str -> List Str -> List Str -> List ClassMapping -> List Cache -> Content
+ Rattletrap.Type.Content: [contentCaches] :: Content -> List Cache
+ Rattletrap.Type.Content: [contentClassMappings] :: Content -> List ClassMapping
+ Rattletrap.Type.Content: [contentFrames] :: Content -> [Frame]
+ Rattletrap.Type.Content: [contentKeyFrames] :: Content -> List KeyFrame
+ Rattletrap.Type.Content: [contentLevels] :: Content -> List Str
+ Rattletrap.Type.Content: [contentMarks] :: Content -> List Mark
+ Rattletrap.Type.Content: [contentMessages] :: Content -> List Message
+ Rattletrap.Type.Content: [contentNames] :: Content -> List Str
+ Rattletrap.Type.Content: [contentObjects] :: Content -> List Str
+ Rattletrap.Type.Content: [contentPackages] :: Content -> List Str
+ Rattletrap.Type.Content: [contentStreamSize] :: Content -> Word32le
+ Rattletrap.Type.Content: data Content
+ Rattletrap.Type.Content: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.Content.Content
+ Rattletrap.Type.Content: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.Content.Content
+ Rattletrap.Type.Content: instance GHC.Classes.Eq Rattletrap.Type.Content.Content
+ Rattletrap.Type.Content: instance GHC.Classes.Ord Rattletrap.Type.Content.Content
+ Rattletrap.Type.Content: instance GHC.Show.Show Rattletrap.Type.Content.Content
+ Rattletrap.Type.DamageStateAttribute: DamageStateAttribute :: Word8le -> Bool -> Int32le -> Vector -> Bool -> Bool -> DamageStateAttribute
+ Rattletrap.Type.DamageStateAttribute: [damageStateAttributeUnknown1] :: DamageStateAttribute -> Word8le
+ Rattletrap.Type.DamageStateAttribute: [damageStateAttributeUnknown2] :: DamageStateAttribute -> Bool
+ Rattletrap.Type.DamageStateAttribute: [damageStateAttributeUnknown3] :: DamageStateAttribute -> Int32le
+ Rattletrap.Type.DamageStateAttribute: [damageStateAttributeUnknown4] :: DamageStateAttribute -> Vector
+ Rattletrap.Type.DamageStateAttribute: [damageStateAttributeUnknown5] :: DamageStateAttribute -> Bool
+ Rattletrap.Type.DamageStateAttribute: [damageStateAttributeUnknown6] :: DamageStateAttribute -> Bool
+ Rattletrap.Type.DamageStateAttribute: data DamageStateAttribute
+ Rattletrap.Type.DamageStateAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.DamageStateAttribute.DamageStateAttribute
+ Rattletrap.Type.DamageStateAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.DamageStateAttribute.DamageStateAttribute
+ Rattletrap.Type.DamageStateAttribute: instance GHC.Classes.Eq Rattletrap.Type.DamageStateAttribute.DamageStateAttribute
+ Rattletrap.Type.DamageStateAttribute: instance GHC.Classes.Ord Rattletrap.Type.DamageStateAttribute.DamageStateAttribute
+ Rattletrap.Type.DamageStateAttribute: instance GHC.Show.Show Rattletrap.Type.DamageStateAttribute.DamageStateAttribute
+ Rattletrap.Type.DemolishAttribute: DemolishAttribute :: Bool -> Word32le -> Bool -> Word32le -> Vector -> Vector -> DemolishAttribute
+ Rattletrap.Type.DemolishAttribute: [demolishAttributeAttackerActorId] :: DemolishAttribute -> Word32le
+ Rattletrap.Type.DemolishAttribute: [demolishAttributeAttackerFlag] :: DemolishAttribute -> Bool
+ Rattletrap.Type.DemolishAttribute: [demolishAttributeAttackerVelocity] :: DemolishAttribute -> Vector
+ Rattletrap.Type.DemolishAttribute: [demolishAttributeVictimActorId] :: DemolishAttribute -> Word32le
+ Rattletrap.Type.DemolishAttribute: [demolishAttributeVictimFlag] :: DemolishAttribute -> Bool
+ Rattletrap.Type.DemolishAttribute: [demolishAttributeVictimVelocity] :: DemolishAttribute -> Vector
+ Rattletrap.Type.DemolishAttribute: data DemolishAttribute
+ Rattletrap.Type.DemolishAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.DemolishAttribute.DemolishAttribute
+ Rattletrap.Type.DemolishAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.DemolishAttribute.DemolishAttribute
+ Rattletrap.Type.DemolishAttribute: instance GHC.Classes.Eq Rattletrap.Type.DemolishAttribute.DemolishAttribute
+ Rattletrap.Type.DemolishAttribute: instance GHC.Classes.Ord Rattletrap.Type.DemolishAttribute.DemolishAttribute
+ Rattletrap.Type.DemolishAttribute: instance GHC.Show.Show Rattletrap.Type.DemolishAttribute.DemolishAttribute
+ Rattletrap.Type.DestroyedReplication: DestroyedReplication :: DestroyedReplication
+ Rattletrap.Type.DestroyedReplication: data DestroyedReplication
+ Rattletrap.Type.DestroyedReplication: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.DestroyedReplication.DestroyedReplication
+ Rattletrap.Type.DestroyedReplication: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.DestroyedReplication.DestroyedReplication
+ Rattletrap.Type.DestroyedReplication: instance GHC.Classes.Eq Rattletrap.Type.DestroyedReplication.DestroyedReplication
+ Rattletrap.Type.DestroyedReplication: instance GHC.Classes.Ord Rattletrap.Type.DestroyedReplication.DestroyedReplication
+ Rattletrap.Type.DestroyedReplication: instance GHC.Show.Show Rattletrap.Type.DestroyedReplication.DestroyedReplication
+ Rattletrap.Type.Dictionary: DictionaryElement :: Str -> a -> (Dictionary a) -> Dictionary a
+ Rattletrap.Type.Dictionary: DictionaryEnd :: Str -> Dictionary a
+ Rattletrap.Type.Dictionary: data Dictionary a
+ Rattletrap.Type.Dictionary: dictionaryLookup :: Str -> Dictionary a -> Maybe a
+ Rattletrap.Type.Dictionary: instance Data.Aeson.Types.FromJSON.FromJSON a => Data.Aeson.Types.FromJSON.FromJSON (Rattletrap.Type.Dictionary.Dictionary a)
+ Rattletrap.Type.Dictionary: instance Data.Aeson.Types.ToJSON.ToJSON a => Data.Aeson.Types.ToJSON.ToJSON (Rattletrap.Type.Dictionary.Dictionary a)
+ Rattletrap.Type.Dictionary: instance GHC.Classes.Eq a => GHC.Classes.Eq (Rattletrap.Type.Dictionary.Dictionary a)
+ Rattletrap.Type.Dictionary: instance GHC.Classes.Ord a => GHC.Classes.Ord (Rattletrap.Type.Dictionary.Dictionary a)
+ Rattletrap.Type.Dictionary: instance GHC.Show.Show a => GHC.Show.Show (Rattletrap.Type.Dictionary.Dictionary a)
+ Rattletrap.Type.EnumAttribute: EnumAttribute :: Word16 -> EnumAttribute
+ Rattletrap.Type.EnumAttribute: [enumAttributeValue] :: EnumAttribute -> Word16
+ Rattletrap.Type.EnumAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.EnumAttribute.EnumAttribute
+ Rattletrap.Type.EnumAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.EnumAttribute.EnumAttribute
+ Rattletrap.Type.EnumAttribute: instance GHC.Classes.Eq Rattletrap.Type.EnumAttribute.EnumAttribute
+ Rattletrap.Type.EnumAttribute: instance GHC.Classes.Ord Rattletrap.Type.EnumAttribute.EnumAttribute
+ Rattletrap.Type.EnumAttribute: instance GHC.Show.Show Rattletrap.Type.EnumAttribute.EnumAttribute
+ Rattletrap.Type.EnumAttribute: newtype EnumAttribute
+ Rattletrap.Type.ExplosionAttribute: ExplosionAttribute :: Bool -> Int32le -> Vector -> ExplosionAttribute
+ Rattletrap.Type.ExplosionAttribute: [explosionAttributeActorId] :: ExplosionAttribute -> Int32le
+ Rattletrap.Type.ExplosionAttribute: [explosionAttributeFlag] :: ExplosionAttribute -> Bool
+ Rattletrap.Type.ExplosionAttribute: [explosionAttributeLocation] :: ExplosionAttribute -> Vector
+ Rattletrap.Type.ExplosionAttribute: data ExplosionAttribute
+ Rattletrap.Type.ExplosionAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.ExplosionAttribute.ExplosionAttribute
+ Rattletrap.Type.ExplosionAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.ExplosionAttribute.ExplosionAttribute
+ Rattletrap.Type.ExplosionAttribute: instance GHC.Classes.Eq Rattletrap.Type.ExplosionAttribute.ExplosionAttribute
+ Rattletrap.Type.ExplosionAttribute: instance GHC.Classes.Ord Rattletrap.Type.ExplosionAttribute.ExplosionAttribute
+ Rattletrap.Type.ExplosionAttribute: instance GHC.Show.Show Rattletrap.Type.ExplosionAttribute.ExplosionAttribute
+ Rattletrap.Type.ExtendedExplosionAttribute: ExtendedExplosionAttribute :: ExplosionAttribute -> FlaggedIntAttribute -> ExtendedExplosionAttribute
+ Rattletrap.Type.ExtendedExplosionAttribute: [extendedExplosionAttributeExplosion] :: ExtendedExplosionAttribute -> ExplosionAttribute
+ Rattletrap.Type.ExtendedExplosionAttribute: [extendedExplosionAttributeUnknown] :: ExtendedExplosionAttribute -> FlaggedIntAttribute
+ Rattletrap.Type.ExtendedExplosionAttribute: data ExtendedExplosionAttribute
+ Rattletrap.Type.ExtendedExplosionAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.ExtendedExplosionAttribute.ExtendedExplosionAttribute
+ Rattletrap.Type.ExtendedExplosionAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.ExtendedExplosionAttribute.ExtendedExplosionAttribute
+ Rattletrap.Type.ExtendedExplosionAttribute: instance GHC.Classes.Eq Rattletrap.Type.ExtendedExplosionAttribute.ExtendedExplosionAttribute
+ Rattletrap.Type.ExtendedExplosionAttribute: instance GHC.Classes.Ord Rattletrap.Type.ExtendedExplosionAttribute.ExtendedExplosionAttribute
+ Rattletrap.Type.ExtendedExplosionAttribute: instance GHC.Show.Show Rattletrap.Type.ExtendedExplosionAttribute.ExtendedExplosionAttribute
+ Rattletrap.Type.FlaggedIntAttribute: FlaggedIntAttribute :: Bool -> Int32le -> FlaggedIntAttribute
+ Rattletrap.Type.FlaggedIntAttribute: [flaggedIntAttributeFlag] :: FlaggedIntAttribute -> Bool
+ Rattletrap.Type.FlaggedIntAttribute: [flaggedIntAttributeInt] :: FlaggedIntAttribute -> Int32le
+ Rattletrap.Type.FlaggedIntAttribute: data FlaggedIntAttribute
+ Rattletrap.Type.FlaggedIntAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.FlaggedIntAttribute.FlaggedIntAttribute
+ Rattletrap.Type.FlaggedIntAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.FlaggedIntAttribute.FlaggedIntAttribute
+ Rattletrap.Type.FlaggedIntAttribute: instance GHC.Classes.Eq Rattletrap.Type.FlaggedIntAttribute.FlaggedIntAttribute
+ Rattletrap.Type.FlaggedIntAttribute: instance GHC.Classes.Ord Rattletrap.Type.FlaggedIntAttribute.FlaggedIntAttribute
+ Rattletrap.Type.FlaggedIntAttribute: instance GHC.Show.Show Rattletrap.Type.FlaggedIntAttribute.FlaggedIntAttribute
+ Rattletrap.Type.Float32le: Float32le :: Float -> Float32le
+ Rattletrap.Type.Float32le: [float32leValue] :: Float32le -> Float
+ Rattletrap.Type.Float32le: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.Float32le.Float32le
+ Rattletrap.Type.Float32le: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.Float32le.Float32le
+ Rattletrap.Type.Float32le: instance GHC.Classes.Eq Rattletrap.Type.Float32le.Float32le
+ Rattletrap.Type.Float32le: instance GHC.Classes.Ord Rattletrap.Type.Float32le.Float32le
+ Rattletrap.Type.Float32le: instance GHC.Show.Show Rattletrap.Type.Float32le.Float32le
+ Rattletrap.Type.Float32le: newtype Float32le
+ Rattletrap.Type.FloatAttribute: FloatAttribute :: Float32le -> FloatAttribute
+ Rattletrap.Type.FloatAttribute: [floatAttributeValue] :: FloatAttribute -> Float32le
+ Rattletrap.Type.FloatAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.FloatAttribute.FloatAttribute
+ Rattletrap.Type.FloatAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.FloatAttribute.FloatAttribute
+ Rattletrap.Type.FloatAttribute: instance GHC.Classes.Eq Rattletrap.Type.FloatAttribute.FloatAttribute
+ Rattletrap.Type.FloatAttribute: instance GHC.Classes.Ord Rattletrap.Type.FloatAttribute.FloatAttribute
+ Rattletrap.Type.FloatAttribute: instance GHC.Show.Show Rattletrap.Type.FloatAttribute.FloatAttribute
+ Rattletrap.Type.FloatAttribute: newtype FloatAttribute
+ Rattletrap.Type.Frame: Frame :: Float32le -> Float32le -> [Replication] -> Frame
+ Rattletrap.Type.Frame: [frameDelta] :: Frame -> Float32le
+ Rattletrap.Type.Frame: [frameReplications] :: Frame -> [Replication]
+ Rattletrap.Type.Frame: [frameTime] :: Frame -> Float32le
+ Rattletrap.Type.Frame: data Frame
+ Rattletrap.Type.Frame: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.Frame.Frame
+ Rattletrap.Type.Frame: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.Frame.Frame
+ Rattletrap.Type.Frame: instance GHC.Classes.Eq Rattletrap.Type.Frame.Frame
+ Rattletrap.Type.Frame: instance GHC.Classes.Ord Rattletrap.Type.Frame.Frame
+ Rattletrap.Type.Frame: instance GHC.Show.Show Rattletrap.Type.Frame.Frame
+ Rattletrap.Type.GameModeAttribute: GameModeAttribute :: Int -> Word8 -> GameModeAttribute
+ Rattletrap.Type.GameModeAttribute: [gameModeAttributeNumBits] :: GameModeAttribute -> Int
+ Rattletrap.Type.GameModeAttribute: [gameModeAttributeWord] :: GameModeAttribute -> Word8
+ Rattletrap.Type.GameModeAttribute: data GameModeAttribute
+ Rattletrap.Type.GameModeAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.GameModeAttribute.GameModeAttribute
+ Rattletrap.Type.GameModeAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.GameModeAttribute.GameModeAttribute
+ Rattletrap.Type.GameModeAttribute: instance GHC.Classes.Eq Rattletrap.Type.GameModeAttribute.GameModeAttribute
+ Rattletrap.Type.GameModeAttribute: instance GHC.Classes.Ord Rattletrap.Type.GameModeAttribute.GameModeAttribute
+ Rattletrap.Type.GameModeAttribute: instance GHC.Show.Show Rattletrap.Type.GameModeAttribute.GameModeAttribute
+ Rattletrap.Type.Header: Header :: Word32le -> Word32le -> Maybe Word32le -> Str -> Dictionary Property -> Header
+ Rattletrap.Type.Header: [headerEngineVersion] :: Header -> Word32le
+ Rattletrap.Type.Header: [headerLabel] :: Header -> Str
+ Rattletrap.Type.Header: [headerLicenseeVersion] :: Header -> Word32le
+ Rattletrap.Type.Header: [headerPatchVersion] :: Header -> Maybe Word32le
+ Rattletrap.Type.Header: [headerProperties] :: Header -> Dictionary Property
+ Rattletrap.Type.Header: data Header
+ Rattletrap.Type.Header: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.Header.Header
+ Rattletrap.Type.Header: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.Header.Header
+ Rattletrap.Type.Header: instance GHC.Classes.Eq Rattletrap.Type.Header.Header
+ Rattletrap.Type.Header: instance GHC.Classes.Ord Rattletrap.Type.Header.Header
+ Rattletrap.Type.Header: instance GHC.Show.Show Rattletrap.Type.Header.Header
+ Rattletrap.Type.Initialization: Initialization :: Maybe Vector -> Maybe Int8Vector -> Initialization
+ Rattletrap.Type.Initialization: [initializationLocation] :: Initialization -> Maybe Vector
+ Rattletrap.Type.Initialization: [initializationRotation] :: Initialization -> Maybe Int8Vector
+ Rattletrap.Type.Initialization: data Initialization
+ Rattletrap.Type.Initialization: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.Initialization.Initialization
+ Rattletrap.Type.Initialization: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.Initialization.Initialization
+ Rattletrap.Type.Initialization: instance GHC.Classes.Eq Rattletrap.Type.Initialization.Initialization
+ Rattletrap.Type.Initialization: instance GHC.Classes.Ord Rattletrap.Type.Initialization.Initialization
+ Rattletrap.Type.Initialization: instance GHC.Show.Show Rattletrap.Type.Initialization.Initialization
+ Rattletrap.Type.Int32le: Int32le :: Int32 -> Int32le
+ Rattletrap.Type.Int32le: [int32leValue] :: Int32le -> Int32
+ Rattletrap.Type.Int32le: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.Int32le.Int32le
+ Rattletrap.Type.Int32le: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.Int32le.Int32le
+ Rattletrap.Type.Int32le: instance GHC.Classes.Eq Rattletrap.Type.Int32le.Int32le
+ Rattletrap.Type.Int32le: instance GHC.Classes.Ord Rattletrap.Type.Int32le.Int32le
+ Rattletrap.Type.Int32le: instance GHC.Show.Show Rattletrap.Type.Int32le.Int32le
+ Rattletrap.Type.Int32le: newtype Int32le
+ Rattletrap.Type.Int8Vector: Int8Vector :: Maybe Int8le -> Maybe Int8le -> Maybe Int8le -> Int8Vector
+ Rattletrap.Type.Int8Vector: [int8VectorX] :: Int8Vector -> Maybe Int8le
+ Rattletrap.Type.Int8Vector: [int8VectorY] :: Int8Vector -> Maybe Int8le
+ Rattletrap.Type.Int8Vector: [int8VectorZ] :: Int8Vector -> Maybe Int8le
+ Rattletrap.Type.Int8Vector: data Int8Vector
+ Rattletrap.Type.Int8Vector: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.Int8Vector.Int8Vector
+ Rattletrap.Type.Int8Vector: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.Int8Vector.Int8Vector
+ Rattletrap.Type.Int8Vector: instance GHC.Classes.Eq Rattletrap.Type.Int8Vector.Int8Vector
+ Rattletrap.Type.Int8Vector: instance GHC.Classes.Ord Rattletrap.Type.Int8Vector.Int8Vector
+ Rattletrap.Type.Int8Vector: instance GHC.Show.Show Rattletrap.Type.Int8Vector.Int8Vector
+ Rattletrap.Type.Int8le: Int8le :: Int8 -> Int8le
+ Rattletrap.Type.Int8le: [int8leValue] :: Int8le -> Int8
+ Rattletrap.Type.Int8le: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.Int8le.Int8le
+ Rattletrap.Type.Int8le: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.Int8le.Int8le
+ Rattletrap.Type.Int8le: instance GHC.Classes.Eq Rattletrap.Type.Int8le.Int8le
+ Rattletrap.Type.Int8le: instance GHC.Classes.Ord Rattletrap.Type.Int8le.Int8le
+ Rattletrap.Type.Int8le: instance GHC.Show.Show Rattletrap.Type.Int8le.Int8le
+ Rattletrap.Type.Int8le: newtype Int8le
+ Rattletrap.Type.IntAttribute: IntAttribute :: Int32le -> IntAttribute
+ Rattletrap.Type.IntAttribute: [intAttributeValue] :: IntAttribute -> Int32le
+ Rattletrap.Type.IntAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.IntAttribute.IntAttribute
+ Rattletrap.Type.IntAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.IntAttribute.IntAttribute
+ Rattletrap.Type.IntAttribute: instance GHC.Classes.Eq Rattletrap.Type.IntAttribute.IntAttribute
+ Rattletrap.Type.IntAttribute: instance GHC.Classes.Ord Rattletrap.Type.IntAttribute.IntAttribute
+ Rattletrap.Type.IntAttribute: instance GHC.Show.Show Rattletrap.Type.IntAttribute.IntAttribute
+ Rattletrap.Type.IntAttribute: newtype IntAttribute
+ Rattletrap.Type.KeyFrame: KeyFrame :: Float32le -> Word32le -> Word32le -> KeyFrame
+ Rattletrap.Type.KeyFrame: [keyFrameFrame] :: KeyFrame -> Word32le
+ Rattletrap.Type.KeyFrame: [keyFramePosition] :: KeyFrame -> Word32le
+ Rattletrap.Type.KeyFrame: [keyFrameTime] :: KeyFrame -> Float32le
+ Rattletrap.Type.KeyFrame: data KeyFrame
+ Rattletrap.Type.KeyFrame: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.KeyFrame.KeyFrame
+ Rattletrap.Type.KeyFrame: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.KeyFrame.KeyFrame
+ Rattletrap.Type.KeyFrame: instance GHC.Classes.Eq Rattletrap.Type.KeyFrame.KeyFrame
+ Rattletrap.Type.KeyFrame: instance GHC.Classes.Ord Rattletrap.Type.KeyFrame.KeyFrame
+ Rattletrap.Type.KeyFrame: instance GHC.Show.Show Rattletrap.Type.KeyFrame.KeyFrame
+ Rattletrap.Type.List: List :: [a] -> List a
+ Rattletrap.Type.List: [listValue] :: List a -> [a]
+ Rattletrap.Type.List: instance Data.Aeson.Types.FromJSON.FromJSON a => Data.Aeson.Types.FromJSON.FromJSON (Rattletrap.Type.List.List a)
+ Rattletrap.Type.List: instance Data.Aeson.Types.ToJSON.ToJSON a => Data.Aeson.Types.ToJSON.ToJSON (Rattletrap.Type.List.List a)
+ Rattletrap.Type.List: instance GHC.Classes.Eq a => GHC.Classes.Eq (Rattletrap.Type.List.List a)
+ Rattletrap.Type.List: instance GHC.Classes.Ord a => GHC.Classes.Ord (Rattletrap.Type.List.List a)
+ Rattletrap.Type.List: instance GHC.Show.Show a => GHC.Show.Show (Rattletrap.Type.List.List a)
+ Rattletrap.Type.List: newtype List a
+ Rattletrap.Type.LoadoutAttribute: LoadoutAttribute :: Word8le -> Word32le -> Word32le -> Word32le -> Word32le -> Word32le -> Word32le -> Word32le -> Maybe Word32le -> Maybe Word32le -> Maybe Word32le -> Maybe Word32le -> Maybe Word32le -> LoadoutAttribute
+ Rattletrap.Type.LoadoutAttribute: [loadoutAttributeAntenna] :: LoadoutAttribute -> Word32le
+ Rattletrap.Type.LoadoutAttribute: [loadoutAttributeBanner] :: LoadoutAttribute -> Maybe Word32le
+ Rattletrap.Type.LoadoutAttribute: [loadoutAttributeBody] :: LoadoutAttribute -> Word32le
+ Rattletrap.Type.LoadoutAttribute: [loadoutAttributeDecal] :: LoadoutAttribute -> Word32le
+ Rattletrap.Type.LoadoutAttribute: [loadoutAttributeEngineAudio] :: LoadoutAttribute -> Maybe Word32le
+ Rattletrap.Type.LoadoutAttribute: [loadoutAttributeGoalExplosion] :: LoadoutAttribute -> Maybe Word32le
+ Rattletrap.Type.LoadoutAttribute: [loadoutAttributeRocketTrail] :: LoadoutAttribute -> Word32le
+ Rattletrap.Type.LoadoutAttribute: [loadoutAttributeTopper] :: LoadoutAttribute -> Word32le
+ Rattletrap.Type.LoadoutAttribute: [loadoutAttributeTrail] :: LoadoutAttribute -> Maybe Word32le
+ Rattletrap.Type.LoadoutAttribute: [loadoutAttributeUnknown1] :: LoadoutAttribute -> Word32le
+ Rattletrap.Type.LoadoutAttribute: [loadoutAttributeUnknown2] :: LoadoutAttribute -> Maybe Word32le
+ Rattletrap.Type.LoadoutAttribute: [loadoutAttributeVersion] :: LoadoutAttribute -> Word8le
+ Rattletrap.Type.LoadoutAttribute: [loadoutAttributeWheels] :: LoadoutAttribute -> Word32le
+ Rattletrap.Type.LoadoutAttribute: data LoadoutAttribute
+ Rattletrap.Type.LoadoutAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.LoadoutAttribute.LoadoutAttribute
+ Rattletrap.Type.LoadoutAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.LoadoutAttribute.LoadoutAttribute
+ Rattletrap.Type.LoadoutAttribute: instance GHC.Classes.Eq Rattletrap.Type.LoadoutAttribute.LoadoutAttribute
+ Rattletrap.Type.LoadoutAttribute: instance GHC.Classes.Ord Rattletrap.Type.LoadoutAttribute.LoadoutAttribute
+ Rattletrap.Type.LoadoutAttribute: instance GHC.Show.Show Rattletrap.Type.LoadoutAttribute.LoadoutAttribute
+ Rattletrap.Type.LoadoutOnlineAttribute: LoadoutOnlineAttribute :: [[ProductAttribute]] -> LoadoutOnlineAttribute
+ Rattletrap.Type.LoadoutOnlineAttribute: [loadoutAttributeValue] :: LoadoutOnlineAttribute -> [[ProductAttribute]]
+ Rattletrap.Type.LoadoutOnlineAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.LoadoutOnlineAttribute.LoadoutOnlineAttribute
+ Rattletrap.Type.LoadoutOnlineAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.LoadoutOnlineAttribute.LoadoutOnlineAttribute
+ Rattletrap.Type.LoadoutOnlineAttribute: instance GHC.Classes.Eq Rattletrap.Type.LoadoutOnlineAttribute.LoadoutOnlineAttribute
+ Rattletrap.Type.LoadoutOnlineAttribute: instance GHC.Classes.Ord Rattletrap.Type.LoadoutOnlineAttribute.LoadoutOnlineAttribute
+ Rattletrap.Type.LoadoutOnlineAttribute: instance GHC.Show.Show Rattletrap.Type.LoadoutOnlineAttribute.LoadoutOnlineAttribute
+ Rattletrap.Type.LoadoutOnlineAttribute: newtype LoadoutOnlineAttribute
+ Rattletrap.Type.LoadoutsAttribute: LoadoutsAttribute :: LoadoutAttribute -> LoadoutAttribute -> LoadoutsAttribute
+ Rattletrap.Type.LoadoutsAttribute: [loadoutsAttributeBlue] :: LoadoutsAttribute -> LoadoutAttribute
+ Rattletrap.Type.LoadoutsAttribute: [loadoutsAttributeOrange] :: LoadoutsAttribute -> LoadoutAttribute
+ Rattletrap.Type.LoadoutsAttribute: data LoadoutsAttribute
+ Rattletrap.Type.LoadoutsAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.LoadoutsAttribute.LoadoutsAttribute
+ Rattletrap.Type.LoadoutsAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.LoadoutsAttribute.LoadoutsAttribute
+ Rattletrap.Type.LoadoutsAttribute: instance GHC.Classes.Eq Rattletrap.Type.LoadoutsAttribute.LoadoutsAttribute
+ Rattletrap.Type.LoadoutsAttribute: instance GHC.Classes.Ord Rattletrap.Type.LoadoutsAttribute.LoadoutsAttribute
+ Rattletrap.Type.LoadoutsAttribute: instance GHC.Show.Show Rattletrap.Type.LoadoutsAttribute.LoadoutsAttribute
+ Rattletrap.Type.LoadoutsOnlineAttribute: LoadoutsOnlineAttribute :: LoadoutOnlineAttribute -> LoadoutOnlineAttribute -> Bool -> Bool -> LoadoutsOnlineAttribute
+ Rattletrap.Type.LoadoutsOnlineAttribute: [loadoutsOnlineAttributeBlue] :: LoadoutsOnlineAttribute -> LoadoutOnlineAttribute
+ Rattletrap.Type.LoadoutsOnlineAttribute: [loadoutsOnlineAttributeOrange] :: LoadoutsOnlineAttribute -> LoadoutOnlineAttribute
+ Rattletrap.Type.LoadoutsOnlineAttribute: [loadoutsOnlineAttributeUnknown1] :: LoadoutsOnlineAttribute -> Bool
+ Rattletrap.Type.LoadoutsOnlineAttribute: [loadoutsOnlineAttributeUnknown2] :: LoadoutsOnlineAttribute -> Bool
+ Rattletrap.Type.LoadoutsOnlineAttribute: data LoadoutsOnlineAttribute
+ Rattletrap.Type.LoadoutsOnlineAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.LoadoutsOnlineAttribute.LoadoutsOnlineAttribute
+ Rattletrap.Type.LoadoutsOnlineAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.LoadoutsOnlineAttribute.LoadoutsOnlineAttribute
+ Rattletrap.Type.LoadoutsOnlineAttribute: instance GHC.Classes.Eq Rattletrap.Type.LoadoutsOnlineAttribute.LoadoutsOnlineAttribute
+ Rattletrap.Type.LoadoutsOnlineAttribute: instance GHC.Classes.Ord Rattletrap.Type.LoadoutsOnlineAttribute.LoadoutsOnlineAttribute
+ Rattletrap.Type.LoadoutsOnlineAttribute: instance GHC.Show.Show Rattletrap.Type.LoadoutsOnlineAttribute.LoadoutsOnlineAttribute
+ Rattletrap.Type.LocationAttribute: LocationAttribute :: Vector -> LocationAttribute
+ Rattletrap.Type.LocationAttribute: [locationAttributeValue] :: LocationAttribute -> Vector
+ Rattletrap.Type.LocationAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.LocationAttribute.LocationAttribute
+ Rattletrap.Type.LocationAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.LocationAttribute.LocationAttribute
+ Rattletrap.Type.LocationAttribute: instance GHC.Classes.Eq Rattletrap.Type.LocationAttribute.LocationAttribute
+ Rattletrap.Type.LocationAttribute: instance GHC.Classes.Ord Rattletrap.Type.LocationAttribute.LocationAttribute
+ Rattletrap.Type.LocationAttribute: instance GHC.Show.Show Rattletrap.Type.LocationAttribute.LocationAttribute
+ Rattletrap.Type.LocationAttribute: newtype LocationAttribute
+ Rattletrap.Type.Mark: Mark :: Str -> Word32le -> Mark
+ Rattletrap.Type.Mark: [markFrame] :: Mark -> Word32le
+ Rattletrap.Type.Mark: [markValue] :: Mark -> Str
+ Rattletrap.Type.Mark: data Mark
+ Rattletrap.Type.Mark: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.Mark.Mark
+ Rattletrap.Type.Mark: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.Mark.Mark
+ Rattletrap.Type.Mark: instance GHC.Classes.Eq Rattletrap.Type.Mark.Mark
+ Rattletrap.Type.Mark: instance GHC.Classes.Ord Rattletrap.Type.Mark.Mark
+ Rattletrap.Type.Mark: instance GHC.Show.Show Rattletrap.Type.Mark.Mark
+ Rattletrap.Type.Message: Message :: Word32le -> Str -> Str -> Message
+ Rattletrap.Type.Message: [messageFrame] :: Message -> Word32le
+ Rattletrap.Type.Message: [messageName] :: Message -> Str
+ Rattletrap.Type.Message: [messageValue] :: Message -> Str
+ Rattletrap.Type.Message: data Message
+ Rattletrap.Type.Message: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.Message.Message
+ Rattletrap.Type.Message: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.Message.Message
+ Rattletrap.Type.Message: instance GHC.Classes.Eq Rattletrap.Type.Message.Message
+ Rattletrap.Type.Message: instance GHC.Classes.Ord Rattletrap.Type.Message.Message
+ Rattletrap.Type.Message: instance GHC.Show.Show Rattletrap.Type.Message.Message
+ Rattletrap.Type.MusicStingerAttribute: MusicStingerAttribute :: Bool -> Word32le -> Word8le -> MusicStingerAttribute
+ Rattletrap.Type.MusicStingerAttribute: [musicStingerAttributeCue] :: MusicStingerAttribute -> Word32le
+ Rattletrap.Type.MusicStingerAttribute: [musicStingerAttributeFlag] :: MusicStingerAttribute -> Bool
+ Rattletrap.Type.MusicStingerAttribute: [musicStingerAttributeTrigger] :: MusicStingerAttribute -> Word8le
+ Rattletrap.Type.MusicStingerAttribute: data MusicStingerAttribute
+ Rattletrap.Type.MusicStingerAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.MusicStingerAttribute.MusicStingerAttribute
+ Rattletrap.Type.MusicStingerAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.MusicStingerAttribute.MusicStingerAttribute
+ Rattletrap.Type.MusicStingerAttribute: instance GHC.Classes.Eq Rattletrap.Type.MusicStingerAttribute.MusicStingerAttribute
+ Rattletrap.Type.MusicStingerAttribute: instance GHC.Classes.Ord Rattletrap.Type.MusicStingerAttribute.MusicStingerAttribute
+ Rattletrap.Type.MusicStingerAttribute: instance GHC.Show.Show Rattletrap.Type.MusicStingerAttribute.MusicStingerAttribute
+ Rattletrap.Type.PartyLeaderAttribute: PartyLeaderAttribute :: Word8le -> Maybe (RemoteId, Word8le) -> PartyLeaderAttribute
+ Rattletrap.Type.PartyLeaderAttribute: [partyLeaderAttributeId] :: PartyLeaderAttribute -> Maybe (RemoteId, Word8le)
+ Rattletrap.Type.PartyLeaderAttribute: [partyLeaderAttributeSystemId] :: PartyLeaderAttribute -> Word8le
+ Rattletrap.Type.PartyLeaderAttribute: data PartyLeaderAttribute
+ Rattletrap.Type.PartyLeaderAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.PartyLeaderAttribute.PartyLeaderAttribute
+ Rattletrap.Type.PartyLeaderAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.PartyLeaderAttribute.PartyLeaderAttribute
+ Rattletrap.Type.PartyLeaderAttribute: instance GHC.Classes.Eq Rattletrap.Type.PartyLeaderAttribute.PartyLeaderAttribute
+ Rattletrap.Type.PartyLeaderAttribute: instance GHC.Classes.Ord Rattletrap.Type.PartyLeaderAttribute.PartyLeaderAttribute
+ Rattletrap.Type.PartyLeaderAttribute: instance GHC.Show.Show Rattletrap.Type.PartyLeaderAttribute.PartyLeaderAttribute
+ Rattletrap.Type.PickupAttribute: PickupAttribute :: Maybe Word32le -> Bool -> PickupAttribute
+ Rattletrap.Type.PickupAttribute: [pickupAttributeInstigatorId] :: PickupAttribute -> Maybe Word32le
+ Rattletrap.Type.PickupAttribute: [pickupAttributePickedUp] :: PickupAttribute -> Bool
+ Rattletrap.Type.PickupAttribute: data PickupAttribute
+ Rattletrap.Type.PickupAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.PickupAttribute.PickupAttribute
+ Rattletrap.Type.PickupAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.PickupAttribute.PickupAttribute
+ Rattletrap.Type.PickupAttribute: instance GHC.Classes.Eq Rattletrap.Type.PickupAttribute.PickupAttribute
+ Rattletrap.Type.PickupAttribute: instance GHC.Classes.Ord Rattletrap.Type.PickupAttribute.PickupAttribute
+ Rattletrap.Type.PickupAttribute: instance GHC.Show.Show Rattletrap.Type.PickupAttribute.PickupAttribute
+ Rattletrap.Type.PlayerHistoryKeyAttribute: PlayerHistoryKeyAttribute :: Bitstream -> PlayerHistoryKeyAttribute
+ Rattletrap.Type.PlayerHistoryKeyAttribute: [playerHistoryKeyAttributeUnknown] :: PlayerHistoryKeyAttribute -> Bitstream
+ Rattletrap.Type.PlayerHistoryKeyAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.PlayerHistoryKeyAttribute.PlayerHistoryKeyAttribute
+ Rattletrap.Type.PlayerHistoryKeyAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.PlayerHistoryKeyAttribute.PlayerHistoryKeyAttribute
+ Rattletrap.Type.PlayerHistoryKeyAttribute: instance GHC.Classes.Eq Rattletrap.Type.PlayerHistoryKeyAttribute.PlayerHistoryKeyAttribute
+ Rattletrap.Type.PlayerHistoryKeyAttribute: instance GHC.Classes.Ord Rattletrap.Type.PlayerHistoryKeyAttribute.PlayerHistoryKeyAttribute
+ Rattletrap.Type.PlayerHistoryKeyAttribute: instance GHC.Show.Show Rattletrap.Type.PlayerHistoryKeyAttribute.PlayerHistoryKeyAttribute
+ Rattletrap.Type.PlayerHistoryKeyAttribute: newtype PlayerHistoryKeyAttribute
+ Rattletrap.Type.PrivateMatchSettingsAttribute: PrivateMatchSettingsAttribute :: Str -> Word32le -> Word32le -> Str -> Str -> Bool -> PrivateMatchSettingsAttribute
+ Rattletrap.Type.PrivateMatchSettingsAttribute: [privateMatchSettingsAttributeFlag] :: PrivateMatchSettingsAttribute -> Bool
+ Rattletrap.Type.PrivateMatchSettingsAttribute: [privateMatchSettingsAttributeGameName] :: PrivateMatchSettingsAttribute -> Str
+ Rattletrap.Type.PrivateMatchSettingsAttribute: [privateMatchSettingsAttributeJoinableBy] :: PrivateMatchSettingsAttribute -> Word32le
+ Rattletrap.Type.PrivateMatchSettingsAttribute: [privateMatchSettingsAttributeMaxPlayers] :: PrivateMatchSettingsAttribute -> Word32le
+ Rattletrap.Type.PrivateMatchSettingsAttribute: [privateMatchSettingsAttributeMutators] :: PrivateMatchSettingsAttribute -> Str
+ Rattletrap.Type.PrivateMatchSettingsAttribute: [privateMatchSettingsAttributePassword] :: PrivateMatchSettingsAttribute -> Str
+ Rattletrap.Type.PrivateMatchSettingsAttribute: data PrivateMatchSettingsAttribute
+ Rattletrap.Type.PrivateMatchSettingsAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.PrivateMatchSettingsAttribute.PrivateMatchSettingsAttribute
+ Rattletrap.Type.PrivateMatchSettingsAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.PrivateMatchSettingsAttribute.PrivateMatchSettingsAttribute
+ Rattletrap.Type.PrivateMatchSettingsAttribute: instance GHC.Classes.Eq Rattletrap.Type.PrivateMatchSettingsAttribute.PrivateMatchSettingsAttribute
+ Rattletrap.Type.PrivateMatchSettingsAttribute: instance GHC.Classes.Ord Rattletrap.Type.PrivateMatchSettingsAttribute.PrivateMatchSettingsAttribute
+ Rattletrap.Type.PrivateMatchSettingsAttribute: instance GHC.Show.Show Rattletrap.Type.PrivateMatchSettingsAttribute.PrivateMatchSettingsAttribute
+ Rattletrap.Type.ProductAttribute: ProductAttribute :: Bool -> Word32le -> Maybe Str -> Maybe (Either CompressedWord Word32) -> ProductAttribute
+ Rattletrap.Type.ProductAttribute: [productAttributeObjectId] :: ProductAttribute -> Word32le
+ Rattletrap.Type.ProductAttribute: [productAttributeObjectName] :: ProductAttribute -> Maybe Str
+ Rattletrap.Type.ProductAttribute: [productAttributeUnknown] :: ProductAttribute -> Bool
+ Rattletrap.Type.ProductAttribute: [productAttributeValue] :: ProductAttribute -> Maybe (Either CompressedWord Word32)
+ Rattletrap.Type.ProductAttribute: data ProductAttribute
+ Rattletrap.Type.ProductAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.ProductAttribute.ProductAttribute
+ Rattletrap.Type.ProductAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.ProductAttribute.ProductAttribute
+ Rattletrap.Type.ProductAttribute: instance GHC.Classes.Eq Rattletrap.Type.ProductAttribute.ProductAttribute
+ Rattletrap.Type.ProductAttribute: instance GHC.Classes.Ord Rattletrap.Type.ProductAttribute.ProductAttribute
+ Rattletrap.Type.ProductAttribute: instance GHC.Show.Show Rattletrap.Type.ProductAttribute.ProductAttribute
+ Rattletrap.Type.Property: Property :: Str -> Word64le -> PropertyValue Property -> Property
+ Rattletrap.Type.Property: [propertyKind] :: Property -> Str
+ Rattletrap.Type.Property: [propertySize] :: Property -> Word64le
+ Rattletrap.Type.Property: [propertyValue] :: Property -> PropertyValue Property
+ Rattletrap.Type.Property: data Property
+ Rattletrap.Type.Property: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.Property.Property
+ Rattletrap.Type.Property: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.Property.Property
+ Rattletrap.Type.Property: instance GHC.Classes.Eq Rattletrap.Type.Property.Property
+ Rattletrap.Type.Property: instance GHC.Classes.Ord Rattletrap.Type.Property.Property
+ Rattletrap.Type.Property: instance GHC.Show.Show Rattletrap.Type.Property.Property
+ Rattletrap.Type.PropertyValue: PropertyValueArray :: (List (Dictionary a)) -> PropertyValue a
+ Rattletrap.Type.PropertyValue: PropertyValueBool :: Word8le -> PropertyValue a
+ Rattletrap.Type.PropertyValue: PropertyValueByte :: Str -> (Maybe Str) -> PropertyValue a
+ Rattletrap.Type.PropertyValue: PropertyValueFloat :: Float32le -> PropertyValue a
+ Rattletrap.Type.PropertyValue: PropertyValueInt :: Int32le -> PropertyValue a
+ Rattletrap.Type.PropertyValue: PropertyValueName :: Str -> PropertyValue a
+ Rattletrap.Type.PropertyValue: PropertyValueQWord :: Word64le -> PropertyValue a
+ Rattletrap.Type.PropertyValue: PropertyValueStr :: Str -> PropertyValue a
+ Rattletrap.Type.PropertyValue: data PropertyValue a
+ Rattletrap.Type.PropertyValue: instance Data.Aeson.Types.FromJSON.FromJSON a => Data.Aeson.Types.FromJSON.FromJSON (Rattletrap.Type.PropertyValue.PropertyValue a)
+ Rattletrap.Type.PropertyValue: instance Data.Aeson.Types.ToJSON.ToJSON a => Data.Aeson.Types.ToJSON.ToJSON (Rattletrap.Type.PropertyValue.PropertyValue a)
+ Rattletrap.Type.PropertyValue: instance GHC.Classes.Eq a => GHC.Classes.Eq (Rattletrap.Type.PropertyValue.PropertyValue a)
+ Rattletrap.Type.PropertyValue: instance GHC.Classes.Ord a => GHC.Classes.Ord (Rattletrap.Type.PropertyValue.PropertyValue a)
+ Rattletrap.Type.PropertyValue: instance GHC.Show.Show a => GHC.Show.Show (Rattletrap.Type.PropertyValue.PropertyValue a)
+ Rattletrap.Type.QWordAttribute: QWordAttribute :: Word64le -> QWordAttribute
+ Rattletrap.Type.QWordAttribute: [qWordAttributeValue] :: QWordAttribute -> Word64le
+ Rattletrap.Type.QWordAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.QWordAttribute.QWordAttribute
+ Rattletrap.Type.QWordAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.QWordAttribute.QWordAttribute
+ Rattletrap.Type.QWordAttribute: instance GHC.Classes.Eq Rattletrap.Type.QWordAttribute.QWordAttribute
+ Rattletrap.Type.QWordAttribute: instance GHC.Classes.Ord Rattletrap.Type.QWordAttribute.QWordAttribute
+ Rattletrap.Type.QWordAttribute: instance GHC.Show.Show Rattletrap.Type.QWordAttribute.QWordAttribute
+ Rattletrap.Type.QWordAttribute: newtype QWordAttribute
+ Rattletrap.Type.RemoteId: RemoteIdPlayStation :: Text -> [Word8] -> RemoteId
+ Rattletrap.Type.RemoteId: RemoteIdSplitscreen :: Word32 -> RemoteId
+ Rattletrap.Type.RemoteId: RemoteIdSteam :: Word64le -> RemoteId
+ Rattletrap.Type.RemoteId: RemoteIdSwitch :: Bitstream -> RemoteId
+ Rattletrap.Type.RemoteId: RemoteIdXbox :: Word64le -> RemoteId
+ Rattletrap.Type.RemoteId: data RemoteId
+ Rattletrap.Type.RemoteId: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.RemoteId.RemoteId
+ Rattletrap.Type.RemoteId: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.RemoteId.RemoteId
+ Rattletrap.Type.RemoteId: instance GHC.Classes.Eq Rattletrap.Type.RemoteId.RemoteId
+ Rattletrap.Type.RemoteId: instance GHC.Classes.Ord Rattletrap.Type.RemoteId.RemoteId
+ Rattletrap.Type.RemoteId: instance GHC.Show.Show Rattletrap.Type.RemoteId.RemoteId
+ Rattletrap.Type.Replay: Replay :: Section Header -> Section Content -> Replay
+ Rattletrap.Type.Replay: [replayContent] :: Replay -> Section Content
+ Rattletrap.Type.Replay: [replayHeader] :: Replay -> Section Header
+ Rattletrap.Type.Replay: data Replay
+ Rattletrap.Type.Replay: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.Replay.Replay
+ Rattletrap.Type.Replay: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.Replay.Replay
+ Rattletrap.Type.Replay: instance GHC.Classes.Eq Rattletrap.Type.Replay.Replay
+ Rattletrap.Type.Replay: instance GHC.Classes.Ord Rattletrap.Type.Replay.Replay
+ Rattletrap.Type.Replay: instance GHC.Show.Show Rattletrap.Type.Replay.Replay
+ Rattletrap.Type.Replication: Replication :: CompressedWord -> ReplicationValue -> Replication
+ Rattletrap.Type.Replication: [replicationActorId] :: Replication -> CompressedWord
+ Rattletrap.Type.Replication: [replicationValue] :: Replication -> ReplicationValue
+ Rattletrap.Type.Replication: data Replication
+ Rattletrap.Type.Replication: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.Replication.Replication
+ Rattletrap.Type.Replication: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.Replication.Replication
+ Rattletrap.Type.Replication: instance GHC.Classes.Eq Rattletrap.Type.Replication.Replication
+ Rattletrap.Type.Replication: instance GHC.Classes.Ord Rattletrap.Type.Replication.Replication
+ Rattletrap.Type.Replication: instance GHC.Show.Show Rattletrap.Type.Replication.Replication
+ Rattletrap.Type.ReplicationValue: ReplicationValueDestroyed :: DestroyedReplication -> ReplicationValue
+ Rattletrap.Type.ReplicationValue: ReplicationValueSpawned :: SpawnedReplication -> ReplicationValue
+ Rattletrap.Type.ReplicationValue: ReplicationValueUpdated :: UpdatedReplication -> ReplicationValue
+ Rattletrap.Type.ReplicationValue: data ReplicationValue
+ Rattletrap.Type.ReplicationValue: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.ReplicationValue.ReplicationValue
+ Rattletrap.Type.ReplicationValue: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.ReplicationValue.ReplicationValue
+ Rattletrap.Type.ReplicationValue: instance GHC.Classes.Eq Rattletrap.Type.ReplicationValue.ReplicationValue
+ Rattletrap.Type.ReplicationValue: instance GHC.Classes.Ord Rattletrap.Type.ReplicationValue.ReplicationValue
+ Rattletrap.Type.ReplicationValue: instance GHC.Show.Show Rattletrap.Type.ReplicationValue.ReplicationValue
+ Rattletrap.Type.ReservationAttribute: ReservationAttribute :: CompressedWord -> UniqueIdAttribute -> Maybe Str -> Bool -> Bool -> Maybe Word8 -> ReservationAttribute
+ Rattletrap.Type.ReservationAttribute: [reservationAttributeName] :: ReservationAttribute -> Maybe Str
+ Rattletrap.Type.ReservationAttribute: [reservationAttributeNumber] :: ReservationAttribute -> CompressedWord
+ Rattletrap.Type.ReservationAttribute: [reservationAttributeUniqueId] :: ReservationAttribute -> UniqueIdAttribute
+ Rattletrap.Type.ReservationAttribute: [reservationAttributeUnknown1] :: ReservationAttribute -> Bool
+ Rattletrap.Type.ReservationAttribute: [reservationAttributeUnknown2] :: ReservationAttribute -> Bool
+ Rattletrap.Type.ReservationAttribute: [reservationAttributeUnknown3] :: ReservationAttribute -> Maybe Word8
+ Rattletrap.Type.ReservationAttribute: data ReservationAttribute
+ Rattletrap.Type.ReservationAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.ReservationAttribute.ReservationAttribute
+ Rattletrap.Type.ReservationAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.ReservationAttribute.ReservationAttribute
+ Rattletrap.Type.ReservationAttribute: instance GHC.Classes.Eq Rattletrap.Type.ReservationAttribute.ReservationAttribute
+ Rattletrap.Type.ReservationAttribute: instance GHC.Classes.Ord Rattletrap.Type.ReservationAttribute.ReservationAttribute
+ Rattletrap.Type.ReservationAttribute: instance GHC.Show.Show Rattletrap.Type.ReservationAttribute.ReservationAttribute
+ Rattletrap.Type.RigidBodyStateAttribute: RigidBodyStateAttribute :: Bool -> Vector -> CompressedWordVector -> Maybe Vector -> Maybe Vector -> RigidBodyStateAttribute
+ Rattletrap.Type.RigidBodyStateAttribute: [rigidBodyStateAttributeAngularVelocity] :: RigidBodyStateAttribute -> Maybe Vector
+ Rattletrap.Type.RigidBodyStateAttribute: [rigidBodyStateAttributeLinearVelocity] :: RigidBodyStateAttribute -> Maybe Vector
+ Rattletrap.Type.RigidBodyStateAttribute: [rigidBodyStateAttributeLocation] :: RigidBodyStateAttribute -> Vector
+ Rattletrap.Type.RigidBodyStateAttribute: [rigidBodyStateAttributeRotation] :: RigidBodyStateAttribute -> CompressedWordVector
+ Rattletrap.Type.RigidBodyStateAttribute: [rigidBodyStateAttributeSleeping] :: RigidBodyStateAttribute -> Bool
+ Rattletrap.Type.RigidBodyStateAttribute: data RigidBodyStateAttribute
+ Rattletrap.Type.RigidBodyStateAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.RigidBodyStateAttribute.RigidBodyStateAttribute
+ Rattletrap.Type.RigidBodyStateAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.RigidBodyStateAttribute.RigidBodyStateAttribute
+ Rattletrap.Type.RigidBodyStateAttribute: instance GHC.Classes.Eq Rattletrap.Type.RigidBodyStateAttribute.RigidBodyStateAttribute
+ Rattletrap.Type.RigidBodyStateAttribute: instance GHC.Classes.Ord Rattletrap.Type.RigidBodyStateAttribute.RigidBodyStateAttribute
+ Rattletrap.Type.RigidBodyStateAttribute: instance GHC.Show.Show Rattletrap.Type.RigidBodyStateAttribute.RigidBodyStateAttribute
+ Rattletrap.Type.Section: Section :: Word32le -> Word32le -> a -> Section a
+ Rattletrap.Type.Section: [sectionBody] :: Section a -> a
+ Rattletrap.Type.Section: [sectionCrc] :: Section a -> Word32le
+ Rattletrap.Type.Section: [sectionSize] :: Section a -> Word32le
+ Rattletrap.Type.Section: data Section a
+ Rattletrap.Type.Section: instance Data.Aeson.Types.FromJSON.FromJSON a => Data.Aeson.Types.FromJSON.FromJSON (Rattletrap.Type.Section.Section a)
+ Rattletrap.Type.Section: instance Data.Aeson.Types.ToJSON.ToJSON a => Data.Aeson.Types.ToJSON.ToJSON (Rattletrap.Type.Section.Section a)
+ Rattletrap.Type.Section: instance GHC.Classes.Eq a => GHC.Classes.Eq (Rattletrap.Type.Section.Section a)
+ Rattletrap.Type.Section: instance GHC.Classes.Ord a => GHC.Classes.Ord (Rattletrap.Type.Section.Section a)
+ Rattletrap.Type.Section: instance GHC.Show.Show a => GHC.Show.Show (Rattletrap.Type.Section.Section a)
+ Rattletrap.Type.SpawnedReplication: SpawnedReplication :: Bool -> Maybe Word32le -> Maybe Str -> Word32le -> Str -> Str -> Initialization -> SpawnedReplication
+ Rattletrap.Type.SpawnedReplication: [spawnedReplicationClassName] :: SpawnedReplication -> Str
+ Rattletrap.Type.SpawnedReplication: [spawnedReplicationFlag] :: SpawnedReplication -> Bool
+ Rattletrap.Type.SpawnedReplication: [spawnedReplicationInitialization] :: SpawnedReplication -> Initialization
+ Rattletrap.Type.SpawnedReplication: [spawnedReplicationNameIndex] :: SpawnedReplication -> Maybe Word32le
+ Rattletrap.Type.SpawnedReplication: [spawnedReplicationName] :: SpawnedReplication -> Maybe Str
+ Rattletrap.Type.SpawnedReplication: [spawnedReplicationObjectId] :: SpawnedReplication -> Word32le
+ Rattletrap.Type.SpawnedReplication: [spawnedReplicationObjectName] :: SpawnedReplication -> Str
+ Rattletrap.Type.SpawnedReplication: data SpawnedReplication
+ Rattletrap.Type.SpawnedReplication: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.SpawnedReplication.SpawnedReplication
+ Rattletrap.Type.SpawnedReplication: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.SpawnedReplication.SpawnedReplication
+ Rattletrap.Type.SpawnedReplication: instance GHC.Classes.Eq Rattletrap.Type.SpawnedReplication.SpawnedReplication
+ Rattletrap.Type.SpawnedReplication: instance GHC.Classes.Ord Rattletrap.Type.SpawnedReplication.SpawnedReplication
+ Rattletrap.Type.SpawnedReplication: instance GHC.Show.Show Rattletrap.Type.SpawnedReplication.SpawnedReplication
+ Rattletrap.Type.Str: Str :: Text -> Str
+ Rattletrap.Type.Str: [strValue] :: Str -> Text
+ Rattletrap.Type.Str: fromStr :: Str -> String
+ Rattletrap.Type.Str: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.Str.Str
+ Rattletrap.Type.Str: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.Str.Str
+ Rattletrap.Type.Str: instance GHC.Classes.Eq Rattletrap.Type.Str.Str
+ Rattletrap.Type.Str: instance GHC.Classes.Ord Rattletrap.Type.Str.Str
+ Rattletrap.Type.Str: instance GHC.Show.Show Rattletrap.Type.Str.Str
+ Rattletrap.Type.Str: newtype Str
+ Rattletrap.Type.Str: toStr :: String -> Str
+ Rattletrap.Type.StringAttribute: StringAttribute :: Str -> StringAttribute
+ Rattletrap.Type.StringAttribute: [stringAttributeValue] :: StringAttribute -> Str
+ Rattletrap.Type.StringAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.StringAttribute.StringAttribute
+ Rattletrap.Type.StringAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.StringAttribute.StringAttribute
+ Rattletrap.Type.StringAttribute: instance GHC.Classes.Eq Rattletrap.Type.StringAttribute.StringAttribute
+ Rattletrap.Type.StringAttribute: instance GHC.Classes.Ord Rattletrap.Type.StringAttribute.StringAttribute
+ Rattletrap.Type.StringAttribute: instance GHC.Show.Show Rattletrap.Type.StringAttribute.StringAttribute
+ Rattletrap.Type.StringAttribute: newtype StringAttribute
+ Rattletrap.Type.TeamPaintAttribute: TeamPaintAttribute :: Word8le -> Word8le -> Word8le -> Word32le -> Word32le -> TeamPaintAttribute
+ Rattletrap.Type.TeamPaintAttribute: [teamPaintAttributeAccentColor] :: TeamPaintAttribute -> Word8le
+ Rattletrap.Type.TeamPaintAttribute: [teamPaintAttributeAccentFinish] :: TeamPaintAttribute -> Word32le
+ Rattletrap.Type.TeamPaintAttribute: [teamPaintAttributePrimaryColor] :: TeamPaintAttribute -> Word8le
+ Rattletrap.Type.TeamPaintAttribute: [teamPaintAttributePrimaryFinish] :: TeamPaintAttribute -> Word32le
+ Rattletrap.Type.TeamPaintAttribute: [teamPaintAttributeTeam] :: TeamPaintAttribute -> Word8le
+ Rattletrap.Type.TeamPaintAttribute: data TeamPaintAttribute
+ Rattletrap.Type.TeamPaintAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.TeamPaintAttribute.TeamPaintAttribute
+ Rattletrap.Type.TeamPaintAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.TeamPaintAttribute.TeamPaintAttribute
+ Rattletrap.Type.TeamPaintAttribute: instance GHC.Classes.Eq Rattletrap.Type.TeamPaintAttribute.TeamPaintAttribute
+ Rattletrap.Type.TeamPaintAttribute: instance GHC.Classes.Ord Rattletrap.Type.TeamPaintAttribute.TeamPaintAttribute
+ Rattletrap.Type.TeamPaintAttribute: instance GHC.Show.Show Rattletrap.Type.TeamPaintAttribute.TeamPaintAttribute
+ Rattletrap.Type.UniqueIdAttribute: UniqueIdAttribute :: Word8le -> RemoteId -> Word8le -> UniqueIdAttribute
+ Rattletrap.Type.UniqueIdAttribute: [uniqueIdAttributeLocalId] :: UniqueIdAttribute -> Word8le
+ Rattletrap.Type.UniqueIdAttribute: [uniqueIdAttributeRemoteId] :: UniqueIdAttribute -> RemoteId
+ Rattletrap.Type.UniqueIdAttribute: [uniqueIdAttributeSystemId] :: UniqueIdAttribute -> Word8le
+ Rattletrap.Type.UniqueIdAttribute: data UniqueIdAttribute
+ Rattletrap.Type.UniqueIdAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.UniqueIdAttribute.UniqueIdAttribute
+ Rattletrap.Type.UniqueIdAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.UniqueIdAttribute.UniqueIdAttribute
+ Rattletrap.Type.UniqueIdAttribute: instance GHC.Classes.Eq Rattletrap.Type.UniqueIdAttribute.UniqueIdAttribute
+ Rattletrap.Type.UniqueIdAttribute: instance GHC.Classes.Ord Rattletrap.Type.UniqueIdAttribute.UniqueIdAttribute
+ Rattletrap.Type.UniqueIdAttribute: instance GHC.Show.Show Rattletrap.Type.UniqueIdAttribute.UniqueIdAttribute
+ Rattletrap.Type.UpdatedReplication: UpdatedReplication :: [Attribute] -> UpdatedReplication
+ Rattletrap.Type.UpdatedReplication: [updatedReplicationAttributes] :: UpdatedReplication -> [Attribute]
+ Rattletrap.Type.UpdatedReplication: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.UpdatedReplication.UpdatedReplication
+ Rattletrap.Type.UpdatedReplication: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.UpdatedReplication.UpdatedReplication
+ Rattletrap.Type.UpdatedReplication: instance GHC.Classes.Eq Rattletrap.Type.UpdatedReplication.UpdatedReplication
+ Rattletrap.Type.UpdatedReplication: instance GHC.Classes.Ord Rattletrap.Type.UpdatedReplication.UpdatedReplication
+ Rattletrap.Type.UpdatedReplication: instance GHC.Show.Show Rattletrap.Type.UpdatedReplication.UpdatedReplication
+ Rattletrap.Type.UpdatedReplication: newtype UpdatedReplication
+ Rattletrap.Type.Vector: Vector :: Word -> Int -> Int -> Int -> Vector
+ Rattletrap.Type.Vector: [vectorBias] :: Vector -> Word
+ Rattletrap.Type.Vector: [vectorX] :: Vector -> Int
+ Rattletrap.Type.Vector: [vectorY] :: Vector -> Int
+ Rattletrap.Type.Vector: [vectorZ] :: Vector -> Int
+ Rattletrap.Type.Vector: data Vector
+ Rattletrap.Type.Vector: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.Vector.Vector
+ Rattletrap.Type.Vector: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.Vector.Vector
+ Rattletrap.Type.Vector: instance GHC.Classes.Eq Rattletrap.Type.Vector.Vector
+ Rattletrap.Type.Vector: instance GHC.Classes.Ord Rattletrap.Type.Vector.Vector
+ Rattletrap.Type.Vector: instance GHC.Show.Show Rattletrap.Type.Vector.Vector
+ Rattletrap.Type.WeldedInfoAttribute: WeldedInfoAttribute :: Bool -> Int32le -> Vector -> Float32le -> Int8Vector -> WeldedInfoAttribute
+ Rattletrap.Type.WeldedInfoAttribute: [weldedInfoAttributeActive] :: WeldedInfoAttribute -> Bool
+ Rattletrap.Type.WeldedInfoAttribute: [weldedInfoAttributeActorId] :: WeldedInfoAttribute -> Int32le
+ Rattletrap.Type.WeldedInfoAttribute: [weldedInfoAttributeMass] :: WeldedInfoAttribute -> Float32le
+ Rattletrap.Type.WeldedInfoAttribute: [weldedInfoAttributeOffset] :: WeldedInfoAttribute -> Vector
+ Rattletrap.Type.WeldedInfoAttribute: [weldedInfoAttributeRotation] :: WeldedInfoAttribute -> Int8Vector
+ Rattletrap.Type.WeldedInfoAttribute: data WeldedInfoAttribute
+ Rattletrap.Type.WeldedInfoAttribute: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.WeldedInfoAttribute.WeldedInfoAttribute
+ Rattletrap.Type.WeldedInfoAttribute: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.WeldedInfoAttribute.WeldedInfoAttribute
+ Rattletrap.Type.WeldedInfoAttribute: instance GHC.Classes.Eq Rattletrap.Type.WeldedInfoAttribute.WeldedInfoAttribute
+ Rattletrap.Type.WeldedInfoAttribute: instance GHC.Classes.Ord Rattletrap.Type.WeldedInfoAttribute.WeldedInfoAttribute
+ Rattletrap.Type.WeldedInfoAttribute: instance GHC.Show.Show Rattletrap.Type.WeldedInfoAttribute.WeldedInfoAttribute
+ Rattletrap.Type.Word32le: Word32le :: Word32 -> Word32le
+ Rattletrap.Type.Word32le: [word32leValue] :: Word32le -> Word32
+ Rattletrap.Type.Word32le: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.Word32le.Word32le
+ Rattletrap.Type.Word32le: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.Word32le.Word32le
+ Rattletrap.Type.Word32le: instance GHC.Classes.Eq Rattletrap.Type.Word32le.Word32le
+ Rattletrap.Type.Word32le: instance GHC.Classes.Ord Rattletrap.Type.Word32le.Word32le
+ Rattletrap.Type.Word32le: instance GHC.Show.Show Rattletrap.Type.Word32le.Word32le
+ Rattletrap.Type.Word32le: newtype Word32le
+ Rattletrap.Type.Word64le: Word64le :: Word64 -> Word64le
+ Rattletrap.Type.Word64le: [word64leValue] :: Word64le -> Word64
+ Rattletrap.Type.Word64le: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.Word64le.Word64le
+ Rattletrap.Type.Word64le: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.Word64le.Word64le
+ Rattletrap.Type.Word64le: instance GHC.Classes.Eq Rattletrap.Type.Word64le.Word64le
+ Rattletrap.Type.Word64le: instance GHC.Classes.Ord Rattletrap.Type.Word64le.Word64le
+ Rattletrap.Type.Word64le: instance GHC.Show.Show Rattletrap.Type.Word64le.Word64le
+ Rattletrap.Type.Word64le: newtype Word64le
+ Rattletrap.Type.Word8le: Word8le :: Word8 -> Word8le
+ Rattletrap.Type.Word8le: [word8leValue] :: Word8le -> Word8
+ Rattletrap.Type.Word8le: instance Data.Aeson.Types.FromJSON.FromJSON Rattletrap.Type.Word8le.Word8le
+ Rattletrap.Type.Word8le: instance Data.Aeson.Types.ToJSON.ToJSON Rattletrap.Type.Word8le.Word8le
+ Rattletrap.Type.Word8le: instance GHC.Classes.Eq Rattletrap.Type.Word8le.Word8le
+ Rattletrap.Type.Word8le: instance GHC.Classes.Ord Rattletrap.Type.Word8le.Word8le
+ Rattletrap.Type.Word8le: instance GHC.Show.Show Rattletrap.Type.Word8le.Word8le
+ Rattletrap.Type.Word8le: newtype Word8le
+ Rattletrap.Utility.Bytes: encodeLatin1 :: Text -> ByteString
+ Rattletrap.Utility.Bytes: padBytes :: Integral a => a -> ByteString -> ByteString
+ Rattletrap.Utility.Bytes: reverseByte :: Word8 -> Word8
+ Rattletrap.Utility.Bytes: reverseBytes :: ByteString -> ByteString
+ Rattletrap.Utility.Crc: getCrc32 :: ByteString -> Word32
+ Rattletrap.Utility.Helper: decodeReplayFile :: ByteString -> Either String Replay
+ Rattletrap.Utility.Helper: decodeReplayJson :: ByteString -> Either String Replay
+ Rattletrap.Utility.Helper: encodeReplayFile :: Replay -> ByteString
+ Rattletrap.Utility.Helper: encodeReplayJson :: Replay -> ByteString

Files

LICENSE.markdown view
@@ -1,13 +1,13 @@-# [The MIT License (MIT)][]+MIT License -Copyright (c) Taylor Fausak+Copyright (c) 2018 Taylor Fausak -Permission is hereby granted, free of charge, to any person obtaining a copy of-this software and associated documentation files (the "Software"), to deal in-the Software without restriction, including without limitation the rights to-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies-of the Software, and to permit persons to whom the Software is furnished to do-so, subject to the following conditions:+Permission is hereby granted, free of charge, to any person obtaining a copy+of this software and associated documentation files (the "Software"), to deal+in the Software without restriction, including without limitation the rights+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell+copies of the Software, and to permit persons to whom the Software is+furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.@@ -19,5 +19,3 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.--[The MIT License (MIT)]: http://opensource.org/licenses/MIT
README.markdown view
@@ -16,45 +16,82 @@  ## Replays -Rocket League saves your replays in a folder that depends on your operating system.+Rocket League saves your replays in a folder that depends on your operating+system. -- Windows: `%UserProfile%\Documents\My Games\Rocket League\TAGame\Demos`-- macOS: `$HOME/Library/Application Support/Rocket League/TAGame/Demos`-- Linux: `$HOME/.local/share/Rocket League/TAGame/Demos`+- Windows:+  - `%UserProfile%/Documents/My Games/Rocket League/TAGame/Demos`+  - For example: `C:/Users/Taylor/Documents/My Games/Rocket League/TAGame/Demos`+- macOS:+  - `$HOME/Library/Application Support/Rocket League/TAGame/Demos`+  - For example: `/Users/taylor/Library/Application Support/Rocket League/TAGame/Demos`+- Linux:+  - `$HOME/.local/share/Rocket League/TAGame/Demos`+  - For example: `/home/taylor/.local/share/Rocket League/TAGame/Demos` +## Interface++Rattletrap is a command line application.++``` sh+> rattletrap --help+rattletrap version 4.0.0+  -c             --compact                minify JSON output+  -h             --help                   show the help+  -i FILE|URL    --input=FILE|URL         input file or URL+  -m MODE        --mode=MODE              decode or encode+  -o FILE        --output=FILE            output file+  -v             --version                show the version+```++By default Rattletrap will try to determine the appropriate mode (either decode+or encode) based on the file extensions of the input or output. You can+override this behavior by passing `--mode` (or `-m`) with either `decode` or+`encode`.++Input extension | Output extension | Mode+--- | --- | ---+`.replay` | anything | `decode` (parse)+`.json` | anything | `encode` (generate)+anything | `.replay` | `encode` (generate)+anything | `.json` | `decode` (parse)+anything | anything | `decode` (parse)+ ## Parse  Rattletrap can parse (decode) Rocket League replays and output them as JSON.  ``` sh-> rattletrap decode http://example.com/input.replay output.json+> rattletrap --input http://example.com/input.replay --output output.json # or-> rattletrap decode input.replay > output.json+> rattletrap -i input.replay > output.json # or-> rattletrap.decode < input.replay > output.json+> rattletrap < input.replay > output.json ```  The input argument can either be a local path or a URL. -The resulting JSON is minified, but extremely large. The output can be up to 50-times larger than the input.+By default the JSON is pretty-printed. To minify the JSON, pass `--compact` (or+`-c`) to Rattletrap. Even when the JSON is minified, it's extremely large. The+output can be up to 100 times larger than the input. For example, a 1.5 MB+replay turns into 31 MB of minified JSON or 159 MB of pretty-printed JSON.  ## Generate  Rattletrap can also generate (encode) Rocket League replays from JSON files.  ``` sh-> rattletrap encode http://example.com/input.json output.replay+> rattletrap --input http://example.com/input.json --output output.replay # or-> rattletrap encode input.json > output.replay+> rattletrap -i input.json > output.replay # or-> rattletrap.encode < input.json > output.replay+> rattletrap --mode encode < input.json > output.replay ```  The input argument can either be a local path or a URL. -If the JSON was generated by Rattletrap, the resulting replay should be-identical to the original.+If the JSON was generated by Rattletrap, the output replay will be bit-for-bit+identical to the input replay.  ## Modify @@ -62,17 +99,17 @@ used to modify replays.  ``` sh-> rattletrap decode < original.replay |+> rattletrap -i input.replay |   modify-replay-json |-  rattletrap encode > modified.replay+  rattletrap -o output.replay ```  [Rattletrap]: https://github.com/tfausak/rattletrap-[Version badge]: https://www.stackage.org/package/rattletrap/badge/nightly?label=version+[Version badge]: https://img.shields.io/hackage/v/rattletrap.svg?label=version [version]: https://www.stackage.org/nightly/package/rattletrap-[Windows build badge]: https://ci.appveyor.com/api/projects/status/github/tfausak/rattletrap?branch=master&svg=true+[Windows build badge]: https://img.shields.io/appveyor/ci/taylorfausak/rattletrap/master.svg?logo=appveyor [windows build]: https://ci.appveyor.com/project/TaylorFausak/rattletrap-[Build badge]: https://travis-ci.org/tfausak/rattletrap.svg?branch=master+[Build badge]: https://img.shields.io/travis/tfausak/rattletrap/master.svg [build]: https://travis-ci.org/tfausak/rattletrap [Rocket League]: https://www.rocketleaguegame.com [the latest release]: https://github.com/tfausak/rattletrap/releases/latest
executables/Main.hs view
@@ -1,5 +1,5 @@ module Main-  ( module Rattletrap+  ( main   ) where -import Rattletrap (main)+import Rattletrap.Console.Main (main)
library/Rattletrap.hs view
@@ -1,87 +1,140 @@--- | Rattletrap is a tool for parsing and generating Rocket League replays. It--- is typically used as an executable; see "Rattletrap.Main" for details about--- that interface. Using Rattletrap from Haskell is as easy as importing this--- module. Together with "Data.ByteString.Lazy" and "Data.Binary.Get", you can--- decode a 'Replay' value. Then you can transform it into JSON with--- "Data.Aeson". For example:------ @--- let file = "path-to/some.replay"--- bytes <- 'Data.ByteString.Lazy.readFile' file--- let replay = 'Data.Binary.Get.runGet' 'Rattletrap.Replay.getReplay' bytes--- let json = 'Data.Aeson.encode' replay--- 'Data.ByteString.Lazy.putStr' json--- @------ There are a few unusual aspects of Rattletrap to be aware of:------ - In order to improve memory usage, everything Rattletrap does is strict.---   Don't expect any lazy values or evaluation.--- - Some names, like 'Text', collide with commonly-used modules. Use---   qualified imports to avoid collisions.--- - No instances of 'Data.Binary.Binary' are provided. Use functions like---   'getReplay' instead. This was done to improve type inference and make---   profiling easier. Also some types require information that could not be---   provided by the 'Data.Binary.Binary' interface.--- - Importing one specific module is not recommended because all JSON---   instances are defined as orphans in "Rattletrap.Json". module Rattletrap-  ( module Rattletrap.ActorMap-  , module Rattletrap.Attribute-  , module Rattletrap.AttributeMapping-  , module Rattletrap.AttributeType-  , module Rattletrap.AttributeValue-  , module Rattletrap.Cache-  , module Rattletrap.ClassAttributeMap-  , module Rattletrap.ClassMapping-  , module Rattletrap.Content-  , module Rattletrap.Crc-  , module Rattletrap.Data-  , module Rattletrap.Frame-  , module Rattletrap.Header-  , module Rattletrap.Helper-  , module Rattletrap.Initialization-  , module Rattletrap.KeyFrame-  , module Rattletrap.Main-  , module Rattletrap.Mark-  , module Rattletrap.Message-  , module Rattletrap.Primitive-  , module Rattletrap.Property-  , module Rattletrap.PropertyValue-  , module Rattletrap.RemoteId-  , module Rattletrap.Replay-  , module Rattletrap.Replication-  , module Rattletrap.ReplicationValue-  , module Rattletrap.Utility-  , module Rattletrap.Version+  ( Rattletrap.Utility.Helper.decodeReplayFile+  , Rattletrap.Utility.Helper.encodeReplayJson+  , Rattletrap.Utility.Helper.decodeReplayJson+  , Rattletrap.Utility.Helper.encodeReplayFile+  , Rattletrap.Type.Replay.Replay(..)+  , Rattletrap.Type.Section.Section(..)+  , Rattletrap.Type.Header.Header(..)+  , Rattletrap.Type.Word32le.Word32le(..)+  , Rattletrap.Type.Str.Str(..)+  , Rattletrap.Type.Dictionary.Dictionary(..)+  , Rattletrap.Type.Property.Property(..)+  , Rattletrap.Type.Word64le.Word64le(..)+  , Rattletrap.Type.PropertyValue.PropertyValue(..)+  , Rattletrap.Type.List.List(..)+  , Rattletrap.Type.Word8le.Word8le(..)+  , Rattletrap.Type.Float32le.Float32le(..)+  , Rattletrap.Type.Int32le.Int32le(..)+  , Rattletrap.Type.Content.Content(..)+  , Rattletrap.Type.KeyFrame.KeyFrame(..)+  , Rattletrap.Type.Frame.Frame(..)+  , Rattletrap.Type.Replication.Replication(..)+  , Rattletrap.Type.CompressedWord.CompressedWord(..)+  , Rattletrap.Type.ReplicationValue.ReplicationValue(..)+  , Rattletrap.Type.SpawnedReplication.SpawnedReplication(..)+  , Rattletrap.Type.Initialization.Initialization(..)+  , Rattletrap.Type.Vector.Vector(..)+  , Rattletrap.Type.Int8Vector.Int8Vector(..)+  , Rattletrap.Type.Int8le.Int8le(..)+  , Rattletrap.Type.UpdatedReplication.UpdatedReplication(..)+  , Rattletrap.Type.Attribute.Attribute(..)+  , Rattletrap.Type.AttributeValue.AttributeValue(..)+  , Rattletrap.Type.AppliedDamageAttribute.AppliedDamageAttribute(..)+  , Rattletrap.Type.BooleanAttribute.BooleanAttribute(..)+  , Rattletrap.Type.ByteAttribute.ByteAttribute(..)+  , Rattletrap.Type.CamSettingsAttribute.CamSettingsAttribute(..)+  , Rattletrap.Type.ClubColorsAttribute.ClubColorsAttribute(..)+  , Rattletrap.Type.DamageStateAttribute.DamageStateAttribute(..)+  , Rattletrap.Type.DemolishAttribute.DemolishAttribute(..)+  , Rattletrap.Type.EnumAttribute.EnumAttribute(..)+  , Rattletrap.Type.ExplosionAttribute.ExplosionAttribute(..)+  , Rattletrap.Type.ExtendedExplosionAttribute.ExtendedExplosionAttribute(..)+  , Rattletrap.Type.FlaggedIntAttribute.FlaggedIntAttribute(..)+  , Rattletrap.Type.FloatAttribute.FloatAttribute(..)+  , Rattletrap.Type.GameModeAttribute.GameModeAttribute(..)+  , Rattletrap.Type.IntAttribute.IntAttribute(..)+  , Rattletrap.Type.LoadoutAttribute.LoadoutAttribute(..)+  , Rattletrap.Type.LoadoutOnlineAttribute.LoadoutOnlineAttribute(..)+  , Rattletrap.Type.ProductAttribute.ProductAttribute(..)+  , Rattletrap.Type.LoadoutsAttribute.LoadoutsAttribute(..)+  , Rattletrap.Type.LoadoutsOnlineAttribute.LoadoutsOnlineAttribute(..)+  , Rattletrap.Type.LocationAttribute.LocationAttribute(..)+  , Rattletrap.Type.MusicStingerAttribute.MusicStingerAttribute(..)+  , Rattletrap.Type.PartyLeaderAttribute.PartyLeaderAttribute(..)+  , Rattletrap.Type.RemoteId.RemoteId(..)+  , Rattletrap.Type.PickupAttribute.PickupAttribute(..)+  , Rattletrap.Type.PrivateMatchSettingsAttribute.PrivateMatchSettingsAttribute(..)+  , Rattletrap.Type.QWordAttribute.QWordAttribute(..)+  , Rattletrap.Type.ReservationAttribute.ReservationAttribute(..)+  , Rattletrap.Type.UniqueIdAttribute.UniqueIdAttribute(..)+  , Rattletrap.Type.RigidBodyStateAttribute.RigidBodyStateAttribute(..)+  , Rattletrap.Type.CompressedWordVector.CompressedWordVector(..)+  , Rattletrap.Type.StringAttribute.StringAttribute(..)+  , Rattletrap.Type.TeamPaintAttribute.TeamPaintAttribute(..)+  , Rattletrap.Type.WeldedInfoAttribute.WeldedInfoAttribute(..)+  , Rattletrap.Type.DestroyedReplication.DestroyedReplication(..)+  , Rattletrap.Type.Message.Message(..)+  , Rattletrap.Type.Mark.Mark(..)+  , Rattletrap.Type.ClassMapping.ClassMapping(..)+  , Rattletrap.Type.Cache.Cache(..)+  , Rattletrap.Type.AttributeMapping.AttributeMapping(..)   ) where -import Rattletrap.ActorMap-import Rattletrap.Attribute-import Rattletrap.AttributeMapping-import Rattletrap.AttributeType-import Rattletrap.AttributeValue-import Rattletrap.Cache-import Rattletrap.ClassAttributeMap-import Rattletrap.ClassMapping-import Rattletrap.Content-import Rattletrap.Crc-import Rattletrap.Data-import Rattletrap.Frame-import Rattletrap.Header-import Rattletrap.Helper-import Rattletrap.Initialization-import Rattletrap.Json ()-import Rattletrap.KeyFrame-import Rattletrap.Main-import Rattletrap.Mark-import Rattletrap.Message-import Rattletrap.Primitive-import Rattletrap.Property-import Rattletrap.PropertyValue-import Rattletrap.RemoteId-import Rattletrap.Replay-import Rattletrap.Replication-import Rattletrap.ReplicationValue-import Rattletrap.Utility-import Rattletrap.Version+import qualified Rattletrap.Type.AppliedDamageAttribute+import qualified Rattletrap.Type.Attribute+import qualified Rattletrap.Type.AttributeMapping+import qualified Rattletrap.Type.AttributeValue+import qualified Rattletrap.Type.BooleanAttribute+import qualified Rattletrap.Type.ByteAttribute+import qualified Rattletrap.Type.Cache+import qualified Rattletrap.Type.CamSettingsAttribute+import qualified Rattletrap.Type.ClassMapping+import qualified Rattletrap.Type.ClubColorsAttribute+import qualified Rattletrap.Type.CompressedWord+import qualified Rattletrap.Type.CompressedWordVector+import qualified Rattletrap.Type.Content+import qualified Rattletrap.Type.DamageStateAttribute+import qualified Rattletrap.Type.DemolishAttribute+import qualified Rattletrap.Type.DestroyedReplication+import qualified Rattletrap.Type.Dictionary+import qualified Rattletrap.Type.EnumAttribute+import qualified Rattletrap.Type.ExplosionAttribute+import qualified Rattletrap.Type.ExtendedExplosionAttribute+import qualified Rattletrap.Type.FlaggedIntAttribute+import qualified Rattletrap.Type.Float32le+import qualified Rattletrap.Type.FloatAttribute+import qualified Rattletrap.Type.Frame+import qualified Rattletrap.Type.GameModeAttribute+import qualified Rattletrap.Type.Header+import qualified Rattletrap.Type.Initialization+import qualified Rattletrap.Type.Int32le+import qualified Rattletrap.Type.Int8Vector+import qualified Rattletrap.Type.Int8le+import qualified Rattletrap.Type.IntAttribute+import qualified Rattletrap.Type.KeyFrame+import qualified Rattletrap.Type.List+import qualified Rattletrap.Type.LoadoutAttribute+import qualified Rattletrap.Type.LoadoutOnlineAttribute+import qualified Rattletrap.Type.LoadoutsAttribute+import qualified Rattletrap.Type.LoadoutsOnlineAttribute+import qualified Rattletrap.Type.LocationAttribute+import qualified Rattletrap.Type.Mark+import qualified Rattletrap.Type.Message+import qualified Rattletrap.Type.MusicStingerAttribute+import qualified Rattletrap.Type.PartyLeaderAttribute+import qualified Rattletrap.Type.PickupAttribute+import qualified Rattletrap.Type.PrivateMatchSettingsAttribute+import qualified Rattletrap.Type.ProductAttribute+import qualified Rattletrap.Type.Property+import qualified Rattletrap.Type.PropertyValue+import qualified Rattletrap.Type.QWordAttribute+import qualified Rattletrap.Type.RemoteId+import qualified Rattletrap.Type.Replay+import qualified Rattletrap.Type.Replication+import qualified Rattletrap.Type.ReplicationValue+import qualified Rattletrap.Type.ReservationAttribute+import qualified Rattletrap.Type.RigidBodyStateAttribute+import qualified Rattletrap.Type.Section+import qualified Rattletrap.Type.SpawnedReplication+import qualified Rattletrap.Type.Str+import qualified Rattletrap.Type.StringAttribute+import qualified Rattletrap.Type.TeamPaintAttribute+import qualified Rattletrap.Type.UniqueIdAttribute+import qualified Rattletrap.Type.UpdatedReplication+import qualified Rattletrap.Type.Vector+import qualified Rattletrap.Type.WeldedInfoAttribute+import qualified Rattletrap.Type.Word32le+import qualified Rattletrap.Type.Word64le+import qualified Rattletrap.Type.Word8le+import qualified Rattletrap.Utility.Helper
− library/Rattletrap/ActorMap.hs
@@ -1,21 +0,0 @@-module Rattletrap.ActorMap where--import Rattletrap.Primitive--import qualified Data.Map.Strict as Map--type ActorMap = Map.Map CompressedWord Word32--{-# DEPRECATED-makeActorMap "use Data.Map.Strict.empty"- #-}--makeActorMap :: ActorMap-makeActorMap = Map.empty--{-# DEPRECATED-updateActorMap "use Data.Map.Strict.insert"- #-}--updateActorMap :: CompressedWord -> Word32 -> ActorMap -> ActorMap-updateActorMap = Map.insert
− library/Rattletrap/Attribute.hs
@@ -1,65 +0,0 @@-module Rattletrap.Attribute where--import Rattletrap.ActorMap-import Rattletrap.AttributeValue-import Rattletrap.ClassAttributeMap-import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data Attribute = Attribute-  { attributeId :: CompressedWord-  , attributeName :: Text-  -- ^ Read-only! Changing an attribute's name requires editing the class-  -- attribute map.-  , attributeValue :: AttributeValue-  } deriving (Eq, Ord, Show)--getAttributes-  :: (Int, Int, Int)-  -> ClassAttributeMap-  -> ActorMap-  -> CompressedWord-  -> BinaryBit.BitGet [Attribute]-getAttributes version classAttributeMap actorMap actorId = do-  hasAttribute <- BinaryBit.getBool-  if not hasAttribute-    then pure []-    else do-      attribute <- getAttribute version classAttributeMap actorMap actorId-      attributes <- getAttributes version classAttributeMap actorMap actorId-      pure (attribute : attributes)--putAttributes :: [Attribute] -> BinaryBit.BitPut ()-putAttributes attributes = do-  mapM_ putAttribute attributes-  BinaryBit.putBool False--getAttribute-  :: (Int, Int, Int)-  -> ClassAttributeMap-  -> ActorMap-  -> CompressedWord-  -> BinaryBit.BitGet Attribute-getAttribute version classAttributeMap actorMap actorId =-  case getAttributeMap classAttributeMap actorMap actorId of-    Nothing -> fail ("could not get attribute map for " ++ show actorId)-    Just attributeMap -> case getAttributeIdLimit attributeMap of-      Nothing -> fail ("could not get attribute ID limit for " ++ show actorId)-      Just limit -> do-        id_ <- getCompressedWord limit-        case getAttributeName classAttributeMap attributeMap id_ of-          Nothing -> fail ("could not get attribute name for " ++ show id_)-          Just name -> do-            value <- getAttributeValue-              version-              (classAttributeMapObjectMap classAttributeMap)-              name-            pure (Attribute id_ name value)--putAttribute :: Attribute -> BinaryBit.BitPut ()-putAttribute attribute = do-  BinaryBit.putBool True-  putCompressedWord (attributeId attribute)-  putAttributeValue (attributeValue attribute)
− library/Rattletrap/Attribute/AppliedDamage.hs
@@ -1,28 +0,0 @@-module Rattletrap.Attribute.AppliedDamage where--import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data AppliedDamageAttribute = AppliedDamageAttribute-  { appliedDamageAttributeUnknown1 :: Word8-  , appliedDamageAttributeLocation :: Vector-  , appliedDamageAttributeUnknown3 :: Int32-  , appliedDamageAttributeUnknown4 :: Int32-  } deriving (Eq, Ord, Show)--getAppliedDamageAttribute :: BinaryBit.BitGet AppliedDamageAttribute-getAppliedDamageAttribute = do-  unknown1 <- getWord8Bits-  location <- getVector-  unknown3 <- getInt32Bits-  unknown4 <- getInt32Bits-  pure (AppliedDamageAttribute unknown1 location unknown3 unknown4)--putAppliedDamageAttribute :: AppliedDamageAttribute -> BinaryBit.BitPut ()-putAppliedDamageAttribute appliedDamageAttribute = do-  putWord8Bits (appliedDamageAttributeUnknown1 appliedDamageAttribute)-  putVector (appliedDamageAttributeLocation appliedDamageAttribute)-  putInt32Bits (appliedDamageAttributeUnknown3 appliedDamageAttribute)-  putInt32Bits (appliedDamageAttributeUnknown4 appliedDamageAttribute)
− library/Rattletrap/Attribute/Boolean.hs
@@ -1,17 +0,0 @@-module Rattletrap.Attribute.Boolean where--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--newtype BooleanAttribute = BooleanAttribute-  { booleanAttributeValue :: Bool-  } deriving (Eq, Ord, Show)--getBooleanAttribute :: BinaryBit.BitGet BooleanAttribute-getBooleanAttribute = do-  value <- BinaryBit.getBool-  pure (BooleanAttribute value)--putBooleanAttribute :: BooleanAttribute -> BinaryBit.BitPut ()-putBooleanAttribute booleanAttribute =-  BinaryBit.putBool (booleanAttributeValue booleanAttribute)
− library/Rattletrap/Attribute/Byte.hs
@@ -1,19 +0,0 @@-module Rattletrap.Attribute.Byte where--import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--newtype ByteAttribute = ByteAttribute-  { byteAttributeValue :: Word8-  } deriving (Eq, Ord, Show)--getByteAttribute :: BinaryBit.BitGet ByteAttribute-getByteAttribute = do-  value <- getWord8Bits-  pure (ByteAttribute value)--putByteAttribute :: ByteAttribute -> BinaryBit.BitPut ()-putByteAttribute byteAttribute =-  putWord8Bits (byteAttributeValue byteAttribute)
− library/Rattletrap/Attribute/CamSettings.hs
@@ -1,52 +0,0 @@-module Rattletrap.Attribute.CamSettings where--import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data CamSettingsAttribute = CamSettingsAttribute-  { camSettingsAttributeFov :: Float32-  , camSettingsAttributeHeight :: Float32-  , camSettingsAttributeAngle :: Float32-  , camSettingsAttributeDistance :: Float32-  , camSettingsAttributeStiffness :: Float32-  , camSettingsAttributeSwivelSpeed :: Float32-  , camSettingsAttributeTransitionSpeed :: Maybe Float32-  } deriving (Eq, Ord, Show)--getCamSettingsAttribute :: (Int, Int, Int) -> BinaryBit.BitGet CamSettingsAttribute-getCamSettingsAttribute version = do-  fov <- getFloat32Bits-  height <- getFloat32Bits-  angle <- getFloat32Bits-  distance <- getFloat32Bits-  stiffness <- getFloat32Bits-  swivelSpeed <- getFloat32Bits-  transitionSpeed <- if version >= (868, 20, 0)-    then do-      x <- getFloat32Bits-      pure (Just x)-    else pure Nothing-  pure-    ( CamSettingsAttribute-      fov-      height-      angle-      distance-      stiffness-      swivelSpeed-      transitionSpeed-    )--putCamSettingsAttribute :: CamSettingsAttribute -> BinaryBit.BitPut ()-putCamSettingsAttribute camSettingsAttribute = do-  putFloat32Bits (camSettingsAttributeFov camSettingsAttribute)-  putFloat32Bits (camSettingsAttributeHeight camSettingsAttribute)-  putFloat32Bits (camSettingsAttributeAngle camSettingsAttribute)-  putFloat32Bits (camSettingsAttributeDistance camSettingsAttribute)-  putFloat32Bits (camSettingsAttributeStiffness camSettingsAttribute)-  putFloat32Bits (camSettingsAttributeSwivelSpeed camSettingsAttribute)-  case camSettingsAttributeTransitionSpeed camSettingsAttribute of-    Nothing -> pure ()-    Just transitionSpeed -> putFloat32Bits transitionSpeed
− library/Rattletrap/Attribute/ClubColors.hs
@@ -1,28 +0,0 @@-module Rattletrap.Attribute.ClubColors where--import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data ClubColorsAttribute = ClubColorsAttribute-  { clubColorsAttributeBlueFlag :: Bool-  , clubColorsAttributeBlueColor :: Word8-  , clubColorsAttributeOrangeFlag :: Bool-  , clubColorsAttributeOrangeColor :: Word8-  } deriving (Eq, Ord, Show)--getClubColorsAttribute :: BinaryBit.BitGet ClubColorsAttribute-getClubColorsAttribute = do-  blueFlag <- BinaryBit.getBool-  blueColor <- getWord8Bits-  orangeFlag <- BinaryBit.getBool-  orangeColor <- getWord8Bits-  pure (ClubColorsAttribute blueFlag blueColor orangeFlag orangeColor)--putClubColorsAttribute :: ClubColorsAttribute -> BinaryBit.BitPut ()-putClubColorsAttribute clubColorsAttribute = do-  BinaryBit.putBool (clubColorsAttributeBlueFlag clubColorsAttribute)-  putWord8Bits (clubColorsAttributeBlueColor clubColorsAttribute)-  BinaryBit.putBool (clubColorsAttributeOrangeFlag clubColorsAttribute)-  putWord8Bits (clubColorsAttributeOrangeColor clubColorsAttribute)
− library/Rattletrap/Attribute/DamageState.hs
@@ -1,35 +0,0 @@-module Rattletrap.Attribute.DamageState where--import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data DamageStateAttribute = DamageStateAttribute-  { damageStateAttributeUnknown1 :: Word8-  , damageStateAttributeUnknown2 :: Bool-  , damageStateAttributeUnknown3 :: Int32-  , damageStateAttributeUnknown4 :: Vector-  , damageStateAttributeUnknown5 :: Bool-  , damageStateAttributeUnknown6 :: Bool-  } deriving (Eq, Ord, Show)--getDamageStateAttribute :: BinaryBit.BitGet DamageStateAttribute-getDamageStateAttribute = do-  unknown1 <- getWord8Bits-  unknown2 <- BinaryBit.getBool-  unknown3 <- getInt32Bits-  unknown4 <- getVector-  unknown5 <- BinaryBit.getBool-  unknown6 <- BinaryBit.getBool-  pure-    (DamageStateAttribute unknown1 unknown2 unknown3 unknown4 unknown5 unknown6)--putDamageStateAttribute :: DamageStateAttribute -> BinaryBit.BitPut ()-putDamageStateAttribute damageStateAttribute = do-  putWord8Bits (damageStateAttributeUnknown1 damageStateAttribute)-  BinaryBit.putBool (damageStateAttributeUnknown2 damageStateAttribute)-  putInt32Bits (damageStateAttributeUnknown3 damageStateAttribute)-  putVector (damageStateAttributeUnknown4 damageStateAttribute)-  BinaryBit.putBool (damageStateAttributeUnknown5 damageStateAttribute)-  BinaryBit.putBool (damageStateAttributeUnknown6 damageStateAttribute)
− library/Rattletrap/Attribute/Demolish.hs
@@ -1,42 +0,0 @@-module Rattletrap.Attribute.Demolish where--import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data DemolishAttribute = DemolishAttribute-  { demolishAttributeAttackerFlag :: Bool-  , demolishAttributeAttackerActorId :: Word32-  , demolishAttributeVictimFlag :: Bool-  , demolishAttributeVictimActorId :: Word32-  , demolishAttributeAttackerVelocity :: Vector-  , demolishAttributeVictimVelocity :: Vector-  } deriving (Eq, Ord, Show)--getDemolishAttribute :: BinaryBit.BitGet DemolishAttribute-getDemolishAttribute = do-  attackerFlag <- BinaryBit.getBool-  attackerActorId <- getWord32Bits-  victimFlag <- BinaryBit.getBool-  victimActorId <- getWord32Bits-  attackerVelocity <- getVector-  victimVelocity <- getVector-  pure-    ( DemolishAttribute-      attackerFlag-      attackerActorId-      victimFlag-      victimActorId-      attackerVelocity-      victimVelocity-    )--putDemolishAttribute :: DemolishAttribute -> BinaryBit.BitPut ()-putDemolishAttribute demolishAttribute = do-  BinaryBit.putBool (demolishAttributeAttackerFlag demolishAttribute)-  putWord32Bits (demolishAttributeAttackerActorId demolishAttribute)-  BinaryBit.putBool (demolishAttributeVictimFlag demolishAttribute)-  putWord32Bits (demolishAttributeVictimActorId demolishAttribute)-  putVector (demolishAttributeAttackerVelocity demolishAttribute)-  putVector (demolishAttributeVictimVelocity demolishAttribute)
− library/Rattletrap/Attribute/Enum.hs
@@ -1,18 +0,0 @@-module Rattletrap.Attribute.Enum where--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit-import qualified Data.Word as Word--newtype EnumAttribute = EnumAttribute-  { enumAttributeValue :: Word.Word16-  } deriving (Eq, Ord, Show)--getEnumAttribute :: BinaryBit.BitGet EnumAttribute-getEnumAttribute = do-  value <- BinaryBit.getWord16be 11-  pure (EnumAttribute value)--putEnumAttribute :: EnumAttribute -> BinaryBit.BitPut ()-putEnumAttribute enumAttribute =-  BinaryBit.putWord16be 11 (enumAttributeValue enumAttribute)
− library/Rattletrap/Attribute/Explosion.hs
@@ -1,24 +0,0 @@-module Rattletrap.Attribute.Explosion where--import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data ExplosionAttribute = ExplosionAttribute-  { explosionAttributeActorId :: Int32-  , explosionAttributeLocation :: Vector-  } deriving (Eq, Ord, Show)--getExplosionAttribute :: BinaryBit.BitGet ExplosionAttribute-getExplosionAttribute = do-  False <- BinaryBit.getBool-  actorId <- getInt32Bits-  location <- getVector-  pure (ExplosionAttribute actorId location)--putExplosionAttribute :: ExplosionAttribute -> BinaryBit.BitPut ()-putExplosionAttribute explosionAttribute = do-  BinaryBit.putBool False-  putInt32Bits (explosionAttributeActorId explosionAttribute)-  putVector (explosionAttributeLocation explosionAttribute)
− library/Rattletrap/Attribute/ExtendedExplosion.hs
@@ -1,32 +0,0 @@-module Rattletrap.Attribute.ExtendedExplosion where--import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data ExtendedExplosionAttribute = ExtendedExplosionAttribute-  { extendedExplosionAttributeActorId :: Int32-  , extendedExplosionAttributeLocation :: Vector-  , extendedExplosionAttributeUnknown1 :: Bool-  , extendedExplosionAttributeUnknown2 :: Int32-  } deriving (Eq, Ord, Show)--getExtendedExplosionAttribute :: BinaryBit.BitGet ExtendedExplosionAttribute-getExtendedExplosionAttribute = do-  False <- BinaryBit.getBool-  actorId <- getInt32Bits-  location <- getVector-  unknown1 <- BinaryBit.getBool-  unknown2 <- getInt32Bits-  pure (ExtendedExplosionAttribute actorId location unknown1 unknown2)--putExtendedExplosionAttribute-  :: ExtendedExplosionAttribute -> BinaryBit.BitPut ()-putExtendedExplosionAttribute extendedExplosionAttribute = do-  BinaryBit.putBool False-  putInt32Bits (extendedExplosionAttributeActorId extendedExplosionAttribute)-  putVector (extendedExplosionAttributeLocation extendedExplosionAttribute)-  BinaryBit.putBool-    (extendedExplosionAttributeUnknown1 extendedExplosionAttribute)-  putInt32Bits (extendedExplosionAttributeUnknown2 extendedExplosionAttribute)
− library/Rattletrap/Attribute/FlaggedInt.hs
@@ -1,22 +0,0 @@-module Rattletrap.Attribute.FlaggedInt where--import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data FlaggedIntAttribute = FlaggedIntAttribute-  { flaggedIntAttributeFlag :: Bool-  , flaggedIntAttributeInt :: Int32-  } deriving (Eq, Ord, Show)--getFlaggedIntAttribute :: BinaryBit.BitGet FlaggedIntAttribute-getFlaggedIntAttribute = do-  flag <- BinaryBit.getBool-  int <- getInt32Bits-  pure (FlaggedIntAttribute flag int)--putFlaggedIntAttribute :: FlaggedIntAttribute -> BinaryBit.BitPut ()-putFlaggedIntAttribute flaggedIntAttribute = do-  BinaryBit.putBool (flaggedIntAttributeFlag flaggedIntAttribute)-  putInt32Bits (flaggedIntAttributeInt flaggedIntAttribute)
− library/Rattletrap/Attribute/Float.hs
@@ -1,19 +0,0 @@-module Rattletrap.Attribute.Float where--import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--newtype FloatAttribute = FloatAttribute-  { floatAttributeValue :: Float32-  } deriving (Eq, Ord, Show)--getFloatAttribute :: BinaryBit.BitGet FloatAttribute-getFloatAttribute = do-  value <- getFloat32Bits-  pure (FloatAttribute value)--putFloatAttribute :: FloatAttribute -> BinaryBit.BitPut ()-putFloatAttribute floatAttribute =-  putFloat32Bits (floatAttributeValue floatAttribute)
− library/Rattletrap/Attribute/GameMode.hs
@@ -1,22 +0,0 @@-module Rattletrap.Attribute.GameMode where--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit-import qualified Data.Word as Word--data GameModeAttribute = GameModeAttribute-  { gameModeAttributeNumBits :: Int-  , gameModeAttributeWord :: Word.Word8-  } deriving (Eq, Ord, Show)--getGameModeAttribute :: (Int, Int, Int) -> BinaryBit.BitGet GameModeAttribute-getGameModeAttribute version = do-  let numBits = if version < (868, 12, 0) then 2 else 8-  word <- BinaryBit.getWord8 numBits-  pure (GameModeAttribute numBits word)--putGameModeAttribute :: GameModeAttribute -> BinaryBit.BitPut ()-putGameModeAttribute gameModeAttribute = do-  let numBits = gameModeAttributeNumBits gameModeAttribute-  let word = gameModeAttributeWord gameModeAttribute-  BinaryBit.putWord8 numBits word
− library/Rattletrap/Attribute/Int.hs
@@ -1,18 +0,0 @@-module Rattletrap.Attribute.Int where--import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--newtype IntAttribute = IntAttribute-  { intAttributeValue :: Int32-  } deriving (Eq, Ord, Show)--getIntAttribute :: BinaryBit.BitGet IntAttribute-getIntAttribute = do-  value <- getInt32Bits-  pure (IntAttribute value)--putIntAttribute :: IntAttribute -> BinaryBit.BitPut ()-putIntAttribute intAttribute = putInt32Bits (intAttributeValue intAttribute)
− library/Rattletrap/Attribute/Loadout.hs
@@ -1,83 +0,0 @@-module Rattletrap.Attribute.Loadout where--import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data LoadoutAttribute = LoadoutAttribute-  { loadoutAttributeVersion :: Word8-  , loadoutAttributeBody :: Word32-  , loadoutAttributeDecal :: Word32-  , loadoutAttributeWheels :: Word32-  , loadoutAttributeRocketTrail :: Word32-  -- ^ Now known as "rocket boost".-  , loadoutAttributeAntenna :: Word32-  , loadoutAttributeTopper :: Word32-  , loadoutAttributeUnknown1 :: Word32-  , loadoutAttributeUnknown2 :: Maybe Word32-  , loadoutAttributeEngineAudio :: Maybe Word32-  , loadoutAttributeTrail :: Maybe Word32-  , loadoutAttributeGoalExplosion :: Maybe Word32-  , loadoutAttributeBanner :: Maybe Word32-  } deriving (Eq, Ord, Show)--getLoadoutAttribute :: BinaryBit.BitGet LoadoutAttribute-getLoadoutAttribute = do-  version <- getWord8Bits-  body <- getWord32Bits-  decal <- getWord32Bits-  wheels <- getWord32Bits-  rocketTrail <- getWord32Bits-  antenna <- getWord32Bits-  topper <- getWord32Bits-  unknown1 <- getWord32Bits-  unknown2 <- getOptional (version > Word8 10) getWord32Bits-  engineAudio <- getOptional (version >= Word8 16) getWord32Bits-  trail <- getOptional (version >= Word8 16) getWord32Bits-  goalExplosion <- getOptional (version >= Word8 16) getWord32Bits-  banner <- getOptional (version >= Word8 17) getWord32Bits-  pure-    ( LoadoutAttribute-      version-      body-      decal-      wheels-      rocketTrail-      antenna-      topper-      unknown1-      unknown2-      engineAudio-      trail-      goalExplosion-      banner-    )--getOptional :: Bool -> BinaryBit.BitGet a -> BinaryBit.BitGet (Maybe a)-getOptional p f = if p-  then do-    x <- f-    pure (Just x)-  else pure Nothing--putLoadoutAttribute :: LoadoutAttribute -> BinaryBit.BitPut ()-putLoadoutAttribute loadoutAttribute = do-  putWord8Bits (loadoutAttributeVersion loadoutAttribute)-  putWord32Bits (loadoutAttributeBody loadoutAttribute)-  putWord32Bits (loadoutAttributeDecal loadoutAttribute)-  putWord32Bits (loadoutAttributeWheels loadoutAttribute)-  putWord32Bits (loadoutAttributeRocketTrail loadoutAttribute)-  putWord32Bits (loadoutAttributeAntenna loadoutAttribute)-  putWord32Bits (loadoutAttributeTopper loadoutAttribute)-  putWord32Bits (loadoutAttributeUnknown1 loadoutAttribute)-  putOptional (loadoutAttributeUnknown2 loadoutAttribute) putWord32Bits-  putOptional (loadoutAttributeEngineAudio loadoutAttribute) putWord32Bits-  putOptional (loadoutAttributeTrail loadoutAttribute) putWord32Bits-  putOptional (loadoutAttributeGoalExplosion loadoutAttribute) putWord32Bits-  putOptional (loadoutAttributeBanner loadoutAttribute) putWord32Bits--putOptional :: Maybe a -> (a -> BinaryBit.BitPut ()) -> BinaryBit.BitPut ()-putOptional m f = case m of-  Just x -> f x-  Nothing -> pure ()
− library/Rattletrap/Attribute/LoadoutOnline.hs
@@ -1,30 +0,0 @@-module Rattletrap.Attribute.LoadoutOnline where--import Rattletrap.Attribute.Product-import Rattletrap.Primitive--import qualified Control.Monad as Monad-import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit-import qualified Data.Map as Map--newtype LoadoutOnlineAttribute = LoadoutOnlineAttribute-  { loadoutAttributeValue :: [[ProductAttribute]]-  } deriving (Eq, Ord, Show)--getLoadoutOnlineAttribute-  :: (Int, Int, Int)-  -> Map.Map Word32 Text-  -> BinaryBit.BitGet LoadoutOnlineAttribute-getLoadoutOnlineAttribute version objectMap = do-  size <- getWord8Bits-  values <- Monad.replicateM-    (fromIntegral (word8Value size))-    (getProductAttributes version objectMap)-  pure (LoadoutOnlineAttribute values)--putLoadoutOnlineAttribute :: LoadoutOnlineAttribute -> BinaryBit.BitPut ()-putLoadoutOnlineAttribute loadoutAttribute = do-  let attributes = loadoutAttributeValue loadoutAttribute-  putWord8Bits (Word8 (fromIntegral (length attributes)))-  mapM_ putProductAttributes attributes
− library/Rattletrap/Attribute/Loadouts.hs
@@ -1,22 +0,0 @@-module Rattletrap.Attribute.Loadouts where--import Rattletrap.Attribute.Loadout--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data LoadoutsAttribute = LoadoutsAttribute-  { loadoutsAttributeBlue :: LoadoutAttribute-  , loadoutsAttributeOrange :: LoadoutAttribute-  } deriving (Eq, Ord, Show)--getLoadoutsAttribute :: BinaryBit.BitGet LoadoutsAttribute-getLoadoutsAttribute = do-  blue <- getLoadoutAttribute-  orange <- getLoadoutAttribute-  pure (LoadoutsAttribute blue orange)--putLoadoutsAttribute :: LoadoutsAttribute -> BinaryBit.BitPut ()-putLoadoutsAttribute loadoutsAttribute = do-  putLoadoutAttribute (loadoutsAttributeBlue loadoutsAttribute)-  putLoadoutAttribute (loadoutsAttributeOrange loadoutsAttribute)
− library/Rattletrap/Attribute/LoadoutsOnline.hs
@@ -1,35 +0,0 @@-module Rattletrap.Attribute.LoadoutsOnline where--import Rattletrap.Attribute.LoadoutOnline-import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit-import qualified Data.Map as Map--data LoadoutsOnlineAttribute = LoadoutsOnlineAttribute-  { loadoutsOnlineAttributeBlue :: LoadoutOnlineAttribute-  , loadoutsOnlineAttributeOrange :: LoadoutOnlineAttribute-  , loadoutsOnlineAttributeUnknown1 :: Bool-  , loadoutsOnlineAttributeUnknown2 :: Bool-  } deriving (Eq, Ord, Show)--getLoadoutsOnlineAttribute-  :: (Int, Int, Int)-  -> Map.Map Word32 Text-  -> BinaryBit.BitGet LoadoutsOnlineAttribute-getLoadoutsOnlineAttribute version objectMap = do-  blueLoadout <- getLoadoutOnlineAttribute version objectMap-  orangeLoadout <- getLoadoutOnlineAttribute version objectMap-  unknown1 <- BinaryBit.getBool-  unknown2 <- BinaryBit.getBool-  pure (LoadoutsOnlineAttribute blueLoadout orangeLoadout unknown1 unknown2)--putLoadoutsOnlineAttribute :: LoadoutsOnlineAttribute -> BinaryBit.BitPut ()-putLoadoutsOnlineAttribute loadoutsOnlineAttribute = do-  putLoadoutOnlineAttribute-    (loadoutsOnlineAttributeBlue loadoutsOnlineAttribute)-  putLoadoutOnlineAttribute-    (loadoutsOnlineAttributeOrange loadoutsOnlineAttribute)-  BinaryBit.putBool (loadoutsOnlineAttributeUnknown1 loadoutsOnlineAttribute)-  BinaryBit.putBool (loadoutsOnlineAttributeUnknown2 loadoutsOnlineAttribute)
− library/Rattletrap/Attribute/Location.hs
@@ -1,19 +0,0 @@-module Rattletrap.Attribute.Location where--import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--newtype LocationAttribute = LocationAttribute-  { locationAttributeValue :: Vector-  } deriving (Eq, Ord, Show)--getLocationAttribute :: BinaryBit.BitGet LocationAttribute-getLocationAttribute = do-  value <- getVector-  pure (LocationAttribute value)--putLocationAttribute :: LocationAttribute -> BinaryBit.BitPut ()-putLocationAttribute locationAttribute =-  putVector (locationAttributeValue locationAttribute)
− library/Rattletrap/Attribute/MusicStinger.hs
@@ -1,25 +0,0 @@-module Rattletrap.Attribute.MusicStinger where--import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data MusicStingerAttribute = MusicStingerAttribute-  { musicStingerAttributeFlag :: Bool-  , musicStingerAttributeCue :: Word32-  , musicStingerAttributeTrigger :: Word8-  } deriving (Eq, Ord, Show)--getMusicStingerAttribute :: BinaryBit.BitGet MusicStingerAttribute-getMusicStingerAttribute = do-  flag <- BinaryBit.getBool-  cue <- getWord32Bits-  trigger <- getWord8Bits-  pure (MusicStingerAttribute flag cue trigger)--putMusicStingerAttribute :: MusicStingerAttribute -> BinaryBit.BitPut ()-putMusicStingerAttribute musicStingerAttribute = do-  BinaryBit.putBool (musicStingerAttributeFlag musicStingerAttribute)-  putWord32Bits (musicStingerAttributeCue musicStingerAttribute)-  putWord8Bits (musicStingerAttributeTrigger musicStingerAttribute)
− library/Rattletrap/Attribute/PartyLeader.hs
@@ -1,32 +0,0 @@-module Rattletrap.Attribute.PartyLeader where--import Rattletrap.Primitive-import Rattletrap.RemoteId--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data PartyLeaderAttribute = PartyLeaderAttribute-  { partyLeaderAttributeSystemId :: Word8-  , partyLeaderAttributeId :: Maybe (RemoteId, Word8)-  } deriving (Eq, Ord, Show)--getPartyLeaderAttribute :: (Int, Int, Int) -> BinaryBit.BitGet PartyLeaderAttribute-getPartyLeaderAttribute version = do-  systemId <- getWord8Bits-  maybeRemoteAndLocalId <- if systemId == Word8 0-    then pure Nothing-    else do-      remoteId <- getRemoteId version systemId-      localId <- getWord8Bits-      pure (Just (remoteId, localId))-  pure (PartyLeaderAttribute systemId maybeRemoteAndLocalId)--putPartyLeaderAttribute :: PartyLeaderAttribute -> BinaryBit.BitPut ()-putPartyLeaderAttribute partyLeaderAttribute = do-  putWord8Bits (partyLeaderAttributeSystemId partyLeaderAttribute)-  case partyLeaderAttributeId partyLeaderAttribute of-    Nothing -> pure ()-    Just (remoteId, localId) -> do-      putRemoteId remoteId-      putWord8Bits localId
− library/Rattletrap/Attribute/Pickup.hs
@@ -1,31 +0,0 @@-module Rattletrap.Attribute.Pickup where--import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data PickupAttribute = PickupAttribute-  { pickupAttributeInstigatorId :: Maybe Word32-  , pickupAttributePickedUp :: Bool-  } deriving (Eq, Ord, Show)--getPickupAttribute :: BinaryBit.BitGet PickupAttribute-getPickupAttribute = do-  instigator <- BinaryBit.getBool-  maybeInstigatorId <- if instigator-    then do-      instigatorId <- getWord32Bits-      pure (Just instigatorId)-    else pure Nothing-  pickedUp <- BinaryBit.getBool-  pure (PickupAttribute maybeInstigatorId pickedUp)--putPickupAttribute :: PickupAttribute -> BinaryBit.BitPut ()-putPickupAttribute pickupAttribute = do-  case pickupAttributeInstigatorId pickupAttribute of-    Nothing -> BinaryBit.putBool False-    Just instigatorId -> do-      BinaryBit.putBool True-      putWord32Bits instigatorId-  BinaryBit.putBool (pickupAttributePickedUp pickupAttribute)
− library/Rattletrap/Attribute/PrivateMatchSettings.hs
@@ -1,50 +0,0 @@-module Rattletrap.Attribute.PrivateMatchSettings where--import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data PrivateMatchSettingsAttribute = PrivateMatchSettingsAttribute-  { privateMatchSettingsAttributeMutators :: Text-  , privateMatchSettingsAttributeJoinableBy :: Word32-  , privateMatchSettingsAttributeMaxPlayers :: Word32-  , privateMatchSettingsAttributeGameName :: Text-  , privateMatchSettingsAttributePassword :: Text-  , privateMatchSettingsAttributeFlag :: Bool-  } deriving (Eq, Ord, Show)--getPrivateMatchSettingsAttribute-  :: BinaryBit.BitGet PrivateMatchSettingsAttribute-getPrivateMatchSettingsAttribute = do-  mutators <- getTextBits-  joinableBy <- getWord32Bits-  maxPlayers <- getWord32Bits-  gameName <- getTextBits-  password <- getTextBits-  flag <- BinaryBit.getBool-  pure-    ( PrivateMatchSettingsAttribute-      mutators-      joinableBy-      maxPlayers-      gameName-      password-      flag-    )--putPrivateMatchSettingsAttribute-  :: PrivateMatchSettingsAttribute -> BinaryBit.BitPut ()-putPrivateMatchSettingsAttribute privateMatchSettingsAttribute = do-  putTextBits-    (privateMatchSettingsAttributeMutators privateMatchSettingsAttribute)-  putWord32Bits-    (privateMatchSettingsAttributeJoinableBy privateMatchSettingsAttribute)-  putWord32Bits-    (privateMatchSettingsAttributeMaxPlayers privateMatchSettingsAttribute)-  putTextBits-    (privateMatchSettingsAttributeGameName privateMatchSettingsAttribute)-  putTextBits-    (privateMatchSettingsAttributePassword privateMatchSettingsAttribute)-  BinaryBit.putBool-    (privateMatchSettingsAttributeFlag privateMatchSettingsAttribute)
− library/Rattletrap/Attribute/Product.hs
@@ -1,87 +0,0 @@-module Rattletrap.Attribute.Product where--import Rattletrap.Primitive--import qualified Control.Monad as Monad-import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit-import qualified Data.Map as Map-import qualified Data.Word as Word--data ProductAttribute = ProductAttribute-  { productAttributeUnknown :: Bool-  , productAttributeObjectId :: Word32-  , productAttributeObjectName :: Maybe Text-  -- ^ read-only-  , productAttributeValue :: Maybe (Either CompressedWord Word.Word32)-  } deriving (Eq, Ord, Show)--getProductAttributes-  :: (Int, Int, Int) -> Map.Map Word32 Text -> BinaryBit.BitGet [ProductAttribute]-getProductAttributes version objectMap = do-  size <- getWord8Bits-  Monad.replicateM-    (fromIntegral (word8Value size))-    (getProductAttribute version objectMap)--getProductAttribute-  :: (Int, Int, Int) -> Map.Map Word32 Text -> BinaryBit.BitGet ProductAttribute-getProductAttribute version objectMap = do-  flag <- BinaryBit.getBool-  objectId <- getWord32Bits-  let objectName = Map.lookup objectId objectMap-  value <- case objectName of-    Just name -> case textToString name of-      "TAGame.ProductAttribute_Painted_TA" -> if version >= (868, 18, 0)-        then do-          x <- BinaryBit.getWord32be 31-          pure (Just (Right x))-        else do-          x <- getCompressedWord 13-          pure (Just (Left x))-      "TAGame.ProductAttribute_UserColor_TA" -> do-        hasValue <- BinaryBit.getBool-        value <- if hasValue-          then do-            x <- BinaryBit.getWord32be 31-            pure (Just (Right x))-          else pure Nothing-        pure value-      _ ->-        fail-          ( "unknown object name "-          ++ show objectName-          ++ " for ID "-          ++ show objectId-          )-    Nothing -> fail ("missing object name for ID " ++ show objectId)-  pure (ProductAttribute flag objectId objectName value)--putProductAttributes :: [ProductAttribute] -> BinaryBit.BitPut ()-putProductAttributes attributes = do-  putWord8Bits (Word8 (fromIntegral (length attributes)))-  mapM_ putProductAttribute attributes--putProductAttribute :: ProductAttribute -> BinaryBit.BitPut ()-putProductAttribute attribute = do-  BinaryBit.putBool (productAttributeUnknown attribute)-  putWord32Bits (productAttributeObjectId attribute)-  case productAttributeObjectName attribute of-    Just name -> case textToString name of-      "TAGame.ProductAttribute_Painted_TA" ->-        case productAttributeValue attribute of-          Nothing -> pure ()-          Just (Left x) -> putCompressedWord x-          Just (Right x) -> BinaryBit.putWord32be 31 x-      "TAGame.ProductAttribute_UserColor_TA" ->-        case productAttributeValue attribute of-          Nothing -> BinaryBit.putBool False-          Just value -> do-            BinaryBit.putBool True-            case value of-              Left x -> putCompressedWord x-              Right x -> BinaryBit.putWord32be 31 x-      _ ->-        fail ("unknown object name for product attribute " ++ show attribute)-    Nothing ->-      fail ("missing object name for product attribute " ++ show attribute)
− library/Rattletrap/Attribute/QWord.hs
@@ -1,19 +0,0 @@-module Rattletrap.Attribute.QWord where--import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--newtype QWordAttribute = QWordAttribute-  { qWordAttributeValue :: Word64-  } deriving (Eq, Ord, Show)--getQWordAttribute :: BinaryBit.BitGet QWordAttribute-getQWordAttribute = do-  value <- getWord64Bits-  pure (QWordAttribute value)--putQWordAttribute :: QWordAttribute -> BinaryBit.BitPut ()-putQWordAttribute qWordAttribute =-  putWord64Bits (qWordAttributeValue qWordAttribute)
− library/Rattletrap/Attribute/Reservation.hs
@@ -1,48 +0,0 @@-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, Int) -> BinaryBit.BitGet ReservationAttribute-getReservationAttribute version = do-  number <- getCompressedWord 7-  uniqueId <- getUniqueIdAttribute version-  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, 0)-    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
− library/Rattletrap/Attribute/RigidBodyState.hs
@@ -1,51 +0,0 @@-module Rattletrap.Attribute.RigidBodyState where--import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data RigidBodyStateAttribute = RigidBodyStateAttribute-  { rigidBodyStateAttributeSleeping :: Bool-  , rigidBodyStateAttributeLocation :: Vector-  , rigidBodyStateAttributeRotation :: CompressedWordVector-  , rigidBodyStateAttributeLinearVelocity :: Maybe Vector-  , rigidBodyStateAttributeAngularVelocity :: Maybe Vector-  } deriving (Eq, Ord, Show)--getRigidBodyStateAttribute :: BinaryBit.BitGet RigidBodyStateAttribute-getRigidBodyStateAttribute = do-  sleeping <- BinaryBit.getBool-  location <- getVector-  rotation <- getCompressedWordVector-  linearVelocity <- if sleeping-    then pure Nothing-    else do-      linearVelocity <- getVector-      pure (Just linearVelocity)-  angularVelocity <- if sleeping-    then pure Nothing-    else do-      angularVelocity <- getVector-      pure (Just angularVelocity)-  pure-    ( RigidBodyStateAttribute-      sleeping-      location-      rotation-      linearVelocity-      angularVelocity-    )--putRigidBodyStateAttribute :: RigidBodyStateAttribute -> BinaryBit.BitPut ()-putRigidBodyStateAttribute rigidBodyStateAttribute = do-  BinaryBit.putBool (rigidBodyStateAttributeSleeping rigidBodyStateAttribute)-  putVector (rigidBodyStateAttributeLocation rigidBodyStateAttribute)-  putCompressedWordVector-    (rigidBodyStateAttributeRotation rigidBodyStateAttribute)-  case rigidBodyStateAttributeLinearVelocity rigidBodyStateAttribute of-    Nothing -> pure ()-    Just linearVelocity -> putVector linearVelocity-  case rigidBodyStateAttributeAngularVelocity rigidBodyStateAttribute of-    Nothing -> pure ()-    Just angularVelocity -> putVector angularVelocity
− library/Rattletrap/Attribute/String.hs
@@ -1,19 +0,0 @@-module Rattletrap.Attribute.String where--import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--newtype StringAttribute = StringAttribute-  { stringAttributeValue :: Text-  } deriving (Eq, Ord, Show)--getStringAttribute :: BinaryBit.BitGet StringAttribute-getStringAttribute = do-  value <- getTextBits-  pure (StringAttribute value)--putStringAttribute :: StringAttribute -> BinaryBit.BitPut ()-putStringAttribute stringAttribute =-  putTextBits (stringAttributeValue stringAttribute)
− library/Rattletrap/Attribute/TeamPaint.hs
@@ -1,38 +0,0 @@-module Rattletrap.Attribute.TeamPaint where--import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data TeamPaintAttribute = TeamPaintAttribute-  { teamPaintAttributeTeam :: Word8-  , teamPaintAttributePrimaryColor :: Word8-  , teamPaintAttributeAccentColor :: Word8-  , teamPaintAttributePrimaryFinish :: Word32-  , teamPaintAttributeAccentFinish :: Word32-  } deriving (Eq, Ord, Show)--getTeamPaintAttribute :: BinaryBit.BitGet TeamPaintAttribute-getTeamPaintAttribute = do-  team <- getWord8Bits-  primaryColor <- getWord8Bits-  accentColor <- getWord8Bits-  primaryFinish <- getWord32Bits-  accentFinish <- getWord32Bits-  pure-    ( TeamPaintAttribute-      team-      primaryColor-      accentColor-      primaryFinish-      accentFinish-    )--putTeamPaintAttribute :: TeamPaintAttribute -> BinaryBit.BitPut ()-putTeamPaintAttribute teamPaintAttribute = do-  putWord8Bits (teamPaintAttributeTeam teamPaintAttribute)-  putWord8Bits (teamPaintAttributePrimaryColor teamPaintAttribute)-  putWord8Bits (teamPaintAttributeAccentColor teamPaintAttribute)-  putWord32Bits (teamPaintAttributePrimaryFinish teamPaintAttribute)-  putWord32Bits (teamPaintAttributeAccentFinish teamPaintAttribute)
− library/Rattletrap/Attribute/UniqueId.hs
@@ -1,26 +0,0 @@-module Rattletrap.Attribute.UniqueId where--import Rattletrap.Primitive-import Rattletrap.RemoteId--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data UniqueIdAttribute = UniqueIdAttribute-  { uniqueIdAttributeSystemId :: Word8-  , uniqueIdAttributeRemoteId :: RemoteId-  , uniqueIdAttributeLocalId :: Word8-  } deriving (Eq, Ord, Show)--getUniqueIdAttribute :: (Int, Int, Int) -> BinaryBit.BitGet UniqueIdAttribute-getUniqueIdAttribute version = do-  systemId <- getWord8Bits-  remoteId <- getRemoteId version systemId-  localId <- getWord8Bits-  pure (UniqueIdAttribute systemId remoteId localId)--putUniqueIdAttribute :: UniqueIdAttribute -> BinaryBit.BitPut ()-putUniqueIdAttribute uniqueIdAttribute = do-  putWord8Bits (uniqueIdAttributeSystemId uniqueIdAttribute)-  putRemoteId (uniqueIdAttributeRemoteId uniqueIdAttribute)-  putWord8Bits (uniqueIdAttributeLocalId uniqueIdAttribute)
− library/Rattletrap/Attribute/WeldedInfo.hs
@@ -1,31 +0,0 @@-module Rattletrap.Attribute.WeldedInfo where--import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data WeldedInfoAttribute = WeldedInfoAttribute-  { weldedInfoAttributeActive :: Bool-  , weldedInfoAttributeActorId :: Int32-  , weldedInfoAttributeOffset :: Vector-  , weldedInfoAttributeMass :: Float32-  , weldedInfoAttributeRotation :: Int8Vector-  } deriving (Eq, Ord, Show)--getWeldedInfoAttribute :: BinaryBit.BitGet WeldedInfoAttribute-getWeldedInfoAttribute = do-  active <- BinaryBit.getBool-  actorId <- getInt32Bits-  offset <- getVector-  mass <- getFloat32Bits-  rotation <- getInt8Vector-  pure (WeldedInfoAttribute active actorId offset mass rotation)--putWeldedInfoAttribute :: WeldedInfoAttribute -> BinaryBit.BitPut ()-putWeldedInfoAttribute weldedInfoAttribute = do-  BinaryBit.putBool (weldedInfoAttributeActive weldedInfoAttribute)-  putInt32Bits (weldedInfoAttributeActorId weldedInfoAttribute)-  putVector (weldedInfoAttributeOffset weldedInfoAttribute)-  putFloat32Bits (weldedInfoAttributeMass weldedInfoAttribute)-  putInt8Vector (weldedInfoAttributeRotation weldedInfoAttribute)
− library/Rattletrap/AttributeMapping.hs
@@ -1,21 +0,0 @@-module Rattletrap.AttributeMapping where--import Rattletrap.Primitive--import qualified Data.Binary as Binary--data AttributeMapping = AttributeMapping-  { attributeMappingObjectId :: Word32-  , attributeMappingStreamId :: Word32-  } deriving (Eq, Ord, Show)--getAttributeMapping :: Binary.Get AttributeMapping-getAttributeMapping = do-  objectId <- getWord32-  streamId <- getWord32-  pure (AttributeMapping objectId streamId)--putAttributeMapping :: AttributeMapping -> Binary.Put-putAttributeMapping attributeMapping = do-  putWord32 (attributeMappingObjectId attributeMapping)-  putWord32 (attributeMappingStreamId attributeMapping)
− library/Rattletrap/AttributeType.hs
@@ -1,34 +0,0 @@-module Rattletrap.AttributeType where--data AttributeType-  = AppliedDamageAttributeType-  | BooleanAttributeType-  | ByteAttributeType-  | CamSettingsAttributeType-  | ClubColorsAttributeType-  | DamageStateAttributeType-  | DemolishAttributeType-  | EnumAttributeType-  | ExplosionAttributeType-  | ExtendedExplosionAttributeType-  | FlaggedIntAttributeType-  | FloatAttributeType-  | GameModeAttributeType-  | IntAttributeType-  | LoadoutAttributeType-  | LoadoutOnlineAttributeType-  | LoadoutsAttributeType-  | LoadoutsOnlineAttributeType-  | LocationAttributeType-  | MusicStingerAttributeType-  | PartyLeaderAttributeType-  | PickupAttributeType-  | PrivateMatchSettingsAttributeType-  | QWordAttributeType-  | ReservationAttributeType-  | RigidBodyStateAttributeType-  | StringAttributeType-  | TeamPaintAttributeType-  | UniqueIdAttributeType-  | WeldedInfoAttributeType-  deriving (Eq, Ord, Show)
− library/Rattletrap/AttributeValue.hs
@@ -1,242 +0,0 @@-module Rattletrap.AttributeValue-  ( module Rattletrap.AttributeValue-  , module Rattletrap.Attribute.AppliedDamage-  , module Rattletrap.Attribute.Boolean-  , module Rattletrap.Attribute.Byte-  , module Rattletrap.Attribute.CamSettings-  , module Rattletrap.Attribute.ClubColors-  , module Rattletrap.Attribute.DamageState-  , module Rattletrap.Attribute.Demolish-  , module Rattletrap.Attribute.Enum-  , module Rattletrap.Attribute.Explosion-  , module Rattletrap.Attribute.ExtendedExplosion-  , module Rattletrap.Attribute.FlaggedInt-  , module Rattletrap.Attribute.Float-  , module Rattletrap.Attribute.GameMode-  , module Rattletrap.Attribute.Int-  , module Rattletrap.Attribute.Loadout-  , module Rattletrap.Attribute.LoadoutOnline-  , module Rattletrap.Attribute.Loadouts-  , module Rattletrap.Attribute.LoadoutsOnline-  , module Rattletrap.Attribute.Location-  , module Rattletrap.Attribute.MusicStinger-  , module Rattletrap.Attribute.PartyLeader-  , module Rattletrap.Attribute.Pickup-  , module Rattletrap.Attribute.PrivateMatchSettings-  , module Rattletrap.Attribute.Product-  , module Rattletrap.Attribute.QWord-  , module Rattletrap.Attribute.Reservation-  , module Rattletrap.Attribute.RigidBodyState-  , module Rattletrap.Attribute.String-  , module Rattletrap.Attribute.TeamPaint-  , module Rattletrap.Attribute.UniqueId-  , module Rattletrap.Attribute.WeldedInfo-  ) where--import Rattletrap.Attribute.AppliedDamage-import Rattletrap.Attribute.Boolean-import Rattletrap.Attribute.Byte-import Rattletrap.Attribute.CamSettings-import Rattletrap.Attribute.ClubColors-import Rattletrap.Attribute.DamageState-import Rattletrap.Attribute.Demolish-import Rattletrap.Attribute.Enum-import Rattletrap.Attribute.Explosion-import Rattletrap.Attribute.ExtendedExplosion-import Rattletrap.Attribute.FlaggedInt-import Rattletrap.Attribute.Float-import Rattletrap.Attribute.GameMode-import Rattletrap.Attribute.Int-import Rattletrap.Attribute.Loadout-import Rattletrap.Attribute.LoadoutOnline-import Rattletrap.Attribute.Loadouts-import Rattletrap.Attribute.LoadoutsOnline-import Rattletrap.Attribute.Location-import Rattletrap.Attribute.MusicStinger-import Rattletrap.Attribute.PartyLeader-import Rattletrap.Attribute.Pickup-import Rattletrap.Attribute.PrivateMatchSettings-import Rattletrap.Attribute.Product-import Rattletrap.Attribute.QWord-import Rattletrap.Attribute.Reservation-import Rattletrap.Attribute.RigidBodyState-import Rattletrap.Attribute.String-import Rattletrap.Attribute.TeamPaint-import Rattletrap.Attribute.UniqueId-import Rattletrap.Attribute.WeldedInfo-import Rattletrap.AttributeType-import Rattletrap.Data-import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit-import qualified Data.Map.Strict as Map--data AttributeValue-  = AppliedDamageAttributeValue AppliedDamageAttribute-  | BooleanAttributeValue BooleanAttribute-  | ByteAttributeValue ByteAttribute-  | CamSettingsAttributeValue CamSettingsAttribute-  | ClubColorsAttributeValue ClubColorsAttribute-  | DamageStateAttributeValue DamageStateAttribute-  | DemolishAttributeValue DemolishAttribute-  | EnumAttributeValue EnumAttribute-  | ExplosionAttributeValue ExplosionAttribute-  | ExtendedExplosionAttributeValue ExtendedExplosionAttribute-  | FlaggedIntAttributeValue FlaggedIntAttribute-  | FloatAttributeValue FloatAttribute-  | GameModeAttributeValue GameModeAttribute-  | IntAttributeValue IntAttribute-  | LoadoutAttributeValue LoadoutAttribute-  | LoadoutOnlineAttributeValue LoadoutOnlineAttribute-  | LoadoutsAttributeValue LoadoutsAttribute-  | LoadoutsOnlineAttributeValue LoadoutsOnlineAttribute-  | LocationAttributeValue LocationAttribute-  | MusicStingerAttributeValue MusicStingerAttribute-  | PartyLeaderAttributeValue PartyLeaderAttribute-  | PickupAttributeValue PickupAttribute-  | PrivateMatchSettingsAttributeValue PrivateMatchSettingsAttribute-  | QWordAttributeValue QWordAttribute-  | ReservationAttributeValue ReservationAttribute-  | RigidBodyStateAttributeValue RigidBodyStateAttribute-  | StringAttributeValue StringAttribute-  | TeamPaintAttributeValue TeamPaintAttribute-  | UniqueIdAttributeValue UniqueIdAttribute-  | WeldedInfoAttributeValue WeldedInfoAttribute-  deriving (Eq, Ord, Show)--getAttributeValue-  :: (Int, Int, Int)-  -> Map.Map Word32 Text-  -> Text-  -> BinaryBit.BitGet AttributeValue-getAttributeValue version objectMap name =-  case Map.lookup name attributeTypes of-    Just constructor -> case constructor of-      AppliedDamageAttributeType -> do-        x <- getAppliedDamageAttribute-        pure (AppliedDamageAttributeValue x)-      BooleanAttributeType -> do-        x <- getBooleanAttribute-        pure (BooleanAttributeValue x)-      ByteAttributeType -> do-        x <- getByteAttribute-        pure (ByteAttributeValue x)-      CamSettingsAttributeType -> do-        x <- getCamSettingsAttribute version-        pure (CamSettingsAttributeValue x)-      ClubColorsAttributeType -> do-        x <- getClubColorsAttribute-        pure (ClubColorsAttributeValue x)-      DamageStateAttributeType -> do-        x <- getDamageStateAttribute-        pure (DamageStateAttributeValue x)-      DemolishAttributeType -> do-        x <- getDemolishAttribute-        pure (DemolishAttributeValue x)-      EnumAttributeType -> do-        x <- getEnumAttribute-        pure (EnumAttributeValue x)-      ExplosionAttributeType -> do-        x <- getExplosionAttribute-        pure (ExplosionAttributeValue x)-      ExtendedExplosionAttributeType -> do-        x <- getExtendedExplosionAttribute-        pure (ExtendedExplosionAttributeValue x)-      FlaggedIntAttributeType -> do-        x <- getFlaggedIntAttribute-        pure (FlaggedIntAttributeValue x)-      FloatAttributeType -> do-        x <- getFloatAttribute-        pure (FloatAttributeValue x)-      GameModeAttributeType -> do-        x <- getGameModeAttribute version-        pure (GameModeAttributeValue x)-      IntAttributeType -> do-        x <- getIntAttribute-        pure (IntAttributeValue x)-      LoadoutAttributeType -> do-        x <- getLoadoutAttribute-        pure (LoadoutAttributeValue x)-      LoadoutOnlineAttributeType -> do-        x <- getLoadoutOnlineAttribute version objectMap-        pure (LoadoutOnlineAttributeValue x)-      LoadoutsAttributeType -> do-        x <- getLoadoutsAttribute-        pure (LoadoutsAttributeValue x)-      LoadoutsOnlineAttributeType -> do-        x <- getLoadoutsOnlineAttribute version objectMap-        pure (LoadoutsOnlineAttributeValue x)-      LocationAttributeType -> do-        x <- getLocationAttribute-        pure (LocationAttributeValue x)-      MusicStingerAttributeType -> do-        x <- getMusicStingerAttribute-        pure (MusicStingerAttributeValue x)-      PartyLeaderAttributeType -> do-        x <- getPartyLeaderAttribute version-        pure (PartyLeaderAttributeValue x)-      PickupAttributeType -> do-        x <- getPickupAttribute-        pure (PickupAttributeValue x)-      PrivateMatchSettingsAttributeType -> do-        x <- getPrivateMatchSettingsAttribute-        pure (PrivateMatchSettingsAttributeValue x)-      QWordAttributeType -> do-        x <- getQWordAttribute-        pure (QWordAttributeValue x)-      ReservationAttributeType -> do-        x <- getReservationAttribute version-        pure (ReservationAttributeValue x)-      RigidBodyStateAttributeType -> do-        x <- getRigidBodyStateAttribute-        pure (RigidBodyStateAttributeValue x)-      StringAttributeType -> do-        x <- getStringAttribute-        pure (StringAttributeValue x)-      TeamPaintAttributeType -> do-        x <- getTeamPaintAttribute-        pure (TeamPaintAttributeValue x)-      UniqueIdAttributeType -> do-        x <- getUniqueIdAttribute version-        pure (UniqueIdAttributeValue x)-      WeldedInfoAttributeType -> do-        x <- getWeldedInfoAttribute-        pure (WeldedInfoAttributeValue x)-    Nothing -> fail ("don't know how to get attribute value " ++ show name)--attributeTypes :: Map.Map Text AttributeType-attributeTypes = Map.mapKeys stringToText (Map.fromList rawAttributeTypes)--putAttributeValue :: AttributeValue -> BinaryBit.BitPut ()-putAttributeValue value = case value of-  AppliedDamageAttributeValue x -> putAppliedDamageAttribute x-  BooleanAttributeValue x -> putBooleanAttribute x-  ByteAttributeValue x -> putByteAttribute x-  CamSettingsAttributeValue x -> putCamSettingsAttribute x-  ClubColorsAttributeValue x -> putClubColorsAttribute x-  DamageStateAttributeValue x -> putDamageStateAttribute x-  DemolishAttributeValue x -> putDemolishAttribute x-  EnumAttributeValue x -> putEnumAttribute x-  ExplosionAttributeValue x -> putExplosionAttribute x-  ExtendedExplosionAttributeValue x -> putExtendedExplosionAttribute x-  FlaggedIntAttributeValue x -> putFlaggedIntAttribute x-  FloatAttributeValue x -> putFloatAttribute x-  GameModeAttributeValue x -> putGameModeAttribute x-  IntAttributeValue x -> putIntAttribute x-  LoadoutAttributeValue x -> putLoadoutAttribute x-  LoadoutOnlineAttributeValue x -> putLoadoutOnlineAttribute x-  LoadoutsAttributeValue x -> putLoadoutsAttribute x-  LoadoutsOnlineAttributeValue x -> putLoadoutsOnlineAttribute x-  LocationAttributeValue x -> putLocationAttribute x-  MusicStingerAttributeValue x -> putMusicStingerAttribute x-  PartyLeaderAttributeValue x -> putPartyLeaderAttribute x-  PickupAttributeValue x -> putPickupAttribute x-  PrivateMatchSettingsAttributeValue x -> putPrivateMatchSettingsAttribute x-  QWordAttributeValue x -> putQWordAttribute x-  ReservationAttributeValue x -> putReservationAttribute x-  RigidBodyStateAttributeValue x -> putRigidBodyStateAttribute x-  StringAttributeValue x -> putStringAttribute x-  TeamPaintAttributeValue x -> putTeamPaintAttribute x-  UniqueIdAttributeValue x -> putUniqueIdAttribute x-  WeldedInfoAttributeValue x -> putWeldedInfoAttribute x
− library/Rattletrap/Cache.hs
@@ -1,28 +0,0 @@-module Rattletrap.Cache where--import Rattletrap.AttributeMapping-import Rattletrap.Primitive--import qualified Data.Binary as Binary--data Cache = Cache-  { cacheClassId :: Word32-  , cacheParentCacheId :: Word32-  , cacheCacheId :: Word32-  , cacheAttributeMappings :: List AttributeMapping-  } deriving (Eq, Ord, Show)--getCache :: Binary.Get Cache-getCache = do-  classId <- getWord32-  parentCacheId <- getWord32-  cacheId <- getWord32-  attributeMappings <- getList getAttributeMapping-  pure (Cache classId parentCacheId cacheId attributeMappings)--putCache :: Cache -> Binary.Put-putCache cache = do-  putWord32 (cacheClassId cache)-  putWord32 (cacheParentCacheId cache)-  putWord32 (cacheCacheId cache)-  putList putAttributeMapping (cacheAttributeMappings cache)
− library/Rattletrap/ClassAttributeMap.hs
@@ -1,300 +0,0 @@-module Rattletrap.ClassAttributeMap where--import Rattletrap.ActorMap-import Rattletrap.AttributeMapping-import Rattletrap.Cache-import Rattletrap.ClassMapping-import Rattletrap.Data-import Rattletrap.Primitive--import qualified Data.Bimap as Bimap-import qualified Data.IntMap.Strict as IntMap-import qualified Data.List as List-import qualified Data.Map.Strict as Map-import qualified Data.Maybe as Maybe-import qualified Data.Set as Set-import qualified Data.Text as Text---- | This data structure holds all the information about classes, objects, and--- attributes in the replay. The class hierarchy is not fixed; it is encoded--- in the 'Rattletrap.Content.Content'. Similarly, the attributes that belong--- to each class are not fixed either. Converting the raw data into a usable--- structure is tedious; see 'makeClassAttributeMap'.-data ClassAttributeMap = ClassAttributeMap-  { classAttributeMapObjectMap :: Map.Map Word32 Text-  -- ^ A map from object IDs to their names.-  , classAttributeMapObjectClassMap :: Map.Map Word32 Word32-  -- ^ A map from object IDs to their class IDs.-  , classAttributeMapValue :: Map.Map Word32 (Map.Map Word32 Word32)-  -- ^ A map from class IDs to a map from attribute stream IDs to attribute-  -- IDs.-  , classAttributeMapNameMap :: IntMap.IntMap Text-  } deriving (Eq, Ord, Show)---- | Makes a 'ClassAttributeMap' given the necessary fields from the--- 'Rattletrap.Content.Content'.-makeClassAttributeMap-  :: List Text-  -- ^ From 'Rattletrap.Content.contentObjects'.-  -> List ClassMapping-  -- ^ From 'Rattletrap.Content.contentClassMappings'.-  -> List Cache-  -- ^ From 'Rattletrap.Content.contentCaches'.-  -> List Text-  -- ^ From 'Rattletrap.Content.contentNames'.-  -> ClassAttributeMap-makeClassAttributeMap objects classMappings caches names =-  let-    objectMap = makeObjectMap objects-    classMap = makeClassMap classMappings-    objectClassMap = makeObjectClassMap objectMap classMap-    classCache = makeClassCache classMap caches-    attributeMap = makeAttributeMap caches-    classIds = map (\(_, classId, _, _) -> classId) classCache-    parentMap = makeParentMap classCache-    value = Map.fromList-      ( map-        ( \classId ->-          let-            ownAttributes =-              Maybe.fromMaybe Map.empty (Map.lookup classId attributeMap)-            parentsAttributes = case Map.lookup classId parentMap of-              Nothing -> []-              Just parentClassIds -> map-                ( \parentClassId -> Maybe.fromMaybe-                  Map.empty-                  (Map.lookup parentClassId attributeMap)-                )-                parentClassIds-            attributes = ownAttributes : parentsAttributes-          in (classId, Map.fromList (concatMap Map.toList attributes))-        )-        classIds-      )-    nameMap = makeNameMap names-  in ClassAttributeMap objectMap objectClassMap value nameMap--makeNameMap :: List Text -> IntMap.IntMap Text-makeNameMap names = IntMap.fromDistinctAscList (zip [0 ..] (listValue names))--getName :: IntMap.IntMap Text -> Word32 -> Maybe Text-getName nameMap nameIndex =-  IntMap.lookup (fromIntegral (word32Value nameIndex)) nameMap--makeObjectClassMap-  :: Map.Map Word32 Text -> Bimap.Bimap Word32 Text -> Map.Map Word32 Word32-makeObjectClassMap objectMap classMap = do-  let objectIds = Map.keys objectMap-  let classIds = map (getClassId objectMap classMap) objectIds-  let rawPairs = zip objectIds classIds-  let-    pairs = Maybe.mapMaybe-      ( \(objectId, maybeClassId) -> case maybeClassId of-        Nothing -> Nothing-        Just classId -> Just (objectId, classId)-      )-      rawPairs-  Map.fromList pairs--getClassId-  :: Map.Map Word32 Text -> Bimap.Bimap Word32 Text -> Word32 -> Maybe Word32-getClassId objectMap classMap objectId = do-  objectName <- getObjectName objectMap objectId-  className <- getClassName objectName-  Bimap.lookupR className classMap--makeClassCache-  :: Bimap.Bimap Word32 Text-  -> List Cache-  -> [(Maybe Text, Word32, Word32, Word32)]-makeClassCache classMap caches = map-  ( \cache ->-    let-      classId = cacheClassId cache-    in-      ( Bimap.lookup classId classMap-      , classId-      , cacheCacheId cache-      , cacheParentCacheId cache-      )-  )-  (listValue caches)--makeClassMap :: List ClassMapping -> Bimap.Bimap Word32 Text-makeClassMap classMappings = Bimap.fromList-  ( map-    ( \classMapping ->-      (classMappingStreamId classMapping, classMappingName classMapping)-    )-    (listValue classMappings)-  )--makeAttributeMap :: List Cache -> Map.Map Word32 (Map.Map Word32 Word32)-makeAttributeMap caches = Map.fromList-  ( map-    ( \cache ->-      ( cacheClassId cache-      , Map.fromList-        ( map-          ( \attributeMapping ->-            ( attributeMappingStreamId attributeMapping-            , attributeMappingObjectId attributeMapping-            )-          )-          (listValue (cacheAttributeMappings cache))-        )-      )-    )-    (listValue caches)-  )--makeShallowParentMap-  :: [(Maybe Text, Word32, Word32, Word32)] -> Map.Map Word32 Word32-makeShallowParentMap classCache = Map.fromList-  ( Maybe.mapMaybe-    ( \xs -> case xs of-      [] -> Nothing-      (maybeClassName, classId, _, parentCacheId):rest -> do-        parentClassId <- getParentClass maybeClassName parentCacheId rest-        pure (classId, parentClassId)-    )-    (List.tails (reverse classCache))-  )--makeParentMap-  :: [(Maybe Text, Word32, Word32, Word32)] -> Map.Map Word32 [Word32]-makeParentMap classCache =-  let-    shallowParentMap = makeShallowParentMap classCache-  in-    Map.mapWithKey-      (\classId _ -> getParentClasses shallowParentMap classId)-      shallowParentMap--getParentClasses :: Map.Map Word32 Word32 -> Word32 -> [Word32]-getParentClasses shallowParentMap classId =-  case Map.lookup classId shallowParentMap of-    Nothing -> []-    Just parentClassId ->-      parentClassId : getParentClasses shallowParentMap parentClassId--getParentClass-  :: Maybe Text-  -> Word32-  -> [(Maybe Text, Word32, Word32, Word32)]-  -> Maybe Word32-getParentClass maybeClassName parentCacheId xs = case maybeClassName of-  Nothing -> getParentClassById parentCacheId xs-  Just className -> getParentClassByName className parentCacheId xs--getParentClassById-  :: Word32 -> [(Maybe Text, Word32, Word32, Word32)] -> Maybe Word32-getParentClassById parentCacheId xs =-  case dropWhile (\(_, _, cacheId, _) -> cacheId /= parentCacheId) xs of-    [] -> if parentCacheId == Word32 0-      then Nothing-      else getParentClassById (Word32 (word32Value parentCacheId - 1)) xs-    (_, parentClassId, _, _):_ -> Just parentClassId--getParentClassByName-  :: Text -> Word32 -> [(Maybe Text, Word32, Word32, Word32)] -> Maybe Word32-getParentClassByName className parentCacheId xs =-  case Map.lookup className parentClasses of-    Nothing -> getParentClassById parentCacheId xs-    Just parentClassName -> Maybe.maybe-      (getParentClassById parentCacheId xs)-      Just-      ( Maybe.listToMaybe-        ( map-          (\(_, parentClassId, _, _) -> parentClassId)-          ( filter-            (\(_, _, cacheId, _) -> cacheId <= parentCacheId)-            ( filter-              ( \(maybeClassName, _, _, _) ->-                maybeClassName == Just parentClassName-              )-              xs-            )-          )-        )-      )--parentClasses :: Map.Map Text Text-parentClasses = Map.map-  stringToText-  (Map.mapKeys stringToText (Map.fromList rawParentClasses))--makeObjectMap :: List Text -> Map.Map Word32 Text-makeObjectMap objects =-  Map.fromAscList (zip (map Word32 [0 ..]) (listValue objects))--getObjectName :: Map.Map Word32 Text -> Word32 -> Maybe Text-getObjectName objectMap objectId = Map.lookup objectId objectMap--getClassName :: Text -> Maybe Text-getClassName rawObjectName =-  Map.lookup (normalizeObjectName rawObjectName) objectClasses--normalizeObjectName :: Text -> Text-normalizeObjectName objectName =-  let-    name = textValue objectName-    crowdActor = Text.pack "TheWorld:PersistentLevel.CrowdActor_TA"-    crowdManager = Text.pack "TheWorld:PersistentLevel.CrowdManager_TA"-    boostPickup = Text.pack "TheWorld:PersistentLevel.VehiclePickup_Boost_TA"-    mapScoreboard = Text.pack "TheWorld:PersistentLevel.InMapScoreboard_TA"-    breakout = Text.pack "TheWorld:PersistentLevel.BreakOutActor_Platform_TA"-  in if Text.isInfixOf crowdActor name-    then Text crowdActor-    else if Text.isInfixOf crowdManager name-      then Text crowdManager-      else if Text.isInfixOf boostPickup name-        then Text boostPickup-        else if Text.isInfixOf mapScoreboard name-          then Text mapScoreboard-          else if Text.isInfixOf breakout name-            then Text breakout-            else objectName--objectClasses :: Map.Map Text Text-objectClasses = Map.map-  stringToText-  (Map.mapKeys stringToText (Map.fromList rawObjectClasses))--classHasLocation :: Text -> Bool-classHasLocation className = Set.member className classesWithLocation--classesWithLocation :: Set.Set Text-classesWithLocation = Set.fromList (map stringToText rawClassesWithLocation)--classHasRotation :: Text -> Bool-classHasRotation className = Set.member className classesWithRotation--classesWithRotation :: Set.Set Text-classesWithRotation = Set.fromList (map stringToText rawClassesWithRotation)--getAttributeIdLimit :: Map.Map Word32 Word32 -> Maybe Word-getAttributeIdLimit attributeMap = do-  ((streamId, _), _) <- Map.maxViewWithKey attributeMap-  let limit = fromIntegral (word32Value streamId)-  pure limit--getAttributeName-  :: ClassAttributeMap -> Map.Map Word32 Word32 -> CompressedWord -> Maybe Text-getAttributeName classAttributeMap attributeMap streamId = do-  let key = Word32 (fromIntegral (compressedWordValue streamId))-  attributeId <- Map.lookup key attributeMap-  let objectMap = classAttributeMapObjectMap classAttributeMap-  Map.lookup attributeId objectMap--getAttributeMap-  :: ClassAttributeMap-  -> ActorMap-  -> CompressedWord-  -> Maybe (Map.Map Word32 Word32)-getAttributeMap classAttributeMap actorMap actorId = do-  objectId <- Map.lookup actorId actorMap-  let objectClassMap = classAttributeMapObjectClassMap classAttributeMap-  classId <- Map.lookup objectId objectClassMap-  let value = classAttributeMapValue classAttributeMap-  Map.lookup classId value
− library/Rattletrap/ClassMapping.hs
@@ -1,21 +0,0 @@-module Rattletrap.ClassMapping where--import Rattletrap.Primitive--import qualified Data.Binary as Binary--data ClassMapping = ClassMapping-  { classMappingName :: Text-  , classMappingStreamId :: Word32-  } deriving (Eq, Ord, Show)--getClassMapping :: Binary.Get ClassMapping-getClassMapping = do-  name <- getText-  streamId <- getWord32-  pure (ClassMapping name streamId)--putClassMapping :: ClassMapping -> Binary.Put-putClassMapping classMapping = do-  putText (classMappingName classMapping)-  putWord32 (classMappingStreamId classMapping)
+ library/Rattletrap/Console/Main.hs view
@@ -0,0 +1,226 @@+module Rattletrap.Console.Main+  ( main+  , rattletrap+  ) where++import qualified Control.Monad as Monad+import qualified Data.Aeson as Json+import qualified Data.ByteString.Lazy as LazyBytes+import qualified Data.Version as Version+import qualified Network.HTTP.Client as Client+import qualified Network.HTTP.Client.TLS as Client+import qualified Paths_rattletrap as This+import qualified Rattletrap+import qualified System.Console.GetOpt as Console+import qualified System.Environment as Environment+import qualified System.Exit as Exit+import qualified System.FilePath as Path+import qualified System.IO as IO+import qualified Text.Printf as Printf++main :: IO ()+main = do+  name <- Environment.getProgName+  arguments <- Environment.getArgs+  rattletrap name arguments++rattletrap :: String -> [String] -> IO ()+rattletrap name arguments = do+  config <- getConfig arguments+  Monad.when (configHelp config) (printHelp name *> Exit.exitFailure)+  Monad.when (configVersion config) (printVersion *> Exit.exitFailure)+  input <- getInput config+  let decode = getDecoder config+  replay <- either fail pure (decode input)+  let encode = getEncoder config+  putOutput config (encode replay)++getDecoder :: Config -> LazyBytes.ByteString -> Either String Rattletrap.Replay+getDecoder config = case getMode config of+  ModeDecode -> Rattletrap.decodeReplayFile+  ModeEncode -> Rattletrap.decodeReplayJson++getEncoder :: Config -> Rattletrap.Replay -> LazyBytes.ByteString+getEncoder config = case getMode config of+  ModeDecode ->+    if configCompact config then Json.encode else Rattletrap.encodeReplayJson+  ModeEncode -> Rattletrap.encodeReplayFile++getInput :: Config -> IO LazyBytes.ByteString+getInput config = case configInput config of+  Nothing -> LazyBytes.getContents+  Just fileOrUrl -> case Client.parseUrlThrow fileOrUrl of+    Nothing -> LazyBytes.readFile fileOrUrl+    Just request -> do+      manager <- Client.newTlsManager+      response <- Client.httpLbs request manager+      pure (Client.responseBody response)++putOutput :: Config -> LazyBytes.ByteString -> IO ()+putOutput config = case configOutput config of+  Nothing -> LazyBytes.putStr+  Just file -> LazyBytes.writeFile file++getConfig :: [String] -> IO Config+getConfig arguments = do+  let+    (updates, unexpectedArguments, unknownOptions, problems) =+      Console.getOpt' Console.Permute options arguments+  printUnexpectedArguments unexpectedArguments+  printUnknownOptions unknownOptions+  printProblems problems+  Monad.unless (null problems) Exit.exitFailure+  either fail pure (Monad.foldM applyUpdate defaultConfig updates)++type Option = Console.OptDescr Update++type Update = Config -> Either String Config++options :: [Option]+options =+  [ compactOption+  , helpOption+  , inputOption+  , modeOption+  , outputOption+  , versionOption+  ]++compactOption :: Option+compactOption = Console.Option+  ['c']+  ["compact"]+  (Console.NoArg (\config -> pure config { configCompact = True }))+  "minify JSON output"++helpOption :: Option+helpOption = Console.Option+  ['h']+  ["help"]+  (Console.NoArg (\config -> pure config { configHelp = True }))+  "show the help"++inputOption :: Option+inputOption = Console.Option+  ['i']+  ["input"]+  ( Console.ReqArg+    (\input config -> pure config { configInput = Just input })+    "FILE|URL"+  )+  "input file or URL"++modeOption :: Option+modeOption = Console.Option+  ['m']+  ["mode"]+  ( Console.ReqArg+    ( \rawMode config -> do+      mode <- parseMode rawMode+      pure config { configMode = Just mode }+    )+    "MODE"+  )+  "decode or encode"++outputOption :: Option+outputOption = Console.Option+  ['o']+  ["output"]+  ( Console.ReqArg+    (\output config -> pure config { configOutput = Just output })+    "FILE"+  )+  "output file"++versionOption :: Option+versionOption = Console.Option+  ['v']+  ["version"]+  (Console.NoArg (\config -> pure config { configVersion = True }))+  "show the version"++applyUpdate :: Config -> Update -> Either String Config+applyUpdate config update = update config++data Config = Config+  { configCompact :: Bool+  , configHelp :: Bool+  , configInput :: Maybe String+  , configMode :: Maybe Mode+  , configOutput :: Maybe String+  , configVersion :: Bool+  } deriving (Show)++defaultConfig :: Config+defaultConfig = Config+  { configCompact = False+  , configHelp = False+  , configInput = Nothing+  , configMode = Nothing+  , configOutput = Nothing+  , configVersion = False+  }++getMode :: Config -> Mode+getMode config = case getExtension (configInput config) of+  ".json" -> ModeEncode+  ".replay" -> ModeDecode+  _ -> case getExtension (configOutput config) of+    ".json" -> ModeDecode+    ".replay" -> ModeEncode+    _ -> ModeDecode++getExtension :: Maybe String -> String+getExtension = maybe "" Path.takeExtension++data Mode+  = ModeDecode+  | ModeEncode+  deriving (Show)++parseMode :: String -> Either String Mode+parseMode mode = case mode of+  "decode" -> pure ModeDecode+  "encode" -> pure ModeEncode+  _ -> fail (Printf.printf "invalid mode: %s" (show mode))++printUnexpectedArguments :: [String] -> IO ()+printUnexpectedArguments = mapM_ printUnexpectedArgument++printUnexpectedArgument :: String -> IO ()+printUnexpectedArgument =+  warnLn . Printf.printf "WARNING: unexpected argument `%s'"++printUnknownOptions :: [String] -> IO ()+printUnknownOptions = mapM_ printUnknownOption++printUnknownOption :: String -> IO ()+printUnknownOption = warnLn . Printf.printf "WARNING: unknown option `%s'"++printProblems :: [String] -> IO ()+printProblems = mapM_ printProblem++printProblem :: String -> IO ()+printProblem = warn . Printf.printf "ERROR: %s"++printHelp :: String -> IO ()+printHelp = warn . help++help :: String -> String+help name = Console.usageInfo (header name) options++header :: String -> String+header name = unwords [name, "version", version]++version :: String+version = Version.showVersion This.version++printVersion :: IO ()+printVersion = warnLn version++warn :: String -> IO ()+warn = IO.hPutStr IO.stderr++warnLn :: String -> IO ()+warnLn = IO.hPutStrLn IO.stderr
− library/Rattletrap/Content.hs
@@ -1,125 +0,0 @@-module Rattletrap.Content where--import Rattletrap.Cache-import Rattletrap.ClassAttributeMap-import Rattletrap.ClassMapping-import Rattletrap.Frame-import Rattletrap.KeyFrame-import Rattletrap.Mark-import Rattletrap.Message-import Rattletrap.Primitive-import Rattletrap.Utility--import qualified Data.Binary as Binary-import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit-import qualified Data.Binary.Get as Binary-import qualified Data.Binary.Put as Binary-import qualified Data.Map as Map---- | Contains low-level game data about a 'Rattletrap.Replay.Replay'.-data Content = Content-  { contentLevels :: List Text-  -- ^ This typically only has one element, like @stadium_oob_audio_map@.-  , contentKeyFrames :: List KeyFrame-  -- ^ A list of which frames are key frames. Although they aren't necessary-  -- for replay, key frames are frames that replicate every actor. They-  -- typically happen once every 10 seconds.-  , contentStreamSize :: Word32-  -- ^ The size of the stream in bytes. This is only really necessary because-  -- the stream has some arbitrary amount of padding at the end.-  , contentFrames :: [Frame]-  -- ^ The actual game data. This is where all the interesting information is.-  , contentMessages :: List Message-  -- ^ Debugging messages. In newer replays, this is always empty.-  , contentMarks :: List Mark-  -- ^ Tick marks shown on the scrubber when watching a replay.-  , contentPackages :: List Text-  -- ^ A list of @.upk@ files to load, like-  -- @..\\..\\TAGame\\CookedPCConsole\\Stadium_P.upk@.-  , contentObjects :: List Text-  -- ^ Objects in the stream. Used for the-  -- 'Rattletrap.ClassAttributeMap.ClassAttributeMap'.-  , contentNames :: List Text-  -- ^ It's not clear what these are used for. This list is usually not empty,-  -- but appears unused otherwise.-  , contentClassMappings :: List ClassMapping-  -- ^ A mapping between classes and their ID in the stream. Used for the-  -- 'Rattletrap.ClassAttributeMap.ClassAttributeMap'.-  , contentCaches :: List Cache-  -- ^ A list of classes along with their parent classes and attributes. Used-  -- for the 'Rattletrap.ClassAttributeMap.ClassAttributeMap'.-  } deriving (Eq, Ord, Show)--getContent-  :: (Int, Int, Int)-  -- ^ Version numbers, usually from 'Rattletrap.Header.getVersion'.-  -> Int-  -- ^ The number of frames in the stream, usually from-  -- 'Rattletrap.Header.getNumFrames'.-  -> Word-  -- ^ The maximum number of channels in the stream, usually from-  -- 'Rattletrap.Header.getMaxChannels'.-  -> Binary.Get Content-getContent version numFrames maxChannels = do-  levels <- getList getText-  keyFrames <- getList getKeyFrame-  streamSize <- getWord32-  stream <- Binary.getLazyByteString (fromIntegral (word32Value streamSize))-  messages <- getList getMessage-  marks <- getList getMark-  packages <- getList getText-  objects <- getList getText-  names <- getList getText-  classMappings <- getList getClassMapping-  caches <- getList getCache-  let-    classAttributeMap =-      makeClassAttributeMap objects classMappings caches names-  let-    frames = Binary.runGet-      ( BinaryBit.runBitGet-        ( do-          (theFrames, _) <- getFrames-            version-            numFrames-            maxChannels-            classAttributeMap-            Map.empty-          pure theFrames-        )-      )-      (reverseBytes stream)-  pure-    ( Content-      levels-      keyFrames-      streamSize-      frames-      messages-      marks-      packages-      objects-      names-      classMappings-      caches-    )--putContent :: Content -> Binary.Put-putContent content = do-  putList putText (contentLevels content)-  putList putKeyFrame (contentKeyFrames content)-  let streamSize = contentStreamSize content-  putWord32 streamSize-  let-    stream =-      Binary.runPut (BinaryBit.runBitPut (putFrames (contentFrames content)))-  Binary.putLazyByteString-    (reverseBytes (padBytes (word32Value streamSize) stream))-  putList putMessage (contentMessages content)-  putList putMark (contentMarks content)-  putList putText (contentPackages content)-  putList putText (contentObjects content)-  putList putText (contentNames content)-  putList putClassMapping (contentClassMappings content)-  putList putCache (contentCaches content)
− library/Rattletrap/Crc.hs
@@ -1,40 +0,0 @@-module Rattletrap.Crc where--import Rattletrap.Data--import qualified Data.Bits as Bits-import qualified Data.ByteString.Lazy as ByteString-import qualified Data.Vector.Unboxed as Vector-import qualified Data.Word as Word---- | Computes the CRC32 of some bytes. This is done to ensure that the bytes--- are valid before trying to parse them.------ @--- getCrc32 ('Data.ByteString.Lazy.pack' [0x00])--- @------ This CRC uses an initial value of @0xefcbf201@ and a polynomial of--- @0x04c11db7@.-getCrc32 :: ByteString.ByteString -> Word.Word32-getCrc32 bytes = do-  let update = crc32Update crc32Table-  let initial = Bits.complement crc32Initial-  let crc = ByteString.foldl update initial bytes-  Bits.complement crc--crc32Update-  :: Vector.Vector Word.Word32 -> Word.Word32 -> Word.Word8 -> Word.Word32-crc32Update table crc byte = do-  let toWord8 = fromIntegral :: (Integral a) => a -> Word.Word8-  let toInt = fromIntegral :: (Integral a) => a -> Int-  let index = toInt (Bits.xor byte (toWord8 (Bits.shiftR crc 24)))-  let left = Vector.unsafeIndex table index-  let right = Bits.shiftL crc 8-  Bits.xor left right--crc32Initial :: Word.Word32-crc32Initial = 0xefcbf201--crc32Table :: Vector.Vector Word.Word32-crc32Table = Vector.fromList rawCrc32Table
library/Rattletrap/Data.hs view
@@ -1,6 +1,6 @@ module Rattletrap.Data where -import Rattletrap.AttributeType+import Rattletrap.Type.AttributeType  rawParentClasses :: [(String, String)] rawParentClasses =@@ -78,7 +78,6 @@   , "TAGame.SpecialPickup_BallCarSpring_TA"   , "TAGame.SpecialPickup_BallFreeze_TA"   , "TAGame.SpecialPickup_BallGravity_TA"-  , "TAGame.SpecialPickup_BallGravity_TA"   , "TAGame.SpecialPickup_BallLasso_TA"   , "TAGame.SpecialPickup_BallVelcro_TA"   , "TAGame.SpecialPickup_Batarang_TA"@@ -156,151 +155,152 @@  rawAttributeTypes :: [(String, AttributeType)] rawAttributeTypes =-  [ ("Engine.Actor:bBlockActors", BooleanAttributeType)-  , ("Engine.Actor:bCollideActors", BooleanAttributeType)-  , ("Engine.Actor:bHidden", BooleanAttributeType)-  , ("Engine.Actor:DrawScale", FloatAttributeType)-  , ("Engine.Actor:Role", EnumAttributeType)-  , ("Engine.GameReplicationInfo:bMatchIsOver", BooleanAttributeType)-  , ("Engine.GameReplicationInfo:GameClass", FlaggedIntAttributeType)-  , ("Engine.GameReplicationInfo:ServerName", StringAttributeType)-  , ("Engine.Pawn:PlayerReplicationInfo", FlaggedIntAttributeType)-  , ("Engine.PlayerReplicationInfo:bBot", BooleanAttributeType)-  , ("Engine.PlayerReplicationInfo:bIsSpectator", BooleanAttributeType)-  , ("Engine.PlayerReplicationInfo:bReadyToPlay", BooleanAttributeType)-  , ("Engine.PlayerReplicationInfo:bWaitingPlayer", BooleanAttributeType)-  , ("Engine.PlayerReplicationInfo:Ping", ByteAttributeType)-  , ("Engine.PlayerReplicationInfo:PlayerID", IntAttributeType)-  , ("Engine.PlayerReplicationInfo:PlayerName", StringAttributeType)-  , ("Engine.PlayerReplicationInfo:RemoteUserData", StringAttributeType)-  , ("Engine.PlayerReplicationInfo:Score", IntAttributeType)-  , ("Engine.PlayerReplicationInfo:Team", FlaggedIntAttributeType)-  , ("Engine.PlayerReplicationInfo:UniqueId", UniqueIdAttributeType)-  , ("Engine.TeamInfo:Score", IntAttributeType)-  , ("ProjectX.GRI_X:bGameStarted", BooleanAttributeType)-  , ("ProjectX.GRI_X:GameServerID", QWordAttributeType)-  , ("ProjectX.GRI_X:MatchGUID", StringAttributeType)-  , ("ProjectX.GRI_X:ReplicatedGameMutatorIndex", IntAttributeType)-  , ("ProjectX.GRI_X:ReplicatedGamePlaylist", IntAttributeType)-  , ("ProjectX.GRI_X:Reservations", ReservationAttributeType)-  , ("TAGame.Ball_Breakout_TA:AppliedDamage", AppliedDamageAttributeType)-  , ("TAGame.Ball_Breakout_TA:DamageIndex", IntAttributeType)-  , ("TAGame.Ball_Breakout_TA:LastTeamTouch", ByteAttributeType)-  , ("TAGame.Ball_TA:GameEvent", FlaggedIntAttributeType)-  , ("TAGame.Ball_TA:HitTeamNum", ByteAttributeType)-  , ("TAGame.Ball_TA:ReplicatedAddedCarBounceScale", FloatAttributeType)-  , ("TAGame.Ball_TA:ReplicatedBallMaxLinearSpeedScale", FloatAttributeType)-  , ("TAGame.Ball_TA:ReplicatedBallScale", FloatAttributeType)-  , ("TAGame.Ball_TA:ReplicatedExplosionData", ExplosionAttributeType)-  , ("TAGame.Ball_TA:ReplicatedExplosionDataExtended", ExtendedExplosionAttributeType)-  , ("TAGame.Ball_TA:ReplicatedWorldBounceScale", FloatAttributeType)-  , ("TAGame.BreakOutActor_Platform_TA:DamageState", DamageStateAttributeType)-  , ("TAGame.CameraSettingsActor_TA:bUsingBehindView", BooleanAttributeType)-  , ("TAGame.CameraSettingsActor_TA:bUsingSecondaryCamera", BooleanAttributeType)-  , ("TAGame.CameraSettingsActor_TA:CameraPitch", ByteAttributeType)-  , ("TAGame.CameraSettingsActor_TA:CameraYaw", ByteAttributeType)-  , ("TAGame.CameraSettingsActor_TA:PRI", FlaggedIntAttributeType)-  , ("TAGame.CameraSettingsActor_TA:ProfileSettings", CamSettingsAttributeType)-  , ("TAGame.Car_TA:AddedBallForceMultiplier", FloatAttributeType)-  , ("TAGame.Car_TA:AddedCarForceMultiplier", FloatAttributeType)-  , ("TAGame.Car_TA:AttachedPickup", FlaggedIntAttributeType)-  , ("TAGame.Car_TA:ClubColors", ClubColorsAttributeType)-  , ("TAGame.Car_TA:ReplicatedDemolish", DemolishAttributeType)-  , ("TAGame.Car_TA:TeamPaint", TeamPaintAttributeType)-  , ("TAGame.CarComponent_Boost_TA:bNoBoost", BooleanAttributeType)-  , ("TAGame.CarComponent_Boost_TA:BoostModifier", FloatAttributeType)-  , ("TAGame.CarComponent_Boost_TA:bUnlimitedBoost", BooleanAttributeType)-  , ("TAGame.CarComponent_Boost_TA:RechargeDelay", FloatAttributeType)-  , ("TAGame.CarComponent_Boost_TA:RechargeRate", FloatAttributeType)-  , ("TAGame.CarComponent_Boost_TA:ReplicatedBoostAmount", ByteAttributeType)-  , ("TAGame.CarComponent_Boost_TA:UnlimitedBoostRefCount", IntAttributeType)-  , ("TAGame.CarComponent_Dodge_TA:DodgeTorque", LocationAttributeType)-  , ("TAGame.CarComponent_FlipCar_TA:bFlipRight", BooleanAttributeType)-  , ("TAGame.CarComponent_FlipCar_TA:FlipCarTime", FloatAttributeType)-  , ("TAGame.CarComponent_TA:ReplicatedActive", ByteAttributeType)-  , ("TAGame.CarComponent_TA:ReplicatedActivityTime", FloatAttributeType)-  , ("TAGame.CarComponent_TA:Vehicle", FlaggedIntAttributeType)-  , ("TAGame.CrowdActor_TA:GameEvent", FlaggedIntAttributeType)-  , ("TAGame.CrowdActor_TA:ModifiedNoise", FloatAttributeType)-  , ("TAGame.CrowdActor_TA:ReplicatedCountDownNumber", IntAttributeType)-  , ("TAGame.CrowdActor_TA:ReplicatedOneShotSound", FlaggedIntAttributeType)-  , ("TAGame.CrowdActor_TA:ReplicatedRoundCountDownNumber", IntAttributeType)-  , ("TAGame.CrowdManager_TA:GameEvent", FlaggedIntAttributeType)-  , ("TAGame.CrowdManager_TA:ReplicatedGlobalOneShotSound", FlaggedIntAttributeType)-  , ("TAGame.GameEvent_Soccar_TA:bBallHasBeenHit", BooleanAttributeType)-  , ("TAGame.GameEvent_Soccar_TA:bOverTime", BooleanAttributeType)-  , ("TAGame.GameEvent_Soccar_TA:GameTime", IntAttributeType)-  , ("TAGame.GameEvent_Soccar_TA:ReplicatedMusicStinger", MusicStingerAttributeType)-  , ("TAGame.GameEvent_Soccar_TA:ReplicatedScoredOnTeam", ByteAttributeType)-  , ("TAGame.GameEvent_Soccar_TA:RoundNum", IntAttributeType)-  , ("TAGame.GameEvent_Soccar_TA:SecondsRemaining", IntAttributeType)-  , ("TAGame.GameEvent_Soccar_TA:SubRulesArchetype", FlaggedIntAttributeType)-  , ("TAGame.GameEvent_SoccarPrivate_TA:MatchSettings", PrivateMatchSettingsAttributeType)-  , ("TAGame.GameEvent_TA:bCanVoteToForfeit", BooleanAttributeType)-  , ("TAGame.GameEvent_TA:bHasLeaveMatchPenalty", BooleanAttributeType)-  , ("TAGame.GameEvent_TA:BotSkill", IntAttributeType)-  , ("TAGame.GameEvent_TA:GameMode", GameModeAttributeType)-  , ("TAGame.GameEvent_TA:MatchTypeClass", FlaggedIntAttributeType)-  , ("TAGame.GameEvent_TA:ReplicatedGameStateTimeRemaining", IntAttributeType)-  , ("TAGame.GameEvent_TA:ReplicatedStateIndex", ByteAttributeType)-  , ("TAGame.GameEvent_TA:ReplicatedStateName", IntAttributeType)-  , ("TAGame.GameEvent_Team_TA:bForfeit", BooleanAttributeType)-  , ("TAGame.GameEvent_Team_TA:MaxTeamSize", IntAttributeType)-  , ("TAGame.GRI_TA:NewDedicatedServerIP", StringAttributeType)-  , ("TAGame.PRI_TA:bIsInSplitScreen", BooleanAttributeType)-  , ("TAGame.PRI_TA:bMatchMVP", BooleanAttributeType)-  , ("TAGame.PRI_TA:bOnlineLoadoutSet", BooleanAttributeType)-  , ("TAGame.PRI_TA:bOnlineLoadoutsSet", BooleanAttributeType)-  , ("TAGame.PRI_TA:BotProductName", IntAttributeType)-  , ("TAGame.PRI_TA:bReady", BooleanAttributeType)-  , ("TAGame.PRI_TA:bUsingBehindView", BooleanAttributeType)-  , ("TAGame.PRI_TA:bUsingItems", BooleanAttributeType)-  , ("TAGame.PRI_TA:bUsingSecondaryCamera", BooleanAttributeType)-  , ("TAGame.PRI_TA:CameraPitch", ByteAttributeType)-  , ("TAGame.PRI_TA:CameraSettings", CamSettingsAttributeType)-  , ("TAGame.PRI_TA:CameraYaw", ByteAttributeType)-  , ("TAGame.PRI_TA:ClientLoadout", LoadoutAttributeType)-  , ("TAGame.PRI_TA:ClientLoadoutOnline", LoadoutOnlineAttributeType)-  , ("TAGame.PRI_TA:ClientLoadouts", LoadoutsAttributeType)-  , ("TAGame.PRI_TA:ClientLoadoutsOnline", LoadoutsOnlineAttributeType)-  , ("TAGame.PRI_TA:MatchAssists", IntAttributeType)-  , ("TAGame.PRI_TA:MatchBreakoutDamage", IntAttributeType)-  , ("TAGame.PRI_TA:MatchGoals", IntAttributeType)-  , ("TAGame.PRI_TA:MatchSaves", IntAttributeType)-  , ("TAGame.PRI_TA:MatchScore", IntAttributeType)-  , ("TAGame.PRI_TA:MatchShots", IntAttributeType)-  , ("TAGame.PRI_TA:MaxTimeTillItem", IntAttributeType)-  , ("TAGame.PRI_TA:PartyLeader", PartyLeaderAttributeType)-  , ("TAGame.PRI_TA:PawnType", ByteAttributeType)-  , ("TAGame.PRI_TA:PersistentCamera", FlaggedIntAttributeType)-  , ("TAGame.PRI_TA:PlayerHistoryValid", BooleanAttributeType)-  , ("TAGame.PRI_TA:ReplicatedGameEvent", FlaggedIntAttributeType)-  , ("TAGame.PRI_TA:SteeringSensitivity", FloatAttributeType)-  , ("TAGame.PRI_TA:TimeTillItem", IntAttributeType)-  , ("TAGame.PRI_TA:Title", IntAttributeType)-  , ("TAGame.PRI_TA:TotalXP", IntAttributeType)-  , ("TAGame.RBActor_TA:bFrozen", BooleanAttributeType)-  , ("TAGame.RBActor_TA:bIgnoreSyncing", BooleanAttributeType)-  , ("TAGame.RBActor_TA:bReplayActor", BooleanAttributeType)-  , ("TAGame.RBActor_TA:ReplicatedRBState", RigidBodyStateAttributeType)-  , ("TAGame.RBActor_TA:WeldedInfo", WeldedInfoAttributeType)-  , ("TAGame.SpecialPickup_BallFreeze_TA:RepOrigSpeed", FloatAttributeType)-  , ("TAGame.SpecialPickup_BallVelcro_TA:AttachTime", FloatAttributeType)-  , ("TAGame.SpecialPickup_BallVelcro_TA:bBroken", BooleanAttributeType)-  , ("TAGame.SpecialPickup_BallVelcro_TA:bHit", BooleanAttributeType)-  , ("TAGame.SpecialPickup_BallVelcro_TA:BreakTime", FloatAttributeType)-  , ("TAGame.SpecialPickup_Targeted_TA:Targeted", FlaggedIntAttributeType)-  , ("TAGame.Team_Soccar_TA:GameScore", IntAttributeType)-  , ("TAGame.Team_TA:ClubColors", ClubColorsAttributeType)-  , ("TAGame.Team_TA:CustomTeamName", StringAttributeType)-  , ("TAGame.Team_TA:GameEvent", FlaggedIntAttributeType)-  , ("TAGame.Team_TA:LogoData", FlaggedIntAttributeType)-  , ("TAGame.Vehicle_TA:bDriving", BooleanAttributeType)-  , ("TAGame.Vehicle_TA:bReplicatedHandbrake", BooleanAttributeType)-  , ("TAGame.Vehicle_TA:ReplicatedSteer", ByteAttributeType)-  , ("TAGame.Vehicle_TA:ReplicatedThrottle", ByteAttributeType)-  , ("TAGame.VehiclePickup_TA:bNoPickup", BooleanAttributeType)-  , ("TAGame.VehiclePickup_TA:ReplicatedPickupData", PickupAttributeType)+  [ ("Engine.Actor:bBlockActors", AttributeTypeBoolean)+  , ("Engine.Actor:bCollideActors", AttributeTypeBoolean)+  , ("Engine.Actor:bHidden", AttributeTypeBoolean)+  , ("Engine.Actor:DrawScale", AttributeTypeFloat)+  , ("Engine.Actor:Role", AttributeTypeEnum)+  , ("Engine.GameReplicationInfo:bMatchIsOver", AttributeTypeBoolean)+  , ("Engine.GameReplicationInfo:GameClass", AttributeTypeFlaggedInt)+  , ("Engine.GameReplicationInfo:ServerName", AttributeTypeString)+  , ("Engine.Pawn:PlayerReplicationInfo", AttributeTypeFlaggedInt)+  , ("Engine.PlayerReplicationInfo:bBot", AttributeTypeBoolean)+  , ("Engine.PlayerReplicationInfo:bIsSpectator", AttributeTypeBoolean)+  , ("Engine.PlayerReplicationInfo:bReadyToPlay", AttributeTypeBoolean)+  , ("Engine.PlayerReplicationInfo:bWaitingPlayer", AttributeTypeBoolean)+  , ("Engine.PlayerReplicationInfo:Ping", AttributeTypeByte)+  , ("Engine.PlayerReplicationInfo:PlayerID", AttributeTypeInt)+  , ("Engine.PlayerReplicationInfo:PlayerName", AttributeTypeString)+  , ("Engine.PlayerReplicationInfo:RemoteUserData", AttributeTypeString)+  , ("Engine.PlayerReplicationInfo:Score", AttributeTypeInt)+  , ("Engine.PlayerReplicationInfo:Team", AttributeTypeFlaggedInt)+  , ("Engine.PlayerReplicationInfo:UniqueId", AttributeTypeUniqueId)+  , ("Engine.TeamInfo:Score", AttributeTypeInt)+  , ("ProjectX.GRI_X:bGameStarted", AttributeTypeBoolean)+  , ("ProjectX.GRI_X:GameServerID", AttributeTypeQWord)+  , ("ProjectX.GRI_X:MatchGUID", AttributeTypeString)+  , ("ProjectX.GRI_X:ReplicatedGameMutatorIndex", AttributeTypeInt)+  , ("ProjectX.GRI_X:ReplicatedGamePlaylist", AttributeTypeInt)+  , ("ProjectX.GRI_X:Reservations", AttributeTypeReservation)+  , ("TAGame.Ball_Breakout_TA:AppliedDamage", AttributeTypeAppliedDamage)+  , ("TAGame.Ball_Breakout_TA:DamageIndex", AttributeTypeInt)+  , ("TAGame.Ball_Breakout_TA:LastTeamTouch", AttributeTypeByte)+  , ("TAGame.Ball_TA:GameEvent", AttributeTypeFlaggedInt)+  , ("TAGame.Ball_TA:HitTeamNum", AttributeTypeByte)+  , ("TAGame.Ball_TA:ReplicatedAddedCarBounceScale", AttributeTypeFloat)+  , ("TAGame.Ball_TA:ReplicatedBallMaxLinearSpeedScale", AttributeTypeFloat)+  , ("TAGame.Ball_TA:ReplicatedBallScale", AttributeTypeFloat)+  , ("TAGame.Ball_TA:ReplicatedExplosionData", AttributeTypeExplosion)+  , ("TAGame.Ball_TA:ReplicatedExplosionDataExtended", AttributeTypeExtendedExplosion)+  , ("TAGame.Ball_TA:ReplicatedWorldBounceScale", AttributeTypeFloat)+  , ("TAGame.BreakOutActor_Platform_TA:DamageState", AttributeTypeDamageState)+  , ("TAGame.CameraSettingsActor_TA:bUsingBehindView", AttributeTypeBoolean)+  , ("TAGame.CameraSettingsActor_TA:bUsingSecondaryCamera", AttributeTypeBoolean)+  , ("TAGame.CameraSettingsActor_TA:CameraPitch", AttributeTypeByte)+  , ("TAGame.CameraSettingsActor_TA:CameraYaw", AttributeTypeByte)+  , ("TAGame.CameraSettingsActor_TA:PRI", AttributeTypeFlaggedInt)+  , ("TAGame.CameraSettingsActor_TA:ProfileSettings", AttributeTypeCamSettings)+  , ("TAGame.Car_TA:AddedBallForceMultiplier", AttributeTypeFloat)+  , ("TAGame.Car_TA:AddedCarForceMultiplier", AttributeTypeFloat)+  , ("TAGame.Car_TA:AttachedPickup", AttributeTypeFlaggedInt)+  , ("TAGame.Car_TA:ClubColors", AttributeTypeClubColors)+  , ("TAGame.Car_TA:ReplicatedDemolish", AttributeTypeDemolish)+  , ("TAGame.Car_TA:TeamPaint", AttributeTypeTeamPaint)+  , ("TAGame.CarComponent_Boost_TA:bNoBoost", AttributeTypeBoolean)+  , ("TAGame.CarComponent_Boost_TA:BoostModifier", AttributeTypeFloat)+  , ("TAGame.CarComponent_Boost_TA:bUnlimitedBoost", AttributeTypeBoolean)+  , ("TAGame.CarComponent_Boost_TA:RechargeDelay", AttributeTypeFloat)+  , ("TAGame.CarComponent_Boost_TA:RechargeRate", AttributeTypeFloat)+  , ("TAGame.CarComponent_Boost_TA:ReplicatedBoostAmount", AttributeTypeByte)+  , ("TAGame.CarComponent_Boost_TA:UnlimitedBoostRefCount", AttributeTypeInt)+  , ("TAGame.CarComponent_Dodge_TA:DodgeTorque", AttributeTypeLocation)+  , ("TAGame.CarComponent_FlipCar_TA:bFlipRight", AttributeTypeBoolean)+  , ("TAGame.CarComponent_FlipCar_TA:FlipCarTime", AttributeTypeFloat)+  , ("TAGame.CarComponent_TA:ReplicatedActive", AttributeTypeByte)+  , ("TAGame.CarComponent_TA:ReplicatedActivityTime", AttributeTypeFloat)+  , ("TAGame.CarComponent_TA:Vehicle", AttributeTypeFlaggedInt)+  , ("TAGame.CrowdActor_TA:GameEvent", AttributeTypeFlaggedInt)+  , ("TAGame.CrowdActor_TA:ModifiedNoise", AttributeTypeFloat)+  , ("TAGame.CrowdActor_TA:ReplicatedCountDownNumber", AttributeTypeInt)+  , ("TAGame.CrowdActor_TA:ReplicatedOneShotSound", AttributeTypeFlaggedInt)+  , ("TAGame.CrowdActor_TA:ReplicatedRoundCountDownNumber", AttributeTypeInt)+  , ("TAGame.CrowdManager_TA:GameEvent", AttributeTypeFlaggedInt)+  , ("TAGame.CrowdManager_TA:ReplicatedGlobalOneShotSound", AttributeTypeFlaggedInt)+  , ("TAGame.GameEvent_Soccar_TA:bBallHasBeenHit", AttributeTypeBoolean)+  , ("TAGame.GameEvent_Soccar_TA:bOverTime", AttributeTypeBoolean)+  , ("TAGame.GameEvent_Soccar_TA:GameTime", AttributeTypeInt)+  , ("TAGame.GameEvent_Soccar_TA:ReplicatedMusicStinger", AttributeTypeMusicStinger)+  , ("TAGame.GameEvent_Soccar_TA:ReplicatedScoredOnTeam", AttributeTypeByte)+  , ("TAGame.GameEvent_Soccar_TA:RoundNum", AttributeTypeInt)+  , ("TAGame.GameEvent_Soccar_TA:SecondsRemaining", AttributeTypeInt)+  , ("TAGame.GameEvent_Soccar_TA:SubRulesArchetype", AttributeTypeFlaggedInt)+  , ("TAGame.GameEvent_SoccarPrivate_TA:MatchSettings", AttributeTypePrivateMatchSettings)+  , ("TAGame.GameEvent_TA:bCanVoteToForfeit", AttributeTypeBoolean)+  , ("TAGame.GameEvent_TA:bHasLeaveMatchPenalty", AttributeTypeBoolean)+  , ("TAGame.GameEvent_TA:BotSkill", AttributeTypeInt)+  , ("TAGame.GameEvent_TA:GameMode", AttributeTypeGameMode)+  , ("TAGame.GameEvent_TA:MatchTypeClass", AttributeTypeFlaggedInt)+  , ("TAGame.GameEvent_TA:ReplicatedGameStateTimeRemaining", AttributeTypeInt)+  , ("TAGame.GameEvent_TA:ReplicatedStateIndex", AttributeTypeByte)+  , ("TAGame.GameEvent_TA:ReplicatedStateName", AttributeTypeInt)+  , ("TAGame.GameEvent_Team_TA:bForfeit", AttributeTypeBoolean)+  , ("TAGame.GameEvent_Team_TA:MaxTeamSize", AttributeTypeInt)+  , ("TAGame.GRI_TA:NewDedicatedServerIP", AttributeTypeString)+  , ("TAGame.PRI_TA:bIsInSplitScreen", AttributeTypeBoolean)+  , ("TAGame.PRI_TA:bMatchMVP", AttributeTypeBoolean)+  , ("TAGame.PRI_TA:bOnlineLoadoutSet", AttributeTypeBoolean)+  , ("TAGame.PRI_TA:bOnlineLoadoutsSet", AttributeTypeBoolean)+  , ("TAGame.PRI_TA:BotProductName", AttributeTypeInt)+  , ("TAGame.PRI_TA:bReady", AttributeTypeBoolean)+  , ("TAGame.PRI_TA:bUsingBehindView", AttributeTypeBoolean)+  , ("TAGame.PRI_TA:bUsingItems", AttributeTypeBoolean)+  , ("TAGame.PRI_TA:bUsingSecondaryCamera", AttributeTypeBoolean)+  , ("TAGame.PRI_TA:CameraPitch", AttributeTypeByte)+  , ("TAGame.PRI_TA:CameraSettings", AttributeTypeCamSettings)+  , ("TAGame.PRI_TA:CameraYaw", AttributeTypeByte)+  , ("TAGame.PRI_TA:ClientLoadout", AttributeTypeLoadout)+  , ("TAGame.PRI_TA:ClientLoadoutOnline", AttributeTypeLoadoutOnline)+  , ("TAGame.PRI_TA:ClientLoadouts", AttributeTypeLoadouts)+  , ("TAGame.PRI_TA:ClientLoadoutsOnline", AttributeTypeLoadoutsOnline)+  , ("TAGame.PRI_TA:MatchAssists", AttributeTypeInt)+  , ("TAGame.PRI_TA:MatchBreakoutDamage", AttributeTypeInt)+  , ("TAGame.PRI_TA:MatchGoals", AttributeTypeInt)+  , ("TAGame.PRI_TA:MatchSaves", AttributeTypeInt)+  , ("TAGame.PRI_TA:MatchScore", AttributeTypeInt)+  , ("TAGame.PRI_TA:MatchShots", AttributeTypeInt)+  , ("TAGame.PRI_TA:MaxTimeTillItem", AttributeTypeInt)+  , ("TAGame.PRI_TA:PartyLeader", AttributeTypePartyLeader)+  , ("TAGame.PRI_TA:PawnType", AttributeTypeByte)+  , ("TAGame.PRI_TA:PersistentCamera", AttributeTypeFlaggedInt)+  , ("TAGame.PRI_TA:PlayerHistoryKey", AttributeTypePlayerHistoryKey)+  , ("TAGame.PRI_TA:PlayerHistoryValid", AttributeTypeBoolean)+  , ("TAGame.PRI_TA:ReplicatedGameEvent", AttributeTypeFlaggedInt)+  , ("TAGame.PRI_TA:SteeringSensitivity", AttributeTypeFloat)+  , ("TAGame.PRI_TA:TimeTillItem", AttributeTypeInt)+  , ("TAGame.PRI_TA:Title", AttributeTypeInt)+  , ("TAGame.PRI_TA:TotalXP", AttributeTypeInt)+  , ("TAGame.RBActor_TA:bFrozen", AttributeTypeBoolean)+  , ("TAGame.RBActor_TA:bIgnoreSyncing", AttributeTypeBoolean)+  , ("TAGame.RBActor_TA:bReplayActor", AttributeTypeBoolean)+  , ("TAGame.RBActor_TA:ReplicatedRBState", AttributeTypeRigidBodyState)+  , ("TAGame.RBActor_TA:WeldedInfo", AttributeTypeWeldedInfo)+  , ("TAGame.SpecialPickup_BallFreeze_TA:RepOrigSpeed", AttributeTypeFloat)+  , ("TAGame.SpecialPickup_BallVelcro_TA:AttachTime", AttributeTypeFloat)+  , ("TAGame.SpecialPickup_BallVelcro_TA:bBroken", AttributeTypeBoolean)+  , ("TAGame.SpecialPickup_BallVelcro_TA:bHit", AttributeTypeBoolean)+  , ("TAGame.SpecialPickup_BallVelcro_TA:BreakTime", AttributeTypeFloat)+  , ("TAGame.SpecialPickup_Targeted_TA:Targeted", AttributeTypeFlaggedInt)+  , ("TAGame.Team_Soccar_TA:GameScore", AttributeTypeInt)+  , ("TAGame.Team_TA:ClubColors", AttributeTypeClubColors)+  , ("TAGame.Team_TA:CustomTeamName", AttributeTypeString)+  , ("TAGame.Team_TA:GameEvent", AttributeTypeFlaggedInt)+  , ("TAGame.Team_TA:LogoData", AttributeTypeFlaggedInt)+  , ("TAGame.Vehicle_TA:bDriving", AttributeTypeBoolean)+  , ("TAGame.Vehicle_TA:bReplicatedHandbrake", AttributeTypeBoolean)+  , ("TAGame.Vehicle_TA:ReplicatedSteer", AttributeTypeByte)+  , ("TAGame.Vehicle_TA:ReplicatedThrottle", AttributeTypeByte)+  , ("TAGame.VehiclePickup_TA:bNoPickup", AttributeTypeBoolean)+  , ("TAGame.VehiclePickup_TA:ReplicatedPickupData", AttributeTypePickup)   ]  rawCrc32Table :: Integral a => [a]
+ library/Rattletrap/Decode/AppliedDamageAttribute.hs view
@@ -0,0 +1,17 @@+module Rattletrap.Decode.AppliedDamageAttribute+  ( decodeAppliedDamageAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Int32le+import Rattletrap.Decode.Vector+import Rattletrap.Decode.Word8le+import Rattletrap.Type.AppliedDamageAttribute++decodeAppliedDamageAttributeBits :: DecodeBits AppliedDamageAttribute+decodeAppliedDamageAttributeBits =+  AppliedDamageAttribute+    <$> decodeWord8leBits+    <*> decodeVectorBits+    <*> decodeInt32leBits+    <*> decodeInt32leBits
+ library/Rattletrap/Decode/Attribute.hs view
@@ -0,0 +1,74 @@+module Rattletrap.Decode.Attribute+  ( decodeAttributesBits+  , decodeAttributeBits+  ) where++import Data.Semigroup ((<>))+import Rattletrap.Decode.AttributeValue+import Rattletrap.Decode.Common+import Rattletrap.Decode.CompressedWord+import Rattletrap.Type.Attribute+import Rattletrap.Type.ClassAttributeMap+import Rattletrap.Type.Common+import Rattletrap.Type.CompressedWord+import Rattletrap.Type.Str+import Rattletrap.Type.Word32le++decodeAttributesBits+  :: (Int, Int, Int)+  -> ClassAttributeMap+  -> Map CompressedWord Word32le+  -> CompressedWord+  -> DecodeBits [Attribute]+decodeAttributesBits version classes actors actor = do+  hasAttribute <- getBool+  if hasAttribute+    then+      (:)+      <$> decodeAttributeBits version classes actors actor+      <*> decodeAttributesBits version classes actors actor+    else pure []++decodeAttributeBits+  :: (Int, Int, Int)+  -> ClassAttributeMap+  -> Map CompressedWord Word32le+  -> CompressedWord+  -> DecodeBits Attribute+decodeAttributeBits version classes actors actor = do+  attributes <- lookupAttributeMap classes actors actor+  limit <- lookupAttributeIdLimit attributes actor+  attribute <- decodeCompressedWordBits limit+  name <- lookupAttributeName classes attributes attribute+  Attribute attribute name+    <$> decodeAttributeValueBits+          version+          (classAttributeMapObjectMap classes)+          name++lookupAttributeMap+  :: ClassAttributeMap+  -> Map CompressedWord Word32le+  -> CompressedWord+  -> DecodeBits (Map Word32le Word32le)+lookupAttributeMap classes actors actor = fromMaybe+  ("could not get attribute map for " <> show actor)+  (getAttributeMap classes actors actor)++lookupAttributeIdLimit+  :: Map Word32le Word32le -> CompressedWord -> DecodeBits Word+lookupAttributeIdLimit attributes actor = fromMaybe+  ("could not get attribute ID limit for " <> show actor)+  (getAttributeIdLimit attributes)++lookupAttributeName+  :: ClassAttributeMap+  -> Map Word32le Word32le+  -> CompressedWord+  -> DecodeBits Str+lookupAttributeName classes attributes attribute = fromMaybe+  ("could not get attribute name for " <> show attribute)+  (getAttributeName classes attributes attribute)++fromMaybe :: String -> Maybe a -> DecodeBits a+fromMaybe message = maybe (fail message) pure
+ library/Rattletrap/Decode/AttributeMapping.hs view
@@ -0,0 +1,11 @@+module Rattletrap.Decode.AttributeMapping+  ( decodeAttributeMapping+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Word32le+import Rattletrap.Type.AttributeMapping++decodeAttributeMapping :: Decode AttributeMapping+decodeAttributeMapping =+  AttributeMapping <$> decodeWord32le <*> decodeWord32le
+ library/Rattletrap/Decode/AttributeValue.hs view
@@ -0,0 +1,115 @@+module Rattletrap.Decode.AttributeValue+  ( decodeAttributeValueBits+  ) where++import Data.Semigroup ((<>))+import Rattletrap.Data+import Rattletrap.Decode.AppliedDamageAttribute+import Rattletrap.Decode.BooleanAttribute+import Rattletrap.Decode.ByteAttribute+import Rattletrap.Decode.CamSettingsAttribute+import Rattletrap.Decode.ClubColorsAttribute+import Rattletrap.Decode.Common+import Rattletrap.Decode.DamageStateAttribute+import Rattletrap.Decode.DemolishAttribute+import Rattletrap.Decode.EnumAttribute+import Rattletrap.Decode.ExplosionAttribute+import Rattletrap.Decode.ExtendedExplosionAttribute+import Rattletrap.Decode.FlaggedIntAttribute+import Rattletrap.Decode.FloatAttribute+import Rattletrap.Decode.GameModeAttribute+import Rattletrap.Decode.IntAttribute+import Rattletrap.Decode.LoadoutAttribute+import Rattletrap.Decode.LoadoutOnlineAttribute+import Rattletrap.Decode.LoadoutsAttribute+import Rattletrap.Decode.LoadoutsOnlineAttribute+import Rattletrap.Decode.LocationAttribute+import Rattletrap.Decode.MusicStingerAttribute+import Rattletrap.Decode.PartyLeaderAttribute+import Rattletrap.Decode.PickupAttribute+import Rattletrap.Decode.PlayerHistoryKeyAttribute+import Rattletrap.Decode.PrivateMatchSettingsAttribute+import Rattletrap.Decode.QWordAttribute+import Rattletrap.Decode.ReservationAttribute+import Rattletrap.Decode.RigidBodyStateAttribute+import Rattletrap.Decode.StringAttribute+import Rattletrap.Decode.TeamPaintAttribute+import Rattletrap.Decode.UniqueIdAttribute+import Rattletrap.Decode.WeldedInfoAttribute+import Rattletrap.Type.AttributeType+import Rattletrap.Type.AttributeValue+import Rattletrap.Type.Common+import Rattletrap.Type.Str+import Rattletrap.Type.Word32le++import qualified Data.Map as Map++decodeAttributeValueBits+  :: (Int, Int, Int) -> Map Word32le Str -> Str -> DecodeBits AttributeValue+decodeAttributeValueBits version objectMap name = do+  constructor <- maybe+    (fail ("don't know how to get attribute value " <> show name))+    pure+    (Map.lookup name attributeTypes)+  case constructor of+    AttributeTypeAppliedDamage ->+      AttributeValueAppliedDamage <$> decodeAppliedDamageAttributeBits+    AttributeTypeBoolean ->+      AttributeValueBoolean <$> decodeBooleanAttributeBits+    AttributeTypeByte -> AttributeValueByte <$> decodeByteAttributeBits+    AttributeTypeCamSettings ->+      AttributeValueCamSettings <$> decodeCamSettingsAttributeBits version+    AttributeTypeClubColors ->+      AttributeValueClubColors <$> decodeClubColorsAttributeBits+    AttributeTypeDamageState ->+      AttributeValueDamageState <$> decodeDamageStateAttributeBits+    AttributeTypeDemolish ->+      AttributeValueDemolish <$> decodeDemolishAttributeBits+    AttributeTypeEnum -> AttributeValueEnum <$> decodeEnumAttributeBits+    AttributeTypeExplosion ->+      AttributeValueExplosion <$> decodeExplosionAttributeBits+    AttributeTypeExtendedExplosion ->+      AttributeValueExtendedExplosion <$> decodeExtendedExplosionAttributeBits+    AttributeTypeFlaggedInt ->+      AttributeValueFlaggedInt <$> decodeFlaggedIntAttributeBits+    AttributeTypeFloat -> AttributeValueFloat <$> decodeFloatAttributeBits+    AttributeTypeGameMode ->+      AttributeValueGameMode <$> decodeGameModeAttributeBits version+    AttributeTypeInt -> AttributeValueInt <$> decodeIntAttributeBits+    AttributeTypeLoadout ->+      AttributeValueLoadout <$> decodeLoadoutAttributeBits+    AttributeTypeLoadoutOnline ->+      AttributeValueLoadoutOnline+        <$> decodeLoadoutOnlineAttributeBits version objectMap+    AttributeTypeLoadouts ->+      AttributeValueLoadouts <$> decodeLoadoutsAttributeBits+    AttributeTypeLoadoutsOnline ->+      AttributeValueLoadoutsOnline+        <$> decodeLoadoutsOnlineAttributeBits version objectMap+    AttributeTypeLocation ->+      AttributeValueLocation <$> decodeLocationAttributeBits+    AttributeTypeMusicStinger ->+      AttributeValueMusicStinger <$> decodeMusicStingerAttributeBits+    AttributeTypePartyLeader ->+      AttributeValuePartyLeader <$> decodePartyLeaderAttributeBits version+    AttributeTypePickup -> AttributeValuePickup <$> decodePickupAttributeBits+    AttributeTypePlayerHistoryKey ->+      AttributeValuePlayerHistoryKey <$> decodePlayerHistoryKeyAttributeBits+    AttributeTypePrivateMatchSettings ->+      AttributeValuePrivateMatchSettings+        <$> decodePrivateMatchSettingsAttributeBits+    AttributeTypeQWord -> AttributeValueQWord <$> decodeQWordAttributeBits+    AttributeTypeReservation ->+      AttributeValueReservation <$> decodeReservationAttributeBits version+    AttributeTypeRigidBodyState ->+      AttributeValueRigidBodyState <$> decodeRigidBodyStateAttributeBits+    AttributeTypeString -> AttributeValueString <$> decodeStringAttributeBits+    AttributeTypeTeamPaint ->+      AttributeValueTeamPaint <$> decodeTeamPaintAttributeBits+    AttributeTypeUniqueId ->+      AttributeValueUniqueId <$> decodeUniqueIdAttributeBits version+    AttributeTypeWeldedInfo ->+      AttributeValueWeldedInfo <$> decodeWeldedInfoAttributeBits++attributeTypes :: Map Str AttributeType+attributeTypes = Map.mapKeys toStr (Map.fromList rawAttributeTypes)
+ library/Rattletrap/Decode/Bitstream.hs view
@@ -0,0 +1,11 @@+module Rattletrap.Decode.Bitstream+  ( decodeBitstreamBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Type.Bitstream++import qualified Control.Monad as Monad++decodeBitstreamBits :: Int -> DecodeBits Bitstream+decodeBitstreamBits n = Bitstream <$> Monad.replicateM n getBool
+ library/Rattletrap/Decode/BooleanAttribute.hs view
@@ -0,0 +1,9 @@+module Rattletrap.Decode.BooleanAttribute+  ( decodeBooleanAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Type.BooleanAttribute++decodeBooleanAttributeBits :: DecodeBits BooleanAttribute+decodeBooleanAttributeBits = BooleanAttribute <$> getBool
+ library/Rattletrap/Decode/ByteAttribute.hs view
@@ -0,0 +1,10 @@+module Rattletrap.Decode.ByteAttribute+  ( decodeByteAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Word8le+import Rattletrap.Type.ByteAttribute++decodeByteAttributeBits :: DecodeBits ByteAttribute+decodeByteAttributeBits = ByteAttribute <$> decodeWord8leBits
+ library/Rattletrap/Decode/Cache.hs view
@@ -0,0 +1,17 @@+module Rattletrap.Decode.Cache+  ( decodeCache+  ) where++import Rattletrap.Decode.AttributeMapping+import Rattletrap.Decode.Common+import Rattletrap.Decode.List+import Rattletrap.Decode.Word32le+import Rattletrap.Type.Cache++decodeCache :: Decode Cache+decodeCache =+  Cache+    <$> decodeWord32le+    <*> decodeWord32le+    <*> decodeWord32le+    <*> decodeList decodeAttributeMapping
+ library/Rattletrap/Decode/CamSettingsAttribute.hs view
@@ -0,0 +1,19 @@+module Rattletrap.Decode.CamSettingsAttribute+  ( decodeCamSettingsAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Float32le+import Rattletrap.Type.CamSettingsAttribute++decodeCamSettingsAttributeBits+  :: (Int, Int, Int) -> DecodeBits CamSettingsAttribute+decodeCamSettingsAttributeBits version =+  CamSettingsAttribute+    <$> decodeFloat32leBits+    <*> decodeFloat32leBits+    <*> decodeFloat32leBits+    <*> decodeFloat32leBits+    <*> decodeFloat32leBits+    <*> decodeFloat32leBits+    <*> decodeWhen (version >= (868, 20, 0)) decodeFloat32leBits
+ library/Rattletrap/Decode/ClassMapping.hs view
@@ -0,0 +1,11 @@+module Rattletrap.Decode.ClassMapping+  ( decodeClassMapping+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Str+import Rattletrap.Decode.Word32le+import Rattletrap.Type.ClassMapping++decodeClassMapping :: Decode ClassMapping+decodeClassMapping = ClassMapping <$> decodeStr <*> decodeWord32le
+ library/Rattletrap/Decode/ClubColorsAttribute.hs view
@@ -0,0 +1,15 @@+module Rattletrap.Decode.ClubColorsAttribute+  ( decodeClubColorsAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Word8le+import Rattletrap.Type.ClubColorsAttribute++decodeClubColorsAttributeBits :: DecodeBits ClubColorsAttribute+decodeClubColorsAttributeBits =+  ClubColorsAttribute+    <$> getBool+    <*> decodeWord8leBits+    <*> getBool+    <*> decodeWord8leBits
+ library/Rattletrap/Decode/Common.hs view
@@ -0,0 +1,55 @@+module Rattletrap.Decode.Common+  ( Decode+  , DecodeBits+  , decodeWhen+  , getLazyByteStringBits+  , getWord8Bits+  , runDecode+  , runDecodeBits+  , toBits+  , Binary.getFloatle+  , Binary.getLazyByteString+  , Binary.getInt8+  , Binary.getInt32le+  , Binary.getWord8+  , Binary.getWord32le+  , Binary.getWord64le+  , BinaryBits.getBool+  , BinaryBits.getWord16be+  , BinaryBits.getWord32be+  ) where++import qualified Control.Applicative as Applicative+import qualified Data.Binary as Binary+import qualified Data.Binary.Bits.Get as BinaryBits+import qualified Data.Binary.Get as Binary+import qualified Data.ByteString.Lazy as LazyBytes+import qualified Data.Word as Word+import qualified Rattletrap.Utility.Bytes as Utility++type Decode = Binary.Get++type DecodeBits = BinaryBits.BitGet++decodeWhen+  :: (Applicative m, Applicative.Alternative f) => Bool -> m a -> m (f a)+decodeWhen p f = if p then fmap pure f else pure Applicative.empty++getLazyByteStringBits :: Int -> DecodeBits LazyBytes.ByteString+getLazyByteStringBits = BinaryBits.getLazyByteString++getWord8Bits :: Int -> DecodeBits Word.Word8+getWord8Bits = BinaryBits.getWord8++runDecode :: Decode a -> LazyBytes.ByteString -> Either String a+runDecode decode bytes = case Binary.runGetOrFail decode bytes of+  Left (_, _, x) -> fail x+  Right (_, _, x) -> pure x++runDecodeBits :: DecodeBits a -> LazyBytes.ByteString -> Either String a+runDecodeBits = runDecode . BinaryBits.runBitGet++toBits :: Decode a -> Int -> DecodeBits a+toBits decode =+  fmap (Binary.runGet decode . Utility.reverseBytes)+    . BinaryBits.getLazyByteString
+ library/Rattletrap/Decode/CompressedWord.hs view
@@ -0,0 +1,29 @@+module Rattletrap.Decode.CompressedWord+  ( decodeCompressedWordBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Type.CompressedWord++import qualified Data.Bits as Bits++decodeCompressedWordBits :: Word -> DecodeBits CompressedWord+decodeCompressedWordBits limit =+  CompressedWord limit <$> step limit (getMaxBits limit) 0 0++getMaxBits :: Word -> Word+getMaxBits x = do+  let+    n :: Word+    n = max 1 (ceiling (logBase (2 :: Double) (fromIntegral (max 1 x))))+  if x < 1024 && x == 2 ^ n then n + 1 else n++step :: Word -> Word -> Word -> Word -> DecodeBits Word+step limit maxBits position value = do+  let x = Bits.shiftL 1 (fromIntegral position) :: Word+  if position < maxBits && value + x <= limit+    then do+      bit <- getBool+      let newValue = if bit then value + x else value+      step limit maxBits (position + 1) newValue+    else pure value
+ library/Rattletrap/Decode/CompressedWordVector.hs view
@@ -0,0 +1,17 @@+module Rattletrap.Decode.CompressedWordVector+  ( decodeCompressedWordVectorBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.CompressedWord+import Rattletrap.Type.CompressedWordVector++decodeCompressedWordVectorBits :: DecodeBits CompressedWordVector+decodeCompressedWordVectorBits =+  CompressedWordVector+    <$> decodeCompressedWordBits limit+    <*> decodeCompressedWordBits limit+    <*> decodeCompressedWordBits limit++limit :: Word+limit = 65536
+ library/Rattletrap/Decode/Content.hs view
@@ -0,0 +1,68 @@+module Rattletrap.Decode.Content+  ( decodeContent+  ) where++import Rattletrap.Decode.Cache+import Rattletrap.Decode.ClassMapping+import Rattletrap.Decode.Common+import Rattletrap.Decode.Frame+import Rattletrap.Decode.KeyFrame+import Rattletrap.Decode.List+import Rattletrap.Decode.Mark+import Rattletrap.Decode.Message+import Rattletrap.Decode.Str+import Rattletrap.Decode.Word32le+import Rattletrap.Type.ClassAttributeMap+import Rattletrap.Type.Content+import Rattletrap.Type.Word32le+import Rattletrap.Utility.Bytes++import qualified Control.Monad.Trans.State as State++decodeContent+  :: (Int, Int, Int)+  -- ^ Version numbers, usually from 'Rattletrap.Header.getVersion'.+  -> Int+  -- ^ The number of frames in the stream, usually from+  -- 'Rattletrap.Header.getNumFrames'.+  -> Word+  -- ^ The maximum number of channels in the stream, usually from+  -- 'Rattletrap.Header.getMaxChannels'.+  -> Decode Content+decodeContent version numFrames maxChannels = do+  (levels, keyFrames, streamSize) <-+    (,,)+    <$> decodeList decodeStr+    <*> decodeList decodeKeyFrame+    <*> decodeWord32le+  (stream, messages, marks, packages, objects, names, classMappings, caches) <-+    (,,,,,,,)+    <$> getLazyByteString (fromIntegral (word32leValue streamSize))+    <*> decodeList decodeMessage+    <*> decodeList decodeMark+    <*> decodeList decodeStr+    <*> decodeList decodeStr+    <*> decodeList decodeStr+    <*> decodeList decodeClassMapping+    <*> decodeList decodeCache+  let+    classAttributeMap =+      makeClassAttributeMap objects classMappings caches names+    bitGet = State.evalStateT+      (decodeFramesBits version numFrames maxChannels classAttributeMap)+      mempty+  frames <- either fail pure (runDecodeBits bitGet (reverseBytes stream))+  pure+    ( Content+      levels+      keyFrames+      streamSize+      frames+      messages+      marks+      packages+      objects+      names+      classMappings+      caches+    )
+ library/Rattletrap/Decode/DamageStateAttribute.hs view
@@ -0,0 +1,19 @@+module Rattletrap.Decode.DamageStateAttribute+  ( decodeDamageStateAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Int32le+import Rattletrap.Decode.Vector+import Rattletrap.Decode.Word8le+import Rattletrap.Type.DamageStateAttribute++decodeDamageStateAttributeBits :: DecodeBits DamageStateAttribute+decodeDamageStateAttributeBits =+  DamageStateAttribute+    <$> decodeWord8leBits+    <*> getBool+    <*> decodeInt32leBits+    <*> decodeVectorBits+    <*> getBool+    <*> getBool
+ library/Rattletrap/Decode/DemolishAttribute.hs view
@@ -0,0 +1,18 @@+module Rattletrap.Decode.DemolishAttribute+  ( decodeDemolishAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Vector+import Rattletrap.Decode.Word32le+import Rattletrap.Type.DemolishAttribute++decodeDemolishAttributeBits :: DecodeBits DemolishAttribute+decodeDemolishAttributeBits =+  DemolishAttribute+    <$> getBool+    <*> decodeWord32leBits+    <*> getBool+    <*> decodeWord32leBits+    <*> decodeVectorBits+    <*> decodeVectorBits
+ library/Rattletrap/Decode/DestroyedReplication.hs view
@@ -0,0 +1,9 @@+module Rattletrap.Decode.DestroyedReplication+  ( decodeDestroyedReplicationBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Type.DestroyedReplication++decodeDestroyedReplicationBits :: DecodeBits DestroyedReplication+decodeDestroyedReplicationBits = pure DestroyedReplication
+ library/Rattletrap/Decode/Dictionary.hs view
@@ -0,0 +1,16 @@+module Rattletrap.Decode.Dictionary+  ( decodeDictionary+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Str+import Rattletrap.Type.Dictionary+import Rattletrap.Type.Str++decodeDictionary :: Decode a -> Decode (Dictionary a)+decodeDictionary decodeValue = do+  key <- decodeStr+  case filter (/= '\x00') (fromStr key) of+    "None" -> pure (DictionaryEnd key)+    _ ->+      DictionaryElement key <$> decodeValue <*> decodeDictionary decodeValue
+ library/Rattletrap/Decode/EnumAttribute.hs view
@@ -0,0 +1,9 @@+module Rattletrap.Decode.EnumAttribute+  ( decodeEnumAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Type.EnumAttribute++decodeEnumAttributeBits :: DecodeBits EnumAttribute+decodeEnumAttributeBits = EnumAttribute <$> getWord16be 11
+ library/Rattletrap/Decode/ExplosionAttribute.hs view
@@ -0,0 +1,12 @@+module Rattletrap.Decode.ExplosionAttribute+  ( decodeExplosionAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Int32le+import Rattletrap.Decode.Vector+import Rattletrap.Type.ExplosionAttribute++decodeExplosionAttributeBits :: DecodeBits ExplosionAttribute+decodeExplosionAttributeBits =+  ExplosionAttribute <$> getBool <*> decodeInt32leBits <*> decodeVectorBits
+ library/Rattletrap/Decode/ExtendedExplosionAttribute.hs view
@@ -0,0 +1,14 @@+module Rattletrap.Decode.ExtendedExplosionAttribute+  ( decodeExtendedExplosionAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.ExplosionAttribute+import Rattletrap.Decode.FlaggedIntAttribute+import Rattletrap.Type.ExtendedExplosionAttribute++decodeExtendedExplosionAttributeBits :: DecodeBits ExtendedExplosionAttribute+decodeExtendedExplosionAttributeBits =+  ExtendedExplosionAttribute+    <$> decodeExplosionAttributeBits+    <*> decodeFlaggedIntAttributeBits
+ library/Rattletrap/Decode/FlaggedIntAttribute.hs view
@@ -0,0 +1,11 @@+module Rattletrap.Decode.FlaggedIntAttribute+  ( decodeFlaggedIntAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Int32le+import Rattletrap.Type.FlaggedIntAttribute++decodeFlaggedIntAttributeBits :: DecodeBits FlaggedIntAttribute+decodeFlaggedIntAttributeBits =+  FlaggedIntAttribute <$> getBool <*> decodeInt32leBits
+ library/Rattletrap/Decode/Float32le.hs view
@@ -0,0 +1,13 @@+module Rattletrap.Decode.Float32le+  ( decodeFloat32le+  , decodeFloat32leBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Type.Float32le++decodeFloat32le :: Decode Float32le+decodeFloat32le = Float32le <$> getFloatle++decodeFloat32leBits :: DecodeBits Float32le+decodeFloat32leBits = toBits decodeFloat32le 4
+ library/Rattletrap/Decode/FloatAttribute.hs view
@@ -0,0 +1,10 @@+module Rattletrap.Decode.FloatAttribute+  ( decodeFloatAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Float32le+import Rattletrap.Type.FloatAttribute++decodeFloatAttributeBits :: DecodeBits FloatAttribute+decodeFloatAttributeBits = FloatAttribute <$> decodeFloat32leBits
+ library/Rattletrap/Decode/Frame.hs view
@@ -0,0 +1,43 @@+module Rattletrap.Decode.Frame+  ( decodeFramesBits+  , decodeFrameBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Float32le+import Rattletrap.Decode.Replication+import Rattletrap.Type.ClassAttributeMap+import Rattletrap.Type.CompressedWord+import Rattletrap.Type.Frame+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++decodeFramesBits+  :: (Int, Int, Int)+  -> Int+  -> Word+  -> ClassAttributeMap+  -> State.StateT+       (Map.Map CompressedWord Word32le)+       DecodeBits+       [Frame]+decodeFramesBits version count limit classes = if count <= 0+  then pure []+  else+    (:)+    <$> decodeFrameBits version limit classes+    <*> decodeFramesBits version (count - 1) limit classes++decodeFrameBits+  :: (Int, Int, Int)+  -> Word+  -> ClassAttributeMap+  -> State.StateT (Map.Map CompressedWord Word32le) DecodeBits Frame+decodeFrameBits version limit classes =+  Frame+    <$> Trans.lift decodeFloat32leBits+    <*> Trans.lift decodeFloat32leBits+    <*> decodeReplicationsBits version limit classes
+ library/Rattletrap/Decode/GameModeAttribute.hs view
@@ -0,0 +1,14 @@+module Rattletrap.Decode.GameModeAttribute+  ( decodeGameModeAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Type.GameModeAttribute++decodeGameModeAttributeBits :: (Int, Int, Int) -> DecodeBits GameModeAttribute+decodeGameModeAttributeBits version =+  GameModeAttribute <$> pure (numBits version) <*> getWord8Bits+    (numBits version)++numBits :: (Int, Int, Int) -> Int+numBits version = if version < (868, 12, 0) then 2 else 8
+ library/Rattletrap/Decode/Header.hs view
@@ -0,0 +1,21 @@+module Rattletrap.Decode.Header+  ( decodeHeader+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Dictionary+import Rattletrap.Decode.Property+import Rattletrap.Decode.Str+import Rattletrap.Decode.Word32le+import Rattletrap.Type.Header+import Rattletrap.Type.Word32le++decodeHeader :: Decode Header+decodeHeader = do+  (major, minor) <- (,) <$> decodeWord32le <*> decodeWord32le+  Header major minor+    <$> decodeWhen+          (major >= Word32le 868 && minor >= Word32le 18)+          decodeWord32le+    <*> decodeStr+    <*> decodeDictionary decodeProperty
+ library/Rattletrap/Decode/Initialization.hs view
@@ -0,0 +1,14 @@+module Rattletrap.Decode.Initialization+  ( decodeInitializationBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Int8Vector+import Rattletrap.Decode.Vector+import Rattletrap.Type.Initialization++decodeInitializationBits :: Bool -> Bool -> DecodeBits Initialization+decodeInitializationBits hasLocation hasRotation =+  Initialization+    <$> decodeWhen hasLocation decodeVectorBits+    <*> decodeWhen hasRotation decodeInt8VectorBits
+ library/Rattletrap/Decode/Int32le.hs view
@@ -0,0 +1,13 @@+module Rattletrap.Decode.Int32le+  ( decodeInt32le+  , decodeInt32leBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Type.Int32le++decodeInt32le :: Decode Int32le+decodeInt32le = Int32le <$> getInt32le++decodeInt32leBits :: DecodeBits Int32le+decodeInt32leBits = toBits decodeInt32le 4
+ library/Rattletrap/Decode/Int8Vector.hs view
@@ -0,0 +1,17 @@+module Rattletrap.Decode.Int8Vector+  ( decodeInt8VectorBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Int8le+import Rattletrap.Type.Int8Vector+import Rattletrap.Type.Int8le++decodeInt8VectorBits :: DecodeBits Int8Vector+decodeInt8VectorBits =+  Int8Vector <$> decodeFieldBits <*> decodeFieldBits <*> decodeFieldBits++decodeFieldBits :: DecodeBits (Maybe Int8le)+decodeFieldBits = do+  hasField <- getBool+  decodeWhen hasField decodeInt8leBits
+ library/Rattletrap/Decode/Int8le.hs view
@@ -0,0 +1,13 @@+module Rattletrap.Decode.Int8le+  ( decodeInt8le+  , decodeInt8leBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Type.Int8le++decodeInt8le :: Decode Int8le+decodeInt8le = Int8le <$> getInt8++decodeInt8leBits :: DecodeBits Int8le+decodeInt8leBits = toBits decodeInt8le 1
+ library/Rattletrap/Decode/IntAttribute.hs view
@@ -0,0 +1,10 @@+module Rattletrap.Decode.IntAttribute+  ( decodeIntAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Int32le+import Rattletrap.Type.IntAttribute++decodeIntAttributeBits :: DecodeBits IntAttribute+decodeIntAttributeBits = IntAttribute <$> decodeInt32leBits
+ library/Rattletrap/Decode/KeyFrame.hs view
@@ -0,0 +1,12 @@+module Rattletrap.Decode.KeyFrame+  ( decodeKeyFrame+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Float32le+import Rattletrap.Decode.Word32le+import Rattletrap.Type.KeyFrame++decodeKeyFrame :: Decode KeyFrame+decodeKeyFrame =+  KeyFrame <$> decodeFloat32le <*> decodeWord32le <*> decodeWord32le
+ library/Rattletrap/Decode/List.hs view
@@ -0,0 +1,15 @@+module Rattletrap.Decode.List+  ( decodeList+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Word32le+import Rattletrap.Type.List+import Rattletrap.Type.Word32le++import qualified Control.Monad as Monad++decodeList :: Decode a -> Decode (List a)+decodeList decodeElement = do+  size <- decodeWord32le+  List <$> Monad.replicateM (fromIntegral (word32leValue size)) decodeElement
+ library/Rattletrap/Decode/LoadoutAttribute.hs view
@@ -0,0 +1,26 @@+module Rattletrap.Decode.LoadoutAttribute+  ( decodeLoadoutAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Word32le+import Rattletrap.Decode.Word8le+import Rattletrap.Type.LoadoutAttribute+import Rattletrap.Type.Word8le++decodeLoadoutAttributeBits :: DecodeBits LoadoutAttribute+decodeLoadoutAttributeBits = do+  version <- decodeWord8leBits+  LoadoutAttribute version+    <$> decodeWord32leBits+    <*> decodeWord32leBits+    <*> decodeWord32leBits+    <*> decodeWord32leBits+    <*> decodeWord32leBits+    <*> decodeWord32leBits+    <*> decodeWord32leBits+    <*> decodeWhen (version > Word8le 10) decodeWord32leBits+    <*> decodeWhen (version >= Word8le 16) decodeWord32leBits+    <*> decodeWhen (version >= Word8le 16) decodeWord32leBits+    <*> decodeWhen (version >= Word8le 16) decodeWord32leBits+    <*> decodeWhen (version >= Word8le 17) decodeWord32leBits
+ library/Rattletrap/Decode/LoadoutOnlineAttribute.hs view
@@ -0,0 +1,24 @@+module Rattletrap.Decode.LoadoutOnlineAttribute+  ( decodeLoadoutOnlineAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.ProductAttribute+import Rattletrap.Decode.Word8le+import Rattletrap.Type.LoadoutOnlineAttribute+import Rattletrap.Type.Str+import Rattletrap.Type.Word32le+import Rattletrap.Type.Word8le++import qualified Control.Monad as Monad+import qualified Data.Map as Map++decodeLoadoutOnlineAttributeBits+  :: (Int, Int, Int)+  -> Map.Map Word32le Str+  -> DecodeBits LoadoutOnlineAttribute+decodeLoadoutOnlineAttributeBits version objectMap = do+  size <- decodeWord8leBits+  LoadoutOnlineAttribute <$> Monad.replicateM+    (fromIntegral (word8leValue size))+    (decodeProductAttributesBits version objectMap)
+ library/Rattletrap/Decode/LoadoutsAttribute.hs view
@@ -0,0 +1,13 @@+module Rattletrap.Decode.LoadoutsAttribute+  ( decodeLoadoutsAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.LoadoutAttribute+import Rattletrap.Type.LoadoutsAttribute++decodeLoadoutsAttributeBits :: DecodeBits LoadoutsAttribute+decodeLoadoutsAttributeBits =+  LoadoutsAttribute+    <$> decodeLoadoutAttributeBits+    <*> decodeLoadoutAttributeBits
+ library/Rattletrap/Decode/LoadoutsOnlineAttribute.hs view
@@ -0,0 +1,22 @@+module Rattletrap.Decode.LoadoutsOnlineAttribute+  ( decodeLoadoutsOnlineAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.LoadoutOnlineAttribute+import Rattletrap.Type.LoadoutsOnlineAttribute+import Rattletrap.Type.Str+import Rattletrap.Type.Word32le++import qualified Data.Map as Map++decodeLoadoutsOnlineAttributeBits+  :: (Int, Int, Int)+  -> Map.Map Word32le Str+  -> DecodeBits LoadoutsOnlineAttribute+decodeLoadoutsOnlineAttributeBits version objectMap =+  LoadoutsOnlineAttribute+    <$> decodeLoadoutOnlineAttributeBits version objectMap+    <*> decodeLoadoutOnlineAttributeBits version objectMap+    <*> getBool+    <*> getBool
+ library/Rattletrap/Decode/LocationAttribute.hs view
@@ -0,0 +1,10 @@+module Rattletrap.Decode.LocationAttribute+  ( decodeLocationAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Vector+import Rattletrap.Type.LocationAttribute++decodeLocationAttributeBits :: DecodeBits LocationAttribute+decodeLocationAttributeBits = LocationAttribute <$> decodeVectorBits
+ library/Rattletrap/Decode/Mark.hs view
@@ -0,0 +1,11 @@+module Rattletrap.Decode.Mark+  ( decodeMark+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Str+import Rattletrap.Decode.Word32le+import Rattletrap.Type.Mark++decodeMark :: Decode Mark+decodeMark = Mark <$> decodeStr <*> decodeWord32le
+ library/Rattletrap/Decode/Message.hs view
@@ -0,0 +1,11 @@+module Rattletrap.Decode.Message+  ( decodeMessage+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Str+import Rattletrap.Decode.Word32le+import Rattletrap.Type.Message++decodeMessage :: Decode Message+decodeMessage = Message <$> decodeWord32le <*> decodeStr <*> decodeStr
+ library/Rattletrap/Decode/MusicStingerAttribute.hs view
@@ -0,0 +1,15 @@+module Rattletrap.Decode.MusicStingerAttribute+  ( decodeMusicStingerAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Word32le+import Rattletrap.Decode.Word8le+import Rattletrap.Type.MusicStingerAttribute++decodeMusicStingerAttributeBits :: DecodeBits MusicStingerAttribute+decodeMusicStingerAttributeBits =+  MusicStingerAttribute+    <$> getBool+    <*> decodeWord32leBits+    <*> decodeWord8leBits
+ library/Rattletrap/Decode/PartyLeaderAttribute.hs view
@@ -0,0 +1,17 @@+module Rattletrap.Decode.PartyLeaderAttribute+  ( decodePartyLeaderAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.RemoteId+import Rattletrap.Decode.Word8le+import Rattletrap.Type.PartyLeaderAttribute+import Rattletrap.Type.Word8le++decodePartyLeaderAttributeBits+  :: (Int, Int, Int) -> DecodeBits PartyLeaderAttribute+decodePartyLeaderAttributeBits version = do+  systemId <- decodeWord8leBits+  PartyLeaderAttribute systemId <$> decodeWhen+    (systemId /= Word8le 0)+    ((,) <$> decodeRemoteIdBits version systemId <*> decodeWord8leBits)
+ library/Rattletrap/Decode/PickupAttribute.hs view
@@ -0,0 +1,12 @@+module Rattletrap.Decode.PickupAttribute+  ( decodePickupAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Word32le+import Rattletrap.Type.PickupAttribute++decodePickupAttributeBits :: DecodeBits PickupAttribute+decodePickupAttributeBits = do+  instigator <- getBool+  PickupAttribute <$> decodeWhen instigator decodeWord32leBits <*> getBool
+ library/Rattletrap/Decode/PlayerHistoryKeyAttribute.hs view
@@ -0,0 +1,11 @@+module Rattletrap.Decode.PlayerHistoryKeyAttribute+  ( decodePlayerHistoryKeyAttributeBits+  ) where++import Rattletrap.Decode.Bitstream+import Rattletrap.Decode.Common+import Rattletrap.Type.PlayerHistoryKeyAttribute++decodePlayerHistoryKeyAttributeBits :: DecodeBits PlayerHistoryKeyAttribute+decodePlayerHistoryKeyAttributeBits =+  PlayerHistoryKeyAttribute <$> decodeBitstreamBits 1253
+ library/Rattletrap/Decode/PrivateMatchSettingsAttribute.hs view
@@ -0,0 +1,19 @@+module Rattletrap.Decode.PrivateMatchSettingsAttribute+  ( decodePrivateMatchSettingsAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Str+import Rattletrap.Decode.Word32le+import Rattletrap.Type.PrivateMatchSettingsAttribute++decodePrivateMatchSettingsAttributeBits+  :: DecodeBits PrivateMatchSettingsAttribute+decodePrivateMatchSettingsAttributeBits =+  PrivateMatchSettingsAttribute+    <$> decodeStrBits+    <*> decodeWord32leBits+    <*> decodeWord32leBits+    <*> decodeStrBits+    <*> decodeStrBits+    <*> getBool
+ library/Rattletrap/Decode/ProductAttribute.hs view
@@ -0,0 +1,57 @@+module Rattletrap.Decode.ProductAttribute+  ( decodeProductAttributesBits+  , decodeProductAttributeBits+  ) where++import Data.Semigroup ((<>))+import Rattletrap.Decode.Common+import Rattletrap.Decode.CompressedWord+import Rattletrap.Decode.Word32le+import Rattletrap.Decode.Word8le+import Rattletrap.Type.Common+import Rattletrap.Type.CompressedWord+import Rattletrap.Type.ProductAttribute+import Rattletrap.Type.Str+import Rattletrap.Type.Word32le+import Rattletrap.Type.Word8le++import qualified Control.Monad as Monad+import qualified Data.Map as Map++decodeProductAttributesBits+  :: (Int, Int, Int) -> Map Word32le Str -> DecodeBits [ProductAttribute]+decodeProductAttributesBits version objectMap = do+  size <- decodeWord8leBits+  Monad.replicateM+    (fromIntegral (word8leValue size))+    (decodeProductAttributeBits version objectMap)++decodeProductAttributeBits+  :: (Int, Int, Int) -> Map Word32le Str -> DecodeBits ProductAttribute+decodeProductAttributeBits version objectMap = do+  flag <- getBool+  objectId <- decodeWord32leBits+  let objectName = Map.lookup objectId objectMap+  value <- case objectName of+    Just name -> case fromStr name of+      "TAGame.ProductAttribute_Painted_TA" -> Just <$> decodePainted version+      "TAGame.ProductAttribute_UserColor_TA" -> decodeColor+      _ ->+        fail+          ( "unknown object name "+          <> show objectName+          <> " for ID "+          <> show objectId+          )+    Nothing -> fail ("missing object name for ID " <> show objectId)+  pure (ProductAttribute flag objectId objectName value)++decodePainted :: (Int, Int, Int) -> DecodeBits (Either CompressedWord Word32)+decodePainted version = if version >= (868, 18, 0)+  then Right <$> getWord32be 31+  else Left <$> decodeCompressedWordBits 13++decodeColor :: DecodeBits (Maybe (Either CompressedWord Word32))+decodeColor = do+  hasValue <- getBool+  decodeWhen hasValue (Right <$> getWord32be 31)
+ library/Rattletrap/Decode/Property.hs view
@@ -0,0 +1,14 @@+module Rattletrap.Decode.Property+  ( decodeProperty+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.PropertyValue+import Rattletrap.Decode.Str+import Rattletrap.Decode.Word64le+import Rattletrap.Type.Property++decodeProperty :: Decode Property+decodeProperty = do+  kind <- decodeStr+  Property kind <$> decodeWord64le <*> decodePropertyValue decodeProperty kind
+ library/Rattletrap/Decode/PropertyValue.hs view
@@ -0,0 +1,31 @@+module Rattletrap.Decode.PropertyValue+  ( decodePropertyValue+  ) where++import Data.Semigroup ((<>))+import Rattletrap.Decode.Common+import Rattletrap.Decode.Dictionary+import Rattletrap.Decode.Float32le+import Rattletrap.Decode.Int32le+import Rattletrap.Decode.List+import Rattletrap.Decode.Str+import Rattletrap.Decode.Word64le+import Rattletrap.Decode.Word8le+import Rattletrap.Type.PropertyValue+import Rattletrap.Type.Str++decodePropertyValue :: Decode a -> Str -> Decode (PropertyValue a)+decodePropertyValue getProperty kind = case fromStr kind of+  "ArrayProperty" ->+    PropertyValueArray <$> decodeList (decodeDictionary getProperty)+  "BoolProperty" -> PropertyValueBool <$> decodeWord8le+  "ByteProperty" -> do+    k <- decodeStr+    PropertyValueByte k+      <$> decodeWhen (fromStr k /= "OnlinePlatform_Steam") decodeStr+  "FloatProperty" -> PropertyValueFloat <$> decodeFloat32le+  "IntProperty" -> PropertyValueInt <$> decodeInt32le+  "NameProperty" -> PropertyValueName <$> decodeStr+  "QWordProperty" -> PropertyValueQWord <$> decodeWord64le+  "StrProperty" -> PropertyValueStr <$> decodeStr+  _ -> fail ("don't know how to read property value " <> show kind)
+ library/Rattletrap/Decode/QWordAttribute.hs view
@@ -0,0 +1,10 @@+module Rattletrap.Decode.QWordAttribute+  ( decodeQWordAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Word64le+import Rattletrap.Type.QWordAttribute++decodeQWordAttributeBits :: DecodeBits QWordAttribute+decodeQWordAttributeBits = QWordAttribute <$> decodeWord64leBits
+ library/Rattletrap/Decode/RemoteId.hs view
@@ -0,0 +1,38 @@+module Rattletrap.Decode.RemoteId+  ( decodeRemoteIdBits+  ) where++import Data.Semigroup ((<>))+import Rattletrap.Decode.Bitstream+import Rattletrap.Decode.Common+import Rattletrap.Decode.Word64le+import Rattletrap.Type.RemoteId+import Rattletrap.Type.Word8le+import Rattletrap.Utility.Bytes++import qualified Data.ByteString.Lazy as LazyBytes+import qualified Data.Text as Text+import qualified Data.Text.Encoding as Text+import qualified Data.Word as Word++decodeRemoteIdBits :: (Int, Int, Int) -> Word8le -> DecodeBits RemoteId+decodeRemoteIdBits (_, _, patch) systemId = case word8leValue systemId of+  0 -> RemoteIdSplitscreen <$> getWord32be 24+  1 -> RemoteIdSteam <$> decodeWord64leBits+  2 -> RemoteIdPlayStation <$> decodePsName <*> decodePsBytes patch+  4 -> RemoteIdXbox <$> decodeWord64leBits+  6 -> RemoteIdSwitch <$> decodeBitstreamBits 256+  _ -> fail ("unknown system id " <> show systemId)++decodePsName :: DecodeBits Text.Text+decodePsName = fmap+  ( Text.dropWhileEnd (== '\x00')+  . Text.decodeLatin1+  . LazyBytes.toStrict+  . reverseBytes+  )+  (getLazyByteStringBits 16)++decodePsBytes :: Int -> DecodeBits [Word.Word8]+decodePsBytes patch =+  LazyBytes.unpack <$> getLazyByteStringBits (if patch >= 1 then 24 else 16)
+ library/Rattletrap/Decode/Replay.hs view
@@ -0,0 +1,48 @@+module Rattletrap.Decode.Replay+  ( decodeReplay+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Content+import Rattletrap.Decode.Header+import Rattletrap.Decode.Section+import Rattletrap.Type.Dictionary+import Rattletrap.Type.Header+import Rattletrap.Type.Int32le+import Rattletrap.Type.Property+import Rattletrap.Type.PropertyValue+import Rattletrap.Type.Replay+import Rattletrap.Type.Section+import Rattletrap.Type.Str+import Rattletrap.Type.Word32le++decodeReplay :: Decode Replay+decodeReplay = do+  header <- decodeSection decodeHeader+  Replay header <$> decodeSection+    ( decodeContent+      (getVersion (sectionBody header))+      (getNumFrames (sectionBody header))+      (getMaxChannels (sectionBody header))+    )++getVersion :: Header -> (Int, Int, Int)+getVersion header =+  ( fromIntegral (word32leValue (headerEngineVersion header))+  , fromIntegral (word32leValue (headerLicenseeVersion header))+  , maybe 0 (fromIntegral . word32leValue) (headerPatchVersion header)+  )++getNumFrames :: Header -> Int+getNumFrames header =+  case dictionaryLookup (toStr "NumFrames") (headerProperties header) of+    Just (Property _ _ (PropertyValueInt numFrames)) ->+      fromIntegral (int32leValue numFrames)+    _ -> 0++getMaxChannels :: Header -> Word+getMaxChannels header =+  case dictionaryLookup (toStr "MaxChannels") (headerProperties header) of+    Just (Property _ _ (PropertyValueInt numFrames)) ->+      fromIntegral (int32leValue numFrames)+    _ -> 1023
+ library/Rattletrap/Decode/Replication.hs view
@@ -0,0 +1,45 @@+module Rattletrap.Decode.Replication+  ( decodeReplicationsBits+  , decodeReplicationBits+  ) 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 version limit classes = do+  hasReplication <- Trans.lift getBool+  if hasReplication+    then+      (:)+      <$> decodeReplicationBits version limit classes+      <*> decodeReplicationsBits version limit classes+    else pure []++decodeReplicationBits+  :: (Int, Int, Int)+  -> Word+  -> ClassAttributeMap+  -> State.StateT+       (Map.Map CompressedWord Word32le)+       DecodeBits+       Replication+decodeReplicationBits version limit classes = do+  actor <- Trans.lift (decodeCompressedWordBits limit)+  Replication actor <$> decodeReplicationValueBits version classes actor
+ library/Rattletrap/Decode/ReplicationValue.hs view
@@ -0,0 +1,44 @@+module Rattletrap.Decode.ReplicationValue+  ( decodeReplicationValueBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.DestroyedReplication+import Rattletrap.Decode.SpawnedReplication+import Rattletrap.Decode.UpdatedReplication+import Rattletrap.Type.ClassAttributeMap+import Rattletrap.Type.CompressedWord+import Rattletrap.Type.ReplicationValue+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++decodeReplicationValueBits+  :: (Int, Int, Int)+  -> ClassAttributeMap+  -> CompressedWord+  -> State.StateT+       (Map.Map CompressedWord Word32le)+       DecodeBits+       ReplicationValue+decodeReplicationValueBits version classAttributeMap actorId = do+  actorMap <- State.get+  isOpen <- Trans.lift getBool+  if isOpen+    then do+      isNew <- Trans.lift getBool+      if isNew+        then+          ReplicationValueSpawned+            <$> decodeSpawnedReplicationBits version classAttributeMap actorId+        else ReplicationValueUpdated <$> Trans.lift+          ( decodeUpdatedReplicationBits+            version+            classAttributeMap+            actorMap+            actorId+          )+    else ReplicationValueDestroyed+      <$> Trans.lift decodeDestroyedReplicationBits
+ library/Rattletrap/Decode/ReservationAttribute.hs view
@@ -0,0 +1,24 @@+module Rattletrap.Decode.ReservationAttribute+  ( decodeReservationAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.CompressedWord+import Rattletrap.Decode.Str+import Rattletrap.Decode.UniqueIdAttribute+import Rattletrap.Type.ReservationAttribute+import Rattletrap.Type.UniqueIdAttribute+import Rattletrap.Type.Word8le++decodeReservationAttributeBits+  :: (Int, Int, Int) -> DecodeBits ReservationAttribute+decodeReservationAttributeBits version = do+  number <- decodeCompressedWordBits 7+  uniqueId <- decodeUniqueIdAttributeBits version+  ReservationAttribute number uniqueId+    <$> decodeWhen+          (uniqueIdAttributeSystemId uniqueId /= Word8le 0)+          decodeStrBits+    <*> getBool+    <*> getBool+    <*> decodeWhen (version >= (868, 12, 0)) (getWord8Bits 6)
+ library/Rattletrap/Decode/RigidBodyStateAttribute.hs view
@@ -0,0 +1,17 @@+module Rattletrap.Decode.RigidBodyStateAttribute+  ( decodeRigidBodyStateAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.CompressedWordVector+import Rattletrap.Decode.Vector+import Rattletrap.Type.RigidBodyStateAttribute++decodeRigidBodyStateAttributeBits :: DecodeBits RigidBodyStateAttribute+decodeRigidBodyStateAttributeBits = do+  sleeping <- getBool+  RigidBodyStateAttribute sleeping+    <$> decodeVectorBits+    <*> decodeCompressedWordVectorBits+    <*> decodeWhen (not sleeping) decodeVectorBits+    <*> decodeWhen (not sleeping) decodeVectorBits
+ library/Rattletrap/Decode/Section.hs view
@@ -0,0 +1,25 @@+module Rattletrap.Decode.Section+  ( decodeSection+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Word32le+import Rattletrap.Type.Section+import Rattletrap.Type.Word32le+import Rattletrap.Utility.Crc++import qualified Control.Monad as Monad++decodeSection :: Decode a -> Decode (Section a)+decodeSection getBody = do+  size <- decodeWord32le+  crc <- decodeWord32le+  rawBody <- getLazyByteString (fromIntegral (word32leValue size))+  let actualCrc = Word32le (getCrc32 rawBody)+  Monad.when (actualCrc /= crc) (fail (crcMessage actualCrc crc))+  body <- either fail pure (runDecode getBody rawBody)+  pure (Section size crc body)++crcMessage :: Word32le -> Word32le -> String+crcMessage actual expected = unwords+  ["actual CRC", show actual, "does not match expected CRC", show expected]
+ library/Rattletrap/Decode/SpawnedReplication.hs view
@@ -0,0 +1,69 @@+module Rattletrap.Decode.SpawnedReplication+  ( decodeSpawnedReplicationBits+  ) where++import Data.Semigroup ((<>))+import Rattletrap.Decode.Common+import Rattletrap.Decode.Initialization+import Rattletrap.Decode.Word32le+import Rattletrap.Type.ClassAttributeMap+import Rattletrap.Type.CompressedWord+import Rattletrap.Type.SpawnedReplication+import Rattletrap.Type.Str+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++decodeSpawnedReplicationBits+  :: (Int, Int, Int)+  -> ClassAttributeMap+  -> CompressedWord+  -> State.StateT+       (Map.Map CompressedWord Word32le)+       DecodeBits+       SpawnedReplication+decodeSpawnedReplicationBits version classAttributeMap actorId = do+  flag <- Trans.lift getBool+  nameIndex <- decodeWhen+    (version >= (868, 14, 0))+    (Trans.lift decodeWord32leBits)+  name <- lookupName classAttributeMap nameIndex+  objectId <- Trans.lift decodeWord32leBits+  State.modify (Map.insert actorId objectId)+  objectName <- lookupObjectName classAttributeMap objectId+  className <- lookupClassName objectName+  let hasLocation = classHasLocation className+  let hasRotation = classHasRotation className+  initialization <- Trans.lift+    (decodeInitializationBits hasLocation hasRotation)+  pure+    ( SpawnedReplication+      flag+      nameIndex+      name+      objectId+      objectName+      className+      initialization+    )++lookupName :: Monad m => ClassAttributeMap -> Maybe Word32le -> m (Maybe Str)+lookupName classAttributeMap maybeNameIndex = case maybeNameIndex of+  Nothing -> pure Nothing+  Just nameIndex ->+    case getName (classAttributeMapNameMap classAttributeMap) nameIndex of+      Nothing -> fail ("could not get name for index " <> show nameIndex)+      Just name -> pure (Just name)++lookupObjectName :: Monad m => ClassAttributeMap -> Word32le -> m Str+lookupObjectName classAttributeMap objectId =+  case getObjectName (classAttributeMapObjectMap classAttributeMap) objectId of+    Nothing -> fail ("could not get object name for id " <> show objectId)+    Just objectName -> pure objectName++lookupClassName :: Monad m => Str -> m Str+lookupClassName objectName = case getClassName objectName of+  Nothing -> fail ("could not get class name for object " <> show objectName)+  Just className -> pure className
+ library/Rattletrap/Decode/Str.hs view
@@ -0,0 +1,42 @@+module Rattletrap.Decode.Str+  ( decodeStr+  , decodeStrBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Int32le+import Rattletrap.Type.Int32le+import Rattletrap.Type.Str+import Rattletrap.Utility.Bytes++import qualified Data.ByteString.Lazy as LazyBytes+import qualified Data.Text as Text+import qualified Data.Text.Encoding as Text++decodeStr :: Decode Str+decodeStr = do+  rawSize <- decodeInt32le+  bytes <- getLazyByteString (normalizeTextSize rawSize)+  pure (Str (dropNull (getTextDecoder rawSize bytes)))++decodeStrBits :: DecodeBits Str+decodeStrBits = do+  rawSize <- decodeInt32leBits+  bytes <- getLazyByteStringBits (normalizeTextSize rawSize)+  pure (Str (dropNull (getTextDecoder rawSize (reverseBytes bytes))))++normalizeTextSize :: Integral a => Int32le -> a+normalizeTextSize size = case int32leValue size of+  0x05000000 -> 8+  x -> if x < 0 then (-2 * fromIntegral x) else fromIntegral x++getTextDecoder :: Int32le -> LazyBytes.ByteString -> Text.Text+getTextDecoder size bytes =+  let+    decode =+      if size < Int32le 0 then Text.decodeUtf16LE else Text.decodeLatin1+  in+    decode (LazyBytes.toStrict bytes)++dropNull :: Text.Text -> Text.Text+dropNull = Text.dropWhileEnd (== '\x00')
+ library/Rattletrap/Decode/StringAttribute.hs view
@@ -0,0 +1,10 @@+module Rattletrap.Decode.StringAttribute+  ( decodeStringAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Str+import Rattletrap.Type.StringAttribute++decodeStringAttributeBits :: DecodeBits StringAttribute+decodeStringAttributeBits = StringAttribute <$> decodeStrBits
+ library/Rattletrap/Decode/TeamPaintAttribute.hs view
@@ -0,0 +1,17 @@+module Rattletrap.Decode.TeamPaintAttribute+  ( decodeTeamPaintAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Word32le+import Rattletrap.Decode.Word8le+import Rattletrap.Type.TeamPaintAttribute++decodeTeamPaintAttributeBits :: DecodeBits TeamPaintAttribute+decodeTeamPaintAttributeBits =+  TeamPaintAttribute+    <$> decodeWord8leBits+    <*> decodeWord8leBits+    <*> decodeWord8leBits+    <*> decodeWord32leBits+    <*> decodeWord32leBits
+ library/Rattletrap/Decode/UniqueIdAttribute.hs view
@@ -0,0 +1,15 @@+module Rattletrap.Decode.UniqueIdAttribute+  ( decodeUniqueIdAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.RemoteId+import Rattletrap.Decode.Word8le+import Rattletrap.Type.UniqueIdAttribute++decodeUniqueIdAttributeBits :: (Int, Int, Int) -> DecodeBits UniqueIdAttribute+decodeUniqueIdAttributeBits version = do+  systemId <- decodeWord8leBits+  UniqueIdAttribute systemId+    <$> decodeRemoteIdBits version systemId+    <*> decodeWord8leBits
+ library/Rattletrap/Decode/UpdatedReplication.hs view
@@ -0,0 +1,21 @@+module Rattletrap.Decode.UpdatedReplication+  ( decodeUpdatedReplicationBits+  ) where++import Rattletrap.Decode.Attribute+import Rattletrap.Decode.Common+import Rattletrap.Type.ClassAttributeMap+import Rattletrap.Type.CompressedWord+import Rattletrap.Type.UpdatedReplication+import Rattletrap.Type.Word32le++import qualified Data.Map as Map++decodeUpdatedReplicationBits+  :: (Int, Int, Int)+  -> ClassAttributeMap+  -> Map.Map CompressedWord Word32le+  -> CompressedWord+  -> DecodeBits UpdatedReplication+decodeUpdatedReplicationBits version classes actors actor =+  UpdatedReplication <$> decodeAttributesBits version classes actors actor
+ library/Rattletrap/Decode/Vector.hs view
@@ -0,0 +1,28 @@+module Rattletrap.Decode.Vector+  ( decodeVectorBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.CompressedWord+import Rattletrap.Type.CompressedWord+import Rattletrap.Type.Vector++decodeVectorBits :: DecodeBits Vector+decodeVectorBits = do+  size <- decodeCompressedWordBits 19+  let+    limit = getLimit size+    bias = getBias size+  Vector bias+    <$> fmap (fromDelta bias) (decodeCompressedWordBits limit)+    <*> fmap (fromDelta bias) (decodeCompressedWordBits limit)+    <*> fmap (fromDelta bias) (decodeCompressedWordBits limit)++getLimit :: CompressedWord -> Word+getLimit = (2 ^) . (+ 2) . compressedWordValue++getBias :: CompressedWord -> Word+getBias = (2 ^) . (+ 1) . compressedWordValue++fromDelta :: Word -> CompressedWord -> Int+fromDelta bias x = fromIntegral (compressedWordValue x) - fromIntegral bias
+ library/Rattletrap/Decode/WeldedInfoAttribute.hs view
@@ -0,0 +1,19 @@+module Rattletrap.Decode.WeldedInfoAttribute+  ( decodeWeldedInfoAttributeBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Float32le+import Rattletrap.Decode.Int32le+import Rattletrap.Decode.Int8Vector+import Rattletrap.Decode.Vector+import Rattletrap.Type.WeldedInfoAttribute++decodeWeldedInfoAttributeBits :: DecodeBits WeldedInfoAttribute+decodeWeldedInfoAttributeBits =+  WeldedInfoAttribute+    <$> getBool+    <*> decodeInt32leBits+    <*> decodeVectorBits+    <*> decodeFloat32leBits+    <*> decodeInt8VectorBits
+ library/Rattletrap/Decode/Word32le.hs view
@@ -0,0 +1,13 @@+module Rattletrap.Decode.Word32le+  ( decodeWord32le+  , decodeWord32leBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Type.Word32le++decodeWord32le :: Decode Word32le+decodeWord32le = Word32le <$> getWord32le++decodeWord32leBits :: DecodeBits Word32le+decodeWord32leBits = toBits decodeWord32le 4
+ library/Rattletrap/Decode/Word64le.hs view
@@ -0,0 +1,13 @@+module Rattletrap.Decode.Word64le+  ( decodeWord64le+  , decodeWord64leBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Type.Word64le++decodeWord64le :: Decode Word64le+decodeWord64le = Word64le <$> getWord64le++decodeWord64leBits :: DecodeBits Word64le+decodeWord64leBits = toBits decodeWord64le 8
+ library/Rattletrap/Decode/Word8le.hs view
@@ -0,0 +1,13 @@+module Rattletrap.Decode.Word8le+  ( decodeWord8le+  , decodeWord8leBits+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Type.Word8le++decodeWord8le :: Decode Word8le+decodeWord8le = Word8le <$> getWord8++decodeWord8leBits :: DecodeBits Word8le+decodeWord8leBits = toBits decodeWord8le 1
+ library/Rattletrap/Encode/AppliedDamageAttribute.hs view
@@ -0,0 +1,17 @@+module Rattletrap.Encode.AppliedDamageAttribute+  ( putAppliedDamageAttribute+  ) where++import Rattletrap.Encode.Int32le+import Rattletrap.Encode.Vector+import Rattletrap.Encode.Word8le+import Rattletrap.Type.AppliedDamageAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putAppliedDamageAttribute :: AppliedDamageAttribute -> BinaryBits.BitPut ()+putAppliedDamageAttribute appliedDamageAttribute = do+  putWord8Bits (appliedDamageAttributeUnknown1 appliedDamageAttribute)+  putVector (appliedDamageAttributeLocation appliedDamageAttribute)+  putInt32Bits (appliedDamageAttributeUnknown3 appliedDamageAttribute)+  putInt32Bits (appliedDamageAttributeUnknown4 appliedDamageAttribute)
+ library/Rattletrap/Encode/Attribute.hs view
@@ -0,0 +1,21 @@+module Rattletrap.Encode.Attribute+  ( putAttributes+  , putAttribute+  ) where++import Rattletrap.Encode.AttributeValue+import Rattletrap.Encode.CompressedWord+import Rattletrap.Type.Attribute++import qualified Data.Binary.Bits.Put as BinaryBits++putAttributes :: [Attribute] -> BinaryBits.BitPut ()+putAttributes attributes = do+  mapM_ putAttribute attributes+  BinaryBits.putBool False++putAttribute :: Attribute -> BinaryBits.BitPut ()+putAttribute attribute = do+  BinaryBits.putBool True+  putCompressedWord (attributeId attribute)+  putAttributeValue (attributeValue attribute)
+ library/Rattletrap/Encode/AttributeMapping.hs view
@@ -0,0 +1,13 @@+module Rattletrap.Encode.AttributeMapping+  ( putAttributeMapping+  ) where++import Rattletrap.Encode.Word32le+import Rattletrap.Type.AttributeMapping++import qualified Data.Binary as Binary++putAttributeMapping :: AttributeMapping -> Binary.Put+putAttributeMapping attributeMapping = do+  putWord32 (attributeMappingObjectId attributeMapping)+  putWord32 (attributeMappingStreamId attributeMapping)
+ library/Rattletrap/Encode/AttributeValue.hs view
@@ -0,0 +1,72 @@+module Rattletrap.Encode.AttributeValue+  ( putAttributeValue+  ) where++import Rattletrap.Encode.AppliedDamageAttribute+import Rattletrap.Encode.BooleanAttribute+import Rattletrap.Encode.ByteAttribute+import Rattletrap.Encode.CamSettingsAttribute+import Rattletrap.Encode.ClubColorsAttribute+import Rattletrap.Encode.DamageStateAttribute+import Rattletrap.Encode.DemolishAttribute+import Rattletrap.Encode.EnumAttribute+import Rattletrap.Encode.ExplosionAttribute+import Rattletrap.Encode.ExtendedExplosionAttribute+import Rattletrap.Encode.FlaggedIntAttribute+import Rattletrap.Encode.FloatAttribute+import Rattletrap.Encode.GameModeAttribute+import Rattletrap.Encode.IntAttribute+import Rattletrap.Encode.LoadoutAttribute+import Rattletrap.Encode.LoadoutOnlineAttribute+import Rattletrap.Encode.LoadoutsAttribute+import Rattletrap.Encode.LoadoutsOnlineAttribute+import Rattletrap.Encode.LocationAttribute+import Rattletrap.Encode.MusicStingerAttribute+import Rattletrap.Encode.PartyLeaderAttribute+import Rattletrap.Encode.PickupAttribute+import Rattletrap.Encode.PlayerHistoryKeyAttribute+import Rattletrap.Encode.PrivateMatchSettingsAttribute+import Rattletrap.Encode.QWordAttribute+import Rattletrap.Encode.ReservationAttribute+import Rattletrap.Encode.RigidBodyStateAttribute+import Rattletrap.Encode.StringAttribute+import Rattletrap.Encode.TeamPaintAttribute+import Rattletrap.Encode.UniqueIdAttribute+import Rattletrap.Encode.WeldedInfoAttribute+import Rattletrap.Type.AttributeValue++import qualified Data.Binary.Bits.Put as BinaryBits++putAttributeValue :: AttributeValue -> BinaryBits.BitPut ()+putAttributeValue value = case value of+  AttributeValueAppliedDamage x -> putAppliedDamageAttribute x+  AttributeValueBoolean x -> putBooleanAttribute x+  AttributeValueByte x -> putByteAttribute x+  AttributeValueCamSettings x -> putCamSettingsAttribute x+  AttributeValueClubColors x -> putClubColorsAttribute x+  AttributeValueDamageState x -> putDamageStateAttribute x+  AttributeValueDemolish x -> putDemolishAttribute x+  AttributeValueEnum x -> putEnumAttribute x+  AttributeValueExplosion x -> putExplosionAttribute x+  AttributeValueExtendedExplosion x -> putExtendedExplosionAttribute x+  AttributeValueFlaggedInt x -> putFlaggedIntAttribute x+  AttributeValueFloat x -> putFloatAttribute x+  AttributeValueGameMode x -> putGameModeAttribute x+  AttributeValueInt x -> putIntAttribute x+  AttributeValueLoadout x -> putLoadoutAttribute x+  AttributeValueLoadoutOnline x -> putLoadoutOnlineAttribute x+  AttributeValueLoadouts x -> putLoadoutsAttribute x+  AttributeValueLoadoutsOnline x -> putLoadoutsOnlineAttribute x+  AttributeValueLocation x -> putLocationAttribute x+  AttributeValueMusicStinger x -> putMusicStingerAttribute x+  AttributeValuePartyLeader x -> putPartyLeaderAttribute x+  AttributeValuePickup x -> putPickupAttribute x+  AttributeValuePlayerHistoryKey x -> putPlayerHistoryKeyAttribute x+  AttributeValuePrivateMatchSettings x -> putPrivateMatchSettingsAttribute x+  AttributeValueQWord x -> putQWordAttribute x+  AttributeValueReservation x -> putReservationAttribute x+  AttributeValueRigidBodyState x -> putRigidBodyStateAttribute x+  AttributeValueString x -> putStringAttribute x+  AttributeValueTeamPaint x -> putTeamPaintAttribute x+  AttributeValueUniqueId x -> putUniqueIdAttribute x+  AttributeValueWeldedInfo x -> putWeldedInfoAttribute x
+ library/Rattletrap/Encode/Bitstream.hs view
@@ -0,0 +1,10 @@+module Rattletrap.Encode.Bitstream+  ( putBitstream+  ) where++import Rattletrap.Type.Bitstream++import qualified Data.Binary.Bits.Put as BinaryBits++putBitstream :: Bitstream -> BinaryBits.BitPut ()+putBitstream = mapM_ BinaryBits.putBool . bitstreamValue
+ library/Rattletrap/Encode/BooleanAttribute.hs view
@@ -0,0 +1,11 @@+module Rattletrap.Encode.BooleanAttribute+  ( putBooleanAttribute+  ) where++import Rattletrap.Type.BooleanAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putBooleanAttribute :: BooleanAttribute -> BinaryBits.BitPut ()+putBooleanAttribute booleanAttribute =+  BinaryBits.putBool (booleanAttributeValue booleanAttribute)
+ library/Rattletrap/Encode/ByteAttribute.hs view
@@ -0,0 +1,12 @@+module Rattletrap.Encode.ByteAttribute+  ( putByteAttribute+  ) where++import Rattletrap.Encode.Word8le+import Rattletrap.Type.ByteAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putByteAttribute :: ByteAttribute -> BinaryBits.BitPut ()+putByteAttribute byteAttribute =+  putWord8Bits (byteAttributeValue byteAttribute)
+ library/Rattletrap/Encode/Cache.hs view
@@ -0,0 +1,17 @@+module Rattletrap.Encode.Cache+  ( putCache+  ) where++import Rattletrap.Encode.AttributeMapping+import Rattletrap.Encode.List+import Rattletrap.Encode.Word32le+import Rattletrap.Type.Cache++import qualified Data.Binary as Binary++putCache :: Cache -> Binary.Put+putCache cache = do+  putWord32 (cacheClassId cache)+  putWord32 (cacheParentCacheId cache)+  putWord32 (cacheCacheId cache)+  putList putAttributeMapping (cacheAttributeMappings cache)
+ library/Rattletrap/Encode/CamSettingsAttribute.hs view
@@ -0,0 +1,20 @@+module Rattletrap.Encode.CamSettingsAttribute+  ( putCamSettingsAttribute+  ) where++import Rattletrap.Encode.Float32le+import Rattletrap.Type.CamSettingsAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putCamSettingsAttribute :: CamSettingsAttribute -> BinaryBits.BitPut ()+putCamSettingsAttribute camSettingsAttribute = do+  putFloat32Bits (camSettingsAttributeFov camSettingsAttribute)+  putFloat32Bits (camSettingsAttributeHeight camSettingsAttribute)+  putFloat32Bits (camSettingsAttributeAngle camSettingsAttribute)+  putFloat32Bits (camSettingsAttributeDistance camSettingsAttribute)+  putFloat32Bits (camSettingsAttributeStiffness camSettingsAttribute)+  putFloat32Bits (camSettingsAttributeSwivelSpeed camSettingsAttribute)+  case camSettingsAttributeTransitionSpeed camSettingsAttribute of+    Nothing -> pure ()+    Just transitionSpeed -> putFloat32Bits transitionSpeed
+ library/Rattletrap/Encode/ClassMapping.hs view
@@ -0,0 +1,14 @@+module Rattletrap.Encode.ClassMapping+  ( putClassMapping+  ) where++import Rattletrap.Encode.Str+import Rattletrap.Encode.Word32le+import Rattletrap.Type.ClassMapping++import qualified Data.Binary as Binary++putClassMapping :: ClassMapping -> Binary.Put+putClassMapping classMapping = do+  putText (classMappingName classMapping)+  putWord32 (classMappingStreamId classMapping)
+ library/Rattletrap/Encode/ClubColorsAttribute.hs view
@@ -0,0 +1,15 @@+module Rattletrap.Encode.ClubColorsAttribute+  ( putClubColorsAttribute+  ) where++import Rattletrap.Encode.Word8le+import Rattletrap.Type.ClubColorsAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putClubColorsAttribute :: ClubColorsAttribute -> BinaryBits.BitPut ()+putClubColorsAttribute clubColorsAttribute = do+  BinaryBits.putBool (clubColorsAttributeBlueFlag clubColorsAttribute)+  putWord8Bits (clubColorsAttributeBlueColor clubColorsAttribute)+  BinaryBits.putBool (clubColorsAttributeOrangeFlag clubColorsAttribute)+  putWord8Bits (clubColorsAttributeOrangeColor clubColorsAttribute)
+ library/Rattletrap/Encode/CompressedWord.hs view
@@ -0,0 +1,43 @@+module Rattletrap.Encode.CompressedWord+  ( putCompressedWord+  ) where++import Rattletrap.Type.CompressedWord++import qualified Data.Binary.Bits.Put as BinaryBits+import qualified Data.Bits as Bits++putCompressedWord :: CompressedWord -> BinaryBits.BitPut ()+putCompressedWord compressedWord =+  let+    limit = compressedWordLimit compressedWord+    value = compressedWordValue compressedWord+    maxBits = getMaxBits limit+  in putCompressedWordStep limit value maxBits 0 0++putCompressedWordStep+  :: Word -> Word -> Int -> Int -> Word -> BinaryBits.BitPut ()+putCompressedWordStep limit value maxBits position soFar =+  if position < maxBits+    then do+      let x = Bits.shiftL 1 position :: Word+      if maxBits > 1 && position == maxBits - 1 && soFar + x > limit+        then pure ()+        else do+          let bit = Bits.testBit value position+          BinaryBits.putBool bit+          let delta = if bit then x else 0+          putCompressedWordStep+            limit+            value+            maxBits+            (position + 1)+            (soFar + delta)+    else pure ()++getMaxBits :: Word -> Int+getMaxBits x =+  let+    n :: Int+    n = max 1 (ceiling (logBase (2 :: Double) (fromIntegral (max 1 x))))+  in if x < 1024 && x == 2 ^ n then n + 1 else n
+ library/Rattletrap/Encode/CompressedWordVector.hs view
@@ -0,0 +1,14 @@+module Rattletrap.Encode.CompressedWordVector+  ( putCompressedWordVector+  ) where++import Rattletrap.Encode.CompressedWord+import Rattletrap.Type.CompressedWordVector++import qualified Data.Binary.Bits.Put as BinaryBits++putCompressedWordVector :: CompressedWordVector -> BinaryBits.BitPut ()+putCompressedWordVector compressedWordVector = do+  putCompressedWord (compressedWordVectorX compressedWordVector)+  putCompressedWord (compressedWordVectorY compressedWordVector)+  putCompressedWord (compressedWordVectorZ compressedWordVector)
+ library/Rattletrap/Encode/Content.hs view
@@ -0,0 +1,39 @@+module Rattletrap.Encode.Content+  ( putContent+  ) where++import Rattletrap.Encode.Cache+import Rattletrap.Encode.ClassMapping+import Rattletrap.Encode.Frame+import Rattletrap.Encode.KeyFrame+import Rattletrap.Encode.List+import Rattletrap.Encode.Mark+import Rattletrap.Encode.Message+import Rattletrap.Encode.Str+import Rattletrap.Encode.Word32le+import Rattletrap.Type.Content+import Rattletrap.Type.Word32le+import Rattletrap.Utility.Bytes++import qualified Data.Binary as Binary+import qualified Data.Binary.Bits.Put as BinaryBits+import qualified Data.Binary.Put as Binary++putContent :: Content -> Binary.Put+putContent content = do+  putList putText (contentLevels content)+  putList putKeyFrame (contentKeyFrames content)+  let streamSize = contentStreamSize content+  putWord32 streamSize+  let+    stream =+      Binary.runPut (BinaryBits.runBitPut (putFrames (contentFrames content)))+  Binary.putLazyByteString+    (reverseBytes (padBytes (word32leValue streamSize) stream))+  putList putMessage (contentMessages content)+  putList putMark (contentMarks content)+  putList putText (contentPackages content)+  putList putText (contentObjects content)+  putList putText (contentNames content)+  putList putClassMapping (contentClassMappings content)+  putList putCache (contentCaches content)
+ library/Rattletrap/Encode/DamageStateAttribute.hs view
@@ -0,0 +1,19 @@+module Rattletrap.Encode.DamageStateAttribute+  ( putDamageStateAttribute+  ) where++import Rattletrap.Encode.Int32le+import Rattletrap.Encode.Vector+import Rattletrap.Encode.Word8le+import Rattletrap.Type.DamageStateAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putDamageStateAttribute :: DamageStateAttribute -> BinaryBits.BitPut ()+putDamageStateAttribute damageStateAttribute = do+  putWord8Bits (damageStateAttributeUnknown1 damageStateAttribute)+  BinaryBits.putBool (damageStateAttributeUnknown2 damageStateAttribute)+  putInt32Bits (damageStateAttributeUnknown3 damageStateAttribute)+  putVector (damageStateAttributeUnknown4 damageStateAttribute)+  BinaryBits.putBool (damageStateAttributeUnknown5 damageStateAttribute)+  BinaryBits.putBool (damageStateAttributeUnknown6 damageStateAttribute)
+ library/Rattletrap/Encode/DemolishAttribute.hs view
@@ -0,0 +1,18 @@+module Rattletrap.Encode.DemolishAttribute+  ( putDemolishAttribute+  ) where++import Rattletrap.Encode.Vector+import Rattletrap.Encode.Word32le+import Rattletrap.Type.DemolishAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putDemolishAttribute :: DemolishAttribute -> BinaryBits.BitPut ()+putDemolishAttribute demolishAttribute = do+  BinaryBits.putBool (demolishAttributeAttackerFlag demolishAttribute)+  putWord32Bits (demolishAttributeAttackerActorId demolishAttribute)+  BinaryBits.putBool (demolishAttributeVictimFlag demolishAttribute)+  putWord32Bits (demolishAttributeVictimActorId demolishAttribute)+  putVector (demolishAttributeAttackerVelocity demolishAttribute)+  putVector (demolishAttributeVictimVelocity demolishAttribute)
+ library/Rattletrap/Encode/DestroyedReplication.hs view
@@ -0,0 +1,10 @@+module Rattletrap.Encode.DestroyedReplication+  ( putDestroyedReplication+  ) where++import Rattletrap.Type.DestroyedReplication++import qualified Data.Binary.Bits.Put as BinaryBits++putDestroyedReplication :: DestroyedReplication -> BinaryBits.BitPut ()+putDestroyedReplication _ = pure ()
+ library/Rattletrap/Encode/Dictionary.hs view
@@ -0,0 +1,16 @@+module Rattletrap.Encode.Dictionary+  ( putDictionary+  ) where++import Rattletrap.Encode.Str+import Rattletrap.Type.Dictionary++import qualified Data.Binary as Binary++putDictionary :: (a -> Binary.Put) -> Dictionary a -> Binary.Put+putDictionary f x = case x of+  DictionaryElement k v y -> do+    putText k+    f v+    putDictionary f y+  DictionaryEnd y -> putText y
+ library/Rattletrap/Encode/EnumAttribute.hs view
@@ -0,0 +1,11 @@+module Rattletrap.Encode.EnumAttribute+  ( putEnumAttribute+  ) where++import Rattletrap.Type.EnumAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putEnumAttribute :: EnumAttribute -> BinaryBits.BitPut ()+putEnumAttribute enumAttribute =+  BinaryBits.putWord16be 11 (enumAttributeValue enumAttribute)
+ library/Rattletrap/Encode/ExplosionAttribute.hs view
@@ -0,0 +1,15 @@+module Rattletrap.Encode.ExplosionAttribute+  ( putExplosionAttribute+  ) where++import Rattletrap.Encode.Int32le+import Rattletrap.Encode.Vector+import Rattletrap.Type.ExplosionAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putExplosionAttribute :: ExplosionAttribute -> BinaryBits.BitPut ()+putExplosionAttribute explosionAttribute = do+  BinaryBits.putBool False+  putInt32Bits (explosionAttributeActorId explosionAttribute)+  putVector (explosionAttributeLocation explosionAttribute)
+ library/Rattletrap/Encode/ExtendedExplosionAttribute.hs view
@@ -0,0 +1,15 @@+module Rattletrap.Encode.ExtendedExplosionAttribute+  ( putExtendedExplosionAttribute+  ) where++import Rattletrap.Encode.ExplosionAttribute+import Rattletrap.Encode.FlaggedIntAttribute+import Rattletrap.Type.ExtendedExplosionAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putExtendedExplosionAttribute+  :: ExtendedExplosionAttribute -> BinaryBits.BitPut ()+putExtendedExplosionAttribute x = do+  putExplosionAttribute (extendedExplosionAttributeExplosion x)+  putFlaggedIntAttribute (extendedExplosionAttributeUnknown x)
+ library/Rattletrap/Encode/FlaggedIntAttribute.hs view
@@ -0,0 +1,13 @@+module Rattletrap.Encode.FlaggedIntAttribute+  ( putFlaggedIntAttribute+  ) where++import Rattletrap.Encode.Int32le+import Rattletrap.Type.FlaggedIntAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putFlaggedIntAttribute :: FlaggedIntAttribute -> BinaryBits.BitPut ()+putFlaggedIntAttribute flaggedIntAttribute = do+  BinaryBits.putBool (flaggedIntAttributeFlag flaggedIntAttribute)+  putInt32Bits (flaggedIntAttributeInt flaggedIntAttribute)
+ library/Rattletrap/Encode/Float32le.hs view
@@ -0,0 +1,20 @@+module Rattletrap.Encode.Float32le+  ( putFloat32+  , putFloat32Bits+  ) where++import Rattletrap.Type.Float32le+import Rattletrap.Utility.Bytes++import qualified Data.Binary as Binary+import qualified Data.Binary.Bits.Put as BinaryBits+import qualified Data.Binary.Put as Binary+import qualified Data.ByteString.Lazy as LazyBytes++putFloat32 :: Float32le -> Binary.Put+putFloat32 = Binary.putFloatle . float32leValue++putFloat32Bits :: Float32le -> BinaryBits.BitPut ()+putFloat32Bits float32 = do+  let bytes = Binary.runPut (putFloat32 float32)+  BinaryBits.putByteString (LazyBytes.toStrict (reverseBytes bytes))
+ library/Rattletrap/Encode/FloatAttribute.hs view
@@ -0,0 +1,12 @@+module Rattletrap.Encode.FloatAttribute+  ( putFloatAttribute+  ) where++import Rattletrap.Encode.Float32le+import Rattletrap.Type.FloatAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putFloatAttribute :: FloatAttribute -> BinaryBits.BitPut ()+putFloatAttribute floatAttribute =+  putFloat32Bits (floatAttributeValue floatAttribute)
+ library/Rattletrap/Encode/Frame.hs view
@@ -0,0 +1,19 @@+module Rattletrap.Encode.Frame+  ( putFrames+  , putFrame+  ) where++import Rattletrap.Encode.Float32le+import Rattletrap.Encode.Replication+import Rattletrap.Type.Frame++import qualified Data.Binary.Bits.Put as BinaryBits++putFrames :: [Frame] -> BinaryBits.BitPut ()+putFrames = mapM_ putFrame++putFrame :: Frame -> BinaryBits.BitPut ()+putFrame frame = do+  putFloat32Bits (frameTime frame)+  putFloat32Bits (frameDelta frame)+  putReplications (frameReplications frame)
+ library/Rattletrap/Encode/GameModeAttribute.hs view
@@ -0,0 +1,13 @@+module Rattletrap.Encode.GameModeAttribute+  ( putGameModeAttribute+  ) where++import Rattletrap.Type.GameModeAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putGameModeAttribute :: GameModeAttribute -> BinaryBits.BitPut ()+putGameModeAttribute gameModeAttribute = do+  let numBits = gameModeAttributeNumBits gameModeAttribute+  let word = gameModeAttributeWord gameModeAttribute+  BinaryBits.putWord8 numBits word
+ library/Rattletrap/Encode/Header.hs view
@@ -0,0 +1,21 @@+module Rattletrap.Encode.Header+  ( putHeader+  ) where++import Rattletrap.Encode.Dictionary+import Rattletrap.Encode.Property+import Rattletrap.Encode.Str+import Rattletrap.Encode.Word32le+import Rattletrap.Type.Header++import qualified Data.Binary as Binary++putHeader :: Header -> Binary.Put+putHeader header = do+  putWord32 (headerEngineVersion header)+  putWord32 (headerLicenseeVersion header)+  case headerPatchVersion header of+    Nothing -> pure ()+    Just patchVersion -> putWord32 patchVersion+  putText (headerLabel header)+  putDictionary putProperty (headerProperties header)
+ library/Rattletrap/Encode/Initialization.hs view
@@ -0,0 +1,18 @@+module Rattletrap.Encode.Initialization+  ( putInitialization+  ) where++import Rattletrap.Encode.Int8Vector+import Rattletrap.Encode.Vector+import Rattletrap.Type.Initialization++import qualified Data.Binary.Bits.Put as BinaryBits++putInitialization :: Initialization -> BinaryBits.BitPut ()+putInitialization initialization = do+  case initializationLocation initialization of+    Nothing -> pure ()+    Just location -> putVector location+  case initializationRotation initialization of+    Nothing -> pure ()+    Just rotation -> putInt8Vector rotation
+ library/Rattletrap/Encode/Int32le.hs view
@@ -0,0 +1,20 @@+module Rattletrap.Encode.Int32le+  ( putInt32+  , putInt32Bits+  ) where++import Rattletrap.Type.Int32le+import Rattletrap.Utility.Bytes++import qualified Data.Binary as Binary+import qualified Data.Binary.Bits.Put as BinaryBits+import qualified Data.Binary.Put as Binary+import qualified Data.ByteString.Lazy as LazyBytes++putInt32 :: Int32le -> Binary.Put+putInt32 int32 = Binary.putInt32le (int32leValue int32)++putInt32Bits :: Int32le -> BinaryBits.BitPut ()+putInt32Bits int32 = do+  let bytes = Binary.runPut (putInt32 int32)+  BinaryBits.putByteString (LazyBytes.toStrict (reverseBytes bytes))
+ library/Rattletrap/Encode/Int8Vector.hs view
@@ -0,0 +1,22 @@+module Rattletrap.Encode.Int8Vector+  ( putInt8Vector+  ) where++import Rattletrap.Encode.Int8le+import Rattletrap.Type.Int8Vector+import Rattletrap.Type.Int8le++import qualified Data.Binary.Bits.Put as BinaryBits++putInt8Vector :: Int8Vector -> BinaryBits.BitPut ()+putInt8Vector int8Vector = do+  putInt8VectorField (int8VectorX int8Vector)+  putInt8VectorField (int8VectorY int8Vector)+  putInt8VectorField (int8VectorZ int8Vector)++putInt8VectorField :: Maybe Int8le -> BinaryBits.BitPut ()+putInt8VectorField maybeField = case maybeField of+  Nothing -> BinaryBits.putBool False+  Just field -> do+    BinaryBits.putBool True+    putInt8Bits field
+ library/Rattletrap/Encode/Int8le.hs view
@@ -0,0 +1,19 @@+module Rattletrap.Encode.Int8le+  ( putInt8+  , putInt8Bits+  ) where++import Rattletrap.Type.Int8le+import Rattletrap.Utility.Bytes++import qualified Data.Binary.Bits.Put as BinaryBits+import qualified Data.Binary.Put as Binary+import qualified Data.ByteString.Lazy as LazyBytes++putInt8 :: Int8le -> Binary.Put+putInt8 int8 = Binary.putInt8 (int8leValue int8)++putInt8Bits :: Int8le -> BinaryBits.BitPut ()+putInt8Bits int8 = do+  let bytes = Binary.runPut (putInt8 int8)+  BinaryBits.putByteString (LazyBytes.toStrict (reverseBytes bytes))
+ library/Rattletrap/Encode/IntAttribute.hs view
@@ -0,0 +1,11 @@+module Rattletrap.Encode.IntAttribute+  ( putIntAttribute+  ) where++import Rattletrap.Encode.Int32le+import Rattletrap.Type.IntAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putIntAttribute :: IntAttribute -> BinaryBits.BitPut ()+putIntAttribute intAttribute = putInt32Bits (intAttributeValue intAttribute)
+ library/Rattletrap/Encode/KeyFrame.hs view
@@ -0,0 +1,15 @@+module Rattletrap.Encode.KeyFrame+  ( putKeyFrame+  ) where++import Rattletrap.Encode.Float32le+import Rattletrap.Encode.Word32le+import Rattletrap.Type.KeyFrame++import qualified Data.Binary as Binary++putKeyFrame :: KeyFrame -> Binary.Put+putKeyFrame keyFrame = do+  putFloat32 (keyFrameTime keyFrame)+  putWord32 (keyFrameFrame keyFrame)+  putWord32 (keyFramePosition keyFrame)
+ library/Rattletrap/Encode/List.hs view
@@ -0,0 +1,15 @@+module Rattletrap.Encode.List+  ( putList+  ) where++import Rattletrap.Encode.Word32le+import Rattletrap.Type.List+import Rattletrap.Type.Word32le++import qualified Data.Binary as Binary++putList :: (a -> Binary.Put) -> List a -> Binary.Put+putList putElement list = do+  let elements = listValue list+  putWord32 (Word32le (fromIntegral (length elements)))+  mapM_ putElement elements
+ library/Rattletrap/Encode/LoadoutAttribute.hs view
@@ -0,0 +1,30 @@+module Rattletrap.Encode.LoadoutAttribute+  ( putLoadoutAttribute+  ) where++import Rattletrap.Encode.Word32le+import Rattletrap.Encode.Word8le+import Rattletrap.Type.LoadoutAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putLoadoutAttribute :: LoadoutAttribute -> BinaryBits.BitPut ()+putLoadoutAttribute loadoutAttribute = do+  putWord8Bits (loadoutAttributeVersion loadoutAttribute)+  putWord32Bits (loadoutAttributeBody loadoutAttribute)+  putWord32Bits (loadoutAttributeDecal loadoutAttribute)+  putWord32Bits (loadoutAttributeWheels loadoutAttribute)+  putWord32Bits (loadoutAttributeRocketTrail loadoutAttribute)+  putWord32Bits (loadoutAttributeAntenna loadoutAttribute)+  putWord32Bits (loadoutAttributeTopper loadoutAttribute)+  putWord32Bits (loadoutAttributeUnknown1 loadoutAttribute)+  putOptional (loadoutAttributeUnknown2 loadoutAttribute) putWord32Bits+  putOptional (loadoutAttributeEngineAudio loadoutAttribute) putWord32Bits+  putOptional (loadoutAttributeTrail loadoutAttribute) putWord32Bits+  putOptional (loadoutAttributeGoalExplosion loadoutAttribute) putWord32Bits+  putOptional (loadoutAttributeBanner loadoutAttribute) putWord32Bits++putOptional :: Maybe a -> (a -> BinaryBits.BitPut ()) -> BinaryBits.BitPut ()+putOptional m f = case m of+  Just x -> f x+  Nothing -> pure ()
+ library/Rattletrap/Encode/LoadoutOnlineAttribute.hs view
@@ -0,0 +1,16 @@+module Rattletrap.Encode.LoadoutOnlineAttribute+  ( putLoadoutOnlineAttribute+  ) where++import Rattletrap.Encode.ProductAttribute+import Rattletrap.Encode.Word8le+import Rattletrap.Type.LoadoutOnlineAttribute+import Rattletrap.Type.Word8le++import qualified Data.Binary.Bits.Put as BinaryBits++putLoadoutOnlineAttribute :: LoadoutOnlineAttribute -> BinaryBits.BitPut ()+putLoadoutOnlineAttribute loadoutAttribute = do+  let attributes = loadoutAttributeValue loadoutAttribute+  putWord8Bits (Word8le (fromIntegral (length attributes)))+  mapM_ putProductAttributes attributes
+ library/Rattletrap/Encode/LoadoutsAttribute.hs view
@@ -0,0 +1,13 @@+module Rattletrap.Encode.LoadoutsAttribute+  ( putLoadoutsAttribute+  ) where++import Rattletrap.Encode.LoadoutAttribute+import Rattletrap.Type.LoadoutsAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putLoadoutsAttribute :: LoadoutsAttribute -> BinaryBits.BitPut ()+putLoadoutsAttribute loadoutsAttribute = do+  putLoadoutAttribute (loadoutsAttributeBlue loadoutsAttribute)+  putLoadoutAttribute (loadoutsAttributeOrange loadoutsAttribute)
+ library/Rattletrap/Encode/LoadoutsOnlineAttribute.hs view
@@ -0,0 +1,17 @@+module Rattletrap.Encode.LoadoutsOnlineAttribute+  ( putLoadoutsOnlineAttribute+  ) where++import Rattletrap.Encode.LoadoutOnlineAttribute+import Rattletrap.Type.LoadoutsOnlineAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putLoadoutsOnlineAttribute :: LoadoutsOnlineAttribute -> BinaryBits.BitPut ()+putLoadoutsOnlineAttribute loadoutsOnlineAttribute = do+  putLoadoutOnlineAttribute+    (loadoutsOnlineAttributeBlue loadoutsOnlineAttribute)+  putLoadoutOnlineAttribute+    (loadoutsOnlineAttributeOrange loadoutsOnlineAttribute)+  BinaryBits.putBool (loadoutsOnlineAttributeUnknown1 loadoutsOnlineAttribute)+  BinaryBits.putBool (loadoutsOnlineAttributeUnknown2 loadoutsOnlineAttribute)
+ library/Rattletrap/Encode/LocationAttribute.hs view
@@ -0,0 +1,12 @@+module Rattletrap.Encode.LocationAttribute+  ( putLocationAttribute+  ) where++import Rattletrap.Encode.Vector+import Rattletrap.Type.LocationAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putLocationAttribute :: LocationAttribute -> BinaryBits.BitPut ()+putLocationAttribute locationAttribute =+  putVector (locationAttributeValue locationAttribute)
+ library/Rattletrap/Encode/Mark.hs view
@@ -0,0 +1,14 @@+module Rattletrap.Encode.Mark+  ( putMark+  ) where++import Rattletrap.Encode.Str+import Rattletrap.Encode.Word32le+import Rattletrap.Type.Mark++import qualified Data.Binary as Binary++putMark :: Mark -> Binary.Put+putMark mark = do+  putText (markValue mark)+  putWord32 (markFrame mark)
+ library/Rattletrap/Encode/Message.hs view
@@ -0,0 +1,15 @@+module Rattletrap.Encode.Message+  ( putMessage+  ) where++import Rattletrap.Encode.Str+import Rattletrap.Encode.Word32le+import Rattletrap.Type.Message++import qualified Data.Binary as Binary++putMessage :: Message -> Binary.Put+putMessage message = do+  putWord32 (messageFrame message)+  putText (messageName message)+  putText (messageValue message)
+ library/Rattletrap/Encode/MusicStingerAttribute.hs view
@@ -0,0 +1,15 @@+module Rattletrap.Encode.MusicStingerAttribute+  ( putMusicStingerAttribute+  ) where++import Rattletrap.Encode.Word32le+import Rattletrap.Encode.Word8le+import Rattletrap.Type.MusicStingerAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putMusicStingerAttribute :: MusicStingerAttribute -> BinaryBits.BitPut ()+putMusicStingerAttribute musicStingerAttribute = do+  BinaryBits.putBool (musicStingerAttributeFlag musicStingerAttribute)+  putWord32Bits (musicStingerAttributeCue musicStingerAttribute)+  putWord8Bits (musicStingerAttributeTrigger musicStingerAttribute)
+ library/Rattletrap/Encode/PartyLeaderAttribute.hs view
@@ -0,0 +1,18 @@+module Rattletrap.Encode.PartyLeaderAttribute+  ( putPartyLeaderAttribute+  ) where++import Rattletrap.Encode.RemoteId+import Rattletrap.Encode.Word8le+import Rattletrap.Type.PartyLeaderAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putPartyLeaderAttribute :: PartyLeaderAttribute -> BinaryBits.BitPut ()+putPartyLeaderAttribute partyLeaderAttribute = do+  putWord8Bits (partyLeaderAttributeSystemId partyLeaderAttribute)+  case partyLeaderAttributeId partyLeaderAttribute of+    Nothing -> pure ()+    Just (remoteId, localId) -> do+      putRemoteId remoteId+      putWord8Bits localId
+ library/Rattletrap/Encode/PickupAttribute.hs view
@@ -0,0 +1,17 @@+module Rattletrap.Encode.PickupAttribute+  ( putPickupAttribute+  ) where++import Rattletrap.Encode.Word32le+import Rattletrap.Type.PickupAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putPickupAttribute :: PickupAttribute -> BinaryBits.BitPut ()+putPickupAttribute pickupAttribute = do+  case pickupAttributeInstigatorId pickupAttribute of+    Nothing -> BinaryBits.putBool False+    Just instigatorId -> do+      BinaryBits.putBool True+      putWord32Bits instigatorId+  BinaryBits.putBool (pickupAttributePickedUp pickupAttribute)
+ library/Rattletrap/Encode/PlayerHistoryKeyAttribute.hs view
@@ -0,0 +1,12 @@+module Rattletrap.Encode.PlayerHistoryKeyAttribute+  ( putPlayerHistoryKeyAttribute+  ) where++import Rattletrap.Encode.Bitstream+import Rattletrap.Type.PlayerHistoryKeyAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putPlayerHistoryKeyAttribute+  :: PlayerHistoryKeyAttribute -> BinaryBits.BitPut ()+putPlayerHistoryKeyAttribute = putBitstream . playerHistoryKeyAttributeUnknown
+ library/Rattletrap/Encode/PrivateMatchSettingsAttribute.hs view
@@ -0,0 +1,25 @@+module Rattletrap.Encode.PrivateMatchSettingsAttribute+  ( putPrivateMatchSettingsAttribute+  ) where++import Rattletrap.Encode.Str+import Rattletrap.Encode.Word32le+import Rattletrap.Type.PrivateMatchSettingsAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putPrivateMatchSettingsAttribute+  :: PrivateMatchSettingsAttribute -> BinaryBits.BitPut ()+putPrivateMatchSettingsAttribute privateMatchSettingsAttribute = do+  putTextBits+    (privateMatchSettingsAttributeMutators privateMatchSettingsAttribute)+  putWord32Bits+    (privateMatchSettingsAttributeJoinableBy privateMatchSettingsAttribute)+  putWord32Bits+    (privateMatchSettingsAttributeMaxPlayers privateMatchSettingsAttribute)+  putTextBits+    (privateMatchSettingsAttributeGameName privateMatchSettingsAttribute)+  putTextBits+    (privateMatchSettingsAttributePassword privateMatchSettingsAttribute)+  BinaryBits.putBool+    (privateMatchSettingsAttributeFlag privateMatchSettingsAttribute)
+ library/Rattletrap/Encode/ProductAttribute.hs view
@@ -0,0 +1,43 @@+module Rattletrap.Encode.ProductAttribute+  ( putProductAttributes+  , putProductAttribute+  ) where++import Data.Semigroup ((<>))+import Rattletrap.Encode.CompressedWord+import Rattletrap.Encode.Word32le+import Rattletrap.Encode.Word8le+import Rattletrap.Type.ProductAttribute+import Rattletrap.Type.Str+import Rattletrap.Type.Word8le++import qualified Data.Binary.Bits.Put as BinaryBits++putProductAttributes :: [ProductAttribute] -> BinaryBits.BitPut ()+putProductAttributes attributes = do+  putWord8Bits (Word8le (fromIntegral (length attributes)))+  mapM_ putProductAttribute attributes++putProductAttribute :: ProductAttribute -> BinaryBits.BitPut ()+putProductAttribute attribute = do+  BinaryBits.putBool (productAttributeUnknown attribute)+  putWord32Bits (productAttributeObjectId attribute)+  case productAttributeObjectName attribute of+    Just name -> case fromStr name of+      "TAGame.ProductAttribute_Painted_TA" ->+        case productAttributeValue attribute of+          Nothing -> pure ()+          Just (Left x) -> putCompressedWord x+          Just (Right x) -> BinaryBits.putWord32be 31 x+      "TAGame.ProductAttribute_UserColor_TA" ->+        case productAttributeValue attribute of+          Nothing -> BinaryBits.putBool False+          Just value -> do+            BinaryBits.putBool True+            case value of+              Left x -> putCompressedWord x+              Right x -> BinaryBits.putWord32be 31 x+      _ ->+        fail ("unknown object name for product attribute " <> show attribute)+    Nothing ->+      fail ("missing object name for product attribute " <> show attribute)
+ library/Rattletrap/Encode/Property.hs view
@@ -0,0 +1,16 @@+module Rattletrap.Encode.Property+  ( putProperty+  ) where++import Rattletrap.Encode.PropertyValue+import Rattletrap.Encode.Str+import Rattletrap.Encode.Word64le+import Rattletrap.Type.Property++import qualified Data.Binary as Binary++putProperty :: Property -> Binary.Put+putProperty property = do+  putText (propertyKind property)+  putWord64 (propertySize property)+  putPropertyValue putProperty (propertyValue property)
+ library/Rattletrap/Encode/PropertyValue.hs view
@@ -0,0 +1,29 @@+module Rattletrap.Encode.PropertyValue+  ( putPropertyValue+  ) where++import Rattletrap.Encode.Dictionary+import Rattletrap.Encode.Float32le+import Rattletrap.Encode.Int32le+import Rattletrap.Encode.List+import Rattletrap.Encode.Str+import Rattletrap.Encode.Word64le+import Rattletrap.Encode.Word8le+import Rattletrap.Type.PropertyValue++import qualified Data.Binary as Binary++putPropertyValue :: (a -> Binary.Put) -> PropertyValue a -> Binary.Put+putPropertyValue putProperty value = case value of+  PropertyValueArray list -> putList (putDictionary putProperty) list+  PropertyValueBool word8 -> putWord8 word8+  PropertyValueByte k mv -> do+    putText k+    case mv of+      Nothing -> pure ()+      Just v -> putText v+  PropertyValueFloat float32 -> putFloat32 float32+  PropertyValueInt int32 -> putInt32 int32+  PropertyValueName text -> putText text+  PropertyValueQWord word64 -> putWord64 word64+  PropertyValueStr text -> putText text
+ library/Rattletrap/Encode/QWordAttribute.hs view
@@ -0,0 +1,12 @@+module Rattletrap.Encode.QWordAttribute+  ( putQWordAttribute+  ) where++import Rattletrap.Encode.Word64le+import Rattletrap.Type.QWordAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putQWordAttribute :: QWordAttribute -> BinaryBits.BitPut ()+putQWordAttribute qWordAttribute =+  putWord64Bits (qWordAttributeValue qWordAttribute)
+ library/Rattletrap/Encode/RemoteId.hs view
@@ -0,0 +1,24 @@+module Rattletrap.Encode.RemoteId+  ( putRemoteId+  ) where++import Rattletrap.Encode.Bitstream+import Rattletrap.Encode.Word64le+import Rattletrap.Type.RemoteId+import Rattletrap.Utility.Bytes++import qualified Data.Binary.Bits.Put as BinaryBits+import qualified Data.ByteString.Lazy as LazyBytes++putRemoteId :: RemoteId -> BinaryBits.BitPut ()+putRemoteId remoteId = case remoteId of+  RemoteIdPlayStation name bytes -> do+    let+      rawName = LazyBytes.toStrict+        (reverseBytes (padBytes (16 :: Int) (encodeLatin1 name)))+    BinaryBits.putByteString rawName+    BinaryBits.putByteString (LazyBytes.toStrict (LazyBytes.pack bytes))+  RemoteIdSplitscreen word24 -> BinaryBits.putWord32be 24 word24+  RemoteIdSteam word64 -> putWord64Bits word64+  RemoteIdSwitch x -> putBitstream x+  RemoteIdXbox word64 -> putWord64Bits word64
+ library/Rattletrap/Encode/Replay.hs view
@@ -0,0 +1,20 @@+module Rattletrap.Encode.Replay+  ( putReplay+  ) where++import Rattletrap.Encode.Content+import Rattletrap.Encode.Header+import Rattletrap.Encode.Section+import Rattletrap.Type.Replay++import qualified Data.Binary as Binary++-- | Generates a raw replay. Use this with 'Data.Binary.Put.runPut'.+--+-- @+-- let bytes = 'Data.Binary.Put.runPut' ('putReplay' replay)+-- @+putReplay :: Replay -> Binary.Put+putReplay replay = do+  putSection putHeader (replayHeader replay)+  putSection putContent (replayContent replay)
+ library/Rattletrap/Encode/Replication.hs view
@@ -0,0 +1,21 @@+module Rattletrap.Encode.Replication+  ( putReplications+  , putReplication+  ) where++import Rattletrap.Encode.CompressedWord+import Rattletrap.Encode.ReplicationValue+import Rattletrap.Type.Replication++import qualified Data.Binary.Bits.Put as BinaryBits++putReplications :: [Replication] -> BinaryBits.BitPut ()+putReplications replications = do+  mapM_ putReplication replications+  BinaryBits.putBool False++putReplication :: Replication -> BinaryBits.BitPut ()+putReplication replication = do+  BinaryBits.putBool True+  putCompressedWord (replicationActorId replication)+  putReplicationValue (replicationValue replication)
+ library/Rattletrap/Encode/ReplicationValue.hs view
@@ -0,0 +1,24 @@+module Rattletrap.Encode.ReplicationValue+  ( putReplicationValue+  ) where++import Rattletrap.Encode.DestroyedReplication+import Rattletrap.Encode.SpawnedReplication+import Rattletrap.Encode.UpdatedReplication+import Rattletrap.Type.ReplicationValue++import qualified Data.Binary.Bits.Put as BinaryBits++putReplicationValue :: ReplicationValue -> BinaryBits.BitPut ()+putReplicationValue value = case value of+  ReplicationValueSpawned x -> do+    BinaryBits.putBool True+    BinaryBits.putBool True+    putSpawnedReplication x+  ReplicationValueUpdated x -> do+    BinaryBits.putBool True+    BinaryBits.putBool False+    putUpdatedReplication x+  ReplicationValueDestroyed x -> do+    BinaryBits.putBool False+    putDestroyedReplication x
+ library/Rattletrap/Encode/ReservationAttribute.hs view
@@ -0,0 +1,23 @@+module Rattletrap.Encode.ReservationAttribute+  ( putReservationAttribute+  ) where++import Rattletrap.Encode.CompressedWord+import Rattletrap.Encode.Str+import Rattletrap.Encode.UniqueIdAttribute+import Rattletrap.Type.ReservationAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putReservationAttribute :: ReservationAttribute -> BinaryBits.BitPut ()+putReservationAttribute reservationAttribute = do+  putCompressedWord (reservationAttributeNumber reservationAttribute)+  putUniqueIdAttribute (reservationAttributeUniqueId reservationAttribute)+  case reservationAttributeName reservationAttribute of+    Nothing -> pure ()+    Just name -> putTextBits name+  BinaryBits.putBool (reservationAttributeUnknown1 reservationAttribute)+  BinaryBits.putBool (reservationAttributeUnknown2 reservationAttribute)+  case reservationAttributeUnknown3 reservationAttribute of+    Nothing -> pure ()+    Just c -> BinaryBits.putWord8 6 c
+ library/Rattletrap/Encode/RigidBodyStateAttribute.hs view
@@ -0,0 +1,22 @@+module Rattletrap.Encode.RigidBodyStateAttribute+  ( putRigidBodyStateAttribute+  ) where++import Rattletrap.Encode.CompressedWordVector+import Rattletrap.Encode.Vector+import Rattletrap.Type.RigidBodyStateAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putRigidBodyStateAttribute :: RigidBodyStateAttribute -> BinaryBits.BitPut ()+putRigidBodyStateAttribute rigidBodyStateAttribute = do+  BinaryBits.putBool (rigidBodyStateAttributeSleeping rigidBodyStateAttribute)+  putVector (rigidBodyStateAttributeLocation rigidBodyStateAttribute)+  putCompressedWordVector+    (rigidBodyStateAttributeRotation rigidBodyStateAttribute)+  case rigidBodyStateAttributeLinearVelocity rigidBodyStateAttribute of+    Nothing -> pure ()+    Just linearVelocity -> putVector linearVelocity+  case rigidBodyStateAttributeAngularVelocity rigidBodyStateAttribute of+    Nothing -> pure ()+    Just angularVelocity -> putVector angularVelocity
+ library/Rattletrap/Encode/Section.hs view
@@ -0,0 +1,27 @@+module Rattletrap.Encode.Section+  ( putSection+  ) where++import Rattletrap.Encode.Word32le+import Rattletrap.Type.Section+import Rattletrap.Type.Word32le+import Rattletrap.Utility.Crc++import qualified Data.Binary as Binary+import qualified Data.Binary.Put as Binary+import qualified Data.ByteString.Lazy as LazyBytes++-- | Given a way to put the 'sectionBody', puts a section. This will also put+-- the size and CRC.+--+-- @+-- let bytes = 'Data.Binary.Put.runPut' ('putSection' 'Rattletrap.Content.putContent' content)+-- @+putSection :: (a -> Binary.Put) -> Section a -> Binary.Put+putSection putBody section = do+  let rawBody = Binary.runPut (putBody (sectionBody section))+  let size = LazyBytes.length rawBody+  let crc = getCrc32 rawBody+  putWord32 (Word32le (fromIntegral size))+  putWord32 (Word32le crc)+  Binary.putLazyByteString rawBody
+ library/Rattletrap/Encode/SpawnedReplication.hs view
@@ -0,0 +1,18 @@+module Rattletrap.Encode.SpawnedReplication+  ( putSpawnedReplication+  ) where++import Rattletrap.Encode.Initialization+import Rattletrap.Encode.Word32le+import Rattletrap.Type.SpawnedReplication++import qualified Data.Binary.Bits.Put as BinaryBits++putSpawnedReplication :: SpawnedReplication -> BinaryBits.BitPut ()+putSpawnedReplication spawnedReplication = do+  BinaryBits.putBool (spawnedReplicationFlag spawnedReplication)+  case spawnedReplicationNameIndex spawnedReplication of+    Nothing -> pure ()+    Just nameIndex -> putWord32Bits nameIndex+  putWord32Bits (spawnedReplicationObjectId spawnedReplication)+  putInitialization (spawnedReplicationInitialization spawnedReplication)
+ library/Rattletrap/Encode/Str.hs view
@@ -0,0 +1,55 @@+module Rattletrap.Encode.Str+  ( putText+  , putTextBits+  ) where++import Rattletrap.Encode.Int32le+import Rattletrap.Type.Common+import Rattletrap.Type.Int32le+import Rattletrap.Type.Str+import Rattletrap.Utility.Bytes++import qualified Data.Binary as Binary+import qualified Data.Binary.Bits.Put as BinaryBits+import qualified Data.Binary.Put as Binary+import qualified Data.ByteString.Lazy as LazyBytes+import qualified Data.Char as Char+import qualified Data.Text as Text+import qualified Data.Text.Encoding as Text++putText :: Str -> Binary.Put+putText text = do+  let size = getTextSize text+  let encode = getTextEncoder size+  putInt32 size+  Binary.putLazyByteString (encode (addNull (strValue text)))++putTextBits :: Str -> BinaryBits.BitPut ()+putTextBits text = do+  let size = getTextSize text+  let encode = getTextEncoder size+  putInt32Bits size+  BinaryBits.putByteString+    (LazyBytes.toStrict (reverseBytes (encode (addNull (strValue text)))))++getTextSize :: Str -> Int32le+getTextSize text =+  let+    value = strValue text+    scale = if Text.all Char.isLatin1 value then 1 else -1 :: Int32+    rawSize = if Text.null value+      then 0+      else fromIntegral (Text.length value) + 1 :: Int32+    size = if value == Text.pack "\x00\x00\x00None"+      then 0x05000000+      else scale * rawSize :: Int32+  in+    Int32le size++getTextEncoder :: Int32le -> Text.Text -> LazyBytes.ByteString+getTextEncoder size text = if size < Int32le 0+  then LazyBytes.fromStrict (Text.encodeUtf16LE text)+  else encodeLatin1 text++addNull :: Text.Text -> Text.Text+addNull text = if Text.null text then text else Text.snoc text '\x00'
+ library/Rattletrap/Encode/StringAttribute.hs view
@@ -0,0 +1,12 @@+module Rattletrap.Encode.StringAttribute+  ( putStringAttribute+  ) where++import Rattletrap.Encode.Str+import Rattletrap.Type.StringAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putStringAttribute :: StringAttribute -> BinaryBits.BitPut ()+putStringAttribute stringAttribute =+  putTextBits (stringAttributeValue stringAttribute)
+ library/Rattletrap/Encode/TeamPaintAttribute.hs view
@@ -0,0 +1,17 @@+module Rattletrap.Encode.TeamPaintAttribute+  ( putTeamPaintAttribute+  ) where++import Rattletrap.Encode.Word32le+import Rattletrap.Encode.Word8le+import Rattletrap.Type.TeamPaintAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putTeamPaintAttribute :: TeamPaintAttribute -> BinaryBits.BitPut ()+putTeamPaintAttribute teamPaintAttribute = do+  putWord8Bits (teamPaintAttributeTeam teamPaintAttribute)+  putWord8Bits (teamPaintAttributePrimaryColor teamPaintAttribute)+  putWord8Bits (teamPaintAttributeAccentColor teamPaintAttribute)+  putWord32Bits (teamPaintAttributePrimaryFinish teamPaintAttribute)+  putWord32Bits (teamPaintAttributeAccentFinish teamPaintAttribute)
+ library/Rattletrap/Encode/UniqueIdAttribute.hs view
@@ -0,0 +1,15 @@+module Rattletrap.Encode.UniqueIdAttribute+  ( putUniqueIdAttribute+  ) where++import Rattletrap.Encode.RemoteId+import Rattletrap.Encode.Word8le+import Rattletrap.Type.UniqueIdAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putUniqueIdAttribute :: UniqueIdAttribute -> BinaryBits.BitPut ()+putUniqueIdAttribute uniqueIdAttribute = do+  putWord8Bits (uniqueIdAttributeSystemId uniqueIdAttribute)+  putRemoteId (uniqueIdAttributeRemoteId uniqueIdAttribute)+  putWord8Bits (uniqueIdAttributeLocalId uniqueIdAttribute)
+ library/Rattletrap/Encode/UpdatedReplication.hs view
@@ -0,0 +1,12 @@+module Rattletrap.Encode.UpdatedReplication+  ( putUpdatedReplication+  ) where++import Rattletrap.Encode.Attribute+import Rattletrap.Type.UpdatedReplication++import qualified Data.Binary.Bits.Put as BinaryBits++putUpdatedReplication :: UpdatedReplication -> BinaryBits.BitPut ()+putUpdatedReplication updatedReplication =+  putAttributes (updatedReplicationAttributes updatedReplication)
+ library/Rattletrap/Encode/Vector.hs view
@@ -0,0 +1,26 @@+module Rattletrap.Encode.Vector+  ( putVector+  ) where++import Rattletrap.Encode.CompressedWord+import Rattletrap.Type.CompressedWord+import Rattletrap.Type.Vector++import qualified Data.Binary.Bits.Put as BinaryBits++putVector :: Vector -> BinaryBits.BitPut ()+putVector vector = do+  let+    bitSize =+      round (logBase (2 :: Float) (fromIntegral (vectorBias vector))) - 1 :: Word+    dx =+      fromIntegral (vectorX vector + fromIntegral (vectorBias vector)) :: Word+    dy =+      fromIntegral (vectorY vector + fromIntegral (vectorBias vector)) :: Word+    dz =+      fromIntegral (vectorZ vector + fromIntegral (vectorBias vector)) :: Word+    limit = 2 ^ (bitSize + 2) :: Word+  putCompressedWord (CompressedWord 19 bitSize)+  putCompressedWord (CompressedWord limit dx)+  putCompressedWord (CompressedWord limit dy)+  putCompressedWord (CompressedWord limit dz)
+ library/Rattletrap/Encode/WeldedInfoAttribute.hs view
@@ -0,0 +1,19 @@+module Rattletrap.Encode.WeldedInfoAttribute+  ( putWeldedInfoAttribute+  ) where++import Rattletrap.Encode.Float32le+import Rattletrap.Encode.Int32le+import Rattletrap.Encode.Int8Vector+import Rattletrap.Encode.Vector+import Rattletrap.Type.WeldedInfoAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putWeldedInfoAttribute :: WeldedInfoAttribute -> BinaryBits.BitPut ()+putWeldedInfoAttribute weldedInfoAttribute = do+  BinaryBits.putBool (weldedInfoAttributeActive weldedInfoAttribute)+  putInt32Bits (weldedInfoAttributeActorId weldedInfoAttribute)+  putVector (weldedInfoAttributeOffset weldedInfoAttribute)+  putFloat32Bits (weldedInfoAttributeMass weldedInfoAttribute)+  putInt8Vector (weldedInfoAttributeRotation weldedInfoAttribute)
+ library/Rattletrap/Encode/Word32le.hs view
@@ -0,0 +1,20 @@+module Rattletrap.Encode.Word32le+  ( putWord32+  , putWord32Bits+  ) where++import Rattletrap.Type.Word32le+import Rattletrap.Utility.Bytes++import qualified Data.Binary as Binary+import qualified Data.Binary.Bits.Put as BinaryBits+import qualified Data.Binary.Put as Binary+import qualified Data.ByteString.Lazy as LazyBytes++putWord32 :: Word32le -> Binary.Put+putWord32 word32 = Binary.putWord32le (word32leValue word32)++putWord32Bits :: Word32le -> BinaryBits.BitPut ()+putWord32Bits word32 = do+  let bytes = Binary.runPut (putWord32 word32)+  BinaryBits.putByteString (LazyBytes.toStrict (reverseBytes bytes))
+ library/Rattletrap/Encode/Word64le.hs view
@@ -0,0 +1,20 @@+module Rattletrap.Encode.Word64le+  ( putWord64+  , putWord64Bits+  ) where++import Rattletrap.Type.Word64le+import Rattletrap.Utility.Bytes++import qualified Data.Binary as Binary+import qualified Data.Binary.Bits.Put as BinaryBits+import qualified Data.Binary.Put as Binary+import qualified Data.ByteString.Lazy as LazyBytes++putWord64 :: Word64le -> Binary.Put+putWord64 word64 = Binary.putWord64le (word64leValue word64)++putWord64Bits :: Word64le -> BinaryBits.BitPut ()+putWord64Bits word64 = do+  let bytes = Binary.runPut (putWord64 word64)+  BinaryBits.putByteString (LazyBytes.toStrict (reverseBytes bytes))
+ library/Rattletrap/Encode/Word8le.hs view
@@ -0,0 +1,20 @@+module Rattletrap.Encode.Word8le+  ( putWord8+  , putWord8Bits+  ) where++import Rattletrap.Type.Word8le+import Rattletrap.Utility.Bytes++import qualified Data.Binary as Binary+import qualified Data.Binary.Bits.Put as BinaryBits+import qualified Data.Binary.Put as Binary+import qualified Data.ByteString.Lazy as LazyBytes++putWord8 :: Word8le -> Binary.Put+putWord8 word8 = Binary.putWord8 (word8leValue word8)++putWord8Bits :: Word8le -> BinaryBits.BitPut ()+putWord8Bits word8 = do+  let bytes = Binary.runPut (putWord8 word8)+  BinaryBits.putByteString (LazyBytes.toStrict (reverseBytes bytes))
− library/Rattletrap/Frame.hs
@@ -1,67 +0,0 @@-module Rattletrap.Frame where--import Rattletrap.ActorMap-import Rattletrap.ClassAttributeMap-import Rattletrap.Primitive-import Rattletrap.Replication--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data Frame = Frame-  { frameTime :: Float32-  -- ^ Time in seconds since the beginning of the match.-  , frameDelta :: Float32-  -- ^ Time in seconds since the last frame. Usually about 0.03 since there-  -- are 30 frames per second.-  , frameReplications :: [Replication]-  } deriving (Eq, Ord, Show)--getFrames-  :: (Int, Int, Int)-  -> Int-  -> Word-  -> ClassAttributeMap-  -> ActorMap-  -> BinaryBit.BitGet ([Frame], ActorMap)-getFrames version numFrames maxChannels classAttributeMap actorMap =-  if numFrames <= 0-    then pure ([], actorMap)-    else do-      (frame, newActorMap) <- getFrame-        version-        maxChannels-        classAttributeMap-        actorMap-      (frames, newerActorMap) <- getFrames-        version-        (numFrames - 1)-        maxChannels-        classAttributeMap-        newActorMap-      pure (frame : frames, newerActorMap)--putFrames :: [Frame] -> BinaryBit.BitPut ()-putFrames = mapM_ putFrame--getFrame-  :: (Int, Int, Int)-  -> Word-  -> ClassAttributeMap-  -> ActorMap-  -> BinaryBit.BitGet (Frame, ActorMap)-getFrame version maxChannels classAttributeMap actorMap = do-  time <- getFloat32Bits-  delta <- getFloat32Bits-  (replications, newActorMap) <- getReplications-    version-    maxChannels-    classAttributeMap-    actorMap-  pure (Frame time delta replications, newActorMap)--putFrame :: Frame -> BinaryBit.BitPut ()-putFrame frame = do-  putFloat32Bits (frameTime frame)-  putFloat32Bits (frameDelta frame)-  putReplications (frameReplications frame)
− library/Rattletrap/Header.hs
@@ -1,112 +0,0 @@-module Rattletrap.Header where--import Rattletrap.Primitive-import Rattletrap.Property-import Rattletrap.PropertyValue--import qualified Data.Binary as Binary-import qualified Data.Map as Map-import qualified Data.Maybe as Maybe---- | Contains high-level metadata about a 'Rattletrap.Replay.Replay'.-data Header = Header-  { headerEngineVersion :: Word32-  -- ^ The "major" ("engine") version number.-  , headerLicenseeVersion :: Word32-  -- ^ The "minor" ("licensee") version number.-  , headerPatchVersion :: Maybe Word32-  -- ^ The "patch" ("net") version number.-  , headerLabel :: Text-  -- ^ Always @TAGame.Replay_Soccar_TA@.-  , headerProperties :: Dictionary Property-  -- ^ These properties determine how a replay will look in the list of-  -- replays in-game. One element is required for the replay to show up:-  ---  -- - MapName: This is a 'Rattletrap.PropertyValue.NameProperty' with a-  --   case-insensitive map identifier, like @Stadium_P@.-  ---  -- There are many other properties that affect how the replay looks in the-  -- list of replays.-  ---  -- - Date: A 'Rattletrap.PropertyValue.StrProperty' with the format-  --   @YYYY-mm-dd:HH-MM@. Dates are not validated, but the month must be-  --   between 1 and 12 to show up. The hour is shown modulo 12 with AM or PM.-  -- - MatchType: A 'Rattletrap.PropertyValue.NameProperty'. If this is not-  --   one of the expected values, nothing will be shown next to the replay's-  --   map. The expected values are: @Online@, @Offline@, @Private@, and-  --   @Season@.-  -- - NumFrames: This 'Rattletrap.PropertyValue.IntProperty' is used to-  --   calculate the length of the match. There are 30 frames per second,-  --   a typical 5-minute match has about 9,000 frames.-  -- - PrimaryPlayerTeam: This is an 'Rattletrap.PropertyValue.IntProperty'.-  --   It is either 0 (blue) or 1 (orange). Any other value is ignored. If-  --   this would be 0, you don't have to set it at all.-  -- - ReplayName: An optional 'Rattletrap.PropertyValue.StrProperty' with a-  --   user-supplied name for the replay.-  -- - Team0Score: The blue team's score as an-  --   'Rattletrap.PropertyValue.IntProperty'. Can be omitted if the score is-  --   0.-  -- - Team1Score: The orange team's score as an-  --   'Rattletrap.PropertyValue.IntProperty'. Can also be omitted if the-  --   score is 0.-  -- - TeamSize: An 'Rattletrap.PropertyValue.IntProperty' with the number of-  --   players per team. This value is not validated, so you can put absurd-  --   values like 99. To get an "unfair" team size like 1v4, you must set the-  --   bUnfairBots 'Rattletrap.PropertyValue.BoolProperty' to @True@.-  } deriving (Eq, Ord, Show)--getHeader :: Binary.Get Header-getHeader = do-  engineVersion <- getWord32-  licenseeVersion <- getWord32-  patchVersion <- getPatchVersion engineVersion licenseeVersion-  label <- getText-  properties <- getDictionary getProperty-  pure (Header engineVersion licenseeVersion patchVersion label properties)--getPatchVersion :: Word32 -> Word32 -> Binary.Get (Maybe Word32)-getPatchVersion major minor = if hasPatchVersion major minor-  then do-    patchVersion <- getWord32-    pure (Just patchVersion)-  else pure Nothing--hasPatchVersion :: Word32 -> Word32 -> Bool-hasPatchVersion major minor = major >= Word32 868 && minor >= Word32 18--putHeader :: Header -> Binary.Put-putHeader header = do-  putWord32 (headerEngineVersion header)-  putWord32 (headerLicenseeVersion header)-  case headerPatchVersion header of-    Nothing -> pure ()-    Just patchVersion -> putWord32 patchVersion-  putText (headerLabel header)-  putDictionary putProperty (headerProperties header)--getVersion :: Header -> (Int, Int, Int)-getVersion header =-  ( fromIntegral (word32Value (headerEngineVersion header))-  , fromIntegral (word32Value (headerLicenseeVersion header))-  , Maybe.fromMaybe 0 (fmap (\ v -> fromIntegral (word32Value v)) (headerPatchVersion header))-  )--getNumFrames :: Header -> Int-getNumFrames header =-  let-    key = textValue (stringToText "NumFrames")-    properties = dictionaryValue (headerProperties header)-  in case Map.lookup key properties of-    Just (Property _ _ (IntProperty numFrames)) ->-      fromIntegral (int32Value numFrames)-    _ -> 0--getMaxChannels :: Header -> Word-getMaxChannels header =-  let-    key = textValue (stringToText "MaxChannels")-    properties = dictionaryValue (headerProperties header)-  in case Map.lookup key properties of-    Just (Property _ _ (IntProperty numFrames)) ->-      fromIntegral (int32Value numFrames)-    _ -> 1023
− library/Rattletrap/Helper.hs
@@ -1,103 +0,0 @@--- | This module provides helper functions for converting replays to and from--- both their binary format and JSON.-module Rattletrap.Helper where--import Rattletrap.Json ()-import Rattletrap.Replay--import qualified Data.Aeson as Aeson-import qualified Data.Binary.Get as Binary-import qualified Data.Binary.Put as Binary-import qualified Data.ByteString.Lazy as ByteString-import qualified System.IO as IO---- * Lazy byte strings--- | Parses a raw replay.-decodeReplay :: ByteString.ByteString -> Either String Replay-decodeReplay contents = case Binary.runGetOrFail getReplay contents of-  Left (_, _, message) -> fail message-  Right (_, _, replay) -> pure replay---- | Encodes a replay as JSON.-encodeJson :: Replay -> ByteString.ByteString-encodeJson = Aeson.encode---- | Parses a JSON replay.-decodeJson :: ByteString.ByteString -> Either String Replay-decodeJson = Aeson.eitherDecode---- | Encodes a raw replay.-encodeReplay :: Replay -> ByteString.ByteString-encodeReplay replay = Binary.runPut (putReplay replay)---- * File paths--- | 'decodeReplay'-{-# DEPRECATED-decodeReplayFile "use Data.ByteString.Lazy.readFile"- #-}--decodeReplayFile :: FilePath -> IO (Either String Replay)-decodeReplayFile file = IO.withBinaryFile file IO.ReadMode decodeReplayHandle---- | 'encodeJson'-{-# DEPRECATED-encodeJsonFile "use Data.ByteString.Lazy.writeFile"- #-}--encodeJsonFile :: Replay -> FilePath -> IO ()-encodeJsonFile replay file =-  IO.withBinaryFile file IO.WriteMode (encodeJsonHandle replay)---- | 'decodeJson'-{-# DEPRECATED-decodeJsonFile "use Data.ByteString.Lazy.readFile"- #-}--decodeJsonFile :: FilePath -> IO (Either String Replay)-decodeJsonFile file = IO.withBinaryFile file IO.ReadMode decodeJsonHandle---- | 'encodeReplay'-{-# DEPRECATED-encodeReplayFile "use Data.ByteString.Lazy.writeFile"- #-}--encodeReplayFile :: Replay -> FilePath -> IO ()-encodeReplayFile replay file =-  IO.withBinaryFile file IO.WriteMode (encodeReplayHandle replay)---- * Handles--- | 'decodeReplay'-{-# DEPRECATED-decodeReplayHandle "use Data.ByteString.Lazy.hGetContents"- #-}--decodeReplayHandle :: IO.Handle -> IO (Either String Replay)-decodeReplayHandle handle = do-  contents <- ByteString.hGetContents handle-  pure (decodeReplay contents)---- | 'encodeJson'-{-# DEPRECATED-encodeJsonHandle "use Data.ByteString.Lazy.hPut"- #-}--encodeJsonHandle :: Replay -> IO.Handle -> IO ()-encodeJsonHandle replay handle = ByteString.hPut handle (encodeJson replay)---- | 'decodeJson'-{-# DEPRECATED-decodeJsonHandle "use Data.ByteString.Lazy.hGetContents"- #-}--decodeJsonHandle :: IO.Handle -> IO (Either String Replay)-decodeJsonHandle handle = do-  contents <- ByteString.hGetContents handle-  pure (decodeJson contents)---- | 'encodeReplay'-{-# DEPRECATED-encodeReplayHandle "use Data.ByteString.Lazy.hPut"- #-}--encodeReplayHandle :: Replay -> IO.Handle -> IO ()-encodeReplayHandle replay handle = ByteString.hPut handle (encodeReplay replay)
− library/Rattletrap/Initialization.hs
@@ -1,38 +0,0 @@-module Rattletrap.Initialization where--import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data Initialization = Initialization-  { initializationLocation :: Maybe Vector-  -- ^ Not every class has an initial location. See-  -- 'Rattletrap.Data.rawClassesWithLocation'.-  , initializationRotation :: Maybe Int8Vector-  -- ^ Only classes with location can have rotation, but not every one does.-  -- See 'Rattletrap.Data.rawClassesWithRotation'.-  } deriving (Eq, Ord, Show)--getInitialization :: Bool -> Bool -> BinaryBit.BitGet Initialization-getInitialization hasLocation hasRotation = do-  location <- if hasLocation-    then do-      location <- getVector-      pure (Just location)-    else pure Nothing-  rotation <- if hasRotation-    then do-      rotation <- getInt8Vector-      pure (Just rotation)-    else pure Nothing-  pure (Initialization location rotation)--putInitialization :: Initialization -> BinaryBit.BitPut ()-putInitialization initialization = do-  case initializationLocation initialization of-    Nothing -> pure ()-    Just location -> putVector location-  case initializationRotation initialization of-    Nothing -> pure ()-    Just rotation -> putInt8Vector rotation
− library/Rattletrap/Json.hs
@@ -1,112 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-# OPTIONS_GHC -fno-warn-orphans #-}--module Rattletrap.Json where--import Rattletrap.Attribute-import Rattletrap.AttributeMapping-import Rattletrap.AttributeValue-import Rattletrap.Cache-import Rattletrap.ClassMapping-import Rattletrap.Content-import Rattletrap.Frame-import Rattletrap.Header-import Rattletrap.Initialization-import Rattletrap.KeyFrame-import Rattletrap.Mark-import Rattletrap.Message-import Rattletrap.Primitive-import Rattletrap.Property-import Rattletrap.PropertyValue-import Rattletrap.RemoteId-import Rattletrap.Replay-import Rattletrap.Replication-import Rattletrap.ReplicationValue--import qualified Control.Monad as Monad-import qualified Data.Aeson.TH as Aeson-import qualified Data.Aeson.Types as Aeson-import qualified Language.Haskell.TH as TH--$(let toSnakeCase = Aeson.camelTo2 '_'-      dropName name = drop (length (TH.nameBase name))-      optionsFor name =-        Aeson.defaultOptions-        { Aeson.constructorTagModifier = toSnakeCase-        , Aeson.fieldLabelModifier = toSnakeCase . dropName name-        , Aeson.omitNothingFields = True-        , Aeson.sumEncoding = Aeson.ObjectWithSingleField-        , Aeson.unwrapUnaryRecords = True-        }-      deriveJSON declarations name = do-        newDeclarations <- Aeson.deriveJSON (optionsFor name) name-        pure (newDeclarations ++ declarations)-      names =-        [ ''AppliedDamageAttribute-        , ''Attribute-        , ''AttributeMapping-        , ''AttributeValue-        , ''BooleanAttribute-        , ''ByteAttribute-        , ''Cache-        , ''CamSettingsAttribute-        , ''ClassMapping-        , ''ClubColorsAttribute-        , ''CompressedWord-        , ''CompressedWordVector-        , ''Content-        , ''DamageStateAttribute-        , ''DemolishAttribute-        , ''DestroyedReplication-        , ''Dictionary-        , ''EnumAttribute-        , ''ExplosionAttribute-        , ''ExtendedExplosionAttribute-        , ''FlaggedIntAttribute-        , ''Float32-        , ''FloatAttribute-        , ''Frame-        , ''GameModeAttribute-        , ''Header-        , ''Initialization-        , ''Int32-        , ''Int8-        , ''Int8Vector-        , ''IntAttribute-        , ''KeyFrame-        , ''List-        , ''LoadoutAttribute-        , ''LoadoutOnlineAttribute-        , ''LoadoutsAttribute-        , ''LoadoutsOnlineAttribute-        , ''LocationAttribute-        , ''Mark-        , ''Message-        , ''MusicStingerAttribute-        , ''PartyLeaderAttribute-        , ''PickupAttribute-        , ''PrivateMatchSettingsAttribute-        , ''ProductAttribute-        , ''Property-        , ''PropertyValue-        , ''QWordAttribute-        , ''RemoteId-        , ''Replay-        , ''Replication-        , ''ReplicationValue-        , ''ReservationAttribute-        , ''RigidBodyStateAttribute-        , ''Section-        , ''SpawnedReplication-        , ''StringAttribute-        , ''TeamPaintAttribute-        , ''Text-        , ''UniqueIdAttribute-        , ''UpdatedReplication-        , ''Vector-        , ''WeldedInfoAttribute-        , ''Word32-        , ''Word64-        , ''Word8-        ]-  in Monad.foldM deriveJSON [] names)
− library/Rattletrap/KeyFrame.hs
@@ -1,27 +0,0 @@-module Rattletrap.KeyFrame where--import Rattletrap.Primitive--import qualified Data.Binary as Binary--data KeyFrame = KeyFrame-  { keyFrameTime :: Float32-  -- ^ When this key frame occurs, in seconds.-  , keyFrameFrame :: Word32-  -- ^ The frame number of this key frame, starting from 0.-  , keyFramePosition :: Word32-  -- ^ The bit position of this key frame in the stream.-  } deriving (Eq, Ord, Show)--getKeyFrame :: Binary.Get KeyFrame-getKeyFrame = do-  time <- getFloat32-  frame <- getWord32-  position <- getWord32-  pure (KeyFrame time frame position)--putKeyFrame :: KeyFrame -> Binary.Put-putKeyFrame keyFrame = do-  putFloat32 (keyFrameTime keyFrame)-  putWord32 (keyFrameFrame keyFrame)-  putWord32 (keyFramePosition keyFrame)
− library/Rattletrap/Main.hs
@@ -1,60 +0,0 @@-module Rattletrap.Main where--import Rattletrap.Helper-import Rattletrap.Version--import qualified Data.ByteString.Lazy as ByteString-import qualified Data.Version as Version-import qualified Network.HTTP.Client as Client-import qualified Network.HTTP.Client.TLS as Client-import qualified System.Environment as Environment---- | Gets command-line arguments and passes them to 'mainWithArgs'.-main :: IO ()-main = do-  args <- Environment.getArgs-  mainWithArgs args---- | Runs the main command-line interface. Can be used in one of three modes:------ 1. @mainWithArgs ["version"]@: Prints out the version number and exits.---    Mostly useful for debugging.--- 2. @mainWithArgs ["decode"]@: Parses a raw replay into JSON. By default---    this reads from STDIN and writes to STDOUT. To read from a file, pass a---    second argument like @mainWithArgs ["decode", "input.replay"]@. To write---    to a file, pass a third argument like---    @mainWithArgs ["decode", "input.replay", "output.json"]@.--- 3. @mainWithArgs ["encode"]@: Generates a raw replay from JSON. The---    handling of input and output is the same as decoding.-mainWithArgs :: [String] -> IO ()-mainWithArgs args = case args of-  ["version"] -> putStrLn (Version.showVersion version)-  action:files -> do-    (getInput, putOutput) <- getIO files-    input <- getInput-    output <- case action of-      "decode" -> case decodeReplay input of-        Left message -> fail message-        Right replay -> pure (encodeJson replay)-      "encode" -> case decodeJson input of-        Left message -> fail message-        Right replay -> pure (encodeReplay replay)-      _ -> fail ("unknown action: " ++ show action)-    putOutput output-  _ -> fail ("unknown arguments: " ++ show args)--getIO-  :: [FilePath] -> IO (IO ByteString.ByteString, ByteString.ByteString -> IO ())-getIO files = case files of-  [] -> pure (ByteString.getContents, ByteString.putStr)-  [i] -> pure (readUrlOrFile i, ByteString.putStr)-  [i, o] -> pure (readUrlOrFile i, ByteString.writeFile o)-  _ -> fail ("unknown files: " ++ show files)--readUrlOrFile :: FilePath -> IO ByteString.ByteString-readUrlOrFile i = case Client.parseUrlThrow i of-  Just request -> do-    manager <- Client.newTlsManager-    response <- Client.httpLbs request manager-    pure (Client.responseBody response)-  Nothing -> ByteString.readFile i
− library/Rattletrap/Mark.hs
@@ -1,23 +0,0 @@-module Rattletrap.Mark where--import Rattletrap.Primitive--import qualified Data.Binary as Binary--data Mark = Mark-  { markValue :: Text-  -- ^ Which type of mark this is, like @Team0Goal@.-  , markFrame :: Word32-  -- ^ Which frame this mark belongs to, starting from 0.-  } deriving (Eq, Ord, Show)--getMark :: Binary.Get Mark-getMark = do-  value <- getText-  frame <- getWord32-  pure (Mark value frame)--putMark :: Mark -> Binary.Put-putMark mark = do-  putText (markValue mark)-  putWord32 (markFrame mark)
− library/Rattletrap/Message.hs
@@ -1,27 +0,0 @@-module Rattletrap.Message where--import Rattletrap.Primitive--import qualified Data.Binary as Binary--data Message = Message-  { messageFrame :: Word32-  -- ^ Which frame this message belongs to, starting from 0.-  , messageName :: Text-  -- ^ The primary player's name.-  , messageValue :: Text-  -- ^ The content of the message.-  } deriving (Eq, Ord, Show)--getMessage :: Binary.Get Message-getMessage = do-  frame <- getWord32-  name <- getText-  value <- getText-  pure (Message frame name value)--putMessage :: Message -> Binary.Put-putMessage message = do-  putWord32 (messageFrame message)-  putText (messageName message)-  putText (messageValue message)
− library/Rattletrap/Primitive.hs
@@ -1,31 +0,0 @@-module Rattletrap.Primitive-  ( module Rattletrap.Primitive.CompressedWord-  , module Rattletrap.Primitive.CompressedWordVector-  , module Rattletrap.Primitive.Dictionary-  , module Rattletrap.Primitive.Float32-  , module Rattletrap.Primitive.Int8-  , module Rattletrap.Primitive.Int8Vector-  , module Rattletrap.Primitive.Int32-  , module Rattletrap.Primitive.List-  , module Rattletrap.Primitive.Section-  , module Rattletrap.Primitive.Text-  , module Rattletrap.Primitive.Vector-  , module Rattletrap.Primitive.Word8-  , module Rattletrap.Primitive.Word32-  , module Rattletrap.Primitive.Word64-  ) where--import Rattletrap.Primitive.CompressedWord-import Rattletrap.Primitive.CompressedWordVector-import Rattletrap.Primitive.Dictionary-import Rattletrap.Primitive.Float32-import Rattletrap.Primitive.Int32-import Rattletrap.Primitive.Int8-import Rattletrap.Primitive.Int8Vector-import Rattletrap.Primitive.List-import Rattletrap.Primitive.Section-import Rattletrap.Primitive.Text-import Rattletrap.Primitive.Vector-import Rattletrap.Primitive.Word32-import Rattletrap.Primitive.Word64-import Rattletrap.Primitive.Word8
− library/Rattletrap/Primitive/CompressedWord.hs
@@ -1,49 +0,0 @@-module Rattletrap.Primitive.CompressedWord where--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit-import qualified Data.Bits as Bits--data CompressedWord = CompressedWord-  { compressedWordLimit :: Word-  , compressedWordValue :: Word-  } deriving (Eq, Ord, Show)--getCompressedWord :: Word -> BinaryBit.BitGet CompressedWord-getCompressedWord limit = do-  value <- getCompressedWordStep limit (getMaxBits limit) 0 0-  pure (CompressedWord limit value)--putCompressedWord :: CompressedWord -> BinaryBit.BitPut ()-putCompressedWord compressedWord = do-  let limit = compressedWordLimit compressedWord-  let value = compressedWordValue compressedWord-  let maxBits = getMaxBits limit-  let-    go position soFar = if position < maxBits-      then do-        let x = Bits.shiftL 1 position-        if maxBits > 1 && position == maxBits - 1 && soFar + x > limit-          then pure ()-          else do-            let bit = Bits.testBit value position-            BinaryBit.putBool bit-            let delta = if bit then x else 0-            go (position + 1) (soFar + delta)-      else pure ()-  go 0 0--getMaxBits :: (Integral a, Integral b) => a -> b-getMaxBits x = do-  let n = max 1 (ceiling (logBase (2 :: Double) (fromIntegral (max 1 x))))-  if x < 1024 && x == 2 ^ n then n + 1 else n--getCompressedWordStep :: Word -> Word -> Word -> Word -> BinaryBit.BitGet Word-getCompressedWordStep limit maxBits position value = do-  let x = Bits.shiftL 1 (fromIntegral position)-  if position < maxBits && value + x <= limit-    then do-      bit <- BinaryBit.getBool-      let newValue = if bit then value + x else value-      getCompressedWordStep limit maxBits (position + 1) newValue-    else pure value
− library/Rattletrap/Primitive/CompressedWordVector.hs
@@ -1,26 +0,0 @@-module Rattletrap.Primitive.CompressedWordVector where--import Rattletrap.Primitive.CompressedWord--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data CompressedWordVector = CompressedWordVector-  { compressedWordVectorX :: CompressedWord-  , compressedWordVectorY :: CompressedWord-  , compressedWordVectorZ :: CompressedWord-  } deriving (Eq, Ord, Show)--getCompressedWordVector :: BinaryBit.BitGet CompressedWordVector-getCompressedWordVector = do-  let limit = 65536-  x <- getCompressedWord limit-  y <- getCompressedWord limit-  z <- getCompressedWord limit-  pure (CompressedWordVector x y z)--putCompressedWordVector :: CompressedWordVector -> BinaryBit.BitPut ()-putCompressedWordVector compressedWordVector = do-  putCompressedWord (compressedWordVectorX compressedWordVector)-  putCompressedWord (compressedWordVectorY compressedWordVector)-  putCompressedWord (compressedWordVectorZ compressedWordVector)
− library/Rattletrap/Primitive/Dictionary.hs
@@ -1,60 +0,0 @@-module Rattletrap.Primitive.Dictionary where--import Rattletrap.Primitive.Text--import qualified Data.Binary as Binary-import qualified Data.Map as Map-import qualified Data.Text as Text--data Dictionary a = Dictionary-  { dictionaryKeys :: [Text]-  -- ^ Objects in JSON aren't ordered, so the order of the keys must be stored-  -- separately.-  , dictionaryLastKey :: Text-  -- ^ The last key is usually @None@ but sometimes contains extra null bytes.-  , dictionaryValue :: Map.Map Text.Text a-  -- ^ Be sure to update 'dictionaryKeys' if you add, change, or remove a key-  -- in this map.-  } deriving (Eq, Ord, Show)--getDictionary :: Binary.Get a -> Binary.Get (Dictionary a)-getDictionary getValue = do-  (elements, lastKey) <- getElements getValue-  let keys = map fst elements-  let value = Map.mapKeys textValue (Map.fromList elements)-  pure (Dictionary keys lastKey value)--getElements :: Binary.Get a -> Binary.Get ([(Text, a)], Text)-getElements getValue = do-  (key, maybeValue) <- getElement getValue-  case maybeValue of-    Nothing -> pure ([], key)-    Just value -> do-      let element = (key, value)-      (elements, lastKey) <- getElements getValue-      pure (element : elements, lastKey)--getElement :: Binary.Get a -> Binary.Get (Text, Maybe a)-getElement getValue = do-  key <- getText-  if isNoneKey key-    then pure (key, Nothing)-    else do-      value <- getValue-      pure (key, Just value)--isNoneKey :: Text -> Bool-isNoneKey text = filter (/= '\x00') (textToString text) == "None"--putDictionary :: (a -> Binary.Put) -> Dictionary a -> Binary.Put-putDictionary putValue dictionary = do-  let elements = dictionaryValue dictionary-  mapM_-    ( \key -> do-      putText key-      case Map.lookup (textValue key) elements of-        Nothing -> fail ("could not find key " ++ textToString key)-        Just value -> putValue value-    )-    (dictionaryKeys dictionary)-  putText (dictionaryLastKey dictionary)
− library/Rattletrap/Primitive/Float32.hs
@@ -1,33 +0,0 @@-module Rattletrap.Primitive.Float32 where--import Rattletrap.Utility--import qualified Data.Binary as Binary-import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit-import qualified Data.Binary.Get as Binary-import qualified Data.Binary.IEEE754 as IEEE754-import qualified Data.Binary.Put as Binary-import qualified Data.ByteString.Lazy as ByteString--newtype Float32 = Float32-  { float32Value :: Float-  } deriving (Eq, Ord, Show)--getFloat32 :: Binary.Get Float32-getFloat32 = do-  float32 <- IEEE754.getFloat32le-  pure (Float32 float32)--putFloat32 :: Float32 -> Binary.Put-putFloat32 float32 = IEEE754.putFloat32le (float32Value float32)--getFloat32Bits :: BinaryBit.BitGet Float32-getFloat32Bits = do-  bytes <- BinaryBit.getLazyByteString 4-  pure (Binary.runGet getFloat32 (reverseBytes bytes))--putFloat32Bits :: Float32 -> BinaryBit.BitPut ()-putFloat32Bits float32 = do-  let bytes = Binary.runPut (putFloat32 float32)-  BinaryBit.putByteString (ByteString.toStrict (reverseBytes bytes))
− library/Rattletrap/Primitive/Int32.hs
@@ -1,33 +0,0 @@-module Rattletrap.Primitive.Int32 where--import Rattletrap.Utility--import qualified Data.Binary as Binary-import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit-import qualified Data.Binary.Get as Binary-import qualified Data.Binary.Put as Binary-import qualified Data.ByteString.Lazy as ByteString-import qualified Data.Int as Int--newtype Int32 = Int32-  { int32Value :: Int.Int32-  } deriving (Eq, Ord, Show)--getInt32 :: Binary.Get Int32-getInt32 = do-  int32 <- Binary.getInt32le-  pure (Int32 int32)--putInt32 :: Int32 -> Binary.Put-putInt32 int32 = Binary.putInt32le (int32Value int32)--getInt32Bits :: BinaryBit.BitGet Int32-getInt32Bits = do-  bytes <- BinaryBit.getLazyByteString 4-  pure (Binary.runGet getInt32 (reverseBytes bytes))--putInt32Bits :: Int32 -> BinaryBit.BitPut ()-putInt32Bits int32 = do-  let bytes = Binary.runPut (putInt32 int32)-  BinaryBit.putByteString (ByteString.toStrict (reverseBytes bytes))
− library/Rattletrap/Primitive/Int8.hs
@@ -1,32 +0,0 @@-module Rattletrap.Primitive.Int8 where--import Rattletrap.Utility--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit-import qualified Data.Binary.Get as Binary-import qualified Data.Binary.Put as Binary-import qualified Data.ByteString.Lazy as ByteString-import qualified Data.Int as Int--newtype Int8 = Int8-  { int8Value :: Int.Int8-  } deriving (Eq, Ord, Show)--getInt8 :: Binary.Get Int8-getInt8 = do-  int8 <- Binary.getInt8-  pure (Int8 int8)--putInt8 :: Int8 -> Binary.Put-putInt8 int8 = Binary.putInt8 (int8Value int8)--getInt8Bits :: BinaryBit.BitGet Int8-getInt8Bits = do-  bytes <- BinaryBit.getLazyByteString 1-  pure (Binary.runGet getInt8 (reverseBytes bytes))--putInt8Bits :: Int8 -> BinaryBit.BitPut ()-putInt8Bits int8 = do-  let bytes = Binary.runPut (putInt8 int8)-  BinaryBit.putByteString (ByteString.toStrict (reverseBytes bytes))
− library/Rattletrap/Primitive/Int8Vector.hs
@@ -1,41 +0,0 @@-module Rattletrap.Primitive.Int8Vector where--import Rattletrap.Primitive.Int8--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data Int8Vector = Int8Vector-  { int8VectorX :: Maybe Int8-  , int8VectorY :: Maybe Int8-  , int8VectorZ :: Maybe Int8-  } deriving (Eq, Ord, Show)--getInt8Vector :: BinaryBit.BitGet Int8Vector-getInt8Vector = do-  x <- getInt8VectorField-  y <- getInt8VectorField-  z <- getInt8VectorField-  pure (Int8Vector x y z)--putInt8Vector :: Int8Vector -> BinaryBit.BitPut ()-putInt8Vector int8Vector = do-  putInt8VectorField (int8VectorX int8Vector)-  putInt8VectorField (int8VectorY int8Vector)-  putInt8VectorField (int8VectorZ int8Vector)--getInt8VectorField :: BinaryBit.BitGet (Maybe Int8)-getInt8VectorField = do-  hasField <- BinaryBit.getBool-  if hasField-    then do-      field <- getInt8Bits-      pure (Just field)-    else pure Nothing--putInt8VectorField :: Maybe Int8 -> BinaryBit.BitPut ()-putInt8VectorField maybeField = case maybeField of-  Nothing -> BinaryBit.putBool False-  Just field -> do-    BinaryBit.putBool True-    putInt8Bits field
− library/Rattletrap/Primitive/List.hs
@@ -1,22 +0,0 @@-module Rattletrap.Primitive.List where--import Rattletrap.Primitive.Word32--import qualified Control.Monad as Monad-import qualified Data.Binary as Binary--newtype List a = List-  { listValue :: [a]-  } deriving (Eq, Ord, Show)--getList :: Binary.Get a -> Binary.Get (List a)-getList getElement = do-  size <- getWord32-  elements <- Monad.replicateM (fromIntegral (word32Value size)) getElement-  pure (List elements)--putList :: (a -> Binary.Put) -> List a -> Binary.Put-putList putElement list = do-  let elements = listValue list-  putWord32 (Word32 (fromIntegral (length elements)))-  mapM_ putElement elements
− library/Rattletrap/Primitive/Section.hs
@@ -1,54 +0,0 @@-module Rattletrap.Primitive.Section where--import Rattletrap.Crc-import Rattletrap.Primitive.Word32--import qualified Control.Monad as Monad-import qualified Data.Binary as Binary-import qualified Data.Binary.Get as Binary-import qualified Data.Binary.Put as Binary-import qualified Data.ByteString.Lazy as ByteString---- | A section is a large piece of a 'Rattletrap.Replay.Replay'. It has a--- 32-bit size (in bytes), a 32-bit CRC (see "Rattletrap.Crc"), and then a--- bunch of data (the body). This interface is provided so that you don't have--- to think about the size and CRC.-newtype Section a = Section-  { sectionBody :: a-  -- ^ The actual content in the section.-  } deriving (Eq, Ord, Show)---- | Given a way to get the 'sectionBody', gets a section. This will fail if--- the section's CRC does not match.------ @--- let header = 'Data.Binary.Get.runGet' ('getSection' 'Rattletrap.Header.getHeader') bytes--- @-getSection :: Binary.Get a -> Binary.Get (Section a)-getSection getBody = do-  size <- getWord32-  crc <- getWord32-  rawBody <- Binary.getLazyByteString (fromIntegral (word32Value size))-  let actualCrc = Word32 (getCrc32 rawBody)-  Monad.when (actualCrc /= crc) (fail (crcMessage actualCrc crc))-  let body = Binary.runGet getBody rawBody-  pure (Section body)---- | Given a way to put the 'sectionBody', puts a section. This will also put--- the size and CRC.------ @--- let bytes = 'Data.Binary.Put.runPut' ('putSection' 'Rattletrap.Content.putContent' content)--- @-putSection :: (a -> Binary.Put) -> Section a -> Binary.Put-putSection putBody section = do-  let rawBody = Binary.runPut (putBody (sectionBody section))-  let size = ByteString.length rawBody-  let crc = getCrc32 rawBody-  putWord32 (Word32 (fromIntegral size))-  putWord32 (Word32 crc)-  Binary.putLazyByteString rawBody--crcMessage :: Word32 -> Word32 -> String-crcMessage actual expected = unwords-  ["actual CRC", show actual, "does not match expected CRC", show expected]
− library/Rattletrap/Primitive/Text.hs
@@ -1,94 +0,0 @@-module Rattletrap.Primitive.Text where--import Rattletrap.Primitive.Int32-import Rattletrap.Utility--import qualified Data.Binary as Binary-import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit-import qualified Data.Binary.Get as Binary-import qualified Data.Binary.Put as Binary-import qualified Data.ByteString.Lazy as ByteString-import qualified Data.Char as Char-import qualified Data.Text as Text-import qualified Data.Text.Encoding as Encoding--newtype Text = Text-  { textValue :: Text.Text-  } deriving (Eq, Ord, Show)--getText :: Binary.Get Text-getText = do-  rawSize <- getInt32-  let decode = getTextDecoder rawSize-  let size = normalizeTextSize rawSize-  bytes <- Binary.getLazyByteString size-  let text = dropNull (decode bytes)-  pure (Text text)--putText :: Text -> Binary.Put-putText text = do-  let size = getTextSize text-  let encode = getTextEncoder size-  putInt32 size-  Binary.putLazyByteString (encode (addNull (textValue text)))--getTextBits :: BinaryBit.BitGet Text-getTextBits = do-  rawSize <- getInt32Bits-  let decode = getTextDecoder rawSize-  let size = normalizeTextSize rawSize-  bytes <- BinaryBit.getLazyByteString size-  let text = dropNull (decode (reverseBytes bytes))-  pure (Text text)--putTextBits :: Text -> BinaryBit.BitPut ()-putTextBits text = do-  let size = getTextSize text-  let encode = getTextEncoder size-  putInt32Bits size-  BinaryBit.putByteString-    (ByteString.toStrict (reverseBytes (encode (addNull (textValue text)))))--stringToText :: String -> Text-stringToText string = Text (Text.pack string)--textToString :: Text -> String-textToString text = Text.unpack (textValue text)--getTextSize :: Text -> Int32-getTextSize text =-  let-    value = textValue text-    scale = if Text.all Char.isLatin1 value then 1 else -1-    rawSize =-      if Text.null value then 0 else fromIntegral (Text.length value) + 1-    size = if value == Text.pack "\x00\x00\x00None"-      then 0x05000000-      else scale * rawSize-  in-    Int32 size--normalizeTextSize :: Integral a => Int32 -> a-normalizeTextSize size = case int32Value size of-  0x05000000 -> 8-  x -> if x < 0 then (-2 * fromIntegral x) else fromIntegral x--getTextDecoder :: Int32 -> ByteString.ByteString -> Text.Text-getTextDecoder size bytes =-  let-    decode =-      if size < Int32 0 then Encoding.decodeUtf16LE else Encoding.decodeLatin1-  in-    decode (ByteString.toStrict bytes)--getTextEncoder :: Int32 -> Text.Text -> ByteString.ByteString-getTextEncoder size text = if size < Int32 0-  then ByteString.fromStrict (Encoding.encodeUtf16LE text)-  else encodeLatin1 text--dropNull :: Text.Text -> Text.Text-dropNull = Text.dropWhileEnd (== '\x00')--addNull :: Text.Text -> Text.Text-addNull text = if Text.null text then text else Text.snoc text '\x00'
− library/Rattletrap/Primitive/Vector.hs
@@ -1,41 +0,0 @@-module Rattletrap.Primitive.Vector where--import Rattletrap.Primitive.CompressedWord--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data Vector = Vector-  { vectorBias :: Word-  , vectorX :: Int-  , vectorY :: Int-  , vectorZ :: Int-  } deriving (Eq, Ord, Show)--getVector :: BinaryBit.BitGet Vector-getVector = do-  bitSize <- getCompressedWord 19-  let limit = 2 ^ (compressedWordValue bitSize + 2)-  dx <- getCompressedWord limit-  dy <- getCompressedWord limit-  dz <- getCompressedWord limit-  let fromCompressedWord x = fromIntegral (compressedWordValue x)-  let bias = 2 ^ (fromCompressedWord bitSize + 1 :: Word)-  let x = fromCompressedWord dx - fromIntegral bias-  let y = fromCompressedWord dy - fromIntegral bias-  let z = fromCompressedWord dz - fromIntegral bias-  pure (Vector bias x y z)--putVector :: Vector -> BinaryBit.BitPut ()-putVector vector = do-  let-    bitSize =-      round (logBase (2 :: Float) (fromIntegral (vectorBias vector))) - 1-  putCompressedWord (CompressedWord 19 bitSize)-  let dx = fromIntegral (vectorX vector + fromIntegral (vectorBias vector))-  let dy = fromIntegral (vectorY vector + fromIntegral (vectorBias vector))-  let dz = fromIntegral (vectorZ vector + fromIntegral (vectorBias vector))-  let limit = 2 ^ (bitSize + 2)-  putCompressedWord (CompressedWord limit dx)-  putCompressedWord (CompressedWord limit dy)-  putCompressedWord (CompressedWord limit dz)
− library/Rattletrap/Primitive/Word32.hs
@@ -1,33 +0,0 @@-module Rattletrap.Primitive.Word32 where--import Rattletrap.Utility--import qualified Data.Binary as Binary-import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit-import qualified Data.Binary.Get as Binary-import qualified Data.Binary.Put as Binary-import qualified Data.ByteString.Lazy as ByteString-import qualified Data.Word as Word--newtype Word32 = Word32-  { word32Value :: Word.Word32-  } deriving (Eq, Ord, Show)--getWord32 :: Binary.Get Word32-getWord32 = do-  word32 <- Binary.getWord32le-  pure (Word32 word32)--putWord32 :: Word32 -> Binary.Put-putWord32 word32 = Binary.putWord32le (word32Value word32)--getWord32Bits :: BinaryBit.BitGet Word32-getWord32Bits = do-  bytes <- BinaryBit.getLazyByteString 4-  pure (Binary.runGet getWord32 (reverseBytes bytes))--putWord32Bits :: Word32 -> BinaryBit.BitPut ()-putWord32Bits word32 = do-  let bytes = Binary.runPut (putWord32 word32)-  BinaryBit.putByteString (ByteString.toStrict (reverseBytes bytes))
− library/Rattletrap/Primitive/Word64.hs
@@ -1,33 +0,0 @@-module Rattletrap.Primitive.Word64 where--import Rattletrap.Utility--import qualified Data.Binary as Binary-import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit-import qualified Data.Binary.Get as Binary-import qualified Data.Binary.Put as Binary-import qualified Data.ByteString.Lazy as ByteString-import qualified Data.Word as Word--newtype Word64 = Word64-  { word64Value :: Word.Word64-  } deriving (Eq, Ord, Show)--getWord64 :: Binary.Get Word64-getWord64 = do-  word64 <- Binary.getWord64le-  pure (Word64 word64)--putWord64 :: Word64 -> Binary.Put-putWord64 word64 = Binary.putWord64le (word64Value word64)--getWord64Bits :: BinaryBit.BitGet Word64-getWord64Bits = do-  bytes <- BinaryBit.getLazyByteString 8-  pure (Binary.runGet getWord64 (reverseBytes bytes))--putWord64Bits :: Word64 -> BinaryBit.BitPut ()-putWord64Bits word64 = do-  let bytes = Binary.runPut (putWord64 word64)-  BinaryBit.putByteString (ByteString.toStrict (reverseBytes bytes))
− library/Rattletrap/Primitive/Word8.hs
@@ -1,33 +0,0 @@-module Rattletrap.Primitive.Word8 where--import Rattletrap.Utility--import qualified Data.Binary as Binary-import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit-import qualified Data.Binary.Get as Binary-import qualified Data.Binary.Put as Binary-import qualified Data.ByteString.Lazy as ByteString-import qualified Data.Word as Word--newtype Word8 = Word8-  { word8Value :: Word.Word8-  } deriving (Eq, Ord, Show)--getWord8 :: Binary.Get Word8-getWord8 = do-  word8 <- Binary.getWord8-  pure (Word8 word8)--putWord8 :: Word8 -> Binary.Put-putWord8 word8 = Binary.putWord8 (word8Value word8)--getWord8Bits :: BinaryBit.BitGet Word8-getWord8Bits = do-  bytes <- BinaryBit.getLazyByteString 1-  pure (Binary.runGet getWord8 (reverseBytes bytes))--putWord8Bits :: Word8 -> BinaryBit.BitPut ()-putWord8Bits word8 = do-  let bytes = Binary.runPut (putWord8 word8)-  BinaryBit.putByteString (ByteString.toStrict (reverseBytes bytes))
− library/Rattletrap/Property.hs
@@ -1,26 +0,0 @@-module Rattletrap.Property where--import Rattletrap.Primitive-import Rattletrap.PropertyValue--import qualified Data.Binary as Binary--data Property = Property-  { propertyKind :: Text-  , propertySize :: Word64-  -- ^ Not used.-  , propertyValue :: PropertyValue Property-  } deriving (Eq, Ord, Show)--getProperty :: Binary.Get Property-getProperty = do-  kind <- getText-  size <- getWord64-  value <- getPropertyValue getProperty kind-  pure (Property kind size value)--putProperty :: Property -> Binary.Put-putProperty property = do-  putText (propertyKind property)-  putWord64 (propertySize property)-  putPropertyValue putProperty (propertyValue property)
− library/Rattletrap/PropertyValue.hs
@@ -1,69 +0,0 @@-module Rattletrap.PropertyValue where--import Rattletrap.Primitive--import qualified Data.Binary as Binary--data PropertyValue a-  = ArrayProperty (List (Dictionary a))-  -- ^ Yes, a list of dictionaries. No, it doesn't make sense. These usually-  -- only have one element.-  | BoolProperty Word8-  | ByteProperty Text-                 (Maybe Text)-  -- ^ This is a strange name for essentially a key-value pair.-  | FloatProperty Float32-  | IntProperty Int32-  | NameProperty Text-  -- ^ It's unclear how exactly this is different than a 'StrProperty'.-  | QWordProperty Word64-  | StrProperty Text-  deriving (Eq, Ord, Show)--getPropertyValue :: Binary.Get a -> Text -> Binary.Get (PropertyValue a)-getPropertyValue getProperty kind = case textToString kind of-  "ArrayProperty" -> do-    list <- getList (getDictionary getProperty)-    pure (ArrayProperty list)-  "BoolProperty" -> do-    word8 <- getWord8-    pure (BoolProperty word8)-  "ByteProperty" -> do-    k <- getText-    v <- if textToString k == "OnlinePlatform_Steam"-      then pure Nothing-      else do-        v <- getText-        pure (Just v)-    pure (ByteProperty k v)-  "FloatProperty" -> do-    float32 <- getFloat32-    pure (FloatProperty float32)-  "IntProperty" -> do-    int32 <- getInt32-    pure (IntProperty int32)-  "NameProperty" -> do-    text <- getText-    pure (NameProperty text)-  "QWordProperty" -> do-    word64 <- getWord64-    pure (QWordProperty word64)-  "StrProperty" -> do-    text <- getText-    pure (StrProperty text)-  _ -> fail ("don't know how to read property value " ++ show kind)--putPropertyValue :: (a -> Binary.Put) -> PropertyValue a -> Binary.Put-putPropertyValue putProperty value = case value of-  ArrayProperty list -> putList (putDictionary putProperty) list-  BoolProperty word8 -> putWord8 word8-  ByteProperty k mv -> do-    putText k-    case mv of-      Nothing -> pure ()-      Just v -> putText v-  FloatProperty float32 -> putFloat32 float32-  IntProperty int32 -> putInt32 int32-  NameProperty text -> putText text-  QWordProperty word64 -> putWord64 word64-  StrProperty text -> putText text
− library/Rattletrap/RemoteId.hs
@@ -1,53 +0,0 @@-module Rattletrap.RemoteId where--import Rattletrap.Primitive-import Rattletrap.Utility--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit-import qualified Data.ByteString.Lazy as ByteString-import qualified Data.Text as Text-import qualified Data.Text.Encoding as Encoding-import qualified Data.Word as Word--data RemoteId-  = PlayStationId Text.Text-                  [Word.Word8]-  | SplitscreenId Word.Word32-  | SteamId Word64-  | XboxId Word64-  deriving (Eq, Ord, Show)--getRemoteId :: (Int, Int, Int) -> Word8 -> BinaryBit.BitGet RemoteId-getRemoteId (_, _, patchVersion) systemId = case word8Value systemId of-  0 -> do-    word24 <- BinaryBit.getWord32be 24-    pure (SplitscreenId word24)-  1 -> do-    word64 <- getWord64Bits-    pure (SteamId word64)-  2 -> do-    rawName <- BinaryBit.getLazyByteString 16-    let-      name = Text.dropWhileEnd-        (== '\x00')-        (Encoding.decodeLatin1 (ByteString.toStrict (reverseBytes rawName)))-      numBytes = if patchVersion >= 1 then 24 else 16-    bytes <- BinaryBit.getLazyByteString numBytes-    pure (PlayStationId name (ByteString.unpack bytes))-  4 -> do-    word64 <- getWord64Bits-    pure (XboxId word64)-  _ -> fail ("unknown system id " ++ show systemId)--putRemoteId :: RemoteId -> BinaryBit.BitPut ()-putRemoteId remoteId = case remoteId of-  PlayStationId name bytes -> do-    let-      rawName = ByteString.toStrict-        (reverseBytes (padBytes (16 :: Int) (encodeLatin1 name)))-    BinaryBit.putByteString rawName-    BinaryBit.putByteString (ByteString.toStrict (ByteString.pack bytes))-  SplitscreenId word24 -> BinaryBit.putWord32be 24 word24-  SteamId word64 -> putWord64Bits word64-  XboxId word64 -> putWord64Bits word64
− library/Rattletrap/Replay.hs
@@ -1,39 +0,0 @@-module Rattletrap.Replay where--import Rattletrap.Content-import Rattletrap.Header-import Rattletrap.Primitive.Section--import qualified Data.Binary as Binary---- | A Rocket League replay.-data Replay = Replay-  { replayHeader :: Section Header-  -- ^ This has most of the high-level metadata.-  , replayContent :: Section Content-  -- ^ This has most of the low-level game data.-  } deriving (Eq, Ord, Show)---- | Parses a raw replay. Use this with 'Data.Binary.Get.runGet'.------ @--- let replay = 'Data.Binary.Get.runGet' 'getReplay' bytes--- @-getReplay :: Binary.Get Replay-getReplay = do-  header <- getSection getHeader-  let version = getVersion (sectionBody header)-  let numFrames = getNumFrames (sectionBody header)-  let maxChannels = getMaxChannels (sectionBody header)-  content <- getSection (getContent version numFrames maxChannels)-  pure (Replay header content)---- | Generates a raw replay. Use this with 'Data.Binary.Put.runPut'.------ @--- let bytes = 'Data.Binary.Put.runPut' ('putReplay' replay)--- @-putReplay :: Replay -> Binary.Put-putReplay replay = do-  putSection putHeader (replayHeader replay)-  putSection putContent (replayContent replay)
− library/Rattletrap/Replication.hs
@@ -1,66 +0,0 @@-module Rattletrap.Replication where--import Rattletrap.ActorMap-import Rattletrap.ClassAttributeMap-import Rattletrap.Primitive-import Rattletrap.ReplicationValue--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data Replication = Replication-  { replicationActorId :: CompressedWord-  , replicationValue :: ReplicationValue-  } deriving (Eq, Ord, Show)--getReplications-  :: (Int, Int, Int)-  -> Word-  -> ClassAttributeMap-  -> ActorMap-  -> BinaryBit.BitGet ([Replication], ActorMap)-getReplications version maxChannels classAttributeMap actorMap = do-  maybeReplication <- getReplication-    version-    maxChannels-    classAttributeMap-    actorMap-  case maybeReplication of-    Nothing -> pure ([], actorMap)-    Just (replication, newActorMap) -> do-      (replications, newerActorMap) <- getReplications-        version-        maxChannels-        classAttributeMap-        newActorMap-      pure (replication : replications, newerActorMap)--putReplications :: [Replication] -> BinaryBit.BitPut ()-putReplications replications = do-  mapM_ putReplication replications-  BinaryBit.putBool False--getReplication-  :: (Int, Int, Int)-  -> Word-  -> ClassAttributeMap-  -> ActorMap-  -> BinaryBit.BitGet (Maybe (Replication, ActorMap))-getReplication version maxChannels classAttributeMap actorMap = do-  hasReplication <- BinaryBit.getBool-  if not hasReplication-    then pure Nothing-    else do-      actorId <- getCompressedWord maxChannels-      (value, newActorMap) <- getReplicationValue-        version-        classAttributeMap-        actorMap-        actorId-      pure (Just (Replication actorId value, newActorMap))--putReplication :: Replication -> BinaryBit.BitPut ()-putReplication replication = do-  BinaryBit.putBool True-  putCompressedWord (replicationActorId replication)-  putReplicationValue (replicationValue replication)
− library/Rattletrap/Replication/Destroyed.hs
@@ -1,17 +0,0 @@-module Rattletrap.Replication.Destroyed where--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit---- | Destroyed replications don't actually contain any extra information. All--- you need to know is the actor's ID, which is given by the--- 'Rattletrap.Replication.Replication'.-data DestroyedReplication = DestroyedReplication-  {-  } deriving (Eq, Ord, Show)--getDestroyedReplication :: BinaryBit.BitGet DestroyedReplication-getDestroyedReplication = pure DestroyedReplication--putDestroyedReplication :: DestroyedReplication -> BinaryBit.BitPut ()-putDestroyedReplication _ = pure ()
− library/Rattletrap/Replication/Spawned.hs
@@ -1,88 +0,0 @@-module Rattletrap.Replication.Spawned where--import Rattletrap.ActorMap-import Rattletrap.ClassAttributeMap-import Rattletrap.Initialization-import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit-import qualified Data.Map as Map--data SpawnedReplication = SpawnedReplication-  { spawnedReplicationFlag :: Bool-  -- ^ Unclear what this is.-  , spawnedReplicationNameIndex :: Maybe Word32-  , spawnedReplicationName :: Maybe Text-  -- ^ Read-only! Changing a replication's name requires editing the-  -- 'spawnedReplicationNameIndex' and maybe the class attribute map.-  , spawnedReplicationObjectId :: Word32-  , spawnedReplicationObjectName :: Text-  -- ^ Read-only! Changing a replication's object requires editing the class-  -- attribute map.-  , spawnedReplicationClassName :: Text-  -- ^ Read-only! Changing a replication's class requires editing the class-  -- attribute map.-  , spawnedReplicationInitialization :: Initialization-  } deriving (Eq, Ord, Show)--getSpawnedReplication-  :: (Int, Int, Int)-  -> ClassAttributeMap-  -> ActorMap-  -> CompressedWord-  -> BinaryBit.BitGet (SpawnedReplication, ActorMap)-getSpawnedReplication version classAttributeMap actorMap actorId = do-  flag <- BinaryBit.getBool-  nameIndex <- if version < (868, 14, 0)-    then pure Nothing-    else do-      nameIndex <- getWord32Bits-      pure (Just nameIndex)-  name <- lookupName classAttributeMap nameIndex-  objectId <- getWord32Bits-  let newActorMap = Map.insert actorId objectId actorMap-  objectName <- lookupObjectName classAttributeMap objectId-  className <- lookupClassName objectName-  let hasLocation = classHasLocation className-  let hasRotation = classHasRotation className-  initialization <- getInitialization hasLocation hasRotation-  pure-    ( SpawnedReplication-      flag-      nameIndex-      name-      objectId-      objectName-      className-      initialization-    , newActorMap-    )--putSpawnedReplication :: SpawnedReplication -> BinaryBit.BitPut ()-putSpawnedReplication spawnedReplication = do-  BinaryBit.putBool (spawnedReplicationFlag spawnedReplication)-  case spawnedReplicationNameIndex spawnedReplication of-    Nothing -> pure ()-    Just nameIndex -> putWord32Bits nameIndex-  putWord32Bits (spawnedReplicationObjectId spawnedReplication)-  putInitialization (spawnedReplicationInitialization spawnedReplication)--lookupName :: Monad m => ClassAttributeMap -> Maybe Word32 -> m (Maybe Text)-lookupName classAttributeMap maybeNameIndex = case maybeNameIndex of-  Nothing -> pure Nothing-  Just nameIndex ->-    case getName (classAttributeMapNameMap classAttributeMap) nameIndex of-      Nothing -> fail ("could not get name for index " ++ show nameIndex)-      Just name -> pure (Just name)--lookupObjectName :: Monad m => ClassAttributeMap -> Word32 -> m Text-lookupObjectName classAttributeMap objectId =-  case getObjectName (classAttributeMapObjectMap classAttributeMap) objectId of-    Nothing -> fail ("could not get object name for id " ++ show objectId)-    Just objectName -> pure objectName--lookupClassName :: Monad m => Text -> m Text-lookupClassName objectName = case getClassName objectName of-  Nothing -> fail ("could not get class name for object " ++ show objectName)-  Just className -> pure className
− library/Rattletrap/Replication/Updated.hs
@@ -1,27 +0,0 @@-module Rattletrap.Replication.Updated where--import Rattletrap.ActorMap-import Rattletrap.Attribute-import Rattletrap.ClassAttributeMap-import Rattletrap.Primitive--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--newtype UpdatedReplication = UpdatedReplication-  { updatedReplicationAttributes :: [Attribute]-  } deriving (Eq, Ord, Show)--getUpdatedReplication-  :: (Int, Int, Int)-  -> ClassAttributeMap-  -> ActorMap-  -> CompressedWord-  -> BinaryBit.BitGet UpdatedReplication-getUpdatedReplication version classAttributeMap actorMap actorId = do-  attributes <- getAttributes version classAttributeMap actorMap actorId-  pure (UpdatedReplication attributes)--putUpdatedReplication :: UpdatedReplication -> BinaryBit.BitPut ()-putUpdatedReplication updatedReplication =-  putAttributes (updatedReplicationAttributes updatedReplication)
− library/Rattletrap/ReplicationValue.hs
@@ -1,65 +0,0 @@-module Rattletrap.ReplicationValue-  ( module Rattletrap.ReplicationValue-  , module Rattletrap.Replication.Destroyed-  , module Rattletrap.Replication.Spawned-  , module Rattletrap.Replication.Updated-  ) where--import Rattletrap.ActorMap-import Rattletrap.ClassAttributeMap-import Rattletrap.Primitive-import Rattletrap.Replication.Destroyed-import Rattletrap.Replication.Spawned-import Rattletrap.Replication.Updated--import qualified Data.Binary.Bits.Get as BinaryBit-import qualified Data.Binary.Bits.Put as BinaryBit--data ReplicationValue-  = SpawnedReplicationValue SpawnedReplication-  -- ^ Creates a new actor.-  | UpdatedReplicationValue UpdatedReplication-  -- ^ Updates an existing actor.-  | DestroyedReplicationValue DestroyedReplication-  -- ^ Destroys an existing actor.-  deriving (Eq, Ord, Show)--getReplicationValue-  :: (Int, Int, Int)-  -> ClassAttributeMap-  -> ActorMap-  -> CompressedWord-  -> BinaryBit.BitGet (ReplicationValue, ActorMap)-getReplicationValue version classAttributeMap actorMap actorId = do-  isOpen <- BinaryBit.getBool-  if isOpen-    then do-      isNew <- BinaryBit.getBool-      if isNew-        then do-          (x, newActorMap) <- getSpawnedReplication-            version-            classAttributeMap-            actorMap-            actorId-          pure (SpawnedReplicationValue x, newActorMap)-        else do-          x <- getUpdatedReplication version classAttributeMap actorMap actorId-          pure (UpdatedReplicationValue x, actorMap)-    else do-      x <- getDestroyedReplication-      pure (DestroyedReplicationValue x, actorMap)--putReplicationValue :: ReplicationValue -> BinaryBit.BitPut ()-putReplicationValue value = case value of-  SpawnedReplicationValue x -> do-    BinaryBit.putBool True-    BinaryBit.putBool True-    putSpawnedReplication x-  UpdatedReplicationValue x -> do-    BinaryBit.putBool True-    BinaryBit.putBool False-    putUpdatedReplication x-  DestroyedReplicationValue x -> do-    BinaryBit.putBool False-    putDestroyedReplication x
+ library/Rattletrap/Type/AppliedDamageAttribute.hs view
@@ -0,0 +1,19 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.AppliedDamageAttribute+  ( AppliedDamageAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Int32le+import Rattletrap.Type.Vector+import Rattletrap.Type.Word8le++data AppliedDamageAttribute = AppliedDamageAttribute+  { appliedDamageAttributeUnknown1 :: Word8le+  , appliedDamageAttributeLocation :: Vector+  , appliedDamageAttributeUnknown3 :: Int32le+  , appliedDamageAttributeUnknown4 :: Int32le+  } deriving (Eq, Ord, Show)++$(deriveJson ''AppliedDamageAttribute)
+ library/Rattletrap/Type/Attribute.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.Attribute+  ( Attribute(..)+  ) where++import Rattletrap.Type.AttributeValue+import Rattletrap.Type.Common+import Rattletrap.Type.CompressedWord+import Rattletrap.Type.Str++data Attribute = Attribute+  { attributeId :: CompressedWord+  , attributeName :: Str+  -- ^ Read-only! Changing an attribute's name requires editing the class+  -- attribute map.+  , attributeValue :: AttributeValue+  } deriving (Eq, Ord, Show)++$(deriveJson ''Attribute)
+ library/Rattletrap/Type/AttributeMapping.hs view
@@ -0,0 +1,15 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.AttributeMapping+  ( AttributeMapping(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Word32le++data AttributeMapping = AttributeMapping+  { attributeMappingObjectId :: Word32le+  , attributeMappingStreamId :: Word32le+  } deriving (Eq, Ord, Show)++$(deriveJson ''AttributeMapping)
+ library/Rattletrap/Type/AttributeType.hs view
@@ -0,0 +1,43 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.AttributeType+  ( AttributeType(..)+  ) where++import Rattletrap.Type.Common++data AttributeType+  = AttributeTypeAppliedDamage+  | AttributeTypeBoolean+  | AttributeTypeByte+  | AttributeTypeCamSettings+  | AttributeTypeClubColors+  | AttributeTypeDamageState+  | AttributeTypeDemolish+  | AttributeTypeEnum+  | AttributeTypeExplosion+  | AttributeTypeExtendedExplosion+  | AttributeTypeFlaggedInt+  | AttributeTypeFloat+  | AttributeTypeGameMode+  | AttributeTypeInt+  | AttributeTypeLoadout+  | AttributeTypeLoadoutOnline+  | AttributeTypeLoadouts+  | AttributeTypeLoadoutsOnline+  | AttributeTypeLocation+  | AttributeTypeMusicStinger+  | AttributeTypePartyLeader+  | AttributeTypePickup+  | AttributeTypePlayerHistoryKey+  | AttributeTypePrivateMatchSettings+  | AttributeTypeQWord+  | AttributeTypeReservation+  | AttributeTypeRigidBodyState+  | AttributeTypeString+  | AttributeTypeTeamPaint+  | AttributeTypeUniqueId+  | AttributeTypeWeldedInfo+  deriving (Eq, Ord, Show)++$(deriveJson ''AttributeType)
+ library/Rattletrap/Type/AttributeValue.hs view
@@ -0,0 +1,74 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.AttributeValue+  ( AttributeValue(..)+  ) where++import Rattletrap.Type.AppliedDamageAttribute+import Rattletrap.Type.BooleanAttribute+import Rattletrap.Type.ByteAttribute+import Rattletrap.Type.CamSettingsAttribute+import Rattletrap.Type.ClubColorsAttribute+import Rattletrap.Type.Common+import Rattletrap.Type.DamageStateAttribute+import Rattletrap.Type.DemolishAttribute+import Rattletrap.Type.EnumAttribute+import Rattletrap.Type.ExplosionAttribute+import Rattletrap.Type.ExtendedExplosionAttribute+import Rattletrap.Type.FlaggedIntAttribute+import Rattletrap.Type.FloatAttribute+import Rattletrap.Type.GameModeAttribute+import Rattletrap.Type.IntAttribute+import Rattletrap.Type.LoadoutAttribute+import Rattletrap.Type.LoadoutOnlineAttribute+import Rattletrap.Type.LoadoutsAttribute+import Rattletrap.Type.LoadoutsOnlineAttribute+import Rattletrap.Type.LocationAttribute+import Rattletrap.Type.MusicStingerAttribute+import Rattletrap.Type.PartyLeaderAttribute+import Rattletrap.Type.PickupAttribute+import Rattletrap.Type.PlayerHistoryKeyAttribute+import Rattletrap.Type.PrivateMatchSettingsAttribute+import Rattletrap.Type.QWordAttribute+import Rattletrap.Type.ReservationAttribute+import Rattletrap.Type.RigidBodyStateAttribute+import Rattletrap.Type.StringAttribute+import Rattletrap.Type.TeamPaintAttribute+import Rattletrap.Type.UniqueIdAttribute+import Rattletrap.Type.WeldedInfoAttribute++data AttributeValue+  = AttributeValueAppliedDamage AppliedDamageAttribute+  | AttributeValueBoolean BooleanAttribute+  | AttributeValueByte ByteAttribute+  | AttributeValueCamSettings CamSettingsAttribute+  | AttributeValueClubColors ClubColorsAttribute+  | AttributeValueDamageState DamageStateAttribute+  | AttributeValueDemolish DemolishAttribute+  | AttributeValueEnum EnumAttribute+  | AttributeValueExplosion ExplosionAttribute+  | AttributeValueExtendedExplosion ExtendedExplosionAttribute+  | AttributeValueFlaggedInt FlaggedIntAttribute+  | AttributeValueFloat FloatAttribute+  | AttributeValueGameMode GameModeAttribute+  | AttributeValueInt IntAttribute+  | AttributeValueLoadout LoadoutAttribute+  | AttributeValueLoadoutOnline LoadoutOnlineAttribute+  | AttributeValueLoadouts LoadoutsAttribute+  | AttributeValueLoadoutsOnline LoadoutsOnlineAttribute+  | AttributeValueLocation LocationAttribute+  | AttributeValueMusicStinger MusicStingerAttribute+  | AttributeValuePartyLeader PartyLeaderAttribute+  | AttributeValuePickup PickupAttribute+  | AttributeValuePlayerHistoryKey PlayerHistoryKeyAttribute+  | AttributeValuePrivateMatchSettings PrivateMatchSettingsAttribute+  | AttributeValueQWord QWordAttribute+  | AttributeValueReservation ReservationAttribute+  | AttributeValueRigidBodyState RigidBodyStateAttribute+  | AttributeValueString StringAttribute+  | AttributeValueTeamPaint TeamPaintAttribute+  | AttributeValueUniqueId UniqueIdAttribute+  | AttributeValueWeldedInfo WeldedInfoAttribute+  deriving (Eq, Ord, Show)++$(deriveJson ''AttributeValue)
+ library/Rattletrap/Type/Bitstream.hs view
@@ -0,0 +1,28 @@+module Rattletrap.Type.Bitstream+  ( Bitstream(..)+  ) where++import qualified Data.Aeson as Json+import qualified Data.Bool as Bool+import qualified Data.Text as Text++newtype Bitstream = Bitstream+  { bitstreamValue :: [Bool]+  } deriving (Eq, Ord, Show)++instance Json.FromJSON Bitstream where+  parseJSON =+    Json.withText+      "Bitstream"+      (\text ->+         Bitstream <$>+         mapM+           (\char ->+              case char of+                '0' -> pure False+                '1' -> pure True+                _ -> fail ("invalid bit: " ++ show char))+           (Text.unpack text))++instance Json.ToJSON Bitstream where+  toJSON = Json.toJSON . fmap (Bool.bool '0' '1') . bitstreamValue
+ library/Rattletrap/Type/BooleanAttribute.hs view
@@ -0,0 +1,13 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.BooleanAttribute+  ( BooleanAttribute(..)+  ) where++import Rattletrap.Type.Common++newtype BooleanAttribute = BooleanAttribute+  { booleanAttributeValue :: Bool+  } deriving (Eq, Ord, Show)++$(deriveJson ''BooleanAttribute)
+ library/Rattletrap/Type/ByteAttribute.hs view
@@ -0,0 +1,14 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.ByteAttribute+  ( ByteAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Word8le++newtype ByteAttribute = ByteAttribute+  { byteAttributeValue :: Word8le+  } deriving (Eq, Ord, Show)++$(deriveJson ''ByteAttribute)
+ library/Rattletrap/Type/Cache.hs view
@@ -0,0 +1,19 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.Cache+  ( Cache(..)+  ) where++import Rattletrap.Type.AttributeMapping+import Rattletrap.Type.Common+import Rattletrap.Type.List+import Rattletrap.Type.Word32le++data Cache = Cache+  { cacheClassId :: Word32le+  , cacheParentCacheId :: Word32le+  , cacheCacheId :: Word32le+  , cacheAttributeMappings :: List AttributeMapping+  } deriving (Eq, Ord, Show)++$(deriveJson ''Cache)
+ library/Rattletrap/Type/CamSettingsAttribute.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.CamSettingsAttribute+  ( CamSettingsAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Float32le++data CamSettingsAttribute = CamSettingsAttribute+  { camSettingsAttributeFov :: Float32le+  , camSettingsAttributeHeight :: Float32le+  , camSettingsAttributeAngle :: Float32le+  , camSettingsAttributeDistance :: Float32le+  , camSettingsAttributeStiffness :: Float32le+  , camSettingsAttributeSwivelSpeed :: Float32le+  , camSettingsAttributeTransitionSpeed :: Maybe Float32le+  } deriving (Eq, Ord, Show)++$(deriveJson ''CamSettingsAttribute)
+ library/Rattletrap/Type/ClassAttributeMap.hs view
@@ -0,0 +1,326 @@+module Rattletrap.Type.ClassAttributeMap+  ( ClassAttributeMap(..)+  , classHasLocation+  , classHasRotation+  , getAttributeIdLimit+  , getAttributeMap+  , getAttributeName+  , getClassName+  , getName+  , getObjectName+  , makeClassAttributeMap+  ) where++import Rattletrap.Data+import Rattletrap.Type.AttributeMapping+import Rattletrap.Type.Cache+import Rattletrap.Type.ClassMapping+import Rattletrap.Type.Common+import Rattletrap.Type.CompressedWord+import Rattletrap.Type.List+import Rattletrap.Type.Str+import Rattletrap.Type.Word32le++import qualified Data.IntMap as IntMap+import qualified Data.List as List+import qualified Data.Map as Map+import qualified Data.Maybe as Maybe+import qualified Data.Set as Set+import qualified Data.Text as Text+import qualified Data.Tuple as Tuple++-- | This data structure holds all the information about classes, objects, and+-- attributes in the replay. The class hierarchy is not fixed; it is encoded+-- in the 'Rattletrap.Content.Content'. Similarly, the attributes that belong+-- to each class are not fixed either. Converting the raw data into a usable+-- structure is tedious; see 'makeClassAttributeMap'.+data ClassAttributeMap = ClassAttributeMap+  { classAttributeMapObjectMap :: Map Word32le Str+  -- ^ A map from object IDs to their names.+  , classAttributeMapObjectClassMap :: Map Word32le Word32le+  -- ^ A map from object IDs to their class IDs.+  , classAttributeMapValue :: Map Word32le (Map Word32le Word32le)+  -- ^ A map from class IDs to a map from attribute stream IDs to attribute+  -- IDs.+  , classAttributeMapNameMap :: IntMap.IntMap Str+  } deriving (Eq, Ord, Show)++type Bimap l r = (Map l r, Map r l)++bimap :: (Ord l, Ord r) => [(l, r)] -> Bimap l r+bimap xs = (Map.fromList xs, Map.fromList (fmap Tuple.swap xs))++lookupL :: Ord l => l -> Bimap l r -> Maybe r+lookupL k = Map.lookup k . fst++lookupR :: Ord r => r -> Bimap l r -> Maybe l+lookupR k = Map.lookup k . snd++-- | Makes a 'ClassAttributeMap' given the necessary fields from the+-- 'Rattletrap.Content.Content'.+makeClassAttributeMap+  :: List Str+  -- ^ From 'Rattletrap.Content.contentObjects'.+  -> List ClassMapping+  -- ^ From 'Rattletrap.Content.contentClassMappings'.+  -> List Cache+  -- ^ From 'Rattletrap.Content.contentCaches'.+  -> List Str+  -- ^ From 'Rattletrap.Content.contentNames'.+  -> ClassAttributeMap+makeClassAttributeMap objects classMappings caches names =+  let+    objectMap = makeObjectMap objects+    classMap = makeClassMap classMappings+    objectClassMap = makeObjectClassMap objectMap classMap+    classCache = makeClassCache classMap caches+    attributeMap = makeAttributeMap caches+    classIds = fmap (\(_, classId, _, _) -> classId) classCache+    parentMap = makeParentMap classCache+    value = Map.fromList+      ( fmap+        ( \classId ->+          let+            ownAttributes =+              Maybe.fromMaybe Map.empty (Map.lookup classId attributeMap)+            parentsAttributes = case Map.lookup classId parentMap of+              Nothing -> []+              Just parentClassIds -> fmap+                ( \parentClassId -> Maybe.fromMaybe+                  Map.empty+                  (Map.lookup parentClassId attributeMap)+                )+                parentClassIds+            attributes = ownAttributes : parentsAttributes+          in (classId, Map.fromList (concatMap Map.toList attributes))+        )+        classIds+      )+    nameMap = makeNameMap names+  in ClassAttributeMap objectMap objectClassMap value nameMap++makeNameMap :: List Str -> IntMap.IntMap Str+makeNameMap names = IntMap.fromDistinctAscList (zip [0 ..] (listValue names))++getName :: IntMap.IntMap Str -> Word32le -> Maybe Str+getName nameMap nameIndex =+  IntMap.lookup (fromIntegral (word32leValue nameIndex)) nameMap++makeObjectClassMap+  :: Map Word32le Str -> Bimap Word32le Str -> Map Word32le Word32le+makeObjectClassMap objectMap classMap = do+  let objectIds = Map.keys objectMap+  let classIds = fmap (getClassId objectMap classMap) objectIds+  let rawPairs = zip objectIds classIds+  let+    pairs = Maybe.mapMaybe+      ( \(objectId, maybeClassId) -> case maybeClassId of+        Nothing -> Nothing+        Just classId -> Just (objectId, classId)+      )+      rawPairs+  Map.fromList pairs++getClassId+  :: Map Word32le Str -> Bimap Word32le Str -> Word32le -> Maybe Word32le+getClassId objectMap classMap objectId = do+  objectName <- getObjectName objectMap objectId+  className <- getClassName objectName+  lookupR className classMap++makeClassCache+  :: Bimap Word32le Str+  -> List Cache+  -> [(Maybe Str, Word32le, Word32le, Word32le)]+makeClassCache classMap caches = fmap+  ( \cache ->+    let+      classId = cacheClassId cache+    in+      ( lookupL classId classMap+      , classId+      , cacheCacheId cache+      , cacheParentCacheId cache+      )+  )+  (listValue caches)++makeClassMap :: List ClassMapping -> Bimap Word32le Str+makeClassMap classMappings = bimap+  ( fmap+    ( \classMapping ->+      (classMappingStreamId classMapping, classMappingName classMapping)+    )+    (listValue classMappings)+  )++makeAttributeMap :: List Cache -> Map Word32le (Map Word32le Word32le)+makeAttributeMap caches = Map.fromList+  ( fmap+    ( \cache ->+      ( cacheClassId cache+      , Map.fromList+        ( fmap+          ( \attributeMapping ->+            ( attributeMappingStreamId attributeMapping+            , attributeMappingObjectId attributeMapping+            )+          )+          (listValue (cacheAttributeMappings cache))+        )+      )+    )+    (listValue caches)+  )++makeShallowParentMap+  :: [(Maybe Str, Word32le, Word32le, Word32le)] -> Map Word32le Word32le+makeShallowParentMap classCache = Map.fromList+  ( Maybe.mapMaybe+    ( \xs -> case xs of+      [] -> Nothing+      (maybeClassName, classId, _, parentCacheId):rest -> do+        parentClassId <- getParentClass maybeClassName parentCacheId rest+        pure (classId, parentClassId)+    )+    (List.tails (reverse classCache))+  )++makeParentMap+  :: [(Maybe Str, Word32le, Word32le, Word32le)] -> Map Word32le [Word32le]+makeParentMap classCache =+  let+    shallowParentMap = makeShallowParentMap classCache+  in+    Map.mapWithKey+      (\classId _ -> getParentClasses shallowParentMap classId)+      shallowParentMap++getParentClasses :: Map Word32le Word32le -> Word32le -> [Word32le]+getParentClasses shallowParentMap classId =+  case Map.lookup classId shallowParentMap of+    Nothing -> []+    Just parentClassId ->+      parentClassId : getParentClasses shallowParentMap parentClassId++getParentClass+  :: Maybe Str+  -> Word32le+  -> [(Maybe Str, Word32le, Word32le, Word32le)]+  -> Maybe Word32le+getParentClass maybeClassName parentCacheId xs = case maybeClassName of+  Nothing -> getParentClassById parentCacheId xs+  Just className -> getParentClassByName className parentCacheId xs++getParentClassById+  :: Word32le -> [(Maybe Str, Word32le, Word32le, Word32le)] -> Maybe Word32le+getParentClassById parentCacheId xs =+  case dropWhile (\(_, _, cacheId, _) -> cacheId /= parentCacheId) xs of+    [] -> if parentCacheId == Word32le 0+      then Nothing+      else getParentClassById (Word32le (word32leValue parentCacheId - 1)) xs+    (_, parentClassId, _, _):_ -> Just parentClassId++getParentClassByName+  :: Str+  -> Word32le+  -> [(Maybe Str, Word32le, Word32le, Word32le)]+  -> Maybe Word32le+getParentClassByName className parentCacheId xs =+  case Map.lookup className parentClasses of+    Nothing -> getParentClassById parentCacheId xs+    Just parentClassName -> Maybe.maybe+      (getParentClassById parentCacheId xs)+      Just+      ( Maybe.listToMaybe+        ( fmap+          (\(_, parentClassId, _, _) -> parentClassId)+          ( filter+            (\(_, _, cacheId, _) -> cacheId <= parentCacheId)+            ( filter+              ( \(maybeClassName, _, _, _) ->+                maybeClassName == Just parentClassName+              )+              xs+            )+          )+        )+      )++parentClasses :: Map Str Str+parentClasses =+  Map.map toStr (Map.mapKeys toStr (Map.fromList rawParentClasses))++makeObjectMap :: List Str -> Map Word32le Str+makeObjectMap objects =+  Map.fromAscList (zip (fmap Word32le [0 ..]) (listValue objects))++getObjectName :: Map Word32le Str -> Word32le -> Maybe Str+getObjectName objectMap objectId = Map.lookup objectId objectMap++getClassName :: Str -> Maybe Str+getClassName rawObjectName =+  Map.lookup (normalizeObjectName rawObjectName) objectClasses++normalizeObjectName :: Str -> Str+normalizeObjectName objectName =+  let+    name = strValue objectName+    crowdActor = Text.pack "TheWorld:PersistentLevel.CrowdActor_TA"+    crowdManager = Text.pack "TheWorld:PersistentLevel.CrowdManager_TA"+    boostPickup = Text.pack "TheWorld:PersistentLevel.VehiclePickup_Boost_TA"+    mapScoreboard = Text.pack "TheWorld:PersistentLevel.InMapScoreboard_TA"+    breakout = Text.pack "TheWorld:PersistentLevel.BreakOutActor_Platform_TA"+  in+    if Text.isInfixOf crowdActor name+      then Str crowdActor+      else if Text.isInfixOf crowdManager name+        then Str crowdManager+        else if Text.isInfixOf boostPickup name+          then Str boostPickup+          else if Text.isInfixOf mapScoreboard name+            then Str mapScoreboard+            else if Text.isInfixOf breakout name+              then Str breakout+              else objectName++objectClasses :: Map Str Str+objectClasses =+  Map.map toStr (Map.mapKeys toStr (Map.fromList rawObjectClasses))++classHasLocation :: Str -> Bool+classHasLocation className = Set.member className classesWithLocation++classesWithLocation :: Set.Set Str+classesWithLocation = Set.fromList (fmap toStr rawClassesWithLocation)++classHasRotation :: Str -> Bool+classHasRotation className = Set.member className classesWithRotation++classesWithRotation :: Set.Set Str+classesWithRotation = Set.fromList (fmap toStr rawClassesWithRotation)++getAttributeIdLimit :: Map Word32le Word32le -> Maybe Word+getAttributeIdLimit attributeMap = do+  ((streamId, _), _) <- Map.maxViewWithKey attributeMap+  pure (fromIntegral (word32leValue streamId))++getAttributeName+  :: ClassAttributeMap -> Map Word32le Word32le -> CompressedWord -> Maybe Str+getAttributeName classAttributeMap attributeMap streamId = do+  let key = Word32le (fromIntegral (compressedWordValue streamId))+  attributeId <- Map.lookup key attributeMap+  let objectMap = classAttributeMapObjectMap classAttributeMap+  Map.lookup attributeId objectMap++getAttributeMap+  :: ClassAttributeMap+  -> Map CompressedWord Word32le+  -> CompressedWord+  -> Maybe (Map Word32le Word32le)+getAttributeMap classAttributeMap actorMap actorId = do+  objectId <- Map.lookup actorId actorMap+  let objectClassMap = classAttributeMapObjectClassMap classAttributeMap+  classId <- Map.lookup objectId objectClassMap+  let value = classAttributeMapValue classAttributeMap+  Map.lookup classId value
+ library/Rattletrap/Type/ClassMapping.hs view
@@ -0,0 +1,16 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.ClassMapping+  ( ClassMapping(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Str+import Rattletrap.Type.Word32le++data ClassMapping = ClassMapping+  { classMappingName :: Str+  , classMappingStreamId :: Word32le+  } deriving (Eq, Ord, Show)++$(deriveJson ''ClassMapping)
+ library/Rattletrap/Type/ClubColorsAttribute.hs view
@@ -0,0 +1,17 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.ClubColorsAttribute+  ( ClubColorsAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Word8le++data ClubColorsAttribute = ClubColorsAttribute+  { clubColorsAttributeBlueFlag :: Bool+  , clubColorsAttributeBlueColor :: Word8le+  , clubColorsAttributeOrangeFlag :: Bool+  , clubColorsAttributeOrangeColor :: Word8le+  } deriving (Eq, Ord, Show)++$(deriveJson ''ClubColorsAttribute)
+ library/Rattletrap/Type/Common.hs view
@@ -0,0 +1,55 @@+module Rattletrap.Type.Common+  ( Int.Int8+  , Int.Int32+  , Int.Int64+  , Map.Map+  , Text.Text+  , Word.Word8+  , Word.Word16+  , Word.Word32+  , Word.Word64+  , deriveJson+  ) where++import qualified Data.Aeson as Json+import qualified Data.Aeson.TH as Json+import qualified Data.Char as Char+import qualified Data.Int as Int+import qualified Data.Map as Map+import qualified Data.Maybe as Maybe+import qualified Data.Text as Text+import qualified Data.Word as Word+import qualified Language.Haskell.TH as TH++deriveJson :: TH.Name -> TH.Q [TH.Dec]+deriveJson name = Json.deriveJSON (jsonOptions (TH.nameBase name)) name++jsonOptions :: String -> Json.Options+jsonOptions prefix = Json.defaultOptions+  { Json.constructorTagModifier = toSnakeCase . partialDropPrefix prefix+  , Json.fieldLabelModifier = toSnakeCase+    . partialDropPrefix (lowerFirst prefix)+  , Json.omitNothingFields = True+  , Json.sumEncoding = Json.ObjectWithSingleField+  , Json.unwrapUnaryRecords = True+  }++lowerFirst :: String -> String+lowerFirst string = case string of+  "" -> string+  first:rest -> Char.toLower first : rest++toSnakeCase :: String -> String+toSnakeCase = Json.camelTo2 '_'++partialDropPrefix :: (Eq a, Show a) => [a] -> [a] -> [a]+partialDropPrefix prefix list = Maybe.fromMaybe+  (error (unwords [show prefix, "is not a prefix of", show list]))+  (dropPrefix prefix list)++dropPrefix :: Eq a => [a] -> [a] -> Maybe [a]+dropPrefix prefix list = case prefix of+  [] -> Just list+  ph:pt -> case list of+    [] -> Nothing+    lh:lt -> if ph == lh then dropPrefix pt lt else Nothing
+ library/Rattletrap/Type/CompressedWord.hs view
@@ -0,0 +1,14 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.CompressedWord+  ( CompressedWord(..)+  ) where++import Rattletrap.Type.Common++data CompressedWord = CompressedWord+  { compressedWordLimit :: Word+  , compressedWordValue :: Word+  } deriving (Eq, Ord, Show)++$(deriveJson ''CompressedWord)
+ library/Rattletrap/Type/CompressedWordVector.hs view
@@ -0,0 +1,16 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.CompressedWordVector+  ( CompressedWordVector(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.CompressedWord++data CompressedWordVector = CompressedWordVector+  { compressedWordVectorX :: CompressedWord+  , compressedWordVectorY :: CompressedWord+  , compressedWordVectorZ :: CompressedWord+  } deriving (Eq, Ord, Show)++$(deriveJson ''CompressedWordVector)
+ library/Rattletrap/Type/Content.hs view
@@ -0,0 +1,52 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.Content+  ( Content(..)+  ) where++import Rattletrap.Type.Cache+import Rattletrap.Type.ClassMapping+import Rattletrap.Type.Common+import Rattletrap.Type.Frame+import Rattletrap.Type.KeyFrame+import Rattletrap.Type.List+import Rattletrap.Type.Mark+import Rattletrap.Type.Message+import Rattletrap.Type.Str+import Rattletrap.Type.Word32le++-- | Contains low-level game data about a 'Rattletrap.Replay.Replay'.+data Content = Content+  { contentLevels :: List Str+  -- ^ This typically only has one element, like @stadium_oob_audio_map@.+  , contentKeyFrames :: List KeyFrame+  -- ^ A list of which frames are key frames. Although they aren't necessary+  -- for replay, key frames are frames that replicate every actor. They+  -- typically happen once every 10 seconds.+  , contentStreamSize :: Word32le+  -- ^ The size of the stream in bytes. This is only really necessary because+  -- the stream has some arbitrary amount of padding at the end.+  , contentFrames :: [Frame]+  -- ^ The actual game data. This is where all the interesting information is.+  , contentMessages :: List Message+  -- ^ Debugging messages. In newer replays, this is always empty.+  , contentMarks :: List Mark+  -- ^ Tick marks shown on the scrubber when watching a replay.+  , contentPackages :: List Str+  -- ^ A list of @.upk@ files to load, like+  -- @..\\..\\TAGame\\CookedPCConsole\\Stadium_P.upk@.+  , contentObjects :: List Str+  -- ^ Objects in the stream. Used for the+  -- 'Rattletrap.Type.ClassAttributeMap.ClassAttributeMap'.+  , contentNames :: List Str+  -- ^ It's not clear what these are used for. This list is usually not empty,+  -- but appears unused otherwise.+  , contentClassMappings :: List ClassMapping+  -- ^ A mapping between classes and their ID in the stream. Used for the+  -- 'Rattletrap.Type.ClassAttributeMap.ClassAttributeMap'.+  , contentCaches :: List Cache+  -- ^ A list of classes along with their parent classes and attributes. Used+  -- for the 'Rattletrap.Type.ClassAttributeMap.ClassAttributeMap'.+  } deriving (Eq, Ord, Show)++$(deriveJson ''Content)
+ library/Rattletrap/Type/DamageStateAttribute.hs view
@@ -0,0 +1,21 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.DamageStateAttribute+  ( DamageStateAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Int32le+import Rattletrap.Type.Vector+import Rattletrap.Type.Word8le++data DamageStateAttribute = DamageStateAttribute+  { damageStateAttributeUnknown1 :: Word8le+  , damageStateAttributeUnknown2 :: Bool+  , damageStateAttributeUnknown3 :: Int32le+  , damageStateAttributeUnknown4 :: Vector+  , damageStateAttributeUnknown5 :: Bool+  , damageStateAttributeUnknown6 :: Bool+  } deriving (Eq, Ord, Show)++$(deriveJson ''DamageStateAttribute)
+ library/Rattletrap/Type/DemolishAttribute.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.DemolishAttribute+  ( DemolishAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Vector+import Rattletrap.Type.Word32le++data DemolishAttribute = DemolishAttribute+  { demolishAttributeAttackerFlag :: Bool+  , demolishAttributeAttackerActorId :: Word32le+  , demolishAttributeVictimFlag :: Bool+  , demolishAttributeVictimActorId :: Word32le+  , demolishAttributeAttackerVelocity :: Vector+  , demolishAttributeVictimVelocity :: Vector+  } deriving (Eq, Ord, Show)++$(deriveJson ''DemolishAttribute)
+ library/Rattletrap/Type/DestroyedReplication.hs view
@@ -0,0 +1,15 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.DestroyedReplication+  ( DestroyedReplication(..)+  ) where++import Rattletrap.Type.Common++-- | Destroyed replications don't actually contain any extra information. All+-- you need to know is the actor's ID, which is given by the+-- 'Rattletrap.Replication.Replication'.+data DestroyedReplication = DestroyedReplication+  deriving (Eq, Ord, Show)++$(deriveJson ''DestroyedReplication)
+ library/Rattletrap/Type/Dictionary.hs view
@@ -0,0 +1,69 @@+module Rattletrap.Type.Dictionary+  ( Dictionary(..)+  , dictionaryLookup+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Str++import qualified Control.Monad as Monad+import qualified Data.Aeson as Json+import qualified Data.Aeson.Types as Json+import qualified Data.Map as Map+import qualified Data.Text as Text++data Dictionary a+  = DictionaryElement Str a (Dictionary a)+  | DictionaryEnd Str+  deriving (Eq, Ord, Show)++instance Json.FromJSON a => Json.FromJSON (Dictionary a) where+  parseJSON =+    Json.withObject+      "Dictionary"+      (\o -> do+         keys <- get o "keys"+         lastKey <- get o "last_key"+         value <- get o "value"+         Monad.foldM+           (\d k ->+              case Map.lookup k value of+                Nothing -> fail (unwords ["missing key", show k])+                Just v -> pure (DictionaryElement (Str k) v d))+           (DictionaryEnd lastKey)+           (reverse keys))++instance Json.ToJSON a => Json.ToJSON (Dictionary a) where+  toJSON d =+    Json.object+      [ pair "keys" (dictionaryKeys d)+      , pair "last_key" (dictionaryLastKey d)+      , pair "value" (dictionaryValue d)+      ]++dictionaryKeys :: Dictionary a -> [Str]+dictionaryKeys = fmap fst . toList++dictionaryLastKey :: Dictionary a -> Str+dictionaryLastKey x = case x of+  DictionaryElement _ _ y -> dictionaryLastKey y+  DictionaryEnd y -> y++dictionaryLookup :: Str -> Dictionary a -> Maybe a+dictionaryLookup k x = case x of+  DictionaryElement j v y -> if k == j then Just v else dictionaryLookup k y+  DictionaryEnd _ -> Nothing++dictionaryValue :: Dictionary a -> Map Text a+dictionaryValue = Map.mapKeys strValue . Map.fromList . toList++get :: Json.FromJSON a => Json.Object -> String -> Json.Parser a+get o k = o Json..: Text.pack k++pair :: Json.ToJSON a => String -> a -> (Text, Json.Value)+pair k v = (Text.pack k, Json.toJSON v)++toList :: Dictionary a -> [(Str, a)]+toList x = case x of+  DictionaryElement k v y -> (k, v) : toList y+  DictionaryEnd _ -> []
+ library/Rattletrap/Type/EnumAttribute.hs view
@@ -0,0 +1,13 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.EnumAttribute+  ( EnumAttribute(..)+  ) where++import Rattletrap.Type.Common++newtype EnumAttribute = EnumAttribute+  { enumAttributeValue :: Word16+  } deriving (Eq, Ord, Show)++$(deriveJson ''EnumAttribute)
+ library/Rattletrap/Type/ExplosionAttribute.hs view
@@ -0,0 +1,17 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.ExplosionAttribute+  ( ExplosionAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Int32le+import Rattletrap.Type.Vector++data ExplosionAttribute = ExplosionAttribute+  { explosionAttributeFlag :: Bool+  , explosionAttributeActorId :: Int32le+  , explosionAttributeLocation :: Vector+  } deriving (Eq, Ord, Show)++$(deriveJson ''ExplosionAttribute)
+ library/Rattletrap/Type/ExtendedExplosionAttribute.hs view
@@ -0,0 +1,16 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.ExtendedExplosionAttribute+  ( ExtendedExplosionAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.ExplosionAttribute+import Rattletrap.Type.FlaggedIntAttribute++data ExtendedExplosionAttribute = ExtendedExplosionAttribute+  { extendedExplosionAttributeExplosion :: ExplosionAttribute+  , extendedExplosionAttributeUnknown :: FlaggedIntAttribute+  } deriving (Eq, Ord, Show)++$(deriveJson ''ExtendedExplosionAttribute)
+ library/Rattletrap/Type/FlaggedIntAttribute.hs view
@@ -0,0 +1,15 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.FlaggedIntAttribute+  ( FlaggedIntAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Int32le++data FlaggedIntAttribute = FlaggedIntAttribute+  { flaggedIntAttributeFlag :: Bool+  , flaggedIntAttributeInt :: Int32le+  } deriving (Eq, Ord, Show)++$(deriveJson ''FlaggedIntAttribute)
+ library/Rattletrap/Type/Float32le.hs view
@@ -0,0 +1,13 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.Float32le+  ( Float32le(..)+  ) where++import Rattletrap.Type.Common++newtype Float32le = Float32le+  { float32leValue :: Float+  } deriving (Eq, Ord, Show)++$(deriveJson ''Float32le)
+ library/Rattletrap/Type/FloatAttribute.hs view
@@ -0,0 +1,14 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.FloatAttribute+  ( FloatAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Float32le++newtype FloatAttribute = FloatAttribute+  { floatAttributeValue :: Float32le+  } deriving (Eq, Ord, Show)++$(deriveJson ''FloatAttribute)
+ library/Rattletrap/Type/Frame.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.Frame+  ( Frame(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Float32le+import Rattletrap.Type.Replication++data Frame = Frame+  { frameTime :: Float32le+  -- ^ Time in seconds since the beginning of the match.+  , frameDelta :: Float32le+  -- ^ Time in seconds since the last frame. Usually about 0.03 since there+  -- are 30 frames per second.+  , frameReplications :: [Replication]+  } deriving (Eq, Ord, Show)++$(deriveJson ''Frame)
+ library/Rattletrap/Type/GameModeAttribute.hs view
@@ -0,0 +1,14 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.GameModeAttribute+  ( GameModeAttribute(..)+  ) where++import Rattletrap.Type.Common++data GameModeAttribute = GameModeAttribute+  { gameModeAttributeNumBits :: Int+  , gameModeAttributeWord :: Word8+  } deriving (Eq, Ord, Show)++$(deriveJson ''GameModeAttribute)
+ library/Rattletrap/Type/Header.hs view
@@ -0,0 +1,60 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.Header+  ( Header(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Dictionary+import Rattletrap.Type.Property+import Rattletrap.Type.Str+import Rattletrap.Type.Word32le++-- | Contains high-level metadata about a 'Rattletrap.Replay.Replay'.+data Header = Header+  { headerEngineVersion :: Word32le+  -- ^ The "major" ("engine") version number.+  , headerLicenseeVersion :: Word32le+  -- ^ The "minor" ("licensee") version number.+  , headerPatchVersion :: Maybe Word32le+  -- ^ The "patch" ("net") version number.+  , headerLabel :: Str+  -- ^ Always @TAGame.Replay_Soccar_TA@.+  , headerProperties :: Dictionary Property+  -- ^ These properties determine how a replay will look in the list of+  -- replays in-game. One element is required for the replay to show up:+  --+  -- - MapName: This is a 'Rattletrap.PropertyValue.NameProperty' with a+  --   case-insensitive map identifier, like @Stadium_P@.+  --+  -- There are many other properties that affect how the replay looks in the+  -- list of replays.+  --+  -- - Date: A 'Rattletrap.PropertyValue.StrProperty' with the format+  --   @YYYY-mm-dd:HH-MM@. Dates are not validated, but the month must be+  --   between 1 and 12 to show up. The hour is shown modulo 12 with AM or PM.+  -- - MatchType: A 'Rattletrap.PropertyValue.NameProperty'. If this is not+  --   one of the expected values, nothing will be shown next to the replay's+  --   map. The expected values are: @Online@, @Offline@, @Private@, and+  --   @Season@.+  -- - NumFrames: This 'Rattletrap.PropertyValue.IntProperty' is used to+  --   calculate the length of the match. There are 30 frames per second,+  --   a typical 5-minute match has about 9,000 frames.+  -- - PrimaryPlayerTeam: This is an 'Rattletrap.PropertyValue.IntProperty'.+  --   It is either 0 (blue) or 1 (orange). Any other value is ignored. If+  --   this would be 0, you don't have to set it at all.+  -- - ReplayName: An optional 'Rattletrap.PropertyValue.StrProperty' with a+  --   user-supplied name for the replay.+  -- - Team0Score: The blue team's score as an+  --   'Rattletrap.PropertyValue.IntProperty'. Can be omitted if the score is+  --   0.+  -- - Team1Score: The orange team's score as an+  --   'Rattletrap.PropertyValue.IntProperty'. Can also be omitted if the+  --   score is 0.+  -- - TeamSize: An 'Rattletrap.PropertyValue.IntProperty' with the number of+  --   players per team. This value is not validated, so you can put absurd+  --   values like 99. To get an "unfair" team size like 1v4, you must set the+  --   bUnfairBots 'Rattletrap.PropertyValue.BoolProperty' to @True@.+  } deriving (Eq, Ord, Show)++$(deriveJson ''Header)
+ library/Rattletrap/Type/Initialization.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.Initialization+  ( Initialization(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Int8Vector+import Rattletrap.Type.Vector++data Initialization = Initialization+  { initializationLocation :: Maybe Vector+  -- ^ Not every class has an initial location. See+  -- 'Rattletrap.Data.rawClassesWithLocation'.+  , initializationRotation :: Maybe Int8Vector+  -- ^ Only classes with location can have rotation, but not every one does.+  -- See 'Rattletrap.Data.rawClassesWithRotation'.+  } deriving (Eq, Ord, Show)++$(deriveJson ''Initialization)
+ library/Rattletrap/Type/Int32le.hs view
@@ -0,0 +1,13 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.Int32le+  ( Int32le(..)+  ) where++import Rattletrap.Type.Common++newtype Int32le = Int32le+  { int32leValue :: Int32+  } deriving (Eq, Ord, Show)++$(deriveJson ''Int32le)
+ library/Rattletrap/Type/Int8Vector.hs view
@@ -0,0 +1,16 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.Int8Vector+  ( Int8Vector(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Int8le++data Int8Vector = Int8Vector+  { int8VectorX :: Maybe Int8le+  , int8VectorY :: Maybe Int8le+  , int8VectorZ :: Maybe Int8le+  } deriving (Eq, Ord, Show)++$(deriveJson ''Int8Vector)
+ library/Rattletrap/Type/Int8le.hs view
@@ -0,0 +1,13 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.Int8le+  ( Int8le(..)+  ) where++import Rattletrap.Type.Common++newtype Int8le = Int8le+  { int8leValue :: Int8+  } deriving (Eq, Ord, Show)++$(deriveJson ''Int8le)
+ library/Rattletrap/Type/IntAttribute.hs view
@@ -0,0 +1,14 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.IntAttribute+  ( IntAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Int32le++newtype IntAttribute = IntAttribute+  { intAttributeValue :: Int32le+  } deriving (Eq, Ord, Show)++$(deriveJson ''IntAttribute)
+ library/Rattletrap/Type/KeyFrame.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.KeyFrame+  ( KeyFrame(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Float32le+import Rattletrap.Type.Word32le++data KeyFrame = KeyFrame+  { keyFrameTime :: Float32le+  -- ^ When this key frame occurs, in seconds.+  , keyFrameFrame :: Word32le+  -- ^ The frame number of this key frame, starting from 0.+  , keyFramePosition :: Word32le+  -- ^ The bit position of this key frame in the stream.+  } deriving (Eq, Ord, Show)++$(deriveJson ''KeyFrame)
+ library/Rattletrap/Type/List.hs view
@@ -0,0 +1,13 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.List+  ( List(..)+  ) where++import Rattletrap.Type.Common++newtype List a = List+  { listValue :: [a]+  } deriving (Eq, Ord, Show)++$(deriveJson ''List)
+ library/Rattletrap/Type/LoadoutAttribute.hs view
@@ -0,0 +1,28 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.LoadoutAttribute+  ( LoadoutAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Word32le+import Rattletrap.Type.Word8le++data LoadoutAttribute = LoadoutAttribute+  { loadoutAttributeVersion :: Word8le+  , loadoutAttributeBody :: Word32le+  , loadoutAttributeDecal :: Word32le+  , loadoutAttributeWheels :: Word32le+  , loadoutAttributeRocketTrail :: Word32le+  -- ^ Now known as "rocket boost".+  , loadoutAttributeAntenna :: Word32le+  , loadoutAttributeTopper :: Word32le+  , loadoutAttributeUnknown1 :: Word32le+  , loadoutAttributeUnknown2 :: Maybe Word32le+  , loadoutAttributeEngineAudio :: Maybe Word32le+  , loadoutAttributeTrail :: Maybe Word32le+  , loadoutAttributeGoalExplosion :: Maybe Word32le+  , loadoutAttributeBanner :: Maybe Word32le+  } deriving (Eq, Ord, Show)++$(deriveJson ''LoadoutAttribute)
+ library/Rattletrap/Type/LoadoutOnlineAttribute.hs view
@@ -0,0 +1,14 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.LoadoutOnlineAttribute+  ( LoadoutOnlineAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.ProductAttribute++newtype LoadoutOnlineAttribute = LoadoutOnlineAttribute+  { loadoutAttributeValue :: [[ProductAttribute]]+  } deriving (Eq, Ord, Show)++$(deriveJson ''LoadoutOnlineAttribute)
+ library/Rattletrap/Type/LoadoutsAttribute.hs view
@@ -0,0 +1,15 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.LoadoutsAttribute+  ( LoadoutsAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.LoadoutAttribute++data LoadoutsAttribute = LoadoutsAttribute+  { loadoutsAttributeBlue :: LoadoutAttribute+  , loadoutsAttributeOrange :: LoadoutAttribute+  } deriving (Eq, Ord, Show)++$(deriveJson ''LoadoutsAttribute)
+ library/Rattletrap/Type/LoadoutsOnlineAttribute.hs view
@@ -0,0 +1,17 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.LoadoutsOnlineAttribute+  ( LoadoutsOnlineAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.LoadoutOnlineAttribute++data LoadoutsOnlineAttribute = LoadoutsOnlineAttribute+  { loadoutsOnlineAttributeBlue :: LoadoutOnlineAttribute+  , loadoutsOnlineAttributeOrange :: LoadoutOnlineAttribute+  , loadoutsOnlineAttributeUnknown1 :: Bool+  , loadoutsOnlineAttributeUnknown2 :: Bool+  } deriving (Eq, Ord, Show)++$(deriveJson ''LoadoutsOnlineAttribute)
+ library/Rattletrap/Type/LocationAttribute.hs view
@@ -0,0 +1,14 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.LocationAttribute+  ( LocationAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Vector++newtype LocationAttribute = LocationAttribute+  { locationAttributeValue :: Vector+  } deriving (Eq, Ord, Show)++$(deriveJson ''LocationAttribute)
+ library/Rattletrap/Type/Mark.hs view
@@ -0,0 +1,18 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.Mark+  ( Mark(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Str+import Rattletrap.Type.Word32le++data Mark = Mark+  { markValue :: Str+  -- ^ Which type of mark this is, like @Team0Goal@.+  , markFrame :: Word32le+  -- ^ Which frame this mark belongs to, starting from 0.+  } deriving (Eq, Ord, Show)++$(deriveJson ''Mark)
+ library/Rattletrap/Type/Message.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.Message+  ( Message(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Str+import Rattletrap.Type.Word32le++data Message = Message+  { messageFrame :: Word32le+  -- ^ Which frame this message belongs to, starting from 0.+  , messageName :: Str+  -- ^ The primary player's name.+  , messageValue :: Str+  -- ^ The content of the message.+  } deriving (Eq, Ord, Show)++$(deriveJson ''Message)
+ library/Rattletrap/Type/MusicStingerAttribute.hs view
@@ -0,0 +1,17 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.MusicStingerAttribute+  ( MusicStingerAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Word32le+import Rattletrap.Type.Word8le++data MusicStingerAttribute = MusicStingerAttribute+  { musicStingerAttributeFlag :: Bool+  , musicStingerAttributeCue :: Word32le+  , musicStingerAttributeTrigger :: Word8le+  } deriving (Eq, Ord, Show)++$(deriveJson ''MusicStingerAttribute)
+ library/Rattletrap/Type/PartyLeaderAttribute.hs view
@@ -0,0 +1,16 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.PartyLeaderAttribute+  ( PartyLeaderAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.RemoteId+import Rattletrap.Type.Word8le++data PartyLeaderAttribute = PartyLeaderAttribute+  { partyLeaderAttributeSystemId :: Word8le+  , partyLeaderAttributeId :: Maybe (RemoteId, Word8le)+  } deriving (Eq, Ord, Show)++$(deriveJson ''PartyLeaderAttribute)
+ library/Rattletrap/Type/PickupAttribute.hs view
@@ -0,0 +1,15 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.PickupAttribute+  ( PickupAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Word32le++data PickupAttribute = PickupAttribute+  { pickupAttributeInstigatorId :: Maybe Word32le+  , pickupAttributePickedUp :: Bool+  } deriving (Eq, Ord, Show)++$(deriveJson ''PickupAttribute)
+ library/Rattletrap/Type/PlayerHistoryKeyAttribute.hs view
@@ -0,0 +1,14 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.PlayerHistoryKeyAttribute+  ( PlayerHistoryKeyAttribute(..)+  ) where++import Rattletrap.Type.Bitstream+import Rattletrap.Type.Common++newtype PlayerHistoryKeyAttribute = PlayerHistoryKeyAttribute+  { playerHistoryKeyAttributeUnknown :: Bitstream+  } deriving (Eq, Ord, Show)++$(deriveJson ''PlayerHistoryKeyAttribute)
+ library/Rattletrap/Type/PrivateMatchSettingsAttribute.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.PrivateMatchSettingsAttribute+  ( PrivateMatchSettingsAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Str+import Rattletrap.Type.Word32le++data PrivateMatchSettingsAttribute = PrivateMatchSettingsAttribute+  { privateMatchSettingsAttributeMutators :: Str+  , privateMatchSettingsAttributeJoinableBy :: Word32le+  , privateMatchSettingsAttributeMaxPlayers :: Word32le+  , privateMatchSettingsAttributeGameName :: Str+  , privateMatchSettingsAttributePassword :: Str+  , privateMatchSettingsAttributeFlag :: Bool+  } deriving (Eq, Ord, Show)++$(deriveJson ''PrivateMatchSettingsAttribute)
+ library/Rattletrap/Type/ProductAttribute.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.ProductAttribute+  ( ProductAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.CompressedWord+import Rattletrap.Type.Str+import Rattletrap.Type.Word32le++data ProductAttribute = ProductAttribute+  { productAttributeUnknown :: Bool+  , productAttributeObjectId :: Word32le+  , productAttributeObjectName :: Maybe Str+  -- ^ read-only+  , productAttributeValue :: Maybe (Either CompressedWord Word32)+  } deriving (Eq, Ord, Show)++$(deriveJson ''ProductAttribute)
+ library/Rattletrap/Type/Property.hs view
@@ -0,0 +1,19 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.Property+  ( Property(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.PropertyValue+import Rattletrap.Type.Str+import Rattletrap.Type.Word64le++data Property = Property+  { propertyKind :: Str+  , propertySize :: Word64le+  -- ^ Not used.+  , propertyValue :: PropertyValue Property+  } deriving (Eq, Ord, Show)++$(deriveJson ''Property)
+ library/Rattletrap/Type/PropertyValue.hs view
@@ -0,0 +1,31 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.PropertyValue+  ( PropertyValue(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Dictionary+import Rattletrap.Type.Float32le+import Rattletrap.Type.Int32le+import Rattletrap.Type.List+import Rattletrap.Type.Str+import Rattletrap.Type.Word64le+import Rattletrap.Type.Word8le++data PropertyValue a+  = PropertyValueArray (List (Dictionary a))+  -- ^ Yes, a list of dictionaries. No, it doesn't make sense. These usually+  -- only have one element.+  | PropertyValueBool Word8le+  | PropertyValueByte Str (Maybe Str)+  -- ^ This is a strange name for essentially a key-value pair.+  | PropertyValueFloat Float32le+  | PropertyValueInt Int32le+  | PropertyValueName Str+  -- ^ It's unclear how exactly this is different than a 'StrProperty'.+  | PropertyValueQWord Word64le+  | PropertyValueStr Str+  deriving (Eq, Ord, Show)++$(deriveJson ''PropertyValue)
+ library/Rattletrap/Type/QWordAttribute.hs view
@@ -0,0 +1,14 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.QWordAttribute+  ( QWordAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Word64le++newtype QWordAttribute = QWordAttribute+  { qWordAttributeValue :: Word64le+  } deriving (Eq, Ord, Show)++$(deriveJson ''QWordAttribute)
+ library/Rattletrap/Type/RemoteId.hs view
@@ -0,0 +1,19 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.RemoteId+  ( RemoteId(..)+  ) where++import Rattletrap.Type.Bitstream+import Rattletrap.Type.Common+import Rattletrap.Type.Word64le++data RemoteId+  = RemoteIdPlayStation Text [Word8]+  | RemoteIdSplitscreen Word32+  | RemoteIdSteam Word64le+  | RemoteIdSwitch Bitstream+  | RemoteIdXbox Word64le+  deriving (Eq, Ord, Show)++$(deriveJson ''RemoteId)
+ library/Rattletrap/Type/Replay.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.Replay+  ( Replay(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Content+import Rattletrap.Type.Header+import Rattletrap.Type.Section++-- | A Rocket League replay.+data Replay = Replay+  { replayHeader :: Section Header+  -- ^ This has most of the high-level metadata.+  , replayContent :: Section Content+  -- ^ This has most of the low-level game data.+  } deriving (Eq, Ord, Show)++$(deriveJson ''Replay)
+ library/Rattletrap/Type/Replication.hs view
@@ -0,0 +1,16 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.Replication+  ( Replication(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.CompressedWord+import Rattletrap.Type.ReplicationValue++data Replication = Replication+  { replicationActorId :: CompressedWord+  , replicationValue :: ReplicationValue+  } deriving (Eq, Ord, Show)++$(deriveJson ''Replication)
+ library/Rattletrap/Type/ReplicationValue.hs view
@@ -0,0 +1,21 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.ReplicationValue+  ( ReplicationValue(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.DestroyedReplication+import Rattletrap.Type.SpawnedReplication+import Rattletrap.Type.UpdatedReplication++data ReplicationValue+  = ReplicationValueSpawned SpawnedReplication+  -- ^ Creates a new actor.+  | ReplicationValueUpdated UpdatedReplication+  -- ^ Updates an existing actor.+  | ReplicationValueDestroyed DestroyedReplication+  -- ^ Destroys an existing actor.+  deriving (Eq, Ord, Show)++$(deriveJson ''ReplicationValue)
+ library/Rattletrap/Type/ReservationAttribute.hs view
@@ -0,0 +1,21 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.ReservationAttribute+  ( ReservationAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.CompressedWord+import Rattletrap.Type.Str+import Rattletrap.Type.UniqueIdAttribute++data ReservationAttribute = ReservationAttribute+  { reservationAttributeNumber :: CompressedWord+  , reservationAttributeUniqueId :: UniqueIdAttribute+  , reservationAttributeName :: Maybe Str+  , reservationAttributeUnknown1 :: Bool+  , reservationAttributeUnknown2 :: Bool+  , reservationAttributeUnknown3 :: Maybe Word8+  } deriving (Eq, Ord, Show)++$(deriveJson ''ReservationAttribute)
+ library/Rattletrap/Type/RigidBodyStateAttribute.hs view
@@ -0,0 +1,19 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.RigidBodyStateAttribute+  ( RigidBodyStateAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.CompressedWordVector+import Rattletrap.Type.Vector++data RigidBodyStateAttribute = RigidBodyStateAttribute+  { rigidBodyStateAttributeSleeping :: Bool+  , rigidBodyStateAttributeLocation :: Vector+  , rigidBodyStateAttributeRotation :: CompressedWordVector+  , rigidBodyStateAttributeLinearVelocity :: Maybe Vector+  , rigidBodyStateAttributeAngularVelocity :: Maybe Vector+  } deriving (Eq, Ord, Show)++$(deriveJson ''RigidBodyStateAttribute)
+ library/Rattletrap/Type/Section.hs view
@@ -0,0 +1,23 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.Section+  ( Section(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Word32le++-- | A section is a large piece of a 'Rattletrap.Replay.Replay'. It has a+-- 32-bit size (in bytes), a 32-bit CRC (see "Rattletrap.Utility.Crc"), and then a+-- bunch of data (the body). This interface is provided so that you don't have+-- to think about the size and CRC.+data Section a = Section+  { sectionSize :: Word32le+  -- ^ read only+  , sectionCrc :: Word32le+  -- ^ read only+  , sectionBody :: a+  -- ^ The actual content in the section.+  } deriving (Eq, Ord, Show)++$(deriveJson ''Section)
+ library/Rattletrap/Type/SpawnedReplication.hs view
@@ -0,0 +1,29 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.SpawnedReplication+  ( SpawnedReplication(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Initialization+import Rattletrap.Type.Str+import Rattletrap.Type.Word32le++data SpawnedReplication = SpawnedReplication+  { spawnedReplicationFlag :: Bool+  -- ^ Unclear what this is.+  , spawnedReplicationNameIndex :: Maybe Word32le+  , spawnedReplicationName :: Maybe Str+  -- ^ Read-only! Changing a replication's name requires editing the+  -- 'spawnedReplicationNameIndex' and maybe the class attribute map.+  , spawnedReplicationObjectId :: Word32le+  , spawnedReplicationObjectName :: Str+  -- ^ Read-only! Changing a replication's object requires editing the class+  -- attribute map.+  , spawnedReplicationClassName :: Str+  -- ^ Read-only! Changing a replication's class requires editing the class+  -- attribute map.+  , spawnedReplicationInitialization :: Initialization+  } deriving (Eq, Ord, Show)++$(deriveJson ''SpawnedReplication)
+ library/Rattletrap/Type/Str.hs view
@@ -0,0 +1,23 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.Str+  ( Str(..)+  , toStr+  , fromStr+  ) where++import Rattletrap.Type.Common++import qualified Data.Text as Text++newtype Str = Str+  { strValue :: Text+  } deriving (Eq, Ord, Show)++$(deriveJson ''Str)++toStr :: String -> Str+toStr string = Str (Text.pack string)++fromStr :: Str -> String+fromStr text = Text.unpack (strValue text)
+ library/Rattletrap/Type/StringAttribute.hs view
@@ -0,0 +1,14 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.StringAttribute+  ( StringAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Str++newtype StringAttribute = StringAttribute+  { stringAttributeValue :: Str+  } deriving (Eq, Ord, Show)++$(deriveJson ''StringAttribute)
+ library/Rattletrap/Type/TeamPaintAttribute.hs view
@@ -0,0 +1,19 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.TeamPaintAttribute+  ( TeamPaintAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Word32le+import Rattletrap.Type.Word8le++data TeamPaintAttribute = TeamPaintAttribute+  { teamPaintAttributeTeam :: Word8le+  , teamPaintAttributePrimaryColor :: Word8le+  , teamPaintAttributeAccentColor :: Word8le+  , teamPaintAttributePrimaryFinish :: Word32le+  , teamPaintAttributeAccentFinish :: Word32le+  } deriving (Eq, Ord, Show)++$(deriveJson ''TeamPaintAttribute)
+ library/Rattletrap/Type/UniqueIdAttribute.hs view
@@ -0,0 +1,17 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.UniqueIdAttribute+  ( UniqueIdAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.RemoteId+import Rattletrap.Type.Word8le++data UniqueIdAttribute = UniqueIdAttribute+  { uniqueIdAttributeSystemId :: Word8le+  , uniqueIdAttributeRemoteId :: RemoteId+  , uniqueIdAttributeLocalId :: Word8le+  } deriving (Eq, Ord, Show)++$(deriveJson ''UniqueIdAttribute)
+ library/Rattletrap/Type/UpdatedReplication.hs view
@@ -0,0 +1,14 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.UpdatedReplication+  ( UpdatedReplication(..)+  ) where++import Rattletrap.Type.Attribute+import Rattletrap.Type.Common++newtype UpdatedReplication = UpdatedReplication+  { updatedReplicationAttributes :: [Attribute]+  } deriving (Eq, Ord, Show)++$(deriveJson ''UpdatedReplication)
+ library/Rattletrap/Type/Vector.hs view
@@ -0,0 +1,16 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.Vector+  ( Vector(..)+  ) where++import Rattletrap.Type.Common++data Vector = Vector+  { vectorBias :: Word+  , vectorX :: Int+  , vectorY :: Int+  , vectorZ :: Int+  } deriving (Eq, Ord, Show)++$(deriveJson ''Vector)
+ library/Rattletrap/Type/WeldedInfoAttribute.hs view
@@ -0,0 +1,21 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.WeldedInfoAttribute+  ( WeldedInfoAttribute(..)+  ) where++import Rattletrap.Type.Common+import Rattletrap.Type.Float32le+import Rattletrap.Type.Int32le+import Rattletrap.Type.Int8Vector+import Rattletrap.Type.Vector++data WeldedInfoAttribute = WeldedInfoAttribute+  { weldedInfoAttributeActive :: Bool+  , weldedInfoAttributeActorId :: Int32le+  , weldedInfoAttributeOffset :: Vector+  , weldedInfoAttributeMass :: Float32le+  , weldedInfoAttributeRotation :: Int8Vector+  } deriving (Eq, Ord, Show)++$(deriveJson ''WeldedInfoAttribute)
+ library/Rattletrap/Type/Word32le.hs view
@@ -0,0 +1,13 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.Word32le+  ( Word32le(..)+  ) where++import Rattletrap.Type.Common++newtype Word32le = Word32le+  { word32leValue :: Word32+  } deriving (Eq, Ord, Show)++$(deriveJson ''Word32le)
+ library/Rattletrap/Type/Word64le.hs view
@@ -0,0 +1,13 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.Word64le+  ( Word64le(..)+  ) where++import Rattletrap.Type.Common++newtype Word64le = Word64le+  { word64leValue :: Word64+  } deriving (Eq, Ord, Show)++$(deriveJson ''Word64le)
+ library/Rattletrap/Type/Word8le.hs view
@@ -0,0 +1,13 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.Word8le+  ( Word8le(..)+  ) where++import Rattletrap.Type.Common++newtype Word8le = Word8le+  { word8leValue :: Word8+  } deriving (Eq, Ord, Show)++$(deriveJson ''Word8le)
− library/Rattletrap/Utility.hs
@@ -1,30 +0,0 @@-module Rattletrap.Utility where--import qualified Data.Bits as Bits-import qualified Data.ByteString.Lazy as ByteString-import qualified Data.ByteString.Lazy.Char8 as ByteString8-import qualified Data.Text as Text-import qualified Data.Word as Word--encodeLatin1 :: Text.Text -> ByteString.ByteString-encodeLatin1 text = ByteString8.pack (Text.unpack text)--padBytes :: Integral a => a -> ByteString.ByteString -> ByteString.ByteString-padBytes size bytes = ByteString.concat-  [ bytes-  , ByteString.replicate (fromIntegral size - ByteString.length bytes) 0x00-  ]--reverseByte :: Word.Word8 -> Word.Word8-reverseByte byte =-  Bits.shiftR (byte Bits..&. Bits.bit 7) 7-    + Bits.shiftR (byte Bits..&. Bits.bit 6) 5-    + Bits.shiftR (byte Bits..&. Bits.bit 5) 3-    + Bits.shiftR (byte Bits..&. Bits.bit 4) 1-    + Bits.shiftL (byte Bits..&. Bits.bit 3) 1-    + Bits.shiftL (byte Bits..&. Bits.bit 2) 3-    + Bits.shiftL (byte Bits..&. Bits.bit 1) 5-    + Bits.shiftL (byte Bits..&. Bits.bit 0) 7--reverseBytes :: ByteString.ByteString -> ByteString.ByteString-reverseBytes = ByteString.map reverseByte
+ library/Rattletrap/Utility/Bytes.hs view
@@ -0,0 +1,30 @@+module Rattletrap.Utility.Bytes where++import qualified Data.Bits as Bits+import qualified Data.ByteString.Lazy as LazyBytes+import qualified Data.ByteString.Lazy.Char8 as LazyBytes8+import qualified Data.Text as Text+import qualified Data.Word as Word++encodeLatin1 :: Text.Text -> LazyBytes.ByteString+encodeLatin1 text = LazyBytes8.pack (Text.unpack text)++padBytes :: Integral a => a -> LazyBytes.ByteString -> LazyBytes.ByteString+padBytes size bytes = LazyBytes.concat+  [ bytes+  , LazyBytes.replicate (fromIntegral size - LazyBytes.length bytes) 0x00+  ]++reverseByte :: Word.Word8 -> Word.Word8+reverseByte byte =+  Bits.shiftR (byte Bits..&. Bits.bit 7) 7+    + Bits.shiftR (byte Bits..&. Bits.bit 6) 5+    + Bits.shiftR (byte Bits..&. Bits.bit 5) 3+    + Bits.shiftR (byte Bits..&. Bits.bit 4) 1+    + Bits.shiftL (byte Bits..&. Bits.bit 3) 1+    + Bits.shiftL (byte Bits..&. Bits.bit 2) 3+    + Bits.shiftL (byte Bits..&. Bits.bit 1) 5+    + Bits.shiftL (byte Bits..&. Bits.bit 0) 7++reverseBytes :: LazyBytes.ByteString -> LazyBytes.ByteString+reverseBytes = LazyBytes.map reverseByte
+ library/Rattletrap/Utility/Crc.hs view
@@ -0,0 +1,46 @@+module Rattletrap.Utility.Crc+  ( getCrc32+  ) where++import Rattletrap.Data++import qualified Data.Bits as Bits+import qualified Data.ByteString.Lazy as LazyBytes+import qualified Data.IntMap as IntMap+import qualified Data.Word as Word++-- | Computes the CRC32 of some bytes. This is done to ensure that the bytes+-- are valid before trying to parse them.+--+-- @+-- getCrc32 ('Data.ByteString.Lazy.pack' [0x00])+-- @+--+-- This CRC uses an initial value of @0xefcbf201@ and a polynomial of+-- @0x04c11db7@.+getCrc32 :: LazyBytes.ByteString -> Word.Word32+getCrc32 bytes = do+  let+    update = crc32Update crc32Table+    initial = Bits.complement crc32Initial+    crc = LazyBytes.foldl update initial bytes+  Bits.complement crc++crc32Update+  :: IntMap.IntMap Word.Word32 -> Word.Word32 -> Word.Word8 -> Word.Word32+crc32Update table crc byte = do+  let+    toWord8 :: (Integral a) => a -> Word.Word8+    toWord8 = fromIntegral+    toInt :: (Integral a) => a -> Int+    toInt = fromIntegral+    index = toInt (Bits.xor byte (toWord8 (Bits.shiftR crc 24)))+    left = table IntMap.! index+    right = Bits.shiftL crc 8+  Bits.xor left right++crc32Initial :: Word.Word32+crc32Initial = 0xefcbf201++crc32Table :: IntMap.IntMap Word.Word32+crc32Table = IntMap.fromDistinctAscList (zip [0 ..] rawCrc32Table)
+ library/Rattletrap/Utility/Helper.hs view
@@ -0,0 +1,38 @@+-- | This module provides helper functions for converting replays to and from+-- both their binary format and JSON.+module Rattletrap.Utility.Helper+  ( decodeReplayFile+  , encodeReplayJson+  , decodeReplayJson+  , encodeReplayFile+  ) where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Replay+import Rattletrap.Encode.Replay+import Rattletrap.Type.Replay++import qualified Data.Aeson as Json+import qualified Data.Aeson.Encode.Pretty as Json+import qualified Data.Binary.Put as Binary+import qualified Data.ByteString.Lazy as LazyBytes++-- | Parses a raw replay.+decodeReplayFile :: LazyBytes.ByteString -> Either String Replay+decodeReplayFile = runDecode decodeReplay++-- | Encodes a replay as JSON.+encodeReplayJson :: Replay -> LazyBytes.ByteString+encodeReplayJson = Json.encodePretty' Json.defConfig+  { Json.confCompare = compare+  , Json.confIndent = Json.Spaces 2+  , Json.confTrailingNewline = True+  }++-- | Parses a JSON replay.+decodeReplayJson :: LazyBytes.ByteString -> Either String Replay+decodeReplayJson = Json.eitherDecode++-- | Encodes a raw replay.+encodeReplayFile :: Replay -> LazyBytes.ByteString+encodeReplayFile replay = Binary.runPut (putReplay replay)
− library/Rattletrap/Version.hs
@@ -1,7 +0,0 @@-module Rattletrap.Version where--import qualified Data.Version as Version-import qualified Paths_rattletrap as This--version :: Version.Version-version = This.version
package.yaml view
@@ -1,11 +1,10 @@ name: rattletrap-version: 3.1.2+version: 4.0.0  category: Game description: Rattletrap parses and generates Rocket League replays. extra-source-files:   - CHANGELOG.markdown-  - replays/*.replay   - package.yaml   - README.markdown   - stack.yaml@@ -16,48 +15,45 @@ synopsis: Parse and generate Rocket League replays.  dependencies:-  - aeson >= 1.2.3 && < 1.3-  - base >= 4.10.1 && < 4.11-  - bimap >= 0.3.3 && < 0.4-  - binary >= 0.8.5 && < 0.9-  - binary-bits >= 0.5 && < 0.6-  - bytestring >= 0.10.8 && < 0.11-  - containers >= 0.5.10 && < 0.6-  - data-binary-ieee754 >= 0.4.4 && < 0.5-  - http-client >= 0.5.7 && < 0.6-  - http-client-tls >= 0.3.5 && < 0.4-  - template-haskell >= 2.12.0 && < 2.13-  - text >= 1.2.2 && < 1.3-  - vector >= 0.12.0 && < 0.13-ghc-options: -Wall+  aeson-pretty: == 0.8.5.*+  aeson: == 1.2.3.*+  base: == 4.10.1.*+  binary-bits: == 0.5.*+  binary: == 0.8.5.*+  bytestring: == 0.10.8.*+  containers: == 0.5.10.*+  filepath: == 1.4.1.*+  http-client-tls: == 0.3.5.*+  http-client: == 0.5.7.*+  template-haskell: == 2.12.*+  text: == 1.2.2.*+  transformers: == 0.5.2.*+ghc-options:+  - -Weverything+  - -Wno-implicit-prelude+  - -Wno-missing-import-lists+  - -Wno-safe+  - -Wno-unsafe  library:-  default-extensions:-    - Strict-  other-modules: Paths_rattletrap   source-dirs: library -executables:-  rattletrap:-    dependencies:-      - rattletrap-    ghc-options:-      - -rtsopts-      - -threaded-      - -with-rtsopts=-N-    main: Main.hs-    source-dirs: executables+executable:+  dependencies: rattletrap+  ghc-options:+    - -rtsopts+    - -threaded+  main: Main.hs+  source-dirs: executables  tests:   test:     dependencies:-      - filepath >= 1.4.1 && < 1.5-      - hspec >= 2.4.4 && < 2.5-      - rattletrap-      - temporary >= 1.2.1 && < 1.3+      HUnit: == 1.6.*+      rattletrap:+      temporary: == 1.2.1.*     ghc-options:       - -rtsopts       - -threaded-      - -with-rtsopts=-N     main: Main.hs     source-dirs: tests
rattletrap.cabal view
@@ -2,10 +2,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: ffc648678c84d8942a93a5168812a9a02db2b7471f0f42a0576f8409235cc6cd+-- hash: db273356d10179b50de43a97e4f71076671b4d2a32bd6d23c8ee9b1cd4e20af4  name:           rattletrap-version:        3.1.2+version:        4.0.0 synopsis:       Parse and generate Rocket League replays. description:    Rattletrap parses and generates Rocket League replays. category:       Game@@ -21,68 +21,6 @@     CHANGELOG.markdown     package.yaml     README.markdown-    replays/00080014003600090000036E0F65CCEB.replay-    replays/07E925B1423653D44CB8B4B2524792C1.replay-    replays/0AD21FEE4A512906BEB6C98136AAF49A.replay-    replays/1205D96C4D819800927791820096CD49.replay-    replays/160CA83E41083BFD8E6315B4BFCA0561.replay-    replays/16D580EF479483E015207C901776F9FB.replay-    replays/18D6738D415B70B5BE4C299588D3C141.replay-    replays/1A126AC24CAA0DB0E98835BD960B8AF8.replay-    replays/1AE415514DFC65DCBF8B8391AD35488D.replay-    replays/1BC2D01444ACE577D01E988EADD4DFD0.replay-    replays/1D1DE97D4941C86E43FE0093563DB621.replay-    replays/1EF90FCC4F719F606A5327B3CDD782A4.replay-    replays/1F3798E540B0C37A946561ABBB3037F9.replay-    replays/211466D04B983F5A33CC2FA1D5928672.replay-    replays/22660E3649FC7971E5653692473D4318.replay-    replays/22BACD794ABE7B92E50E9CBDBD9C59CE.replay-    replays/27B6A7B64553F0F685874584F96BAB1B.replay-    replays/29F582C34A65EB34D358A784CBE3C189.replay-    replays/2CFE577044E651D3FA9DBF83ECA8BCC3.replay-    replays/338173964F9F71EBDD31058A1936CBB4.replay-    replays/372DBFCA4BDB340E4357B6BD43032802.replay-    replays/387F059C47C09E253C875CA990EFD9F2.replay-    replays/3EA147DD485B8DD24810689A7A989E44.replay-    replays/4126861E477F4A03DE2A4080374D7908.replay-    replays/42F0D8DA4FC89AE7B80FCAB7F637A8EA.replay-    replays/504ED825482186E771FAA9B642CE5CE4.replay-    replays/520E1BFF468CF6C3C48D1EA85D9C7909.replay-    replays/52AA67F94090C19D33C5009E54D31FE4.replay-    replays/540DA764423C8FB24EB9D486D982F16F.replay-    replays/551CA4D44FF2B86015DE44A6B5790D4C.replay-    replays/6320E51C49066A7C210A2993C2201D5F.replay-    replays/6688EEE34BFEB3EC3A9E3283098CC712.replay-    replays/6B0D1614417085A7AAD82EAA30D8DABE.replay-    replays/6D1B06D844A5BB91B81FD4B5B28F08BA.replay-    replays/6F7CFCD24638F8A6567AB3A8B9958A90.replay-    replays/7109EB9846D303E54B7ACBA792036213.replay-    replays/7BF6073F4614CE0A438994B9A260DA6A.replay-    replays/89CBA30E46FA5385BDD35DA4285D4D2E.replay-    replays/8AE551FF406D7B82ED853B8C7BFF8CDA.replay-    replays/9704208245D7DD851F2FB2BC7DFD9AC3.replay-    replays/98E58A904D713F2DE202358E8573265D.replay-    replays/A128B3AB45D5A18E3EF9CF93C9576BCE.replay-    replays/A52F804845573D8DA65E97BF59026A43.replay-    replays/A558B1B44124D6E021640884E8EEC2A7.replay-    replays/A6711CE74272B2E663DCC9A200A218E3.replay-    replays/A7F001A1417A19BFA8C90990D8F7C2FF.replay-    replays/AFB1F46A49737E36928E1EABC6F5B7AD.replay-    replays/B9F9B87D4A9D0A3D25D4EC91C0401DE2.replay-    replays/C14F7E0E4D9B5E6BE9AD5D8ED56B174C.replay-    replays/C8372B1345B1803DEF039F815DBD802D.replay-    replays/CC4CA70D4F7A67EBAD0ED9B9923106F7.replay-    replays/D0449F5F4AA775B86FFA7DA2B5A3204E.replay-    replays/D428F81646A98C25902CE988AE5C14C8.replay-    replays/D7FB197A451D69075A0C99A2F49A4053.replay-    replays/DCB3A6B94A9DBE46FDE5EAA9B012F6C8.replay-    replays/DE56B1B146687EA2E62E31A37A08C8EB.replay-    replays/EAE311E84BA35B590A6FDBA6DD4F2FEB.replay-    replays/EAE8DADA4BB2DC5422792C9B4A67392D.replay-    replays/F299F176491554B11E34AB91CA76B2CE.replay-    replays/F7B9E14545C7467B89A00895980FCD73.replay-    replays/F811C1D24888015E23B598AD8628C742.replay-    replays/FDC79DA84DD463D4BCCE6B892829AC88.replay     stack.yaml  source-repository head@@ -92,101 +30,236 @@ library   hs-source-dirs:       library-  default-extensions: Strict-  ghc-options: -Wall+  ghc-options: -Weverything -Wno-implicit-prelude -Wno-missing-import-lists -Wno-safe -Wno-unsafe   build-depends:-      aeson >=1.2.3 && <1.3-    , base >=4.10.1 && <4.11-    , bimap >=0.3.3 && <0.4-    , binary >=0.8.5 && <0.9-    , binary-bits >=0.5 && <0.6-    , bytestring >=0.10.8 && <0.11-    , containers >=0.5.10 && <0.6-    , data-binary-ieee754 >=0.4.4 && <0.5-    , http-client >=0.5.7 && <0.6-    , http-client-tls >=0.3.5 && <0.4-    , template-haskell >=2.12.0 && <2.13-    , text >=1.2.2 && <1.3-    , vector >=0.12.0 && <0.13+      aeson ==1.2.3.*+    , aeson-pretty ==0.8.5.*+    , base ==4.10.1.*+    , binary ==0.8.5.*+    , binary-bits ==0.5.*+    , bytestring ==0.10.8.*+    , containers ==0.5.10.*+    , filepath ==1.4.1.*+    , http-client ==0.5.7.*+    , http-client-tls ==0.3.5.*+    , template-haskell ==2.12.*+    , text ==1.2.2.*+    , transformers ==0.5.2.*   exposed-modules:       Rattletrap-      Rattletrap.ActorMap-      Rattletrap.Attribute-      Rattletrap.Attribute.AppliedDamage-      Rattletrap.Attribute.Boolean-      Rattletrap.Attribute.Byte-      Rattletrap.Attribute.CamSettings-      Rattletrap.Attribute.ClubColors-      Rattletrap.Attribute.DamageState-      Rattletrap.Attribute.Demolish-      Rattletrap.Attribute.Enum-      Rattletrap.Attribute.Explosion-      Rattletrap.Attribute.ExtendedExplosion-      Rattletrap.Attribute.FlaggedInt-      Rattletrap.Attribute.Float-      Rattletrap.Attribute.GameMode-      Rattletrap.Attribute.Int-      Rattletrap.Attribute.Loadout-      Rattletrap.Attribute.LoadoutOnline-      Rattletrap.Attribute.Loadouts-      Rattletrap.Attribute.LoadoutsOnline-      Rattletrap.Attribute.Location-      Rattletrap.Attribute.MusicStinger-      Rattletrap.Attribute.PartyLeader-      Rattletrap.Attribute.Pickup-      Rattletrap.Attribute.PrivateMatchSettings-      Rattletrap.Attribute.Product-      Rattletrap.Attribute.QWord-      Rattletrap.Attribute.Reservation-      Rattletrap.Attribute.RigidBodyState-      Rattletrap.Attribute.String-      Rattletrap.Attribute.TeamPaint-      Rattletrap.Attribute.UniqueId-      Rattletrap.Attribute.WeldedInfo-      Rattletrap.AttributeMapping-      Rattletrap.AttributeType-      Rattletrap.AttributeValue-      Rattletrap.Cache-      Rattletrap.ClassAttributeMap-      Rattletrap.ClassMapping-      Rattletrap.Content-      Rattletrap.Crc+      Rattletrap.Console.Main       Rattletrap.Data-      Rattletrap.Frame-      Rattletrap.Header-      Rattletrap.Helper-      Rattletrap.Initialization-      Rattletrap.Json-      Rattletrap.KeyFrame-      Rattletrap.Main-      Rattletrap.Mark-      Rattletrap.Message-      Rattletrap.Primitive-      Rattletrap.Primitive.CompressedWord-      Rattletrap.Primitive.CompressedWordVector-      Rattletrap.Primitive.Dictionary-      Rattletrap.Primitive.Float32-      Rattletrap.Primitive.Int32-      Rattletrap.Primitive.Int8-      Rattletrap.Primitive.Int8Vector-      Rattletrap.Primitive.List-      Rattletrap.Primitive.Section-      Rattletrap.Primitive.Text-      Rattletrap.Primitive.Vector-      Rattletrap.Primitive.Word32-      Rattletrap.Primitive.Word64-      Rattletrap.Primitive.Word8-      Rattletrap.Property-      Rattletrap.PropertyValue-      Rattletrap.RemoteId-      Rattletrap.Replay-      Rattletrap.Replication-      Rattletrap.Replication.Destroyed-      Rattletrap.Replication.Spawned-      Rattletrap.Replication.Updated-      Rattletrap.ReplicationValue-      Rattletrap.Utility-      Rattletrap.Version+      Rattletrap.Decode.AppliedDamageAttribute+      Rattletrap.Decode.Attribute+      Rattletrap.Decode.AttributeMapping+      Rattletrap.Decode.AttributeValue+      Rattletrap.Decode.Bitstream+      Rattletrap.Decode.BooleanAttribute+      Rattletrap.Decode.ByteAttribute+      Rattletrap.Decode.Cache+      Rattletrap.Decode.CamSettingsAttribute+      Rattletrap.Decode.ClassMapping+      Rattletrap.Decode.ClubColorsAttribute+      Rattletrap.Decode.Common+      Rattletrap.Decode.CompressedWord+      Rattletrap.Decode.CompressedWordVector+      Rattletrap.Decode.Content+      Rattletrap.Decode.DamageStateAttribute+      Rattletrap.Decode.DemolishAttribute+      Rattletrap.Decode.DestroyedReplication+      Rattletrap.Decode.Dictionary+      Rattletrap.Decode.EnumAttribute+      Rattletrap.Decode.ExplosionAttribute+      Rattletrap.Decode.ExtendedExplosionAttribute+      Rattletrap.Decode.FlaggedIntAttribute+      Rattletrap.Decode.Float32le+      Rattletrap.Decode.FloatAttribute+      Rattletrap.Decode.Frame+      Rattletrap.Decode.GameModeAttribute+      Rattletrap.Decode.Header+      Rattletrap.Decode.Initialization+      Rattletrap.Decode.Int32le+      Rattletrap.Decode.Int8le+      Rattletrap.Decode.Int8Vector+      Rattletrap.Decode.IntAttribute+      Rattletrap.Decode.KeyFrame+      Rattletrap.Decode.List+      Rattletrap.Decode.LoadoutAttribute+      Rattletrap.Decode.LoadoutOnlineAttribute+      Rattletrap.Decode.LoadoutsAttribute+      Rattletrap.Decode.LoadoutsOnlineAttribute+      Rattletrap.Decode.LocationAttribute+      Rattletrap.Decode.Mark+      Rattletrap.Decode.Message+      Rattletrap.Decode.MusicStingerAttribute+      Rattletrap.Decode.PartyLeaderAttribute+      Rattletrap.Decode.PickupAttribute+      Rattletrap.Decode.PlayerHistoryKeyAttribute+      Rattletrap.Decode.PrivateMatchSettingsAttribute+      Rattletrap.Decode.ProductAttribute+      Rattletrap.Decode.Property+      Rattletrap.Decode.PropertyValue+      Rattletrap.Decode.QWordAttribute+      Rattletrap.Decode.RemoteId+      Rattletrap.Decode.Replay+      Rattletrap.Decode.Replication+      Rattletrap.Decode.ReplicationValue+      Rattletrap.Decode.ReservationAttribute+      Rattletrap.Decode.RigidBodyStateAttribute+      Rattletrap.Decode.Section+      Rattletrap.Decode.SpawnedReplication+      Rattletrap.Decode.Str+      Rattletrap.Decode.StringAttribute+      Rattletrap.Decode.TeamPaintAttribute+      Rattletrap.Decode.UniqueIdAttribute+      Rattletrap.Decode.UpdatedReplication+      Rattletrap.Decode.Vector+      Rattletrap.Decode.WeldedInfoAttribute+      Rattletrap.Decode.Word32le+      Rattletrap.Decode.Word64le+      Rattletrap.Decode.Word8le+      Rattletrap.Encode.AppliedDamageAttribute+      Rattletrap.Encode.Attribute+      Rattletrap.Encode.AttributeMapping+      Rattletrap.Encode.AttributeValue+      Rattletrap.Encode.Bitstream+      Rattletrap.Encode.BooleanAttribute+      Rattletrap.Encode.ByteAttribute+      Rattletrap.Encode.Cache+      Rattletrap.Encode.CamSettingsAttribute+      Rattletrap.Encode.ClassMapping+      Rattletrap.Encode.ClubColorsAttribute+      Rattletrap.Encode.CompressedWord+      Rattletrap.Encode.CompressedWordVector+      Rattletrap.Encode.Content+      Rattletrap.Encode.DamageStateAttribute+      Rattletrap.Encode.DemolishAttribute+      Rattletrap.Encode.DestroyedReplication+      Rattletrap.Encode.Dictionary+      Rattletrap.Encode.EnumAttribute+      Rattletrap.Encode.ExplosionAttribute+      Rattletrap.Encode.ExtendedExplosionAttribute+      Rattletrap.Encode.FlaggedIntAttribute+      Rattletrap.Encode.Float32le+      Rattletrap.Encode.FloatAttribute+      Rattletrap.Encode.Frame+      Rattletrap.Encode.GameModeAttribute+      Rattletrap.Encode.Header+      Rattletrap.Encode.Initialization+      Rattletrap.Encode.Int32le+      Rattletrap.Encode.Int8le+      Rattletrap.Encode.Int8Vector+      Rattletrap.Encode.IntAttribute+      Rattletrap.Encode.KeyFrame+      Rattletrap.Encode.List+      Rattletrap.Encode.LoadoutAttribute+      Rattletrap.Encode.LoadoutOnlineAttribute+      Rattletrap.Encode.LoadoutsAttribute+      Rattletrap.Encode.LoadoutsOnlineAttribute+      Rattletrap.Encode.LocationAttribute+      Rattletrap.Encode.Mark+      Rattletrap.Encode.Message+      Rattletrap.Encode.MusicStingerAttribute+      Rattletrap.Encode.PartyLeaderAttribute+      Rattletrap.Encode.PickupAttribute+      Rattletrap.Encode.PlayerHistoryKeyAttribute+      Rattletrap.Encode.PrivateMatchSettingsAttribute+      Rattletrap.Encode.ProductAttribute+      Rattletrap.Encode.Property+      Rattletrap.Encode.PropertyValue+      Rattletrap.Encode.QWordAttribute+      Rattletrap.Encode.RemoteId+      Rattletrap.Encode.Replay+      Rattletrap.Encode.Replication+      Rattletrap.Encode.ReplicationValue+      Rattletrap.Encode.ReservationAttribute+      Rattletrap.Encode.RigidBodyStateAttribute+      Rattletrap.Encode.Section+      Rattletrap.Encode.SpawnedReplication+      Rattletrap.Encode.Str+      Rattletrap.Encode.StringAttribute+      Rattletrap.Encode.TeamPaintAttribute+      Rattletrap.Encode.UniqueIdAttribute+      Rattletrap.Encode.UpdatedReplication+      Rattletrap.Encode.Vector+      Rattletrap.Encode.WeldedInfoAttribute+      Rattletrap.Encode.Word32le+      Rattletrap.Encode.Word64le+      Rattletrap.Encode.Word8le+      Rattletrap.Type.AppliedDamageAttribute+      Rattletrap.Type.Attribute+      Rattletrap.Type.AttributeMapping+      Rattletrap.Type.AttributeType+      Rattletrap.Type.AttributeValue+      Rattletrap.Type.Bitstream+      Rattletrap.Type.BooleanAttribute+      Rattletrap.Type.ByteAttribute+      Rattletrap.Type.Cache+      Rattletrap.Type.CamSettingsAttribute+      Rattletrap.Type.ClassAttributeMap+      Rattletrap.Type.ClassMapping+      Rattletrap.Type.ClubColorsAttribute+      Rattletrap.Type.Common+      Rattletrap.Type.CompressedWord+      Rattletrap.Type.CompressedWordVector+      Rattletrap.Type.Content+      Rattletrap.Type.DamageStateAttribute+      Rattletrap.Type.DemolishAttribute+      Rattletrap.Type.DestroyedReplication+      Rattletrap.Type.Dictionary+      Rattletrap.Type.EnumAttribute+      Rattletrap.Type.ExplosionAttribute+      Rattletrap.Type.ExtendedExplosionAttribute+      Rattletrap.Type.FlaggedIntAttribute+      Rattletrap.Type.Float32le+      Rattletrap.Type.FloatAttribute+      Rattletrap.Type.Frame+      Rattletrap.Type.GameModeAttribute+      Rattletrap.Type.Header+      Rattletrap.Type.Initialization+      Rattletrap.Type.Int32le+      Rattletrap.Type.Int8le+      Rattletrap.Type.Int8Vector+      Rattletrap.Type.IntAttribute+      Rattletrap.Type.KeyFrame+      Rattletrap.Type.List+      Rattletrap.Type.LoadoutAttribute+      Rattletrap.Type.LoadoutOnlineAttribute+      Rattletrap.Type.LoadoutsAttribute+      Rattletrap.Type.LoadoutsOnlineAttribute+      Rattletrap.Type.LocationAttribute+      Rattletrap.Type.Mark+      Rattletrap.Type.Message+      Rattletrap.Type.MusicStingerAttribute+      Rattletrap.Type.PartyLeaderAttribute+      Rattletrap.Type.PickupAttribute+      Rattletrap.Type.PlayerHistoryKeyAttribute+      Rattletrap.Type.PrivateMatchSettingsAttribute+      Rattletrap.Type.ProductAttribute+      Rattletrap.Type.Property+      Rattletrap.Type.PropertyValue+      Rattletrap.Type.QWordAttribute+      Rattletrap.Type.RemoteId+      Rattletrap.Type.Replay+      Rattletrap.Type.Replication+      Rattletrap.Type.ReplicationValue+      Rattletrap.Type.ReservationAttribute+      Rattletrap.Type.RigidBodyStateAttribute+      Rattletrap.Type.Section+      Rattletrap.Type.SpawnedReplication+      Rattletrap.Type.Str+      Rattletrap.Type.StringAttribute+      Rattletrap.Type.TeamPaintAttribute+      Rattletrap.Type.UniqueIdAttribute+      Rattletrap.Type.UpdatedReplication+      Rattletrap.Type.Vector+      Rattletrap.Type.WeldedInfoAttribute+      Rattletrap.Type.Word32le+      Rattletrap.Type.Word64le+      Rattletrap.Type.Word8le+      Rattletrap.Utility.Bytes+      Rattletrap.Utility.Crc+      Rattletrap.Utility.Helper   other-modules:       Paths_rattletrap   default-language: Haskell2010@@ -195,22 +268,22 @@   main-is: Main.hs   hs-source-dirs:       executables-  ghc-options: -Wall -rtsopts -threaded -with-rtsopts=-N+  ghc-options: -Weverything -Wno-implicit-prelude -Wno-missing-import-lists -Wno-safe -Wno-unsafe -rtsopts -threaded   build-depends:-      aeson >=1.2.3 && <1.3-    , base >=4.10.1 && <4.11-    , bimap >=0.3.3 && <0.4-    , binary >=0.8.5 && <0.9-    , binary-bits >=0.5 && <0.6-    , bytestring >=0.10.8 && <0.11-    , containers >=0.5.10 && <0.6-    , data-binary-ieee754 >=0.4.4 && <0.5-    , http-client >=0.5.7 && <0.6-    , http-client-tls >=0.3.5 && <0.4+      aeson ==1.2.3.*+    , aeson-pretty ==0.8.5.*+    , base ==4.10.1.*+    , binary ==0.8.5.*+    , binary-bits ==0.5.*+    , bytestring ==0.10.8.*+    , containers ==0.5.10.*+    , filepath ==1.4.1.*+    , http-client ==0.5.7.*+    , http-client-tls ==0.3.5.*     , rattletrap-    , template-haskell >=2.12.0 && <2.13-    , text >=1.2.2 && <1.3-    , vector >=0.12.0 && <0.13+    , template-haskell ==2.12.*+    , text ==1.2.2.*+    , transformers ==0.5.2.*   other-modules:       Paths_rattletrap   default-language: Haskell2010@@ -220,25 +293,24 @@   main-is: Main.hs   hs-source-dirs:       tests-  ghc-options: -Wall -rtsopts -threaded -with-rtsopts=-N+  ghc-options: -Weverything -Wno-implicit-prelude -Wno-missing-import-lists -Wno-safe -Wno-unsafe -rtsopts -threaded   build-depends:-      aeson >=1.2.3 && <1.3-    , base >=4.10.1 && <4.11-    , bimap >=0.3.3 && <0.4-    , binary >=0.8.5 && <0.9-    , binary-bits >=0.5 && <0.6-    , bytestring >=0.10.8 && <0.11-    , containers >=0.5.10 && <0.6-    , data-binary-ieee754 >=0.4.4 && <0.5-    , filepath >=1.4.1 && <1.5-    , hspec >=2.4.4 && <2.5-    , http-client >=0.5.7 && <0.6-    , http-client-tls >=0.3.5 && <0.4+      HUnit ==1.6.*+    , aeson ==1.2.3.*+    , aeson-pretty ==0.8.5.*+    , base ==4.10.1.*+    , binary ==0.8.5.*+    , binary-bits ==0.5.*+    , bytestring ==0.10.8.*+    , containers ==0.5.10.*+    , filepath ==1.4.1.*+    , http-client ==0.5.7.*+    , http-client-tls ==0.3.5.*     , rattletrap-    , template-haskell >=2.12.0 && <2.13-    , temporary >=1.2.1 && <1.3-    , text >=1.2.2 && <1.3-    , vector >=0.12.0 && <0.13+    , template-haskell ==2.12.*+    , temporary ==1.2.1.*+    , text ==1.2.2.*+    , transformers ==0.5.2.*   other-modules:       Paths_rattletrap   default-language: Haskell2010
− replays/00080014003600090000036E0F65CCEB.replay

binary file changed (94347 → absent bytes)

− replays/07E925B1423653D44CB8B4B2524792C1.replay

binary file changed (30063 → absent bytes)

− replays/0AD21FEE4A512906BEB6C98136AAF49A.replay

binary file changed (27949 → absent bytes)

− replays/1205D96C4D819800927791820096CD49.replay

binary file changed (461470 → absent bytes)

− replays/160CA83E41083BFD8E6315B4BFCA0561.replay

binary file changed (565359 → absent bytes)

− replays/16D580EF479483E015207C901776F9FB.replay

binary file changed (30691 → absent bytes)

− replays/18D6738D415B70B5BE4C299588D3C141.replay

binary file changed (21996 → absent bytes)

− replays/1A126AC24CAA0DB0E98835BD960B8AF8.replay

binary file changed (98814 → absent bytes)

− replays/1AE415514DFC65DCBF8B8391AD35488D.replay

binary file changed (25926 → absent bytes)

− replays/1BC2D01444ACE577D01E988EADD4DFD0.replay

binary file changed (22739 → absent bytes)

− replays/1D1DE97D4941C86E43FE0093563DB621.replay

binary file changed (59943 → absent bytes)

− replays/1EF90FCC4F719F606A5327B3CDD782A4.replay

binary file changed (737542 → absent bytes)

− replays/1F3798E540B0C37A946561ABBB3037F9.replay

binary file changed (27316 → absent bytes)

− replays/211466D04B983F5A33CC2FA1D5928672.replay

binary file changed (38258 → absent bytes)

− replays/22660E3649FC7971E5653692473D4318.replay

binary file changed (1259407 → absent bytes)

− replays/22BACD794ABE7B92E50E9CBDBD9C59CE.replay

binary file changed (315922 → absent bytes)

− replays/27B6A7B64553F0F685874584F96BAB1B.replay

binary file changed (25332 → absent bytes)

− replays/29F582C34A65EB34D358A784CBE3C189.replay

binary file changed (21607 → absent bytes)

− replays/2CFE577044E651D3FA9DBF83ECA8BCC3.replay

binary file changed (1060102 → absent bytes)

− replays/338173964F9F71EBDD31058A1936CBB4.replay

binary file changed (1556372 → absent bytes)

− replays/372DBFCA4BDB340E4357B6BD43032802.replay

binary file changed (28065 → absent bytes)

− replays/387F059C47C09E253C875CA990EFD9F2.replay

binary file changed (737279 → absent bytes)

− replays/3EA147DD485B8DD24810689A7A989E44.replay

binary file changed (596690 → absent bytes)

− replays/4126861E477F4A03DE2A4080374D7908.replay

binary file changed (26284 → absent bytes)

− replays/42F0D8DA4FC89AE7B80FCAB7F637A8EA.replay

binary file changed (116440 → absent bytes)

− replays/504ED825482186E771FAA9B642CE5CE4.replay

binary file changed (145094 → absent bytes)

− replays/520E1BFF468CF6C3C48D1EA85D9C7909.replay

binary file changed (68945 → absent bytes)

− replays/52AA67F94090C19D33C5009E54D31FE4.replay

binary file changed (570657 → absent bytes)

− replays/540DA764423C8FB24EB9D486D982F16F.replay

binary file changed (34674 → absent bytes)

− replays/551CA4D44FF2B86015DE44A6B5790D4C.replay

binary file changed (754887 → absent bytes)

− replays/6320E51C49066A7C210A2993C2201D5F.replay

binary file changed (391424 → absent bytes)

− replays/6688EEE34BFEB3EC3A9E3283098CC712.replay

binary file changed (1026 → absent bytes)

− replays/6B0D1614417085A7AAD82EAA30D8DABE.replay

binary file changed (1294929 → absent bytes)

− replays/6D1B06D844A5BB91B81FD4B5B28F08BA.replay

binary file changed (91217 → absent bytes)

− replays/6F7CFCD24638F8A6567AB3A8B9958A90.replay

binary file changed (29715 → absent bytes)

− replays/7109EB9846D303E54B7ACBA792036213.replay

binary file changed (65002 → absent bytes)

− replays/7BF6073F4614CE0A438994B9A260DA6A.replay

binary file changed (22841 → absent bytes)

− replays/89CBA30E46FA5385BDD35DA4285D4D2E.replay

binary file changed (212429 → absent bytes)

− replays/8AE551FF406D7B82ED853B8C7BFF8CDA.replay

binary file changed (28946 → absent bytes)

− replays/9704208245D7DD851F2FB2BC7DFD9AC3.replay

binary file changed (36307 → absent bytes)

− replays/98E58A904D713F2DE202358E8573265D.replay

binary file changed (34047 → absent bytes)

− replays/A128B3AB45D5A18E3EF9CF93C9576BCE.replay

binary file changed (743537 → absent bytes)

− replays/A52F804845573D8DA65E97BF59026A43.replay

binary file changed (73064 → absent bytes)

− replays/A558B1B44124D6E021640884E8EEC2A7.replay

binary file changed (266615 → absent bytes)

− replays/A6711CE74272B2E663DCC9A200A218E3.replay

binary file changed (221897 → absent bytes)

− replays/A7F001A1417A19BFA8C90990D8F7C2FF.replay

binary file changed (396148 → absent bytes)

− replays/AFB1F46A49737E36928E1EABC6F5B7AD.replay

binary file changed (32310 → absent bytes)

− replays/B9F9B87D4A9D0A3D25D4EC91C0401DE2.replay

binary file changed (25888 → absent bytes)

− replays/C14F7E0E4D9B5E6BE9AD5D8ED56B174C.replay

binary file changed (25904 → absent bytes)

− replays/C8372B1345B1803DEF039F815DBD802D.replay

binary file changed (23625 → absent bytes)

− replays/CC4CA70D4F7A67EBAD0ED9B9923106F7.replay

binary file changed (30103 → absent bytes)

− replays/D0449F5F4AA775B86FFA7DA2B5A3204E.replay

binary file changed (640433 → absent bytes)

− replays/D428F81646A98C25902CE988AE5C14C8.replay

binary file changed (476589 → absent bytes)

− replays/D7FB197A451D69075A0C99A2F49A4053.replay

binary file changed (29095 → absent bytes)

− replays/DCB3A6B94A9DBE46FDE5EAA9B012F6C8.replay

binary file changed (1055071 → absent bytes)

− replays/DE56B1B146687EA2E62E31A37A08C8EB.replay

binary file changed (368882 → absent bytes)

− replays/EAE311E84BA35B590A6FDBA6DD4F2FEB.replay

binary file changed (30151 → absent bytes)

− replays/EAE8DADA4BB2DC5422792C9B4A67392D.replay

binary file changed (25462 → absent bytes)

− replays/F299F176491554B11E34AB91CA76B2CE.replay

binary file changed (22732 → absent bytes)

− replays/F7B9E14545C7467B89A00895980FCD73.replay

binary file changed (25580 → absent bytes)

− replays/F811C1D24888015E23B598AD8628C742.replay

binary file changed (605 → absent bytes)

− replays/FDC79DA84DD463D4BCCE6B892829AC88.replay

binary file changed (783619 → absent bytes)

stack.yaml view
@@ -1,5 +1,1 @@-resolver: nightly-2017-11-25--packages:-  - .-  - tools+resolver: lts-10.0
tests/Main.hs view
@@ -1,106 +1,107 @@-import qualified Control.Monad as Monad-import qualified Data.ByteString.Lazy as ByteString-import qualified Rattletrap-import qualified System.FilePath as FilePath-import qualified System.IO.Temp as Temp-import qualified Test.Hspec as Hspec+import Control.Exception (displayException, try)+import Control.Monad (unless)+import Data.ByteString.Lazy (readFile)+import Prelude hiding (readFile)+import Rattletrap.Console.Main (rattletrap)+import System.FilePath (addExtension, joinPath)+import System.IO.Temp (withSystemTempDirectory)+import Text.Printf (printf) -main :: IO ()-main = Hspec.hspec spec+import qualified Test.HUnit as Test -spec :: Hspec.Spec-spec = Hspec.describe "Rattletrap" (mapM_ (uncurry itCanRoundTrip) replays)+main :: IO Test.Counts+main = withSystemTempDirectory "rattletrap-" (Test.runTestTT . toTests) -itCanRoundTrip :: String -> String -> Hspec.Spec-itCanRoundTrip uuid description =-  Hspec.it (specName uuid description) (specBody uuid)+toTests :: FilePath -> Test.Test+toTests directory = Test.TestList (fmap (toTest directory) replays) -specName :: String -> String -> String-specName uuid description = unwords [take 4 uuid, description]+toTest :: FilePath -> (String, String) -> Test.Test+toTest directory (uuid, name) = Test.TestLabel+  (toLabel uuid name)+  (Test.TestCase (toAssertion directory uuid)) -specBody :: String -> IO ()-specBody uuid = do-  let inputFile = pathToReplay uuid-  input <- ByteString.readFile inputFile-  Temp.withSystemTempDirectory-    "replay-"-    ( \directory -> do-      let jsonFile = FilePath.combine directory "replay.json"-      Rattletrap.mainWithArgs ["decode", inputFile, jsonFile]-      let outputFile = FilePath.combine directory "output.replay"-      Rattletrap.mainWithArgs ["encode", jsonFile, outputFile]-      output <- ByteString.readFile outputFile-      Monad.unless-        (output == input)-        (Hspec.expectationFailure "output does not match input")-    )+toLabel :: String -> String -> String+toLabel = printf "%s: %s" -pathToReplay :: String -> FilePath-pathToReplay uuid =-  FilePath.joinPath ["replays", FilePath.addExtension uuid ".replay"]+toAssertion :: FilePath -> String -> Test.Assertion+toAssertion directory uuid = do+  let inputFile = joinPath ["replays", addExtension uuid ".replay"]+  result <- try (readFile inputFile)+  case result of+    Left problem -> putStrLn (displayException (problem :: IOError))+    Right input -> do+      let jsonFile = joinPath [directory, addExtension uuid ".json"]+      rattletrap "" ["--compact", "--input", inputFile, "--output", jsonFile]+      let outputFile = joinPath [directory, addExtension uuid ".replay"]+      rattletrap "" ["--input", jsonFile, "--output", outputFile]+      output <- readFile outputFile+      unless+        (output == input)+        (Test.assertFailure "output does not match input")  replays :: [(String, String)] replays =-  [ ("00080014003600090000036E0F65CCEB", "a flip time")-  , ("07E925B1423653D44CB8B4B2524792C1", "a game mode before Neo Tokyo")-  , ("0AD21FEE4A512906BEB6C98136AAF49A", "some Latin-1 text")-  , ("1205D96C4D819800927791820096CD49", "rumble mode")-  , ("160CA83E41083BFD8E6315B4BFCA0561", "a dedicated server IP")-  , ("16D580EF479483E015207C901776F9FB", "new property types")-  , ("18D6738D415B70B5BE4C299588D3C141", "an online loadout attribute")-  , ("1A126AC24CAA0DB0E98835BD960B8AF8", "overtime")-  , ("1AE415514DFC65DCBF8B8391AD35488D", "a game time")-  , ("1BC2D01444ACE577D01E988EADD4DFD0", "no padding after the frames")-  , ("1D1DE97D4941C86E43FE0093563DB621", "a camera pitch")-  , ("1EF90FCC4F719F606A5327B3CDD782A4", "a private hoops match")-  , ("1F3798E540B0C37A946561ABBB3037F9", "splitscreen players")-  , ("211466D04B983F5A33CC2FA1D5928672", "a match save")-  , ("22660E3649FC7971E5653692473D4318", "dropshot")-  , ("22BACD794ABE7B92E50E9CBDBD9C59CE", "a vote to forfeit")-  , ("27B6A7B64553F0F685874584F96BAB1B", "some UTF-16 text")-  , ("29F582C34A65EB34D358A784CBE3C189", "frames")-  , ("2CFE577044E651D3FA9DBF83ECA8BCC3", "a new playstation id")-  , ("338173964F9F71EBDD31058A1936CBB4", "patch 1.37")-  , ("372DBFCA4BDB340E4357B6BD43032802", "a camera yaw attribute")-  , ("387F059C47C09E253C875CA990EFD9F2", "a frozen attribute")-  , ("3EA147DD485B8DD24810689A7A989E44", "a custom team name")-  , ("4126861E477F4A03DE2A4080374D7908", "a game mode after Neo Tokyo")-  , ("42F0D8DA4FC89AE7B80FCAB7F637A8EA", "reservations after Neo Tokyo")-  , ("504ED825482186E771FAA9B642CE5CE4", "some messages")-  , ("520E1BFF468CF6C3C48D1EA85D9C7909", "no pickup attribute")-  , ("52AA67F94090C19D33C5009E54D31FE4", "a match-ending attribute")-  , ("540DA764423C8FB24EB9D486D982F16F", "a demolish attribute")-  , ("551CA4D44FF2B86015DE44A6B5790D4C", "private match settings")-  , ("6320E51C49066A7C210A2993C2201D5F", "a forfeit attribute")-  , ("6688EEE34BFEB3EC3A9E3283098CC712", "a malformed byte property")-  , ("6B0D1614417085A7AAD82EAA30D8DABE", "patch 1.37")-  , ("6D1B06D844A5BB91B81FD4B5B28F08BA", "a flip right")-  , ("6F7CFCD24638F8A6567AB3A8B9958A90", "a map with numbers")-  , ("7109EB9846D303E54B7ACBA792036213", "a boost modifier")-  , ("7BF6073F4614CE0A438994B9A260DA6A", "an online loadouts attribute")-  , ("89CBA30E46FA5385BDD35DA4285D4D2E", "remote user data")-  , ("8AE551FF406D7B82ED853B8C7BFF8CDA", "new painted items")-  , ("9704208245D7DD851F2FB2BC7DFD9AC3", "a batarang")-  , ("98E58A904D713F2DE202358E8573265D", "a player using behind view")-  , ("A128B3AB45D5A18E3EF9CF93C9576BCE", "a round count down")-  , ("A52F804845573D8DA65E97BF59026A43", "some more mutators")-  , ("A558B1B44124D6E021640884E8EEC2A7", "extended explosion data")-  , ("A6711CE74272B2E663DCC9A200A218E3", "a waiting player")-  , ("A7F001A1417A19BFA8C90990D8F7C2FF", "a ready attribute")-  , ("AFB1F46A49737E36928E1EABC6F5B7AD", "patch 1.37")-  , ("B9F9B87D4A9D0A3D25D4EC91C0401DE2", "a party leader")-  , ("C14F7E0E4D9B5E6BE9AD5D8ED56B174C", "some mutators")-  , ("C8372B1345B1803DEF039F815DBD802D", "a spectator")-  , ("CC4CA70D4F7A67EBAD0ED9B9923106F7", "after Starbase ARC")-  , ("D0449F5F4AA775B86FFA7DA2B5A3204E", "hoops mutators")-  , ("D428F81646A98C25902CE988AE5C14C8", "a private hockey match")-  , ("D7FB197A451D69075A0C99A2F49A4053", "an explosion attribute")-  , ("DCB3A6B94A9DBE46FDE5EAA9B012F6C8", "a pawn type attribute")-  , ("DE56B1B146687EA2E62E31A37A08C8EB", "a problematic product attribute")-  , ("EAE311E84BA35B590A6FDBA6DD4F2FEB", "an actor/object ID collision")-  , ("EAE8DADA4BB2DC5422792C9B4A67392D", "custom team colors")-  , ("F299F176491554B11E34AB91CA76B2CE", "a location attribute")-  , ("F7B9E14545C7467B89A00895980FCD73", "a hockey game event")-  , ("F811C1D24888015E23B598AD8628C742", "no frames")-  , ("FDC79DA84DD463D4BCCE6B892829AC88", "an MVP")+  [ ("0008", "a flip time")+  , ("000b", "nintendo switch")+  , ("07e9", "a game mode before Neo Tokyo")+  , ("0ad2", "some Latin-1 text")+  , ("1205", "rumble mode")+  , ("160c", "a dedicated server IP")+  , ("16d5", "new property types")+  , ("18d6", "an online loadout attribute")+  , ("1a12", "overtime")+  , ("1ae4", "a game time")+  , ("1bc2", "no padding after the frames")+  , ("1d1d", "a camera pitch")+  , ("1ef9", "a private hoops match")+  , ("1f37", "splitscreen players")+  , ("2114", "a match save")+  , ("2266", "dropshot")+  , ("22ba", "a vote to forfeit")+  , ("27b6", "some UTF-16 text")+  , ("29f5", "frames")+  , ("2cfe", "a new playstation id")+  , ("3381", "patch 1.37")+  , ("372d", "a camera yaw attribute")+  , ("387f", "a frozen attribute")+  , ("3ea1", "a custom team name")+  , ("4126", "a game mode after Neo Tokyo")+  , ("42f0", "reservations after Neo Tokyo")+  , ("504e", "some messages")+  , ("520e", "no pickup attribute")+  , ("52aa", "a match-ending attribute")+  , ("540d", "a demolish attribute")+  , ("551c", "private match settings")+  , ("6320", "a forfeit attribute")+  , ("6688", "a malformed byte property")+  , ("6b0d", "patch 1.37")+  , ("6d1b", "a flip right")+  , ("6f7c", "a map with numbers")+  , ("7109", "a boost modifier")+  , ("7bf6", "an online loadouts attribute")+  , ("89cb", "remote user data")+  , ("8ae5", "new painted items")+  , ("9704", "a batarang")+  , ("98e5", "a player using behind view")+  , ("a128", "a round count down")+  , ("a52f", "some more mutators")+  , ("a558", "extended explosion data")+  , ("a671", "a waiting player")+  , ("a7f0", "a ready attribute")+  , ("afb1", "patch 1.37")+  , ("b9f9", "a party leader")+  , ("c14f", "some mutators")+  , ("c837", "a spectator")+  , ("cc4c", "after Starbase ARC")+  , ("d044", "hoops mutators")+  , ("d428", "a private hockey match")+  , ("d7fb", "an explosion attribute")+  , ("dcb3", "a pawn type attribute")+  , ("de56", "a problematic product attribute")+  , ("eae3", "an actor/object ID collision")+  , ("eae8", "custom team colors")+  , ("f299", "a location attribute")+  , ("f7b9", "a hockey game event")+  , ("f811", "no frames")+  , ("fdc7", "an MVP")   ]