module Rattletrap.Type.Attribute.DamageState where

import qualified Rattletrap.BitGet as BitGet
import qualified Rattletrap.BitPut as BitPut
import qualified Rattletrap.Schema as Schema
import qualified Rattletrap.Type.I32 as I32
import qualified Rattletrap.Type.U8 as U8
import qualified Rattletrap.Type.Vector as Vector
import qualified Rattletrap.Type.Version as Version
import qualified Rattletrap.Utility.Json as Json

data DamageState = DamageState
  { DamageState -> U8
unknown1 :: U8.U8
  , DamageState -> Bool
unknown2 :: Bool
  , DamageState -> I32
unknown3 :: I32.I32
  , DamageState -> Vector
unknown4 :: Vector.Vector
  , DamageState -> Bool
unknown5 :: Bool
  , DamageState -> Bool
unknown6 :: Bool
  }
  deriving (DamageState -> DamageState -> Bool
(DamageState -> DamageState -> Bool)
-> (DamageState -> DamageState -> Bool) -> Eq DamageState
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DamageState -> DamageState -> Bool
$c/= :: DamageState -> DamageState -> Bool
== :: DamageState -> DamageState -> Bool
$c== :: DamageState -> DamageState -> Bool
Eq, Int -> DamageState -> ShowS
[DamageState] -> ShowS
DamageState -> String
(Int -> DamageState -> ShowS)
-> (DamageState -> String)
-> ([DamageState] -> ShowS)
-> Show DamageState
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DamageState] -> ShowS
$cshowList :: [DamageState] -> ShowS
show :: DamageState -> String
$cshow :: DamageState -> String
showsPrec :: Int -> DamageState -> ShowS
$cshowsPrec :: Int -> DamageState -> ShowS
Show)

instance Json.FromJSON DamageState where
  parseJSON :: Value -> Parser DamageState
parseJSON = String
-> (Object -> Parser DamageState) -> Value -> Parser DamageState
forall a. String -> (Object -> Parser a) -> Value -> Parser a
Json.withObject String
"DamageState" ((Object -> Parser DamageState) -> Value -> Parser DamageState)
-> (Object -> Parser DamageState) -> Value -> Parser DamageState
forall a b. (a -> b) -> a -> b
$ \Object
object -> do
    U8
unknown1 <- Object -> String -> Parser U8
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"unknown1"
    Bool
unknown2 <- Object -> String -> Parser Bool
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"unknown2"
    I32
unknown3 <- Object -> String -> Parser I32
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"unknown3"
    Vector
unknown4 <- Object -> String -> Parser Vector
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"unknown4"
    Bool
unknown5 <- Object -> String -> Parser Bool
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"unknown5"
    Bool
unknown6 <- Object -> String -> Parser Bool
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"unknown6"
    DamageState -> Parser DamageState
forall (f :: * -> *) a. Applicative f => a -> f a
pure DamageState :: U8 -> Bool -> I32 -> Vector -> Bool -> Bool -> DamageState
DamageState
      { U8
unknown1 :: U8
unknown1 :: U8
unknown1
      , Bool
unknown2 :: Bool
unknown2 :: Bool
unknown2
      , I32
unknown3 :: I32
unknown3 :: I32
unknown3
      , Vector
unknown4 :: Vector
unknown4 :: Vector
unknown4
      , Bool
unknown5 :: Bool
unknown5 :: Bool
unknown5
      , Bool
unknown6 :: Bool
unknown6 :: Bool
unknown6
      }

instance Json.ToJSON DamageState where
  toJSON :: DamageState -> Value
toJSON DamageState
x = [Pair] -> Value
Json.object
    [ String -> U8 -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"unknown1" (U8 -> Pair) -> U8 -> Pair
forall a b. (a -> b) -> a -> b
$ DamageState -> U8
unknown1 DamageState
x
    , String -> Bool -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"unknown2" (Bool -> Pair) -> Bool -> Pair
forall a b. (a -> b) -> a -> b
$ DamageState -> Bool
unknown2 DamageState
x
    , String -> I32 -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"unknown3" (I32 -> Pair) -> I32 -> Pair
forall a b. (a -> b) -> a -> b
$ DamageState -> I32
unknown3 DamageState
x
    , String -> Vector -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"unknown4" (Vector -> Pair) -> Vector -> Pair
forall a b. (a -> b) -> a -> b
$ DamageState -> Vector
unknown4 DamageState
x
    , String -> Bool -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"unknown5" (Bool -> Pair) -> Bool -> Pair
forall a b. (a -> b) -> a -> b
$ DamageState -> Bool
unknown5 DamageState
x
    , String -> Bool -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"unknown6" (Bool -> Pair) -> Bool -> Pair
forall a b. (a -> b) -> a -> b
$ DamageState -> Bool
unknown6 DamageState
x
    ]

