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
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
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 = forall a. String -> (Object -> Parser a) -> Value -> Parser a
Json.withObject String
"Demolish" forall a b. (a -> b) -> a -> b
$ \Object
object -> do
    Bool
attackerFlag <- forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"attacker_flag"
    U32
attackerActorId <- forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"attacker_actor_id"
    Bool
victimFlag <- forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"victim_flag"
    U32
victimActorId <- forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"victim_actor_id"
    Vector
attackerVelocity <- forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"attacker_velocity"
    Vector
victimVelocity <- forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"victim_velocity"
    forall (f :: * -> *) a. Applicative f => a -> f a
pure
      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 =
    [(Key, Value)] -> Value
Json.object
      [ forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"attacker_flag" forall a b. (a -> b) -> a -> b
$ Demolish -> Bool
attackerFlag Demolish
x,
        forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"attacker_actor_id" forall a b. (a -> b) -> a -> b
$ Demolish -> U32
attackerActorId Demolish
x,
        forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"victim_flag" forall a b. (a -> b) -> a -> b
$ Demolish -> Bool
victimFlag Demolish
x,
        forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"victim_actor_id" forall a b. (a -> b) -> a -> b
$ Demolish -> U32
victimActorId Demolish
x,
        forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"attacker_velocity" forall a b. (a -> b) -> a -> b
$ Demolish -> Vector
attackerVelocity Demolish
x,
        forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"victim_velocity" 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" forall a b. (a -> b) -> a -> b
$
    [((Key, Value), Bool)] -> Value
Schema.object
      [ (forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"attacker_flag" forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
Schema.boolean, Bool
True),
        (forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"attacker_actor_id" forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
U32.schema, Bool
True),
        (forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"victim_flag" forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
Schema.boolean, Bool
True),
        (forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"victim_actor_id" forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
U32.schema, Bool
True),
        (forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"attacker_velocity" forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
Vector.schema, Bool
True),
        (forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"victim_velocity" 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)
    forall a. Semigroup a => a -> a -> a
<> U32 -> BitPut
U32.bitPut (Demolish -> U32
attackerActorId Demolish
demolishAttribute)
    forall a. Semigroup a => a -> a -> a
<> Bool -> BitPut
BitPut.bool (Demolish -> Bool
victimFlag Demolish
demolishAttribute)
    forall a. Semigroup a => a -> a -> a
<> U32 -> BitPut
U32.bitPut (Demolish -> U32
victimActorId Demolish
demolishAttribute)
    forall a. Semigroup a => a -> a -> a
<> Vector -> BitPut
Vector.bitPut (Demolish -> Vector
attackerVelocity Demolish
demolishAttribute)
    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 = forall a. String -> BitGet a -> BitGet a
BitGet.label String
"Demolish" forall a b. (a -> b) -> a -> b
$ do
  Bool
attackerFlag <- forall a. String -> BitGet a -> BitGet a
BitGet.label String
"attackerFlag" BitGet Bool
BitGet.bool
  U32
attackerActorId <- forall a. String -> BitGet a -> BitGet a
BitGet.label String
"attackerActorId" BitGet U32
U32.bitGet
  Bool
victimFlag <- forall a. String -> BitGet a -> BitGet a
BitGet.label String
"victimFlag" BitGet Bool
BitGet.bool
  U32
victimActorId <- forall a. String -> BitGet a -> BitGet a
BitGet.label String
"victimActorId" BitGet U32
U32.bitGet
  Vector
attackerVelocity <- forall a. String -> BitGet a -> BitGet a
BitGet.label String
"attackerVelocity" forall a b. (a -> b) -> a -> b
$ Version -> BitGet Vector
Vector.bitGet Version
version
  Vector
victimVelocity <- forall a. String -> BitGet a -> BitGet a
BitGet.label String
"victimVelocity" forall a b. (a -> b) -> a -> b
$ Version -> BitGet Vector
Vector.bitGet Version
version
  forall (f :: * -> *) a. Applicative f => a -> f a
pure
    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
      }