module Rattletrap.Type.Attribute.CustomDemolishExtended where

import qualified Rattletrap.BitGet as BitGet
import qualified Rattletrap.BitPut as BitPut
import qualified Rattletrap.Schema as Schema
import qualified Rattletrap.Type.Attribute.CustomDemolish as CustomDemolish
import qualified Rattletrap.Type.ObjectTarget as ObjectTarget
import qualified Rattletrap.Type.Version as Version
import qualified Rattletrap.Utility.Json as Json

data CustomDemolishExtended = CustomDemolishExtended
  { CustomDemolishExtended -> ObjectTarget
attackerPri :: ObjectTarget.ObjectTarget,
    CustomDemolishExtended -> ObjectTarget
selfDemoFx :: ObjectTarget.ObjectTarget,
    CustomDemolishExtended -> Bool
selfDemolish :: Bool,
    CustomDemolishExtended -> CustomDemolish
customDemolish :: CustomDemolish.CustomDemolish
  }
  deriving (CustomDemolishExtended -> CustomDemolishExtended -> Bool
(CustomDemolishExtended -> CustomDemolishExtended -> Bool)
-> (CustomDemolishExtended -> CustomDemolishExtended -> Bool)
-> Eq CustomDemolishExtended
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CustomDemolishExtended -> CustomDemolishExtended -> Bool
== :: CustomDemolishExtended -> CustomDemolishExtended -> Bool
$c/= :: CustomDemolishExtended -> CustomDemolishExtended -> Bool
/= :: CustomDemolishExtended -> CustomDemolishExtended -> Bool
Eq, Int -> CustomDemolishExtended -> ShowS
[CustomDemolishExtended] -> ShowS
CustomDemolishExtended -> String
(Int -> CustomDemolishExtended -> ShowS)
-> (CustomDemolishExtended -> String)
-> ([CustomDemolishExtended] -> ShowS)
-> Show CustomDemolishExtended
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CustomDemolishExtended -> ShowS
showsPrec :: Int -> CustomDemolishExtended -> ShowS
$cshow :: CustomDemolishExtended -> String
show :: CustomDemolishExtended -> String
$cshowList :: [CustomDemolishExtended] -> ShowS
showList :: [CustomDemolishExtended] -> ShowS
Show)

instance Json.FromJSON CustomDemolishExtended where
  parseJSON :: Value -> Parser CustomDemolishExtended
parseJSON = String
-> (Object -> Parser CustomDemolishExtended)
-> Value
-> Parser CustomDemolishExtended
forall a. String -> (Object -> Parser a) -> Value -> Parser a
Json.withObject String
"CustomDemolishExtended" ((Object -> Parser CustomDemolishExtended)
 -> Value -> Parser CustomDemolishExtended)
-> (Object -> Parser CustomDemolishExtended)
-> Value
-> Parser CustomDemolishExtended
forall a b. (a -> b) -> a -> b
$ \Object
object -> do
    ObjectTarget
attackerPri <- Object -> String -> Parser ObjectTarget
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"attacker_pri"
    ObjectTarget
selfDemoFx <- Object -> String -> Parser ObjectTarget
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"self_demo_fx"
    Bool
selfDemolish <- Object -> String -> Parser Bool
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"self_demolish"
    CustomDemolish
customDemolish <- Object -> String -> Parser CustomDemolish
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"custom_demolish"
    CustomDemolishExtended -> Parser CustomDemolishExtended
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
      CustomDemolishExtended
        { ObjectTarget
attackerPri :: ObjectTarget
attackerPri :: ObjectTarget
attackerPri,
          ObjectTarget
selfDemoFx :: ObjectTarget
selfDemoFx :: ObjectTarget
selfDemoFx,
          Bool
selfDemolish :: Bool
selfDemolish :: Bool
selfDemolish,
          CustomDemolish
customDemolish :: CustomDemolish
customDemolish :: CustomDemolish
customDemolish
        }

instance Json.ToJSON CustomDemolishExtended where
  toJSON :: CustomDemolishExtended -> Value
toJSON CustomDemolishExtended
x =
    [(Key, Value)] -> Value
Json.object
      [ String -> ObjectTarget -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"attacker_pri" (ObjectTarget -> (Key, Value)) -> ObjectTarget -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ CustomDemolishExtended -> ObjectTarget
attackerPri CustomDemolishExtended
x,
        String -> ObjectTarget -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"self_demo_fx" (ObjectTarget -> (Key, Value)) -> ObjectTarget -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ CustomDemolishExtended -> ObjectTarget
selfDemoFx CustomDemolishExtended
x,
        String -> Bool -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"self_demolish" (Bool -> (Key, Value)) -> Bool -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ CustomDemolishExtended -> Bool
selfDemolish CustomDemolishExtended
x,
        String -> CustomDemolish -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"custom_demolish" (CustomDemolish -> (Key, Value)) -> CustomDemolish -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ CustomDemolishExtended -> CustomDemolish
customDemolish CustomDemolishExtended
x
      ]