schema :: Schema.Schema
schema :: Schema
schema = String -> Value -> Schema
Schema.named String
"attribute-damage-state" (Value -> Schema) -> Value -> Schema
forall a b. (a -> b) -> a -> b
$ [(Pair, Bool)] -> Value
Schema.object
  [ (String -> Value -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"unknown1" (Value -> Pair) -> Value -> Pair
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
U8.schema, Bool
True)
  , (String -> Value -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"unknown2" (Value -> Pair) -> Value -> Pair
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
Schema.boolean, Bool
True)
  , (String -> Value -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"unknown3" (Value -> Pair) -> Value -> Pair
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
I32.schema, Bool
True)
  , (String -> Value -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"unknown4" (Value -> Pair) -> Value -> Pair
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
Vector.schema, Bool
True)
  , (String -> Value -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"unknown5" (Value -> Pair) -> Value -> Pair
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
Schema.boolean, Bool
True)
  , (String -> Value -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"unknown6" (Value -> Pair) -> Value -> Pair
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
Schema.boolean, Bool
True)
  ]

bitPut :: DamageState -> BitPut.BitPut
bitPut :: DamageState -> BitPut
bitPut DamageState
damageStateAttribute =
  U8 -> BitPut
U8.bitPut (DamageState -> U8
unknown1 DamageState
damageStateAttribute)
    BitPut -> BitPut -> BitPut
forall a. Semigroup a => a -> a -> a
<> Bool -> BitPut
BitPut.bool (DamageState -> Bool
unknown2 DamageState
damageStateAttribute)
    BitPut -> BitPut -> BitPut
forall a. Semigroup a => a -> a -> a
<> I32 -> BitPut
I32.bitPut (DamageState -> I32
unknown3 DamageState
damageStateAttribute)
    BitPut -> BitPut -> BitPut
forall a. Semigroup a => a -> a -> a
<> Vector -> BitPut
Vector.bitPut (DamageState -> Vector
unknown4 DamageState
damageStateAttribute)
    BitPut -> BitPut -> BitPut
forall a. Semigroup a => a -> a -> a
<> Bool -> BitPut
BitPut.bool (DamageState -> Bool
unknown5 DamageState
damageStateAttribute)
    BitPut -> BitPut -> BitPut
forall a. Semigroup a => a -> a -> a
<> Bool -> BitPut
BitPut.bool (DamageState -> Bool
unknown6 DamageState
damageStateAttribute)

bitGet :: Version.Version -> BitGet.BitGet DamageState
bitGet :: Version -> BitGet DamageState
bitGet Version
version = String -> BitGet DamageState -> BitGet DamageState
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"CustomDemolish" (BitGet DamageState -> BitGet DamageState)
-> BitGet DamageState -> BitGet DamageState
forall a b. (a -> b) -> a -> b
$ do
  U8
unknown1 <- String -> BitGet U8 -> BitGet U8
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"unknown1" BitGet U8
U8.bitGet
  Bool
unknown2 <- String -> BitGet Bool -> BitGet Bool
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"unknown2" BitGet Bool
BitGet.bool
  I32
unknown3 <- String -> BitGet I32 -> BitGet I32
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"unknown3" BitGet I32
I32.bitGet
  Vector
unknown4 <- String -> BitGet Vector -> BitGet Vector
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"unknown4" (BitGet Vector -> BitGet Vector) -> BitGet Vector -> BitGet Vector
forall a b. (a -> b) -> a -> b
$ Version -> BitGet Vector
Vector.bitGet Version
version
  Bool
unknown5 <- String -> BitGet Bool -> BitGet Bool
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"unknown5" BitGet Bool
BitGet.bool
  Bool
unknown6 <- String -> BitGet Bool -> BitGet Bool
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"unknown6" BitGet Bool
BitGet.bool
  DamageState -> BitGet DamageState
forall (f :: * -> *) a. Applicative f => a -> f a
pure DamageState :: U8 -> Bool -> I32 -> Vector -> Bool -> Bool -> DamageState
DamageState
    { U8
unknown1 :: U8
unknown1 :: U8
unknown1
    , Bool
unknown2 :: Bool
unknown2 :: Bool
unknown2
    , I32
unknown3 :: I32
unknown3 :: I32
unknown3
    , Vector
unknown4 :: Vector
unknown4 :: Vector
unknown4
    , Bool
unknown5 :: Bool
unknown5 :: Bool
unknown5
    , Bool
unknown6 :: Bool
unknown6 :: Bool
unknown6
    }