module Rattletrap.Type.Attribute.Demolish where

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

data Demolish = Demolish
  { Demolish -> Bool
attackerFlag :: Bool
  , Demolish -> U32
attackerActorId :: U32.U32
  , Demolish -> Bool
victimFlag :: Bool
  , Demolish -> U32
victimActorId :: U32.U32
  , Demolish -> Vector
attackerVelocity :: Vector.Vector
  , Demolish -> Vector
victimVelocity :: Vector.Vector
  }
  deriving (Demolish -> Demolish -> Bool
(Demolish -> Demolish -> Bool)
-> (Demolish -> Demolish -> Bool) -> Eq Demolish
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Demolish -> Demolish -> Bool
$c/= :: Demolish -> Demolish -> Bool
== :: Demolish -> Demolish -> Bool
$c== :: Demolish -> Demolish -> Bool
Eq, Int -> Demolish -> ShowS
[Demolish] -> ShowS
Demolish -> String
(Int -> Demolish -> ShowS)
-> (Demolish -> String) -> ([Demolish] -> ShowS) -> Show Demolish
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Demolish] -> ShowS
$cshowList :: [Demolish] -> ShowS
show :: Demolish -> String
$cshow :: Demolish -> String
showsPrec :: Int -> Demolish -> ShowS
$cshowsPrec :: Int -> Demolish -> ShowS
Show)

instance Json.FromJSON Demolish where
  parseJSON :: Value -> Parser Demolish
parseJSON = String -> (Object -> Parser Demolish) -> Value -> Parser Demolish
forall a. String -> (Object -> Parser a) -> Value -> Parser a
Json.withObject String
"Demolish" ((Object -> Parser Demolish) -> Value -> Parser Demolish)
-> (Object -> Parser Demolish) -> Value -> Parser Demolish
forall a b. (a -> b) -> a -> b
$ \Object
object -> do
    Bool
attackerFlag <- Object -> String -> Parser Bool
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"attacker_flag"
    U32
attackerActorId <- Object -> String -> Parser U32
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"attacker_actor_id"
    Bool
victimFlag <- Object -> String -> Parser Bool
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"victim_flag"
    U32
victimActorId <- Object -> String -> Parser U32
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"victim_actor_id"
    Vector
attackerVelocity <- Object -> String -> Parser Vector
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"attacker_velocity"
    Vector
victimVelocity <- Object -> String -> Parser Vector
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"victim_velocity"
    Demolish -> Parser Demolish
forall (f :: * -> *) a. Applicative f => a -> f a
pure Demolish :: Bool -> U32 -> Bool -> U32 -> Vector -> Vector -> Demolish
Demolish
      { Bool
attackerFlag :: Bool
attackerFlag :: Bool
attackerFlag
      , U32
attackerActorId :: U32
attackerActorId :: U32
attackerActorId
      , Bool
victimFlag :: Bool
victimFlag :: Bool
victimFlag
      , U32
victimActorId :: U32
victimActorId :: U32
victimActorId
      , Vector
attackerVelocity :: Vector
attackerVelocity :: Vector
attackerVelocity
      , Vector
victimVelocity :: Vector
victimVelocity :: Vector
victimVelocity
      }

instance Json.ToJSON Demolish where
  toJSON :: Demolish -> Value
toJSON Demolish
x = [Pair] -> Value
Json.object
    [ String -> Bool -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"attacker_flag" (Bool -> Pair) -> Bool -> Pair
forall a b. (a -> b) -> a -> b
$ Demolish -> Bool
attackerFlag Demolish
x
    , String -> U32 -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"attacker_actor_id" (U32 -> Pair) -> U32 -> Pair
forall a b. (a -> b) -> a -> b
$ Demolish -> U32
attackerActorId Demolish
x
    , String -> Bool -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"victim_flag" (Bool -> Pair) -> Bool -> Pair
forall a b. (a -> b) -> a -> b
$ Demolish -> Bool
victimFlag Demolish
x
    , String -> U32 -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"victim_actor_id" (U32 -> Pair) -> U32 -> Pair
forall a b. (a -> b) -> a -> b
$ Demolish -> U32
victimActorId Demolish
x
    , String -> Vector -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"attacker_velocity" (Vector -> Pair) -> Vector -> Pair
forall a b. (a -> b) -> a -> b
$ Demolish -> Vector
attackerVelocity Demolish
x
    , String -> Vector -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"victim_velocity" (Vector -> Pair) -> Vector -> Pair
forall a b. (a -> b) -> a -> b
$ Demolish -> Vector
victimVelocity Demolish
x
    ]