schema :: Schema.Schema
schema :: Schema
schema =
  String -> Value -> Schema
Schema.named String
"attribute-custom-demolish-extended" (Value -> Schema) -> Value -> Schema
forall a b. (a -> b) -> a -> b
$
    [((Key, Value), Bool)] -> Value
Schema.object
      [ (String -> Value -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"attacker_pri" (Value -> (Key, Value)) -> Value -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
ObjectTarget.schema, Bool
True),
        (String -> Value -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"self_demo_fx" (Value -> (Key, Value)) -> Value -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
ObjectTarget.schema, Bool
True),
        (String -> Value -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"self_demolish" (Value -> (Key, Value)) -> Value -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
Schema.boolean, Bool
True),
        (String -> Value -> (Key, Value)
forall value e p.
(ToJSON value, KeyValue e p) =>
String -> value -> p
Json.pair String
"custom_demolish" (Value -> (Key, Value)) -> Value -> (Key, Value)
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
CustomDemolish.schema, Bool
True)
      ]

bitPut :: CustomDemolishExtended -> BitPut.BitPut
bitPut :: CustomDemolishExtended -> BitPut
bitPut CustomDemolishExtended
demolishAttribute =
  ObjectTarget -> BitPut
ObjectTarget.bitPut (CustomDemolishExtended -> ObjectTarget
attackerPri CustomDemolishExtended
demolishAttribute)
    BitPut -> BitPut -> BitPut
forall a. Semigroup a => a -> a -> a
<> ObjectTarget -> BitPut
ObjectTarget.bitPut (CustomDemolishExtended -> ObjectTarget
selfDemoFx CustomDemolishExtended
demolishAttribute)
    BitPut -> BitPut -> BitPut
forall a. Semigroup a => a -> a -> a
<> Bool -> BitPut
BitPut.bool (CustomDemolishExtended -> Bool
selfDemolish CustomDemolishExtended
demolishAttribute)
    BitPut -> BitPut -> BitPut
forall a. Semigroup a => a -> a -> a
<> CustomDemolish -> BitPut
CustomDemolish.bitPut (CustomDemolishExtended -> CustomDemolish
customDemolish CustomDemolishExtended
demolishAttribute)

bitGet :: Version.Version -> BitGet.BitGet CustomDemolishExtended
bitGet :: Version -> BitGet CustomDemolishExtended
bitGet Version
version = String
-> BitGet CustomDemolishExtended -> BitGet CustomDemolishExtended
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"CustomDemolishExtended" (BitGet CustomDemolishExtended -> BitGet CustomDemolishExtended)
-> BitGet CustomDemolishExtended -> BitGet CustomDemolishExtended
forall a b. (a -> b) -> a -> b
$ do
  ObjectTarget
attackerPri <- String -> BitGet ObjectTarget -> BitGet ObjectTarget
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"attackerPri" BitGet ObjectTarget
ObjectTarget.bitGet
  ObjectTarget
selfDemoFx <- String -> BitGet ObjectTarget -> BitGet ObjectTarget
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"selfDemoFx" BitGet ObjectTarget
ObjectTarget.bitGet
  Bool
selfDemolish <- String -> BitGet Bool -> BitGet Bool
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"selfDemolish" BitGet Bool
BitGet.bool
  CustomDemolish
customDemolish <- String -> BitGet CustomDemolish -> BitGet CustomDemolish
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"customDemolish" (BitGet CustomDemolish -> BitGet CustomDemolish)
-> BitGet CustomDemolish -> BitGet CustomDemolish
forall a b. (a -> b) -> a -> b
$ Version -> BitGet CustomDemolish
CustomDemolish.bitGet Version
version
  CustomDemolishExtended -> BitGet CustomDemolishExtended
forall a. a -> Get BitString Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
    CustomDemolishExtended
      { ObjectTarget
attackerPri :: ObjectTarget
attackerPri :: ObjectTarget
attackerPri,
        ObjectTarget
selfDemoFx :: ObjectTarget
selfDemoFx :: ObjectTarget
selfDemoFx,
        Bool
selfDemolish :: Bool
selfDemolish :: Bool
selfDemolish,
        CustomDemolish
customDemolish :: CustomDemolish
customDemolish :: CustomDemolish
customDemolish
      }