rattletrap 9.0.1 → 9.0.2
raw patch · 11 files changed
+131/−24 lines, 11 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Rattletrap: AttributeTypeFlaggedByte :: AttributeType
+ Rattletrap: AttributeValueFlaggedByte :: FlaggedByteAttribute -> AttributeValue
Files
- README.markdown +21/−18
- library/Rattletrap/Data.hs +54/−4
- library/Rattletrap/Decode/AttributeValue.hs +3/−0
- library/Rattletrap/Decode/FlaggedByteAttribute.hs +12/−0
- library/Rattletrap/Encode/AttributeValue.hs +2/−0
- library/Rattletrap/Encode/FlaggedByteAttribute.hs +14/−0
- library/Rattletrap/Type/AttributeType.hs +1/−0
- library/Rattletrap/Type/AttributeValue.hs +2/−0
- library/Rattletrap/Type/FlaggedByteAttribute.hs +16/−0
- rattletrap.cabal +4/−1
- tests/Main.hs +2/−1
README.markdown view
@@ -11,8 +11,8 @@ can be used to modify replays in order to force everyone into the same car or change the map a game was played on. -Rattletrap supports every version of Rocket League up to [1.62][], also known-as the "esports shop update". If a replay can be played by the Rocket League+Rattletrap supports every version of Rocket League up to [1.66][], also known+as the "season 12 update". If a replay can be played by the Rocket League client, it can be parsed by Rattletrap. (If not, that's a bug. Please report it!) @@ -51,8 +51,11 @@ Rattletrap is a command line application. ``` sh-> rattletrap --help-rattletrap.EXE version 8.0.0+$ rattletrap --help+```++```+rattletrap version 9.0.1 -c --compact minify JSON output -f --fast only encode or decode the header -h --help show the help@@ -68,23 +71,23 @@ `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)+--- | --- | ---+`.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 --input http://example.com/input.replay --output output.json+$ rattletrap --input http://example.com/input.replay --output output.json # or-> rattletrap -i input.replay -o output.json+$ rattletrap -i input.replay -o output.json # or-> rattletrap < input.replay > output.json+$ rattletrap < input.replay > output.json ``` The input argument can either be a local path or a URL.@@ -99,11 +102,11 @@ Rattletrap can also generate (encode) Rocket League replays from JSON files. ``` sh-> rattletrap --input http://example.com/input.json --output output.replay+$ rattletrap --input http://example.com/input.json --output output.replay # or-> rattletrap -i input.json -o output.replay+$ rattletrap -i input.json -o output.replay # or-> rattletrap --mode encode < input.json > output.replay+$ rattletrap --mode encode < input.json > output.replay ``` The input argument can either be a local path or a URL.@@ -117,7 +120,7 @@ used to modify replays. ``` sh-> rattletrap -i input.replay |+$ rattletrap -i input.replay | modify-replay-json | rattletrap -o output.replay ```@@ -132,7 +135,7 @@ [Docker build badge]: https://img.shields.io/docker/build/taylorfausak/rattletrap.svg?label=docker&logo=docker&logoColor=white [docker build]: https://hub.docker.com/r/taylorfausak/rattletrap [Rocket League]: https://www.rocketleague.com-[1.62]: https://www.rocketleague.com/news/patch-notes-v1-62/+[1.66]: https://www.rocketleague.com/news/patch-notes-v1-66-season-12-update-/ [Ball Chasing]: https://ballchasing.com [Haskell]: https://www.haskell.org [C# parser]: https://github.com/jjbott/RocketLeagueReplayParser
library/Rattletrap/Data.hs view
@@ -59,6 +59,7 @@ , ("TAGame.SpecialPickup_TA", "TAGame.CarComponent_TA") , ("TAGame.SpecialPickup_Targeted_TA", "TAGame.SpecialPickup_TA") , ("TAGame.SpecialPickup_Tornado_TA", "TAGame.SpecialPickup_TA")+ , ("TAGame.SpecialPickup_HauntedBallBeam_TA", "TAGame.SpecialPickup_TA") , ("TAGame.Team_Soccar_TA", "TAGame.Team_TA") , ("TAGame.Team_TA", "Engine.TeamInfo") , ("TAGame.Vehicle_TA", "TAGame.RBActor_TA")@@ -69,10 +70,23 @@ rawClassesWithLocation :: [String] rawClassesWithLocation = [ "TAGame.Ball_Breakout_TA"+ , "Archetypes.Ball.Ball_Breakout" , "TAGame.Ball_TA"- , "TAGame.CameraSettingsActor_TA"+ , "Archetypes.Ball.Ball_BasketBall_Mutator"+ , "Archetypes.Ball.Ball_BasketBall"+ , "Archetypes.Ball.Ball_Basketball"+ , "Archetypes.Ball.Ball_Default"+ , "Archetypes.Ball.Ball_Puck"+ , "Archetypes.Ball.CubeBall"+ , "Archetypes.Ball.Ball_Haunted"+ , "TAGame.Ball_Haunted_TA" , "TAGame.Car_Season_TA" , "TAGame.Car_TA"+ , "Archetypes.Car.Car_Default"+ , "Archetypes.GameEvent.GameEvent_Season:CarArchetype"+ , "Archetypes.SpecialPickups.SpecialPickup_HauntedBallBeam"+ , "Archetypes.SpecialPickups.SpecialPickup_Rugby"+ , "TAGame.CameraSettingsActor_TA" , "TAGame.CarComponent_Boost_TA" , "TAGame.CarComponent_Dodge_TA" , "TAGame.CarComponent_DoubleJump_TA"@@ -96,14 +110,36 @@ , "TAGame.SpecialPickup_Swapper_TA" , "TAGame.SpecialPickup_Tornado_TA" , "TAGame.Team_Soccar_TA"+ , "TAGame.Default__CameraSettingsActor_TA"+ , "TAGame.Default__PRI_TA"+ , "TheWorld:PersistentLevel.BreakOutActor_Platform_TA"+ , "TheWorld:PersistentLevel.CrowdActor_TA"+ , "TheWorld:PersistentLevel.CrowdManager_TA"+ , "TheWorld:PersistentLevel.InMapScoreboard_TA"+ , "TheWorld:PersistentLevel.VehiclePickup_Boost_TA"+ , "TAGame.HauntedBallTrapTrigger_TA"+ , "ProjectX.NetModeReplicator" ] rawClassesWithRotation :: [String] rawClassesWithRotation = [ "TAGame.Ball_Breakout_TA"+ , "Archetypes.Ball.Ball_Breakout" , "TAGame.Ball_TA"+ , "Archetypes.Ball.Ball_BasketBall_Mutator"+ , "Archetypes.Ball.Ball_BasketBall"+ , "Archetypes.Ball.Ball_Basketball"+ , "Archetypes.Ball.Ball_Default"+ , "Archetypes.Ball.Ball_Puck"+ , "Archetypes.Ball.CubeBall"+ , "Archetypes.Ball.Ball_Haunted"+ , "TAGame.Ball_Haunted_TA" , "TAGame.Car_Season_TA" , "TAGame.Car_TA"+ , "Archetypes.Car.Car_Default"+ , "Archetypes.GameEvent.GameEvent_Season:CarArchetype"+ , "Archetypes.SpecialPickups.SpecialPickup_HauntedBallBeam"+ , "Archetypes.SpecialPickups.SpecialPickup_Rugby" -- This comments forces Brittany to use a multi-line layout for this list. ] @@ -112,8 +148,10 @@ [ ("Archetypes.Ball.Ball_BasketBall_Mutator", "TAGame.Ball_TA") , ("Archetypes.Ball.Ball_Basketball", "TAGame.Ball_TA") , ("Archetypes.Ball.Ball_BasketBall", "TAGame.Ball_TA")+ , ("Archetypes.Ball.Ball_Beachball", "TAGame.Ball_TA") , ("Archetypes.Ball.Ball_Breakout", "TAGame.Ball_Breakout_TA") , ("Archetypes.Ball.Ball_Default", "TAGame.Ball_TA")+ , ("Archetypes.Ball.Ball_Haunted", "TAGame.Ball_Haunted_TA") , ("Archetypes.Ball.Ball_Puck", "TAGame.Ball_TA") , ("Archetypes.Ball.CubeBall", "TAGame.Ball_TA") , ("Archetypes.Car.Car_Default", "TAGame.Car_TA")@@ -148,6 +186,8 @@ , ("Archetypes.SpecialPickups.SpecialPickup_StrongHit", "TAGame.SpecialPickup_HitForce_TA") , ("Archetypes.SpecialPickups.SpecialPickup_Swapper", "TAGame.SpecialPickup_Swapper_TA") , ("Archetypes.SpecialPickups.SpecialPickup_Tornado", "TAGame.SpecialPickup_Tornado_TA")+ , ("Archetypes.SpecialPickups.SpecialPickup_HauntedBallBeam", "TAGame.SpecialPickup_HauntedBallBeam_TA")+ , ("Archetypes.SpecialPickups.SpecialPickup_Rugby", "TAGame.SpecialPickup_Rugby_TA") , ("Archetypes.Teams.Team0", "TAGame.Team_Soccar_TA") , ("Archetypes.Teams.Team1", "TAGame.Team_Soccar_TA") , ("GameInfo_Basketball.GameInfo.GameInfo_Basketball:GameReplicationInfoArchetype", "TAGame.GRI_TA")@@ -156,6 +196,7 @@ , ("GameInfo_Items.GameInfo.GameInfo_Items:GameReplicationInfoArchetype", "TAGame.GRI_TA") , ("GameInfo_Season.GameInfo.GameInfo_Season:GameReplicationInfoArchetype", "TAGame.GRI_TA") , ("GameInfo_Soccar.GameInfo.GameInfo_Soccar:GameReplicationInfoArchetype", "TAGame.GRI_TA")+ , ("ProjectX.Default__NetModeReplicator_X", "ProjectX.NetModeReplicator") , ("TAGame.Default__CameraSettingsActor_TA", "TAGame.CameraSettingsActor_TA") , ("TAGame.Default__PRI_TA", "TAGame.PRI_TA") , ("TheWorld:PersistentLevel.BreakOutActor_Platform_TA", "TAGame.BreakOutActor_Platform_TA")@@ -163,6 +204,8 @@ , ("TheWorld:PersistentLevel.CrowdManager_TA", "TAGame.CrowdManager_TA") , ("TheWorld:PersistentLevel.InMapScoreboard_TA", "TAGame.InMapScoreboard_TA") , ("TheWorld:PersistentLevel.VehiclePickup_Boost_TA", "TAGame.VehiclePickup_Boost_TA")+ , ("Haunted_TrainStation_P.TheWorld:PersistentLevel.HauntedBallTrapTrigger_TA_1", "TAGame.HauntedBallTrapTrigger_TA")+ , ("Haunted_TrainStation_P.TheWorld:PersistentLevel.HauntedBallTrapTrigger_TA_0", "TAGame.HauntedBallTrapTrigger_TA") ] rawAttributeTypes :: [(String, AttributeType)]@@ -297,15 +340,16 @@ , ("TAGame.PRI_TA:PersistentCamera", AttributeTypeFlaggedInt) , ("TAGame.PRI_TA:PlayerHistoryKey", AttributeTypePlayerHistoryKey) , ("TAGame.PRI_TA:PlayerHistoryValid", AttributeTypeBoolean)- , ("TAGame.PRI_TA:PrimaryTitle", AttributeTypeTitle) , ("TAGame.PRI_TA:ReplicatedGameEvent", AttributeTypeFlaggedInt) , ("TAGame.PRI_TA:ReplicatedWorstNetQualityBeyondLatency", AttributeTypeByte)- , ("TAGame.PRI_TA:SecondaryTitle", AttributeTypeTitle)- , ("TAGame.PRI_TA:SpectatorShortcut", AttributeTypeInt) , ("TAGame.PRI_TA:SteeringSensitivity", AttributeTypeFloat)+ , ("TAGame.PRI_TA:SkillTier", AttributeTypeFlaggedByte) , ("TAGame.PRI_TA:TimeTillItem", AttributeTypeInt) , ("TAGame.PRI_TA:Title", AttributeTypeInt) , ("TAGame.PRI_TA:TotalXP", AttributeTypeInt)+ , ("TAGame.PRI_TA:PrimaryTitle", AttributeTypeTitle)+ , ("TAGame.PRI_TA:SecondaryTitle", AttributeTypeTitle)+ , ("TAGame.PRI_TA:SpectatorShortcut", AttributeTypeInt) , ("TAGame.RBActor_TA:bFrozen", AttributeTypeBoolean) , ("TAGame.RBActor_TA:bIgnoreSyncing", AttributeTypeBoolean) , ("TAGame.RBActor_TA:bReplayActor", AttributeTypeBoolean)@@ -329,6 +373,12 @@ , ("TAGame.Vehicle_TA:ReplicatedThrottle", AttributeTypeByte) , ("TAGame.VehiclePickup_TA:bNoPickup", AttributeTypeBoolean) , ("TAGame.VehiclePickup_TA:ReplicatedPickupData", AttributeTypePickup)+ , ("TAGame.Ball_Haunted_TA:LastTeamTouch", AttributeTypeByte)+ , ("TAGame.Ball_Haunted_TA:TotalActiveBeams", AttributeTypeByte)+ , ("TAGame.Ball_Haunted_TA:DeactivatedGoalIndex", AttributeTypeByte)+ , ("TAGame.Ball_Haunted_TA:ReplicatedBeamBrokenValue", AttributeTypeByte)+ , ("TAGame.Ball_Haunted_TA:bIsBallBeamed", AttributeTypeBoolean)+ , ("TAGame.SpecialPickup_Rugby_TA:bBallWelded", AttributeTypeBoolean) ] rawCrc32Table :: Integral a => [a]
library/Rattletrap/Decode/AttributeValue.hs view
@@ -17,6 +17,7 @@ import Rattletrap.Decode.ExplosionAttribute import Rattletrap.Decode.ExtendedExplosionAttribute import Rattletrap.Decode.FlaggedIntAttribute+import Rattletrap.Decode.FlaggedByteAttribute import Rattletrap.Decode.FloatAttribute import Rattletrap.Decode.GameModeAttribute import Rattletrap.Decode.Int64Attribute@@ -76,6 +77,8 @@ <$> decodeExtendedExplosionAttributeBits version AttributeTypeFlaggedInt -> AttributeValueFlaggedInt <$> decodeFlaggedIntAttributeBits+ AttributeTypeFlaggedByte ->+ AttributeValueFlaggedByte <$> decodeFlaggedByteAttributeBits AttributeTypeFloat -> AttributeValueFloat <$> decodeFloatAttributeBits AttributeTypeGameMode -> AttributeValueGameMode <$> decodeGameModeAttributeBits version
+ library/Rattletrap/Decode/FlaggedByteAttribute.hs view
@@ -0,0 +1,12 @@+module Rattletrap.Decode.FlaggedByteAttribute+ ( decodeFlaggedByteAttributeBits+ )+where++import Rattletrap.Decode.Common+import Rattletrap.Decode.Word8le+import Rattletrap.Type.FlaggedByteAttribute+++decodeFlaggedByteAttributeBits :: DecodeBits FlaggedByteAttribute+decodeFlaggedByteAttributeBits = FlaggedByteAttribute <$> getBool <*> decodeWord8leBits
library/Rattletrap/Encode/AttributeValue.hs view
@@ -14,6 +14,7 @@ import Rattletrap.Encode.ExplosionAttribute import Rattletrap.Encode.ExtendedExplosionAttribute import Rattletrap.Encode.FlaggedIntAttribute+import Rattletrap.Encode.FlaggedByteAttribute import Rattletrap.Encode.FloatAttribute import Rattletrap.Encode.GameModeAttribute import Rattletrap.Encode.Int64Attribute@@ -54,6 +55,7 @@ AttributeValueExplosion x -> putExplosionAttribute x AttributeValueExtendedExplosion x -> putExtendedExplosionAttribute x AttributeValueFlaggedInt x -> putFlaggedIntAttribute x+ AttributeValueFlaggedByte x -> putFlaggedByteAttribute x AttributeValueFloat x -> putFloatAttribute x AttributeValueGameMode x -> putGameModeAttribute x AttributeValueInt x -> putIntAttribute x
+ library/Rattletrap/Encode/FlaggedByteAttribute.hs view
@@ -0,0 +1,14 @@+module Rattletrap.Encode.FlaggedByteAttribute+ ( putFlaggedByteAttribute+ )+where++import Rattletrap.Encode.Word8le+import Rattletrap.Type.FlaggedByteAttribute++import qualified Data.Binary.Bits.Put as BinaryBits++putFlaggedByteAttribute :: FlaggedByteAttribute -> BinaryBits.BitPut ()+putFlaggedByteAttribute flaggedByteAttribute = do+ BinaryBits.putBool (flaggedByteAttributeFlag flaggedByteAttribute)+ putWord8Bits (flaggedByteAttributeByte flaggedByteAttribute)
library/Rattletrap/Type/AttributeType.hs view
@@ -19,6 +19,7 @@ | AttributeTypeExplosion | AttributeTypeExtendedExplosion | AttributeTypeFlaggedInt+ | AttributeTypeFlaggedByte | AttributeTypeFloat | AttributeTypeGameMode | AttributeTypeInt
library/Rattletrap/Type/AttributeValue.hs view
@@ -17,6 +17,7 @@ import Rattletrap.Type.ExplosionAttribute import Rattletrap.Type.ExtendedExplosionAttribute import Rattletrap.Type.FlaggedIntAttribute+import Rattletrap.Type.FlaggedByteAttribute import Rattletrap.Type.FloatAttribute import Rattletrap.Type.GameModeAttribute import Rattletrap.Type.Int64Attribute@@ -53,6 +54,7 @@ | AttributeValueExplosion ExplosionAttribute | AttributeValueExtendedExplosion ExtendedExplosionAttribute | AttributeValueFlaggedInt FlaggedIntAttribute+ | AttributeValueFlaggedByte FlaggedByteAttribute | AttributeValueFloat FloatAttribute | AttributeValueGameMode GameModeAttribute | AttributeValueInt IntAttribute
+ library/Rattletrap/Type/FlaggedByteAttribute.hs view
@@ -0,0 +1,16 @@+{-# LANGUAGE TemplateHaskell #-}++module Rattletrap.Type.FlaggedByteAttribute+ ( FlaggedByteAttribute(..)+ )+where++import Rattletrap.Type.Common+import Rattletrap.Type.Word8le++data FlaggedByteAttribute = FlaggedByteAttribute+ { flaggedByteAttributeFlag :: Bool+ , flaggedByteAttributeByte :: Word8le+ } deriving (Eq, Ord, Show)++$(deriveJson ''FlaggedByteAttribute)
rattletrap.cabal view
@@ -1,7 +1,7 @@ cabal-version: 2.2 name: rattletrap-version: 9.0.1+version: 9.0.2 category: Game description: Rattletrap parses and generates Rocket League replays.@@ -78,6 +78,7 @@ Rattletrap.Decode.ExplosionAttribute Rattletrap.Decode.ExtendedExplosionAttribute Rattletrap.Decode.FlaggedIntAttribute+ Rattletrap.Decode.FlaggedByteAttribute Rattletrap.Decode.Float32le Rattletrap.Decode.FloatAttribute Rattletrap.Decode.Frame@@ -152,6 +153,7 @@ Rattletrap.Encode.ExplosionAttribute Rattletrap.Encode.ExtendedExplosionAttribute Rattletrap.Encode.FlaggedIntAttribute+ Rattletrap.Encode.FlaggedByteAttribute Rattletrap.Encode.Float32le Rattletrap.Encode.FloatAttribute Rattletrap.Encode.Frame@@ -228,6 +230,7 @@ Rattletrap.Type.ExplosionAttribute Rattletrap.Type.ExtendedExplosionAttribute Rattletrap.Type.FlaggedIntAttribute+ Rattletrap.Type.FlaggedByteAttribute Rattletrap.Type.Float32le Rattletrap.Type.FloatAttribute Rattletrap.Type.Frame
tests/Main.hs view
@@ -95,7 +95,8 @@ replays :: [(String, String)] replays =- [ ("0008", "a flip time")+ [ ("21a8", "v1.66")+ , ("0008", "a flip time") , ("000b", "nintendo switch") , ("07e9", "a game mode before Neo Tokyo") , ("0ad2", "some Latin-1 text")