rattletrap 2.5.2 → 3.0.0
raw patch · 30 files changed
+235/−136 lines, 30 filesbinary-added
Files
- library/Rattletrap/Attribute.hs +9/−5
- library/Rattletrap/Attribute/AppliedDamage.hs +1/−6
- library/Rattletrap/Attribute/CamSettings.hs +21/−3
- library/Rattletrap/Attribute/DamageState.hs +1/−7
- library/Rattletrap/Attribute/Loadout.hs +5/−1
- library/Rattletrap/Attribute/LoadoutOnline.hs +14/−24
- library/Rattletrap/Attribute/LoadoutsOnline.hs +9/−4
- library/Rattletrap/Attribute/PrivateMatchSettings.hs +4/−3
- library/Rattletrap/Attribute/ProductAttribute.hs +89/−0
- library/Rattletrap/AttributeValue.hs +11/−5
- library/Rattletrap/ClassAttributeMap.hs +30/−36
- library/Rattletrap/Content.hs +2/−2
- library/Rattletrap/Crc.hs +2/−4
- library/Rattletrap/Data.hs +4/−0
- library/Rattletrap/Frame.hs +4/−4
- library/Rattletrap/Json.hs +1/−0
- library/Rattletrap/Main.hs +3/−2
- library/Rattletrap/Primitive/CompressedWord.hs +1/−3
- library/Rattletrap/Primitive/Text.hs +1/−3
- library/Rattletrap/Replication.hs +4/−4
- library/Rattletrap/Replication/Spawned.hs +5/−11
- library/Rattletrap/Replication/Updated.hs +2/−2
- library/Rattletrap/ReplicationValue.hs +2/−2
- library/Rattletrap/Utility.hs +1/−3
- package.yaml +1/−1
- rattletrap.cabal +5/−1
- replays/338173964F9F71EBDD31058A1936CBB4.replay binary
- replays/6B0D1614417085A7AAD82EAA30D8DABE.replay binary
- replays/AFB1F46A49737E36928E1EABC6F5B7AD.replay binary
- tests/Main.hs +3/−0
library/Rattletrap/Attribute.hs view
@@ -16,8 +16,8 @@ , attributeValue :: AttributeValue } deriving (Eq, Ord, Show) -getAttributes- :: (Int, Int)+getAttributes ::+ (Int, Int) -> ClassAttributeMap -> ActorMap -> CompressedWord@@ -36,8 +36,8 @@ mapM_ putAttribute attributes BinaryBit.putBool False -getAttribute- :: (Int, Int)+getAttribute ::+ (Int, Int) -> ClassAttributeMap -> ActorMap -> CompressedWord@@ -54,7 +54,11 @@ case getAttributeName classAttributeMap attributeMap id_ of Nothing -> fail ("could not get attribute name for " ++ show id_) Just name -> do- value <- getAttributeValue version name+ value <-+ getAttributeValue+ version+ (classAttributeMapObjectMap classAttributeMap)+ name pure (Attribute id_ name value) putAttribute :: Attribute -> BinaryBit.BitPut ()
library/Rattletrap/Attribute/AppliedDamage.hs view
@@ -18,12 +18,7 @@ location <- getVector unknown3 <- getInt32Bits unknown4 <- getInt32Bits- pure- (AppliedDamageAttribute- unknown1- location- unknown3- unknown4)+ pure (AppliedDamageAttribute unknown1 location unknown3 unknown4) putAppliedDamageAttribute :: AppliedDamageAttribute -> BinaryBit.BitPut () putAppliedDamageAttribute appliedDamageAttribute = do
library/Rattletrap/Attribute/CamSettings.hs view
@@ -12,17 +12,32 @@ , camSettingsAttributeDistance :: Float32 , camSettingsAttributeStiffness :: Float32 , camSettingsAttributeSwivelSpeed :: Float32+ , camSettingsAttributeTransitionSpeed :: Maybe Float32 } deriving (Eq, Ord, Show) -getCamSettingsAttribute :: BinaryBit.BitGet CamSettingsAttribute-getCamSettingsAttribute = do+getCamSettingsAttribute :: (Int, Int) -> BinaryBit.BitGet CamSettingsAttribute+getCamSettingsAttribute version = do fov <- getFloat32Bits height <- getFloat32Bits angle <- getFloat32Bits distance <- getFloat32Bits stiffness <- getFloat32Bits swivelSpeed <- getFloat32Bits- pure (CamSettingsAttribute fov height angle distance stiffness swivelSpeed)+ transitionSpeed <-+ if version >= (868, 20)+ 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@@ -32,3 +47,6 @@ putFloat32Bits (camSettingsAttributeDistance camSettingsAttribute) putFloat32Bits (camSettingsAttributeStiffness camSettingsAttribute) putFloat32Bits (camSettingsAttributeSwivelSpeed camSettingsAttribute)+ case camSettingsAttributeTransitionSpeed camSettingsAttribute of+ Nothing -> pure ()+ Just transitionSpeed -> putFloat32Bits transitionSpeed
library/Rattletrap/Attribute/DamageState.hs view
@@ -23,13 +23,7 @@ unknown5 <- BinaryBit.getBool unknown6 <- BinaryBit.getBool pure- (DamageStateAttribute- unknown1- unknown2- unknown3- unknown4- unknown5- unknown6)+ (DamageStateAttribute unknown1 unknown2 unknown3 unknown4 unknown5 unknown6) putDamageStateAttribute :: DamageStateAttribute -> BinaryBit.BitPut () putDamageStateAttribute damageStateAttribute = do
library/Rattletrap/Attribute/Loadout.hs view
@@ -19,6 +19,7 @@ , loadoutAttributeEngineAudio :: Maybe Word32 , loadoutAttributeTrail :: Maybe Word32 , loadoutAttributeGoalExplosion :: Maybe Word32+ , loadoutAttributeBanner :: Maybe Word32 } deriving (Eq, Ord, Show) getLoadoutAttribute :: BinaryBit.BitGet LoadoutAttribute@@ -35,6 +36,7 @@ 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@@ -48,7 +50,8 @@ unknown2 engineAudio trail- goalExplosion)+ goalExplosion+ banner) getOptional :: Bool -> BinaryBit.BitGet a -> BinaryBit.BitGet (Maybe a) getOptional p f =@@ -72,6 +75,7 @@ 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 =
library/Rattletrap/Attribute/LoadoutOnline.hs view
@@ -1,41 +1,31 @@ module Rattletrap.Attribute.LoadoutOnline where +import Rattletrap.Attribute.ProductAttribute 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 :: [[(Word32, CompressedWord)]]+ { loadoutAttributeValue :: [[ProductAttribute]] } deriving (Eq, Ord, Show) getLoadoutOnlineAttribute ::- (Int, Int) -> BinaryBit.BitGet LoadoutOnlineAttribute-getLoadoutOnlineAttribute (major, minor) = do- let getOuter = do- innerSize <- getWord8Bits- Monad.replicateM (fromIntegral (word8Value innerSize)) getInner- getInner = do- x <- getWord32Bits- y <- getCompressedWord limit- pure (x, y)- limit =- if major >= 868 && minor >= 18- then 2 ^ (32 :: Int)- else 27+ (Int, Int)+ -> Map.Map Word32 Text+ -> BinaryBit.BitGet LoadoutOnlineAttribute+getLoadoutOnlineAttribute version objectMap = do size <- getWord8Bits- values <- Monad.replicateM (fromIntegral (word8Value size)) getOuter+ values <-+ Monad.replicateM+ (fromIntegral (word8Value size))+ (getProductAttributes version objectMap) pure (LoadoutOnlineAttribute values) putLoadoutOnlineAttribute :: LoadoutOnlineAttribute -> BinaryBit.BitPut () putLoadoutOnlineAttribute loadoutAttribute = do- let putOuter xs = do- putWord8Bits (Word8 (fromIntegral (length xs)))- mapM_ putInner xs- putInner (x, y) = do- putWord32Bits x- putCompressedWord y- value = loadoutAttributeValue loadoutAttribute- putWord8Bits (Word8 (fromIntegral (length value)))- mapM_ putOuter value+ let attributes = loadoutAttributeValue loadoutAttribute+ putWord8Bits (Word8 (fromIntegral (length attributes)))+ mapM_ putProductAttributes attributes
library/Rattletrap/Attribute/LoadoutsOnline.hs view
@@ -1,9 +1,11 @@ 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@@ -12,10 +14,13 @@ , loadoutsOnlineAttributeUnknown2 :: Bool } deriving (Eq, Ord, Show) -getLoadoutsOnlineAttribute :: (Int, Int) -> BinaryBit.BitGet LoadoutsOnlineAttribute-getLoadoutsOnlineAttribute version = do- blueLoadout <- getLoadoutOnlineAttribute version- orangeLoadout <- getLoadoutOnlineAttribute version+getLoadoutsOnlineAttribute ::+ (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)
library/Rattletrap/Attribute/PrivateMatchSettings.hs view
@@ -14,7 +14,8 @@ , privateMatchSettingsAttributeFlag :: Bool } deriving (Eq, Ord, Show) -getPrivateMatchSettingsAttribute :: BinaryBit.BitGet PrivateMatchSettingsAttribute+getPrivateMatchSettingsAttribute ::+ BinaryBit.BitGet PrivateMatchSettingsAttribute getPrivateMatchSettingsAttribute = do mutators <- getTextBits joinableBy <- getWord32Bits@@ -31,8 +32,8 @@ password flag) -putPrivateMatchSettingsAttribute :: PrivateMatchSettingsAttribute- -> BinaryBit.BitPut ()+putPrivateMatchSettingsAttribute ::+ PrivateMatchSettingsAttribute -> BinaryBit.BitPut () putPrivateMatchSettingsAttribute privateMatchSettingsAttribute = do putTextBits (privateMatchSettingsAttributeMutators privateMatchSettingsAttribute)
+ library/Rattletrap/Attribute/ProductAttribute.hs view
@@ -0,0 +1,89 @@+module Rattletrap.Attribute.ProductAttribute 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) -> Map.Map Word32 Text -> BinaryBit.BitGet [ProductAttribute]+getProductAttributes version objectMap = do+ size <- getWord8Bits+ Monad.replicateM+ (fromIntegral (word8Value size))+ (getProductAttribute version objectMap)++getProductAttribute ::+ (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)+ then do+ x <- BinaryBit.getWord32be 31+ pure (Just (Right x))+ else do+ x <- getCompressedWord 14+ 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/AttributeValue.hs view
@@ -23,6 +23,7 @@ , module Rattletrap.Attribute.PartyLeader , module Rattletrap.Attribute.Pickup , module Rattletrap.Attribute.PrivateMatchSettings+ , module Rattletrap.Attribute.ProductAttribute , module Rattletrap.Attribute.QWord , module Rattletrap.Attribute.Reservation , module Rattletrap.Attribute.RigidBodyState@@ -55,6 +56,7 @@ import Rattletrap.Attribute.PartyLeader import Rattletrap.Attribute.Pickup import Rattletrap.Attribute.PrivateMatchSettings+import Rattletrap.Attribute.ProductAttribute import Rattletrap.Attribute.QWord import Rattletrap.Attribute.Reservation import Rattletrap.Attribute.RigidBodyState@@ -103,8 +105,12 @@ | WeldedInfoAttributeValue WeldedInfoAttribute deriving (Eq, Ord, Show) -getAttributeValue :: (Int, Int) -> Text -> BinaryBit.BitGet AttributeValue-getAttributeValue version name =+getAttributeValue ::+ (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@@ -118,7 +124,7 @@ x <- getByteAttribute pure (ByteAttributeValue x) CamSettingsAttributeType -> do- x <- getCamSettingsAttribute+ x <- getCamSettingsAttribute version pure (CamSettingsAttributeValue x) ClubColorsAttributeType -> do x <- getClubColorsAttribute@@ -154,13 +160,13 @@ x <- getLoadoutAttribute pure (LoadoutAttributeValue x) LoadoutOnlineAttributeType -> do- x <- getLoadoutOnlineAttribute version+ x <- getLoadoutOnlineAttribute version objectMap pure (LoadoutOnlineAttributeValue x) LoadoutsAttributeType -> do x <- getLoadoutsAttribute pure (LoadoutsAttributeValue x) LoadoutsOnlineAttributeType -> do- x <- getLoadoutsOnlineAttribute version+ x <- getLoadoutsOnlineAttribute version objectMap pure (LoadoutsOnlineAttributeValue x) LocationAttributeType -> do x <- getLocationAttribute
library/Rattletrap/ClassAttributeMap.hs view
@@ -33,8 +33,8 @@ -- | Makes a 'ClassAttributeMap' given the necessary fields from the -- 'Rattletrap.Content.Content'.-makeClassAttributeMap- :: List Text+makeClassAttributeMap ::+ List Text -- ^ From 'Rattletrap.Content.contentObjects'. -> List ClassMapping -- ^ From 'Rattletrap.Content.contentClassMappings'.@@ -82,9 +82,8 @@ getName nameMap nameIndex = IntMap.lookup (fromIntegral (word32Value nameIndex)) nameMap -makeObjectClassMap :: Map.Map Word32 Text- -> Bimap.Bimap Word32 Text- -> Map.Map Word32 Word32+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@@ -98,18 +97,17 @@ rawPairs Map.fromList pairs -getClassId :: Map.Map Word32 Text- -> Bimap.Bimap Word32 Text- -> Word32- -> Maybe Word32+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 ::+ Bimap.Bimap Word32 Text+ -> List Cache+ -> [(Maybe Text, Word32, Word32, Word32)] makeClassCache classMap caches = map (\cache ->@@ -142,8 +140,8 @@ (listValue (cacheAttributeMappings cache))))) (listValue caches)) -makeShallowParentMap :: [(Maybe Text, Word32, Word32, Word32)]- -> Map.Map Word32 Word32+makeShallowParentMap ::+ [(Maybe Text, Word32, Word32, Word32)] -> Map.Map Word32 Word32 makeShallowParentMap classCache = Map.fromList (Maybe.mapMaybe@@ -155,8 +153,8 @@ pure (classId, parentClassId)) (List.tails (reverse classCache))) -makeParentMap :: [(Maybe Text, Word32, Word32, Word32)]- -> Map.Map Word32 [Word32]+makeParentMap ::+ [(Maybe Text, Word32, Word32, Word32)] -> Map.Map Word32 [Word32] makeParentMap classCache = let shallowParentMap = makeShallowParentMap classCache in Map.mapWithKey@@ -170,18 +168,18 @@ Just parentClassId -> parentClassId : getParentClasses shallowParentMap parentClassId -getParentClass :: Maybe Text- -> Word32- -> [(Maybe Text, Word32, Word32, Word32)]- -> Maybe Word32+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 ::+ Word32 -> [(Maybe Text, Word32, Word32, Word32)] -> Maybe Word32 getParentClassById parentCacheId xs = case dropWhile (\(_, _, cacheId, _) -> cacheId /= parentCacheId) xs of [] ->@@ -190,10 +188,8 @@ else getParentClassById (Word32 (word32Value parentCacheId - 1)) xs (_, parentClassId, _, _):_ -> Just parentClassId -getParentClassByName :: Text- -> Word32- -> [(Maybe Text, Word32, Word32, Word32)]- -> Maybe Word32+getParentClassByName ::+ Text -> Word32 -> [(Maybe Text, Word32, Word32, Word32)] -> Maybe Word32 getParentClassByName className parentCacheId xs = case Map.lookup className parentClasses of Nothing -> getParentClassById parentCacheId xs@@ -205,7 +201,7 @@ (map (\(_, parentClassId, _, _) -> parentClassId) (filter- (\(_, _, cacheId, _) -> cacheId == parentCacheId)+ (\(_, _, cacheId, _) -> cacheId <= parentCacheId) (filter (\(maybeClassName, _, _, _) -> maybeClassName == Just parentClassName)@@ -245,8 +241,8 @@ else if Text.isInfixOf mapScoreboard name then Text mapScoreboard else if Text.isInfixOf breakout name- then Text breakout- else objectName+ then Text breakout+ else objectName objectClasses :: Map.Map Text Text objectClasses =@@ -272,18 +268,16 @@ let limit = fromIntegral (word32Value streamId) pure limit -getAttributeName :: ClassAttributeMap- -> Map.Map Word32 Word32- -> CompressedWord- -> Maybe Text+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+getAttributeMap ::+ ClassAttributeMap -> ActorMap -> CompressedWord -> Maybe (Map.Map Word32 Word32)
library/Rattletrap/Content.hs view
@@ -51,8 +51,8 @@ -- for the 'Rattletrap.ClassAttributeMap.ClassAttributeMap'. } deriving (Eq, Ord, Show) -getContent- :: (Int, Int)+getContent ::+ (Int, Int) -- ^ Major and minor version numbers, usually from -- 'Rattletrap.Header.getVersion'. -> Int
library/Rattletrap/Crc.hs view
@@ -23,10 +23,8 @@ let crc = ByteString.foldl update initial bytes Bits.complement crc -crc32Update :: Vector.Vector Word.Word32- -> Word.Word32- -> Word.Word8- -> Word.Word32+crc32Update ::+ Vector.Vector Word.Word32 -> Word.Word32 -> Word.Word8 -> Word.Word32 crc32Update table crc byte = do let toWord8 = fromIntegral :: (Integral a) =>
library/Rattletrap/Data.hs view
@@ -179,6 +179,7 @@ , ("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)@@ -250,6 +251,7 @@ , ("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)@@ -271,7 +273,9 @@ , ("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)
library/Rattletrap/Frame.hs view
@@ -17,8 +17,8 @@ , frameReplications :: [Replication] } deriving (Eq, Ord, Show) -getFrames- :: (Int, Int)+getFrames ::+ (Int, Int) -> Int -> Word -> ClassAttributeMap@@ -42,8 +42,8 @@ putFrames :: [Frame] -> BinaryBit.BitPut () putFrames = mapM_ putFrame -getFrame- :: (Int, Int)+getFrame ::+ (Int, Int) -> Word -> ClassAttributeMap -> ActorMap
library/Rattletrap/Json.hs view
@@ -86,6 +86,7 @@ , ''PartyLeaderAttribute , ''PickupAttribute , ''PrivateMatchSettingsAttribute+ , ''ProductAttribute , ''Property , ''PropertyValue , ''QWordAttribute
library/Rattletrap/Main.hs view
@@ -45,8 +45,9 @@ putOutput output _ -> fail ("unknown arguments: " ++ show args) -getIO :: [FilePath]- -> IO (IO ByteString.ByteString, ByteString.ByteString -> IO ())+getIO ::+ [FilePath]+ -> IO (IO ByteString.ByteString, ByteString.ByteString -> IO ()) getIO files = case files of [] -> pure (ByteString.getContents, ByteString.putStr)
library/Rattletrap/Primitive/CompressedWord.hs view
@@ -36,9 +36,7 @@ else pure () go 0 0 -getMaxBits- :: (Integral a, Integral b)- => a -> b+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
library/Rattletrap/Primitive/Text.hs view
@@ -73,9 +73,7 @@ else scale * rawSize in Int32 size -normalizeTextSize- :: Integral a- => Int32 -> a+normalizeTextSize :: Integral a => Int32 -> a normalizeTextSize size = case int32Value size of 0x05000000 -> 8
library/Rattletrap/Replication.hs view
@@ -13,8 +13,8 @@ , replicationValue :: ReplicationValue } deriving (Eq, Ord, Show) -getReplications- :: (Int, Int)+getReplications ::+ (Int, Int) -> Word -> ClassAttributeMap -> ActorMap@@ -34,8 +34,8 @@ mapM_ putReplication replications BinaryBit.putBool False -getReplication- :: (Int, Int)+getReplication ::+ (Int, Int) -> Word -> ClassAttributeMap -> ActorMap
library/Rattletrap/Replication/Spawned.hs view
@@ -26,8 +26,8 @@ , spawnedReplicationInitialization :: Initialization } deriving (Eq, Ord, Show) -getSpawnedReplication- :: (Int, Int)+getSpawnedReplication ::+ (Int, Int) -> ClassAttributeMap -> ActorMap -> CompressedWord@@ -68,9 +68,7 @@ putWord32Bits (spawnedReplicationObjectId spawnedReplication) putInitialization (spawnedReplicationInitialization spawnedReplication) -lookupName- :: Monad m- => ClassAttributeMap -> Maybe Word32 -> m (Maybe Text)+lookupName :: Monad m => ClassAttributeMap -> Maybe Word32 -> m (Maybe Text) lookupName classAttributeMap maybeNameIndex = case maybeNameIndex of Nothing -> pure Nothing@@ -79,17 +77,13 @@ Nothing -> fail ("could not get name for index " ++ show nameIndex) Just name -> pure (Just name) -lookupObjectName- :: Monad m- => ClassAttributeMap -> Word32 -> m Text+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 :: Monad m => Text -> m Text lookupClassName objectName = case getClassName objectName of Nothing -> fail ("could not get class name for object " ++ show objectName)
library/Rattletrap/Replication/Updated.hs view
@@ -12,8 +12,8 @@ { updatedReplicationAttributes :: [Attribute] } deriving (Eq, Ord, Show) -getUpdatedReplication- :: (Int, Int)+getUpdatedReplication ::+ (Int, Int) -> ClassAttributeMap -> ActorMap -> CompressedWord
library/Rattletrap/ReplicationValue.hs view
@@ -24,8 +24,8 @@ -- ^ Destroys an existing actor. deriving (Eq, Ord, Show) -getReplicationValue- :: (Int, Int)+getReplicationValue ::+ (Int, Int) -> ClassAttributeMap -> ActorMap -> CompressedWord
library/Rattletrap/Utility.hs view
@@ -9,9 +9,7 @@ encodeLatin1 :: Text.Text -> ByteString.ByteString encodeLatin1 text = ByteString8.pack (Text.unpack text) -padBytes- :: Integral a- => a -> ByteString.ByteString -> ByteString.ByteString+padBytes :: Integral a => a -> ByteString.ByteString -> ByteString.ByteString padBytes size bytes = ByteString.concat [ bytes
package.yaml view
@@ -1,5 +1,5 @@ name: rattletrap-version: 2.5.2+version: 3.0.0 category: Game description: Rattletrap parses and generates Rocket League replays.
rattletrap.cabal view
@@ -3,7 +3,7 @@ -- see: https://github.com/sol/hpack name: rattletrap-version: 2.5.2+version: 3.0.0 synopsis: Parse and generate Rocket League replays. description: Rattletrap parses and generates Rocket League replays. category: Game@@ -37,6 +37,7 @@ replays/22BACD794ABE7B92E50E9CBDBD9C59CE.replay replays/27B6A7B64553F0F685874584F96BAB1B.replay replays/29F582C34A65EB34D358A784CBE3C189.replay+ replays/338173964F9F71EBDD31058A1936CBB4.replay replays/372DBFCA4BDB340E4357B6BD43032802.replay replays/387F059C47C09E253C875CA990EFD9F2.replay replays/3EA147DD485B8DD24810689A7A989E44.replay@@ -49,6 +50,7 @@ replays/551CA4D44FF2B86015DE44A6B5790D4C.replay replays/6320E51C49066A7C210A2993C2201D5F.replay replays/6688EEE34BFEB3EC3A9E3283098CC712.replay+ replays/6B0D1614417085A7AAD82EAA30D8DABE.replay replays/6D1B06D844A5BB91B81FD4B5B28F08BA.replay replays/6F7CFCD24638F8A6567AB3A8B9958A90.replay replays/7109EB9846D303E54B7ACBA792036213.replay@@ -62,6 +64,7 @@ replays/A558B1B44124D6E021640884E8EEC2A7.replay replays/A6711CE74272B2E663DCC9A200A218E3.replay replays/A7F001A1417A19BFA8C90990D8F7C2FF.replay+ replays/AFB1F46A49737E36928E1EABC6F5B7AD.replay replays/B9F9B87D4A9D0A3D25D4EC91C0401DE2.replay replays/C14F7E0E4D9B5E6BE9AD5D8ED56B174C.replay replays/C8372B1345B1803DEF039F815DBD802D.replay@@ -126,6 +129,7 @@ Rattletrap.Attribute.PartyLeader Rattletrap.Attribute.Pickup Rattletrap.Attribute.PrivateMatchSettings+ Rattletrap.Attribute.ProductAttribute Rattletrap.Attribute.QWord Rattletrap.Attribute.Reservation Rattletrap.Attribute.RigidBodyState
+ replays/338173964F9F71EBDD31058A1936CBB4.replay view
binary file changed (absent → 1556372 bytes)
+ replays/6B0D1614417085A7AAD82EAA30D8DABE.replay view
binary file changed (absent → 1294929 bytes)
+ replays/AFB1F46A49737E36928E1EABC6F5B7AD.replay view
binary file changed (absent → 32310 bytes)
tests/Main.hs view
@@ -58,6 +58,7 @@ , ("22BACD794ABE7B92E50E9CBDBD9C59CE", "a vote to forfeit") , ("27B6A7B64553F0F685874584F96BAB1B", "some UTF-16 text") , ("29F582C34A65EB34D358A784CBE3C189", "frames")+ , ("338173964F9F71EBDD31058A1936CBB4", "patch 1.37") , ("372DBFCA4BDB340E4357B6BD43032802", "a camera yaw attribute") , ("387F059C47C09E253C875CA990EFD9F2", "a frozen attribute") , ("3EA147DD485B8DD24810689A7A989E44", "a custom team name")@@ -70,6 +71,7 @@ , ("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")@@ -83,6 +85,7 @@ , ("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")