-- | This module contains largely static data about Rocket League itself, such -- as which classes objects belong to. module Octane.Data where import Data.Function ((&)) import Data.Monoid ((<>)) import qualified Data.Bimap as Bimap import qualified Data.Map.Strict as Map import qualified Data.Set as Set import qualified Data.Text as Text -- * Classes -- | A map from class names to a set of object names that are that class. This -- is typically not useful by itself, as it is used to build the -- 'objectToClass' map. classToObjects :: Map.Map Text.Text (Set.Set Text.Text) classToObjects = let normal = [ ( "TAGame.Ball_TA", [ "Archetypes.Ball.Ball_Default" , "Archetypes.Ball.Ball_Basketball" , "Archetypes.Ball.Ball_Puck" , "Archetypes.Ball.CubeBall" ]) , ( "TAGame.CameraSettingsActor_TA", [ "TAGame.CameraSettingsActor_TA:PRI" , "TAGame.Default__CameraSettingsActor_TA" ]) , ( "TAGame.CarComponent_Boost_TA", [ "Archetypes.CarComponents.CarComponent_Boost" ]) , ( "TAGame.CarComponent_Dodge_TA", [ "Archetypes.CarComponents.CarComponent_Dodge" ]) , ( "TAGame.CarComponent_DoubleJump_TA", [ "Archetypes.CarComponents.CarComponent_DoubleJump" ]) , ( "TAGame.CarComponent_FlipCar_TA", [ "Archetypes.CarComponents.CarComponent_FlipCar" ]) , ( "TAGame.CarComponent_Jump_TA", [ "Archetypes.CarComponents.CarComponent_Jump" ]) , ( "TAGame.Car_TA", [ "Archetypes.Car.Car_Default" , "Archetypes.GameEvent.GameEvent_Season:CarArchetype" ]) , ( "TAGame.GameEvent_Season_TA", [ "Archetypes.GameEvent.GameEvent_Season" ]) , ( "TAGame.GameEvent_SoccarPrivate_TA", [ "Archetypes.GameEvent.GameEvent_BasketballPrivate" , "Archetypes.GameEvent.GameEvent_HockeyPrivate" , "Archetypes.GameEvent.GameEvent_SoccarPrivate" ]) , ( "TAGame.GameEvent_SoccarSplitscreen_TA", [ "Archetypes.GameEvent.GameEvent_BasketballSplitscreen" , "Archetypes.GameEvent.GameEvent_HockeySplitscreen" , "Archetypes.GameEvent.GameEvent_SoccarSplitscreen" ]) , ( "TAGame.GameEvent_Soccar_TA", [ "Archetypes.GameEvent.GameEvent_Soccar" , "Archetypes.GameEvent.GameEvent_Basketball" ]) , ( "TAGame.GRI_TA", [ "GameInfo_Basketball.GameInfo.GameInfo_Basketball:GameReplicationInfoArchetype" , "Gameinfo_Hockey.GameInfo.Gameinfo_Hockey:GameReplicationInfoArchetype" , "GameInfo_Season.GameInfo.GameInfo_Season:GameReplicationInfoArchetype" , "GameInfo_Soccar.GameInfo.GameInfo_Soccar:GameReplicationInfoArchetype" ]) , ( "TAGame.PRI_TA", [ "TAGame.Default__PRI_TA" ]) , ( "TAGame.Team_Soccar_TA", [ "Archetypes.Teams.Team" ]) , ( "TAGame.VoteActor_TA", [ "TAGame.Default__VoteActor_TA" ]) ] & map (\ (klass, objects) -> ( Text.pack klass , objects & map Text.pack & Set.fromList )) special = [ ("TAGame.CrowdActor_TA", ".TheWorld:PersistentLevel.CrowdActor_TA_") , ("TAGame.CrowdManager_TA", ".TheWorld:PersistentLevel.CrowdManager_TA_") , ("TAGame.VehiclePickup_Boost_TA", ".TheWorld:PersistentLevel.VehiclePickup_Boost_TA_") ] & map (\ (klass, suffix) -> ( Text.pack klass , levels & Set.map (\ level -> level <> Text.pack suffix) )) in Map.fromList (normal ++ special) -- | A set of classes that have an initial location vector. locationClasses :: Set.Set Text.Text locationClasses = [ "TAGame.Ball_TA" , "TAGame.CameraSettingsActor_TA" , "TAGame.CarComponent_Boost_TA" , "TAGame.CarComponent_Dodge_TA" , "TAGame.CarComponent_DoubleJump_TA" , "TAGame.CarComponent_FlipCar_TA" , "TAGame.CarComponent_Jump_TA" , "TAGame.Car_Season_TA" , "TAGame.Car_TA" , "TAGame.GRI_TA" , "TAGame.GameEvent_Season_TA" , "TAGame.GameEvent_SoccarPrivate_TA" , "TAGame.GameEvent_SoccarSplitscreen_TA" , "TAGame.GameEvent_Soccar_TA" , "TAGame.PRI_TA" , "TAGame.Team_Soccar_TA" ] & map Text.pack & Set.fromList -- | A set of classes that have an initial rotation vector. rotationClasses :: Set.Set Text.Text rotationClasses = [ "TAGame.Ball_TA" , "TAGame.Car_Season_TA" , "TAGame.Car_TA" ] & map Text.pack & Set.fromList -- * Levels -- | A set of level names. This is typically not useful by itself, as it is -- used to build the 'classToObjects' map. If you are going to use it, be -- aware that many of the levels are duplicated with strange capitalization. -- For example, this set contains both @Wasteland_P@ and @Wasteland_p@. levels :: Set.Set Text.Text levels = [ "EuroStadium_Rainy_P" , "HoopsStadium_P" , "Park_Night_P" , "Park_Rainy_P" , "Stadium_p" , "TrainStation_Night_P" , "TrainStation_P" , "Trainstation_Night_P" , "UtopiaStadium_Dusk_P" , "UtopiaStadium_Dusk_p" , "UtopiaStadium_P" , "Utopiastadium_p" , "Wasteland_P" , "Wasteland_p" , "eurostad_oob_audio_map" , "eurostadium_p" , "eurostadium_rainy_audio" , "hoopsstadium_sfx" , "labs_cosmic_p" , "labs_doublegoal_p" , "labs_underpass_p" , "labs_utopia_p" , "park_night_sfx" , "park_p" , "park_rainy_sfx" , "park_sfx" , "stadium_oob_audio_map" , "stadium_p" , "stadium_winter_p" , "trainstation_p" , "utopiastadium_p" , "utopiastadium_sfx" , "wasteland_sfx" ] & map Text.pack & Set.fromList -- * Objects -- | A map from object names to their class names. Note that any trailing -- numbers have been stripped from the object names. So -- @Archetypes.Teams.Team0@ is in this map as @Archetypes.Teams.Team@. objectToClass :: Map.Map Text.Text Text.Text objectToClass = Map.foldrWithKey (\ klass objects m -> objects & Set.map (\ object -> (object, klass)) & Set.toList & Map.fromList & Map.union m) Map.empty classToObjects -- * Properties -- | A set of properties that are booleans. booleanProperties :: Set.Set Text.Text booleanProperties = [ "Engine.Actor:bBlockActors" , "Engine.Actor:bCollideActors" , "Engine.Actor:bCollideWorld" , "Engine.Actor:bHardAttach" , "Engine.Actor:bHidden" , "Engine.Actor:bNetOwner" , "Engine.Actor:bProjTarget" , "Engine.Actor:bTearOff" , "Engine.GameReplicationInfo:bMatchIsOver" , "Engine.Pawn:bCanSwatTurn" , "Engine.Pawn:bRootMotionFromInterpCurve" , "Engine.Pawn:bSimulateGravity" , "Engine.PlayerReplicationInfo:bAdmin" , "Engine.PlayerReplicationInfo:bBot" , "Engine.PlayerReplicationInfo:bFromPreviousLevel" , "Engine.PlayerReplicationInfo:bIsSpectator" , "Engine.PlayerReplicationInfo:bOnlySpectator" , "Engine.PlayerReplicationInfo:bOutOfLives" , "Engine.PlayerReplicationInfo:bReadyToPlay" , "Engine.PlayerReplicationInfo:bWaitingPlayer" , "ProjectX.GRI_X:bGameStarted" , "TAGame.CameraSettingsActor_TA:bUsingBehindView" , "TAGame.CameraSettingsActor_TA:bUsingSecondaryCamera" , "TAGame.CarComponent_Boost_TA:bNoBoost" , "TAGame.CarComponent_Boost_TA:bUnlimitedBoost" , "TAGame.CarComponent_FlipCar_TA:bFlipRight" , "TAGame.GameEvent_Soccar_TA:bBallHasBeenHit" , "TAGame.GameEvent_Soccar_TA:bOverTime" , "TAGame.GameEvent_TA:bHasLeaveMatchPenalty" , "TAGame.GameEvent_Team_TA:bDisableMutingOtherTeam" , "TAGame.PRI_TA:bIsInSplitScreen" , "TAGame.PRI_TA:bMatchMVP" , "TAGame.PRI_TA:bOnlineLoadoutSet" , "TAGame.PRI_TA:bReady" , "TAGame.PRI_TA:bUsingBehindView" , "TAGame.PRI_TA:bUsingFreecam" , "TAGame.PRI_TA:bUsingSecondaryCamera" , "TAGame.PRI_TA:bVoteToForfeitDisabled" , "TAGame.RBActor_TA:bFrozen" , "TAGame.RBActor_TA:bReplayActor" , "TAGame.Vehicle_TA:bDriving" , "TAGame.Vehicle_TA:bReplicatedHandbrake" ] & map Text.pack & Set.fromList -- | A set of properties that are bytes. byteProperties :: Set.Set Text.Text byteProperties = [ "Engine.PlayerReplicationInfo:Ping" , "TAGame.Ball_TA:HitTeamNum" , "TAGame.CameraSettingsActor_TA:CameraPitch" , "TAGame.CameraSettingsActor_TA:CameraYaw" , "TAGame.CarComponent_Boost_TA:ReplicatedBoostAmount" , "TAGame.CarComponent_TA:ReplicatedActive" , "TAGame.GameEvent_Soccar_TA:ReplicatedScoredOnTeam" , "TAGame.GameEvent_TA:ReplicatedStateIndex" , "TAGame.PRI_TA:CameraPitch" , "TAGame.PRI_TA:CameraYaw" , "TAGame.Vehicle_TA:ReplicatedSteer" , "TAGame.Vehicle_TA:ReplicatedThrottle" ] & map Text.pack & Set.fromList -- | A set of properties that are camera settings. camSettingsProperties :: Set.Set Text.Text camSettingsProperties = [ "TAGame.CameraSettingsActor_TA:ProfileSettings" , "TAGame.PRI_TA:CameraSettings" ] & map Text.pack & Set.fromList -- | A set of properties that are demolitions. demolishProperties :: Set.Set Text.Text demolishProperties = [ "TAGame.Car_TA:ReplicatedDemolish" ] & map Text.pack & Set.fromList -- | A set of properties that are enumerations. enumProperties :: Set.Set Text.Text enumProperties = [ "Engine.Actor:Role" ] & map Text.pack & Set.fromList -- | A set of properties that are explosions. explosionProperties :: Set.Set Text.Text explosionProperties = [ "TAGame.Ball_TA:ReplicatedExplosionData" ] & map Text.pack & Set.fromList -- | A set of properties that are flagged integers. flaggedIntProperties :: Set.Set Text.Text flaggedIntProperties = [ "Engine.Actor:Owner" , "Engine.Actor:ReplicatedCollisionType" , "Engine.GameReplicationInfo:GameClass" , "Engine.Pawn:PlayerReplicationInfo" , "Engine.PlayerReplicationInfo:Team" , "Engine.TeamInfo:TeamIndex" , "TAGame.Ball_TA:GameEvent" , "TAGame.CameraSettingsActor_TA:PRI" , "TAGame.CarComponent_TA:Vehicle" , "TAGame.CrowdActor_TA:GameEvent" , "TAGame.CrowdActor_TA:ReplicatedOneShotSound" , "TAGame.CrowdManager_TA:GameEvent" , "TAGame.CrowdManager_TA:ReplicatedGlobalOneShotSound" , "TAGame.PRI_TA:PersistentCamera" , "TAGame.PRI_TA:ReplicatedGameEvent" , "TAGame.Team_TA:GameEvent" , "TAGame.Team_TA:LogoData" ] & map Text.pack & Set.fromList -- | A set of properties that are floats. floatProperties :: Set.Set Text.Text floatProperties = [ "Engine.Actor:DrawScale" , "TAGame.Ball_TA:ReplicatedAddedCarBounceScale" , "TAGame.Ball_TA:ReplicatedBallMaxLinearSpeedScale" , "TAGame.Ball_TA:ReplicatedBallScale" , "TAGame.Ball_TA:ReplicatedWorldBounceScale" , "TAGame.CarComponent_Boost_TA:BoostModifier" , "TAGame.CarComponent_Boost_TA:RechargeDelay" , "TAGame.CarComponent_Boost_TA:RechargeRate" , "TAGame.CarComponent_FlipCar_TA:FlipCarTime" , "TAGame.CrowdActor_TA:ModifiedNoise" ] & map Text.pack & Set.fromList -- | A set of properties that are game modes. gameModeProperties :: Set.Set Text.Text gameModeProperties = [ "TAGame.GameEvent_TA:GameMode" ] & map Text.pack & Set.fromList -- | A set of properties that are integers. intProperties :: Set.Set Text.Text intProperties = [ "Engine.PlayerReplicationInfo:PlayerID" , "Engine.PlayerReplicationInfo:Score" , "Engine.TeamInfo:Score" , "ProjectX.GRI_X:ReplicatedGameMutatorIndex" , "ProjectX.GRI_X:ReplicatedGamePlaylist" , "TAGame.CrowdActor_TA:ReplicatedCountDownNumber" , "TAGame.GameEvent_Soccar_TA:RoundNum" , "TAGame.GameEvent_Soccar_TA:SecondsRemaining" , "TAGame.GameEvent_TA:BotSkill" , "TAGame.GameEvent_TA:ReplicatedGameStateTimeRemaining" , "TAGame.GameEvent_TA:ReplicatedStateName" , "TAGame.GameEvent_Team_TA:MaxTeamSize" , "TAGame.PRI_TA:MatchAssists" , "TAGame.PRI_TA:MatchGoals" , "TAGame.PRI_TA:MatchSaves" , "TAGame.PRI_TA:MatchScore" , "TAGame.PRI_TA:MatchShots" , "TAGame.PRI_TA:Title" , "TAGame.PRI_TA:TotalXP" , "TAGame.Team_Soccar_TA:GameScore" ] & map Text.pack & Set.fromList -- | A set of properties that are online loadouts. loadoutOnlineProperties :: Set.Set Text.Text loadoutOnlineProperties = [ "TAGame.PRI_TA:ClientLoadoutOnline" ] & map Text.pack & Set.fromList -- | A set of properties that are loadouts. loadoutProperties :: Set.Set Text.Text loadoutProperties = [ "TAGame.PRI_TA:ClientLoadout" ] & map Text.pack & Set.fromList -- | A set of properties that are locations. locationProperties :: Set.Set Text.Text locationProperties = [ "Engine.Actor:RelativeLocation" , "TAGame.CarComponent_Dodge_TA:DodgeTorque" ] & map Text.pack & Set.fromList -- | A set of properties that are music stingers. musicStingerProperties :: Set.Set Text.Text musicStingerProperties = [ "TAGame.GameEvent_Soccar_TA:ReplicatedMusicStinger" ] & map Text.pack & Set.fromList -- | A set of properties that are pickups. pickupProperties :: Set.Set Text.Text pickupProperties = [ "TAGame.VehiclePickup_TA:ReplicatedPickupData" ] & map Text.pack & Set.fromList -- | A set of properties that are private match settings. privateMatchSettingsProperties :: Set.Set Text.Text privateMatchSettingsProperties = [ "TAGame.GameEvent_SoccarPrivate_TA:MatchSettings" ] & map Text.pack & Set.fromList -- | A set of properties that are Q words, whatever those are. qWordProperties :: Set.Set Text.Text qWordProperties = [ "ProjectX.GRI_X:GameServerID" ] & map Text.pack & Set.fromList -- | A set of properties that are relation rotations. relativeRotationProperties :: Set.Set Text.Text relativeRotationProperties = [ "Engine.Actor:RelativeRotation" ] & map Text.pack & Set.fromList -- | A set of properties that are reservations. reservationProperties :: Set.Set Text.Text reservationProperties = [ "ProjectX.GRI_X:Reservations" ] & map Text.pack & Set.fromList -- | A set of properties that are rigid body states. rigidBodyStateProperties :: Set.Set Text.Text rigidBodyStateProperties = [ "TAGame.RBActor_TA:ReplicatedRBState" ] & map Text.pack & Set.fromList -- | A set of properties that are strings. stringProperties :: Set.Set Text.Text stringProperties = [ "Engine.GameReplicationInfo:ServerName" , "Engine.PlayerReplicationInfo:PlayerName" , "Engine.PlayerReplicationInfo:RemoteUserData" , "TAGame.GRI_TA:NewDedicatedServerIP" , "TAGame.Team_TA:CustomTeamName" ] & map Text.pack & Set.fromList -- | A set of properties that are team paints. teamPaintProperties :: Set.Set Text.Text teamPaintProperties = [ "TAGame.Car_TA:TeamPaint" ] & map Text.pack & Set.fromList -- | A set of properties that are unique IDs. uniqueIdProperties :: Set.Set Text.Text uniqueIdProperties = [ "Engine.PlayerReplicationInfo:UniqueId" -- , "TAGame.PRI_TA:PartyLeader" ] & map Text.pack & Set.fromList -- * Garage -- | A one-to-one mapping between body IDs and their names. bodies :: Bimap.Bimap Int Text.Text bodies = [ ("Armadillo", 625) -- GearsCar , ("Backfire", 21) , ("Batmobile", 803) -- Darkcar , ("Breakout", 22) -- Force , ("DeLorean Time Machine", 597) -- GreyCar , ("Dominus", 403) -- MuscleCar , ("Gizmo", 26) -- Spark , ("Grog", 607) -- WastelandTruck , ("Hogsticker", 723) -- Warthog , ("Hotshot", 29) -- Torment , ("Merc", 30) -- Vanquish , ("Octane", 23) , ("Paladin", 24) -- Orion , ("Ripper", 600) -- Interceptor , ("Road Hog", 25) -- Rhino , ("Scarab", 404) , ("Sweet Tooth", 27) , ("Takumi", 402) -- Import , ("Venom", 31) , ("X-Devil", 28) -- Torch , ("Zippy", 523) ] & map (\ (v, k) -> (k, Text.pack v)) & Bimap.fromList -- | A one-to-one mapping between decal IDs and their names. decals :: Bimap.Bimap Int Text.Text decals = [ ( "Backfire", [ ("Flames", 288) , ("Lightning", 289) , ("Skulls", 290) , ("Stars", 291) , ("Stripes", 292) , ("Tech", 293) , ("Wings", 294) ]) , ( "Breakout", [ ("Flames", 295) , ("Lightning", 296) , ("Skulls", 297) , ("Stars", 298) , ("Stripes", 299) , ("Tech", 300) , ("Wings", 301) ]) , ( "Dominus", [ ("Flames", 504) , ("Scorpions", 506) -- Skorpion , ("Skulls", 507) , ("Stripes", 508) , ("Tats", 509) -- Tribal , ("Wings", 510) ]) , ( "Gizmo", [ ("Flames", 323) , ("Lightning", 324) , ("Skulls", 325) , ("Stars", 326) , ("Stripes", 327) , ("Tech", 328) , ("Wings", 329) ]) , ( "Grog", [ ("Bomber", 674) , ("Cyclops", 694) , ("Lepus", 675) -- Bunny , ("Stripes", 687) , ("Tagged", 695) , ("Tribal", 696) ]) , ( "Hotshot", [ ("Flames", 337) , ("Lightning", 338) , ("Skulls", 339) , ("Stars", 340) , ("Stripes", 341) , ("Tech", 342) , ("Wings", 343) ]) , ( "Merc", [ ("Dots", 344) , ("Flames", 345) , ("Lightning", 346) , ("Skulls", 347) , ("Stars", 348) , ("Stripes", 349) , ("Wings", 350) ]) , ( "Octane", [ ("Flames", 302) , ("Lightning", 303) , ("Skulls", 304) , ("Stars", 305) , ("Stripes", 306) , ("Tech", 307) , ("Wings", 308) ]) , ( "Paladin", [ ("Flames", 309) , ("Lightning", 310) , ("Skulls", 311) , ("Stars", 312) , ("Stripes", 313) , ("Tech", 314) , ("Wings", 315) ]) , ( "Ripper", [ ("Bomber", 701) -- Sandgirl , ("Flames", 669) , ("Ockie", 700) -- Getkraken , ("Shot Fox", 670) -- Kitsune , ("Spikes", 671) , ("Tribal", 672) ]) , ( "Road Hog", [ ("Flames", 316) , ("Lightning", 317) , ("Skulls", 318) , ("Stars", 319) , ("Stripes", 320) , ("Tech", 321) -- TechSplat , ("Wings", 322) ]) , ( "Scarab", [ ("Bomani", 585) -- Clouds , ("Derby Girl", 592) -- RollerDerby , ("Flames", 591) , ("Hearts", 586) , ("Tiger", 587) , ("Tribal", 588) ]) , ( "Takumi", [ ("Chaser", 503) -- Wisp , ("Copycat", 497) -- Gato , ("Crazy-8", 502) -- Technologic , ("Gaki", 499) -- Ohai , ("Reiko", 498) -- Nitrous , ("Stripes", 501) ]) , ( "Venom", [ ("Dots", 351) , ("Flames", 352) , ("Lightning", 353) , ("Skulls", 354) , ("Stripes", 355) , ("Tagged", 356) , ("Wings", 357) ]) , ( "X-Devil", [ ("Flames", 330) , ("Lightning", 331) , ("Skulls", 332) , ("Stars", 333) , ("Stripes", 334) , ("Tech", 335) , ("Wings", 336) ]) , ( "Zippy", [ ("Caboodle", 589) -- HeckTec , ("Callous", 590) -- MeanMachine , ("Flames", 583) , ("Hearts", 581) , ("Leopard", 584) , ("Tiger", 582) ]) ] & map (\ (body, values) -> values & map (\ (v, k) -> (k, v ++ " [" ++ body ++ "]"))) & concat & map (\ (k, v) -> (k, Text.pack v)) & Bimap.fromList & Bimap.insert 0 (Text.pack "None") -- | A one-to-one mapping between wheels IDs and their names. wheels :: Bimap.Bimap Int Text.Text wheels = [ ("(Alpha Reward) Goldstone", 358) -- AlphaRim , ("Alchemist", 374) -- Revolution , ("Almas", 364) -- Crypt , ("Armadillo", 618) , ("Batmobile", 874) -- Darkcar , ("Bender", 360) -- Ballistic , ("Carriage", 549) , ("Cog", 716) -- TODO: What is this called in game? , ("Cristiano", 386) -- SoccerBall , ("DeLorean Time Machine", 609) -- GreyCar , ("Dieci", 363) -- Caliber , ("Falco", 382) -- Vulcan , ("Foreman", 372) -- OffRoad , ("Grog", 613) -- WastelandTruck , ("Hogsticker", 719) -- Warthog , ("Invader", 380) -- Triad , ("Lowrider", 369) , ("Lucci", 361) -- Bling , ("Mountaineer", 375) -- SnowTire , ("Neptune", 370) -- Mob , ("Octavian", 379) -- Tarantula , ("OEM", 376) -- Star , ("Rat Rod", 366) -- Dynamo , ("Ripper", 690) -- Spiked , ("Scarab", 540) -- Scarab , ("Servergate", 519) -- SkullxBones , ("Spinner", 388) -- Spinner , ("Spyder", 371) -- Ninja , ("Stallion", 365) -- DeepDish , ("Stern", 368) -- Hydra , ("Sunburt", 383) -- Wynd , ("Sweet Tooth", 378) , ("Tempest", 377) -- Storm , ("Tomahawk", 362) -- Brink , ("Trahere", 367) -- Forge , ("Tunica", 359) -- Atlantis , ("Veloce", 373) -- Pedigree , ("Vortex", 381) , ("Zippy", 518) -- SingleSpoke ] & map (\ (v, k) -> (k, Text.pack v)) & Bimap.fromList -- | A one-to-one mapping between rocket trail IDs and their names. rocketTrails :: Bimap.Bimap Int Text.Text rocketTrails = [ ("(Alpha Reward) Gold Rush", 32) -- AlphaReward , ("Accelerato", 524) -- MusicalNotes , ("Batmobile", 868) -- DarkCar , ("Battle-Stars", 545) , ("Bubbles", 33) , ("Burnout", 387) , ("Candy Corn", 578) , ("Confetti", 34) , ("Datastream", 35) -- Digital , ("Flamethrower Blue", 37) , ("Flamethrower Green", 38) , ("Flamethrower Pink", 39) , ("Flamethrower Purple", 40) , ("Flamethrower Red", 41) , ("Flamethrower", 36) , ("Flowers", 42) , ("Grass", 43) , ("Hydro", 69) -- Water , ("Ion Blue", 45) -- LightTrail , ("Ion Green", 46) , ("Ion Pink", 47) , ("Ion Purple", 48) , ("Ion Red", 49) , ("Ion Yellow", 50) , ("Money", 51) , ("Nitrous", 384) , ("Nuts & Bolts", 544) , ("OutaTime", 626) -- GreyCar , ("Plasma", 52) , ("Portal - Conversion Gel", 651) , ("Portal - Propulsion Gel", 652) , ("Portal - Reuplsion Gel", 653) , ("Rainbow", 59) , ("Sacred", 44) -- HolyLight , ("Sandstorm", 664) , ("Slime", 60) , ("Snowflakes", 61) , ("Sparkles", 62) , ("Standard Blue", 64) , ("Standard Pink", 65) , ("Standard Purple", 66) , ("Standard Red", 63) , ("Standard Yellow", 67) , ("Sweet Tooth", 68) , ("Thermal Blue", 54) , ("Thermal Green", 55) , ("Thermal Pink", 56) , ("Thermal Purple", 57) , ("Thermal Yellow", 58) , ("Thermal", 53) -- Propulsion , ("Xmas", 635) -- Presents ] & map (\ (v, k) -> (k, Text.pack v)) & Bimap.fromList -- | A one-to-one mapping between antenna IDs and their names. antennas :: Bimap.Bimap Int Text.Text antennas = [ ("None", 0) , ("(Beta Reward) Gold Nugget", 6) , ("8-Ball", 1) , ("Alien", 753) , ("Balloon Dog", 752) , ("Batman", 804) , ("Blue Chequered Flag", 284) , ("Bomb Pole", 614) , ("Calavera", 574) -- DOTDSkull , ("Camo Flag", 285) , ("Candle", 757) , ("Candy Cane", 649) , ("Chick Magnet", 392) , ("Cupcake", 393) , ("Dave's Bread", 391) , ("deadmau5", 781) -- Mau5 , ("Disco Ball", 800) , ("Disconnect", 394) , ("Dollar Sign", 3) , ("Donut", 395) , ("Foam Finger", 398) , ("Fuzzy Brute", 593) -- FurballFrakenstein , ("Fuzzy Vamp", 595) -- FurballVampire , ("Genie Lamp", 798) , ("Gingerbread Man", 5) , ("Heart", 7) , ("Holiday Gift", 650) -- ChristmasGift , ("Horseshoe", 8) , ("Hula Girl", 762) , ("Jolly Roger", 217) -- Pirate , ("Lightning Bolt", 9) , ("Moai", 522) , ("Parrot", 750) , ("Peace", 11) , ("Piñata", 400) , ("Planetoid", 12) -- Saturn , ("Radioactive", 615) -- RadiationSymbol , ("Rainbow", 490) , ("Reddit Snoo", 629) , ("Retro Ball - Urban", 575) , ("Retro Ball - Utopia", 576) , ("Retro Ball - Wasteland", 577) , ("Rocket", 755) , ("Rose", 785) , ("Rubber Duckie", 779) , ("Safety Flag", 286) -- OrangeNylon , ("Skull", 13) , ("Smiley", 14) , ("Snowman", 15) , ("Soccer Ball", 16) , ("Star", 17) , ("Sunflower", 786) , ("Superman", 805) , ("Sweet Tooth", 18) , ("Tennis Ball", 19) , ("The Game Awards - Statue", 655) -- VGA_Statue , ("UFO", 20) , ("Venus Flytrap", 788) , ("Waffle", 401) , ("White Flag", 491) , ("Wonder Woman", 806) -- TODO: What are these called in game? , ("Community", 527) , ("ESL_Champ", 537) , ("Eyeball", 396) , ("Moderator", 528) , ("PanicButton", 829) , ("Psyonix", 287) , ("TourneyChamp", 539) , ("Translator", 530) -- Community Flags , ("9GAG", 799) , ("AbleGamers", 814) , ("Achievement Hunter", 610) , ("Angry Army", 548) -- AgryJoe , ("Anne Munition", 531) , ("Day[9]TV", 654) , ("Destructoid", 724) , ("EMD1", 532) -- EatMyDiction , ("ESL", 536) , ("Funhaus", 611) , ("Gamespot", 725) , ("Gassy Mexican", 511) , ("Gfinity", 732) , ("GoldGlove", 728) , ("IGN", 802) , ("itmeJP", 533) , ("LIRIK", 513) , ("lolRenaynay", 628) , ("MLG", 538) , ("NeoGAF", 616) , ("NVIDIA", 808) , ("Operation Sports", 726) , ("PC Gamer", 667) , ("Polaris", 608) , ("Razer", 573) , ("Reddit", 630) , ("RL Garage", 645) , ("Rocket Beans TV", 869) , ("Rooster Teeth", 612) , ("Saudi Gamer", 534) , ("Serious Gaming", 572) , ("Something Awful", 699) , ("Spooky1611", 514) , ("Team Fat", 220) , ("Team PowA", 515) , ("The Attack", 535) , ("The Game Awards - Logo", 693) -- VGX , ("Twitch", 221) , ("YouTube Gaming", 516) -- Country Flags , ("Afghanistan", 407) , ("Albania", 408) , ("Algeria", 124) , ("American Samoa", 409) , ("Andorra", 830) , ("Angola", 410) , ("Anguilla", 831) , ("Antigua & Barbuda", 832) , ("Argentina", 125) , ("Armenia", 411) , ("Aruba", 833) , ("Australia", 126) , ("Austria", 127) , ("Azerbaijan", 412) , ("Bahamas", 834) , ("Bahrain", 550) , ("Bangladesh", 413) , ("Barbados", 835) , ("Belarus", 414) , ("Belgium", 128) , ("Belize", 551) , ("Benin", 415) , ("Bermuda", 836) , ("Bhutan", 552) , ("Bolivia", 416) , ("Bosnia and Herzegovina", 129) , ("Botswana", 553) , ("Brazil", 130) , ("British Virgin Islands", 837) , ("Bulgaria", 131) , ("Burkina Faso", 417) , ("Burma", 418) , ("Burundi", 419) , ("Cambodia", 420) , ("Cameroon", 132) , ("Canada", 133) , ("Cape Verde Islands", 134) , ("Cayman Islands", 838) , ("Central African Republic", 540) , ("Chad", 422) , ("Chile", 135) , ("China", 136) , ("Chinese Taipei", 198) , ("Colombia", 137) , ("Comoros", 554) , ("Congo", 138) , ("Congo DR", 423) , ("Cook Islands", 839) , ("Costa Rica", 139) , ("Croatia", 140) , ("Cuba", 424) , ("Curacao", 840) , ("Cyprus", 141) , ("Czech Republic", 142) , ("Côte d'Ivoire", 165) , ("Denmark", 143) , ("Djibouti", 555) , ("Dominica", 841) , ("Dominican Republic", 425) , ("East Timor", 556) , ("Ecuador", 144) , ("Egypt", 426) , ("El Salvador", 145) , ("England", 146) , ("Equatorial Guinea", 147) , ("Eritrea", 427) , ("Estonia", 428) , ("Ethiopia", 429) , ("Falkland Islands", 842) , ("Faroe Islands", 843) , ("Fiji", 557) , ("Finland", 148) , ("France", 149) , ("Gabon", 430) , ("Gambia", 558) , ("Georgia", 431) , ("Germany", 150) , ("Ghana", 151) , ("Gibraltar", 844) , ("Greece", 152) , ("Grenada", 863) , ("Guam", 432) , ("Guatemala", 153) , ("Guinea", 154) , ("Guinea Bissau", 559) , ("Guyana", 560) , ("Haiti", 433) , ("Honduras", 155) , ("Hong Kong", 156) , ("Hungary", 157) , ("Iceland", 158) , ("India", 159) , ("Indonesia", 160) , ("Iran", 161) , ("Iraq", 434) , ("Ireland", 162) , ("Isle Of Man", 845) , ("Israel", 163) , ("Italy", 164) , ("Jamaica", 166) , ("Japan", 167) , ("Jordan", 435) , ("Kazakhstan", 436) , ("Kenya", 168) , ("Kiribati", 846) , ("Kosovo", 561) , ("Kuwait", 437) , ("Kyrgyzstan", 438) , ("Laos", 439) , ("Latvia", 440) , ("Lebanon", 441) , ("Lesotho", 562) , ("Liberia", 442) , ("Libya", 443) , ("Lithuania", 444) , ("Luxembourg", 169) , ("Macau", 563) , ("Macedonia", 445) , ("Madagascar", 446) , ("Malawi", 447) , ("Malaysia", 170) , ("Maldives", 847) , ("Mali", 448) , ("Malta", 171) , ("Marshall Islands", 848) , ("Mauritania", 449) , ("Mauritius", 564) , ("Mexico", 172) , ("Micronesia", 849) , ("Moldova", 450) , ("Mongolia", 451) , ("Montenegro", 452) , ("Montserrat", 864) , ("Morocco", 453) , ("Mozambique", 454) , ("Namibia", 457) , ("Nepal", 458) , ("Netherlands", 173) , ("New Caledonia", 850) , ("New Zealand", 174) , ("Nicaragua", 175) , ("Nigeria", 176) , ("North Korea", 460) , ("North Mariana Islands", 456) , ("Northern Ireland", 177) , ("Norway", 178) , ("Oman", 461) , ("Palestine", 462) , ("Palau", 851) , ("Palestine", 462) , ("Panama", 180) , ("Papua New Guinea", 463) , ("Paraguay", 464) , ("Peru", 181) , ("Philippines", 182) , ("Poland", 183) , ("Portugal", 184) , ("Puerto Rico", 465) , ("Puntland", 565) , ("Qatar", 466) , ("Republic of Niger", 459) , ("Romania", 185) , ("Russia", 186) , ("Rwanda", 467) , ("Réunion", 566) , ("Saint Kitts & Nevis", 852) , ("Saint Lucia", 853) , ("Saint Vincent", 854) , ("Samoa", 855) , ("San Marino", 856) , ("Sao Tome", 857) , ("Saudi Arabia", 468) , ("Scotland", 187) , ("Senegal", 188) , ("Serbia", 189) , ("Seychelles", 858) , ("Sierra Leone", 469) , ("Singapore", 190) , ("Slovakia", 191) , ("Slovenia", 192) , ("Solomon Islands", 567) , ("Somalia", 470) , ("Somaliland", 568) , ("South Africa", 193) , ("South Korea", 194) , ("South Sudan", 471) , ("Spain", 195) , ("Sri Lanka", 389) , ("Sudan", 472) , ("Suriname", 569) , ("Swaziland", 570) , ("Sweden", 196) , ("Switzerland", 197) , ("Syria", 473) , ("Tahiti", 859) , ("Tajikistan", 474) , ("Tanzania", 475) , ("Thailand", 199) , ("Togo", 476) , ("Tonga", 730) , ("Trinidad and Tobago", 477) , ("Tunisia", 200) , ("Turkey", 201) , ("Turkmenistan", 478) , ("Turks & Caicos", 860) , ("Uganda", 479) , ("Ukraine", 204) , ("United Arab Emirates", 202) , ("United Kingdom", 203) , ("United States", 206) , ("Uruguay", 502) , ("US Virgin Islands", 480) , ("Uzbekistan", 481) , ("Vanuatu", 861) , ("Vatican City", 862) , ("Venezuela", 207) , ("Vietnam", 208) , ("Wales", 209) , ("Western Sahara", 571) , ("Yemen", 210) , ("Zambia", 482) , ("Zimbabwe", 483) -- NBA Flags , ("NBA", 1263) , ("Atlanta Hawks", 1245) , ("Boston Celtics", 1246) , ("Brooklyn Nets", 1247) , ("Charlotte Hornets", 1248) , ("Chicago Bulls", 1249) , ("Cleveland Cavaliers", 1250) , ("Dallas Mavericks", 1251) , ("Denver Nuggets", 1252) , ("Detroit Pistons", 1253) , ("Golden State Warriors", 1254) , ("Houston Rockets", 1255) , ("Indian Pacers", 1256) , ("Los Angeles Clippers", 1257) , ("Los Angeles Lakers", 1258) , ("Memphis Grizzlies", 1259) , ("Miami Heat", 1260) , ("Milwaukee Bucks", 1261) , ("Minnesota Timberwolves", 1262) , ("New Orleans Pelicans", 1264) , ("New Tork Knicks", 1265) , ("Oklahoma City Thunder", 1266) , ("Orlando Magic", 1267) , ("Philadelphia 76ers", 1268) , ("Phoenix Suns", 1269) , ("Portland Trail Blazers", 1270) , ("Sacramento Kings", 1271) , ("San Antonio Spurs", 1272) , ("Toronto Raptors", 1273) , ("Utah Jazz", 1274) , ("Washington Wizards", 1275) -- Video Games , ("Blacklight", 385) , ("Blacklight: Retribution", 211) , ("Chivalry - Agatha Knights", 525) , ("Chivalry - Mason Order", 526) , ("Edge Of Space", 213) , ("Euro Truck Simulator Rig", 813) -- ETS2 , ("Fallout - Vault Boy", 673) , ("Fenix Rage", 216) , ("Goat Simulator - G2", 927) , ("Goat Simulator - Goatenna", 867) , ("Oddworld - Abe", 678) , ("Oddworld - Molluck", 679) , ("Oddworld - Necrum", 632) , ("Oddworld - RuptureFarms", 633) , ("Portal - Aperture Laboratories", 656) , ("Portal - Cake Sticker", 657) , ("Portal - Companion Cube", 681) , ("Portal - PotatOS", 698) , ("Portal - Wheatley", 686) -- Portal_PC , ("Shadowgate", 218) , ("Strike Vector EX", 219) , ("Unreal", 222) , ("Unreal Frag Center", 485) , ("Unreal Tournament", 489) -- UTBlue , ("Unreal Tournament (Classic)", 487) -- UT , ("Unreal Tournament - Blue", 484) -- Epic_BlueFlag , ("Unreal Tournament - Flak Shell", 397) , ("Unreal Tournament - Red", 486) -- Epic_RedFlag , ("Unreal Tournament 2004", 488) , ("Warframe", 223) , ("Warframe - Chroma", 682) , ("Warframe - Excalibur", 684) , ("Warframe - Loki", 683) , ("Witcher Medallion", 749) , ("Worms W.M.D", 1008) , ("Worms W.M.D. Grenade", 1000) ] & map (\ (v, k) -> (k, Text.pack v)) & Bimap.fromList -- | A one-to-one mapping between topper IDs and their names. toppers :: Bimap.Bimap Int Text.Text toppers = [ ("None", 0) , ("(Alpha Reward) Gold Cap", 224) -- AlphaHat , ("Antlers", 774) , ("Beret", 775) , ("Biker Cap", 776) , ("Birthday Cake", 789) , ("Blitzen", 640) -- ReindeerAntlers , ("Bobby Helmet", 227) -- BPH , ("Boombox", 521) , ("Bowler", 745) -- GentlemanHat , ("Brodie Helmet", 743) -- DoughboyHelmet , ("Brünnhilde", 241) -- Viking_Helmet , ("Captain's Hat", 741) , ("Cavalier", 580) -- Tricorn , ("Chainsaw", 795) , ("Chef's Hat", 756) , ("Cherry Top", 237) -- PoliceSiren , ("Christmas Tree", 639) -- RegularChristmasTree , ("Cockroach", 769) , ("Cow Skull", 685) , ("deadmau5", 796) , ("Deerstalker", 792) , ("Derby", 790) , ("Devil Horns", 229) , ("Fez", 230) , ("Fire Helmet", 231) , ("Foam Hat", 390) -- TourneyWinner , ("Fruit Hat", 744) , ("Graduation Cap", 778) , ("Halo", 232) , ("Hard Hat", 233) , ("Homburg", 742) -- DetectiveHat , ("Locomotive", 547) -- TrainConductor , ("Mariachi Hat", 234) , ("Mohawk", 638) , ("Mouse Trap", 782) -- RatTrap , ("Paper Boat", 770) , ("Pirate's Hat", 235) , ("Pixelated Shades", 494) -- DWI , ("Pizza Topper", 236) , ("Plunger", 772) , ("Police Hat", 746) , ("Portal - Cake", 661) , ("Propellerhead", 225) -- Beanie , ("Pumpkin", 546) -- CatOLantern , ("Rasta", 771) , ("Rhino Horns", 780) , ("Royal Crown", 228) , ("Sad Sapling", 641) -- SadChristmasTree , ("Santa", 642) , ("Season 1 - Bronze", 705) , ("Season 1 - Gold", 706) , ("Season 1 - Platinum", 707) , ("Season 1 - Silver", 708) , ("Shark Fin", 579) , ("Shuriken", 773) , ("Sombrero", 238) , ("Taxi Topper", 239) , ("Tiara", 495) , ("Top Hat", 240) , ("Traffic Cone", 747) , ("Unicorn", 748) -- Unihorn , ("Witch's Hat", 242) , ("Wizard Hat", 243) , ("Work Boot", 740) , ("Worms W.M.D.", 1028) ] & map (\ (v, k) -> (k, Text.pack v)) & Bimap.fromList -- | A one-to-one mapping between paint finish IDs and their names. finishes :: Bimap.Bimap Int Text.Text finishes = [ ("Brushed Metal", 266) , ("Camo", 541) , ("Carbon Fiber", 272) -- GlossyCarbonFiber , ("Corroded Metal", 268) -- Corroded , ("DeLorean Time Machine", 623) -- GreyCar , ("Glossy", 270) -- Default , ("Matte", 273) , ("Metallic", 274) , ("Metallic Pearl", 275) , ("Pearlescent", 276) , ("Semigloss", 277) -- Plastic , ("Sun-Damaged", 542) -- Cracked , ("Toon Glossy", 279) , ("Toon Matte", 281) , ("Toon Wood", 280) , ("Wood", 283) ] & map (\ (v, k) -> (k, Text.pack v)) & Bimap.fromList -- * Misc -- | A one-to-one mapping between bot IDs and their names. bots :: Bimap.Bimap Int Text.Text bots = [ ("Astro", 70) , ("Bane", 71) , ("Beast", 72) , ("Blade", 73) , ("C-Block", 74) , ("Captain", 75) , ("Caveman", 76) , ("Cougar", 77) , ("Devil", 78) , ("Diesel", 79) , ("Dotty", 80) , ("Dude", 81) , ("Duke", 82) , ("Dynamite", 83) , ("Flame", 84) , ("Flash", 85) , ("Fossil", 86) , ("Fury", 87) , ("Hawk", 88) , ("Hunter", 89) , ("Imp", 90) , ("Jet", 91) , ("JM", 92) , ("Kidd", 93) , ("Laser", 94) , ("Lightning", 95) , ("Lucky", 96) , ("Middy", 97) , ("Mountain", 98) , ("Nitro", 99) , ("Outlaw", 100) , ("Phoenix", 101) , ("Raja", 102) , ("Razor", 103) , ("Retro", 104) , ("Roundhouse", 105) , ("Sabre", 106) , ("Samson", 107) , ("Savage", 108) , ("Shadow", 109) , ("Shield", 110) , ("Siren", 111) , ("Sky", 112) , ("Squall", 113) , ("Tank", 114) , ("Thunder", 115) , ("Titan", 116) , ("Turbo", 117) , ("Tusk", 118) , ("Viper", 119) , ("Warrior", 120) , ("Wolf", 121) , ("Yuri", 122) , ("Zap", 123) ] & map (\ (v, k) -> (k, Text.pack v)) & Bimap.fromList -- | A one-to-one mapping between logo IDs and their names. logos :: Bimap.Bimap Int Text.Text logos = [ ("Barracudas", 244) , ("Blacklight", 245) , ("Bombers", 246) , ("Cyclones", 247) , ("Destroyers", 248) , ("Dragons", 249) , ("Express", 250) , ("Guardians", 251) , ("Knights", 252) , ("Kodiaks", 253) , ("Mammoths", 254) , ("Monarchs", 255) , ("Phantoms", 256) , ("Pharaohs", 257) , ("Pioneers", 258) , ("Ravagers", 259) , ("Rebels", 260) , ("Rovers", 261) , ("Scorpions", 262) , ("Skyhawks", 263) , ("Wolves", 264) ] & map (\ (v, k) -> (k, Text.pack v)) & Bimap.fromList gameModes :: Bimap.Bimap Int Text.Text gameModes = [ ("Soccar", 0) , ("Hockey", 1) , ("Hoops", 2) ] & map (\ (v, k) -> (k, Text.pack v)) & Bimap.fromList