diff --git a/README.markdown b/README.markdown
--- a/README.markdown
+++ b/README.markdown
@@ -8,7 +8,9 @@
 Replays][] parses tens of thousands of replays with it. Octane parses most
 replays in less than 5 seconds. It outputs easy-to-read JSON.
 
-If you also want to generate replays, consider using [Rattletrap][] instead.
+That being said, Octane is not actively developed anymore. Consider using
+[Rattletrap][] (which is actively developed) instead. Rattletrap can also
+generate replay files from JSON, which Octane cannot do.
 
 Octane has a command-line interface. To get it, download and unpack [the latest
 release][] for your platform. You can run the executable one of three ways:
diff --git a/library/Octane/Type/Replay.hs b/library/Octane/Type/Replay.hs
--- a/library/Octane/Type/Replay.hs
+++ b/library/Octane/Type/Replay.hs
@@ -309,6 +309,13 @@
         StrictText.pack
       value =
         case Rattletrap.attributeValue attribute of
+          Rattletrap.AppliedDamageAttributeValue x ->
+            Value.ValueAppliedDamage
+              (Value.AppliedDamageValue
+                (toWord8 (Rattletrap.appliedDamageAttributeUnknown1 x))
+                (toIntVector (Rattletrap.appliedDamageAttributeLocation x))
+                (toInt32 (Rattletrap.appliedDamageAttributeUnknown3 x))
+                (toInt32 (Rattletrap.appliedDamageAttributeUnknown4 x)))
           Rattletrap.BooleanAttributeValue x ->
             Value.ValueBoolean
               (Value.BooleanValue
@@ -334,6 +341,15 @@
                  (toWord8 (Rattletrap.clubColorsAttributeBlueColor x))
                  (Boolean.Boolean (Rattletrap.clubColorsAttributeOrangeFlag x))
                  (toWord8 (Rattletrap.clubColorsAttributeOrangeColor x)))