schema :: Schema.Schema
schema :: Schema
schema = String -> Value -> Schema
Schema.named String
"attribute-demolish" (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
"attacker_flag" (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
"attacker_actor_id" (Value -> Pair) -> Value -> Pair
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
U32.schema, Bool
True)
  , (String -> Value -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"victim_flag" (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
"victim_actor_id" (Value -> Pair) -> Value -> Pair
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
U32.schema, Bool
True)
  , (String -> Value -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"attacker_velocity" (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
"victim_velocity" (Value -> Pair) -> Value -> Pair
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
Vector.schema, Bool
True)
  ]

bitPut :: Demolish -> BitPut.BitPut
bitPut :: Demolish -> BitPut
bitPut Demolish
demolishAttribute =
  Bool -> BitPut
BitPut.bool (Demolish -> Bool
attackerFlag Demolish
demolishAttribute)
    BitPut -> BitPut -> BitPut
forall a. Semigroup a => a -> a -> a
<> U32 -> BitPut
U32.bitPut (Demolish -> U32
attackerActorId Demolish
demolishAttribute)
    BitPut -> BitPut -> BitPut
forall a. Semigroup a => a -> a -> a
<> Bool -> BitPut
BitPut.bool (Demolish -> Bool
victimFlag Demolish
demolishAttribute)
    BitPut -> BitPut -> BitPut
forall a. Semigroup a => a -> a -> a
<> U32 -> BitPut
U32.bitPut (Demolish -> U32
victimActorId Demolish
demolishAttribute)
    BitPut -> BitPut -> BitPut
forall a. Semigroup a => a -> a -> a
<> Vector -> BitPut
Vector.bitPut (Demolish -> Vector
attackerVelocity Demolish
demolishAttribute)
    BitPut -> BitPut -> BitPut
forall a. Semigroup a => a -> a -> a
<> Vector -> BitPut
Vector.bitPut (Demolish -> Vector
victimVelocity Demolish
demolishAttribute)

bitGet :: Version.Version -> BitGet.BitGet Demolish
bitGet :: Version -> BitGet Demolish
bitGet Version
version = String -> BitGet Demolish -> BitGet Demolish
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"Demolish" (BitGet Demolish -> BitGet Demolish)
-> BitGet Demolish -> BitGet Demolish
forall a b. (a -> b) -> a -> b
$ do
  Bool
attackerFlag <- String -> BitGet Bool -> BitGet Bool
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"attackerFlag" BitGet Bool
BitGet.bool
  U32
attackerActorId <- String -> BitGet U32 -> BitGet U32
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"attackerActorId" BitGet U32
U32.bitGet
  Bool
victimFlag <- String -> BitGet Bool -> BitGet Bool
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"victimFlag" BitGet Bool
BitGet.bool
  U32
victimActorId <- String -> BitGet U32 -> BitGet U32
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"victimActorId" BitGet U32
U32.bitGet
  Vector
attackerVelocity <- String -> BitGet Vector -> BitGet Vector
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"attackerVelocity" (BitGet Vector -> BitGet Vector) -> BitGet Vector -> BitGet Vector
forall a b. (a -> b) -> a -> b
$ Version -> BitGet Vector
Vector.bitGet Version
version
  Vector
victimVelocity <- String -> BitGet Vector -> BitGet Vector
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"victimVelocity" (BitGet Vector -> BitGet Vector) -> BitGet Vector -> BitGet Vector
forall a b. (a -> b) -> a -> b
$ Version -> BitGet Vector
Vector.bitGet Version
version
  Demolish -> BitGet Demolish
forall (f :: * -> *) a. Applicative f => a -> f a
pure Demolish :: Bool -> U32 -> Bool -> U32 -> Vector -> Vector -> Demolish
Demolish
    { Bool
attackerFlag :: Bool
attackerFlag :: Bool
attackerFlag
    , U32
attackerActorId :: U32
attackerActorId :: U32
attackerActorId
    , Bool
victimFlag :: Bool
victimFlag :: Bool
victimFlag
    , U32
victimActorId :: U32
victimActorId :: U32
victimActorId
    , Vector
attackerVelocity :: Vector
attackerVelocity :: Vector
attackerVelocity
    , Vector
victimVelocity :: Vector
victimVelocity :: Vector
victimVelocity
    }