+          Rattletrap.DamageStateAttributeValue x ->
+            Value.ValueDamageState
+              (Value.DamageStateValue
+                (toWord8 (Rattletrap.damageStateAttributeUnknown1 x))
+                (Boolean.Boolean (Rattletrap.damageStateAttributeUnknown2 x))
+                (toInt32 (Rattletrap.damageStateAttributeUnknown3 x))
+                (toIntVector (Rattletrap.damageStateAttributeUnknown4 x))
+                (Boolean.Boolean (Rattletrap.damageStateAttributeUnknown5 x))
+                (Boolean.Boolean (Rattletrap.damageStateAttributeUnknown6 x)))
           Rattletrap.DemolishAttributeValue x ->
             Value.ValueDemolish
               (Value.DemolishValue
diff --git a/library/Octane/Type/Value.hs b/library/Octane/Type/Value.hs
--- a/library/Octane/Type/Value.hs
+++ b/library/Octane/Type/Value.hs
@@ -2,10 +2,12 @@
 
 module Octane.Type.Value
   ( Value(..)
+  , module Octane.Type.Value.AppliedDamageValue
   , module Octane.Type.Value.BooleanValue
   , module Octane.Type.Value.ByteValue
   , module Octane.Type.Value.CamSettingsValue
   , module Octane.Type.Value.ClubColorsValue
+  , module Octane.Type.Value.DamageStateValue
   , module Octane.Type.Value.DemolishValue
   , module Octane.Type.Value.EnumValue
   , module Octane.Type.Value.ExplosionValue
@@ -30,10 +32,12 @@
   , module Octane.Type.Value.WeldedInfoValue
   ) where
 
+import Octane.Type.Value.AppliedDamageValue
 import Octane.Type.Value.BooleanValue
 import Octane.Type.Value.ByteValue
 import Octane.Type.Value.CamSettingsValue
 import Octane.Type.Value.ClubColorsValue
+import Octane.Type.Value.DamageStateValue
 import Octane.Type.Value.DemolishValue
 import Octane.Type.Value.EnumValue
 import Octane.Type.Value.ExplosionValue
@@ -61,10 +65,12 @@
 
 -- | A replicated property's value.
 data Value
-  = ValueBoolean BooleanValue
+  = ValueAppliedDamage AppliedDamageValue
+  | ValueBoolean BooleanValue
   | ValueByte ByteValue
   | ValueCamSettings CamSettingsValue
   | ValueClubColors ClubColorsValue
+  | ValueDamageState DamageStateValue
   | ValueDemolish DemolishValue
   | ValueEnum EnumValue
   | ValueExplosion ExplosionValue
@@ -92,10 +98,12 @@
 instance Aeson.ToJSON Value where
   toJSON value =
     case value of
+      ValueAppliedDamage x -> Aeson.toJSON x
       ValueBoolean x -> Aeson.toJSON x
       ValueByte x -> Aeson.toJSON x
       ValueCamSettings x -> Aeson.toJSON x
       ValueClubColors x -> Aeson.toJSON x
+      ValueDamageState x -> Aeson.toJSON x
       ValueDemolish x -> Aeson.toJSON x
       ValueEnum x -> Aeson.toJSON x
       ValueExplosion x -> Aeson.toJSON x
diff --git a/library/Octane/Type/Value/AppliedDamageValue.hs b/library/Octane/Type/Value/AppliedDamageValue.hs
new file mode 100644
--- /dev/null
+++ b/library/Octane/Type/Value/AppliedDamageValue.hs
@@ -0,0 +1,44 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedLabels #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module Octane.Type.Value.AppliedDamageValue
+  ( AppliedDamageValue(..)
+  ) where
+
+import Data.Aeson ((.=))
+
+import qualified Data.Aeson as Aeson
+import qualified Data.Default.Class as Default
+import qualified Data.OverloadedRecords.TH as OverloadedRecords
+import qualified Data.Text as StrictText
+import qualified Octane.Type.Int32 as Int32
+import qualified Octane.Type.Vector as Vector
+import qualified Octane.Type.Word8 as Word8
+
+data AppliedDamageValue = AppliedDamageValue
+  { appliedDamageValueUnknown1 :: Word8.Word8
+  , appliedDamageValueLocation :: Vector.Vector Int
+  , appliedDamageValueUnknown3 :: Int32.Int32
+  , appliedDamageValueUnknown4 :: Int32.Int32
+  } deriving (Eq, Show)
+
+$(OverloadedRecords.overloadedRecord Default.def ''AppliedDamageValue)
+
+instance Aeson.ToJSON AppliedDamageValue where
+  toJSON x =
+    Aeson.object
+      [ "Type" .= ("AppliedDamage" :: StrictText.Text)
+      , "Value" .=
+        Aeson.object
+          [ "unknown1" .= appliedDamageValueUnknown1 x
+          , "location" .= appliedDamageValueLocation x
+          , "unknown3" .= appliedDamageValueUnknown3 x
+          , "unknown4" .= appliedDamageValueUnknown4 x
+          ]
+      ]
diff --git a/library/Octane/Type/Value/DamageStateValue.hs b/library/Octane/Type/Value/DamageStateValue.hs
new file mode 100644
--- /dev/null
+++ b/library/Octane/Type/Value/DamageStateValue.hs
@@ -0,0 +1,49 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedLabels #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module Octane.Type.Value.DamageStateValue
+  ( DamageStateValue(..)
+  ) where
+
+import Data.Aeson ((.=))
+
+import qualified Data.Aeson as Aeson
+import qualified Data.Default.Class as Default
+import qualified Data.OverloadedRecords.TH as OverloadedRecords
+import qualified Data.Text as StrictText
+import qualified Octane.Type.Boolean as Boolean
+import qualified Octane.Type.Int32 as Int32
+import qualified Octane.Type.Vector as Vector
+import qualified Octane.Type.Word8 as Word8
+
+data DamageStateValue = DamageStateValue
+  { damageStateValueUnknown1 :: Word8.Word8
+  , damageStateValueUnknown2 :: Boolean.Boolean
+  , damageStateValueUnknown3 :: Int32.Int32
+  , damageStateValueUnknown4 :: Vector.Vector Int
+  , damageStateValueUnknown5 :: Boolean.Boolean
+  , damageStateValueUnknown6 :: Boolean.Boolean
+  } deriving (Eq, Show)
+
+$(OverloadedRecords.overloadedRecord Default.def ''DamageStateValue)
+
+instance Aeson.ToJSON DamageStateValue where
+  toJSON x =
+    Aeson.object
+      [ "Type" .= ("DamageState" :: StrictText.Text)
+      , "Value" .=
+        Aeson.object
+          [ "unknown1" .= damageStateValueUnknown1 x
+          , "unknown2" .= damageStateValueUnknown2 x
+          , "unknown3" .= damageStateValueUnknown3 x
+          , "unknown4" .= damageStateValueUnknown4 x
+          , "unknown5" .= damageStateValueUnknown5 x
+          , "unknown6" .= damageStateValueUnknown6 x
+          ]
+      ]
diff --git a/octane.cabal b/octane.cabal
--- a/octane.cabal
+++ b/octane.cabal
@@ -3,7 +3,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           octane
-version:        0.18.3
+version:        0.19.0
 synopsis:       Parse Rocket League replays.
 description:    Octane parses Rocket League replays.
 category:       Game
@@ -75,10 +75,12 @@
       Octane.Type.State
       Octane.Type.Text
       Octane.Type.Value
+      Octane.Type.Value.AppliedDamageValue
       Octane.Type.Value.BooleanValue
       Octane.Type.Value.ByteValue
       Octane.Type.Value.CamSettingsValue
       Octane.Type.Value.ClubColorsValue
+      Octane.Type.Value.DamageStateValue
       Octane.Type.Value.DemolishValue
       Octane.Type.Value.EnumValue
       Octane.Type.Value.ExplosionValue
diff --git a/package.yaml b/package.yaml
--- a/package.yaml
+++ b/package.yaml
@@ -44,4 +44,4 @@
 maintainer: Taylor Fausak
 name: octane
 synopsis: Parse Rocket League replays.
-version: '0.18.3'
+version: '0.19.0'
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -1,1 +1,3 @@
+extra-deps:
+- rattletrap-2.2.3
 resolver: lts-8.0
