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
    attackerPri <- Object -> String -> Parser ObjectTarget
forall value. FromJSON value => Object -> String -> Parser value
Json.required Object
object String
"attacker_pri"
    selfDemoFx <- Json.required object "self_demo_fx"
    selfDemolish <- Json.required object "self_demolish"
    customDemolish <- Json.required object "custom_demolish"
    pure
      CustomDemolishExtended
        { attackerPri,
          selfDemoFx,
          selfDemolish,
          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
  attackerPri <- String -> BitGet ObjectTarget -> BitGet ObjectTarget
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"attackerPri" BitGet ObjectTarget
ObjectTarget.bitGet
  selfDemoFx <- BitGet.label "selfDemoFx" ObjectTarget.bitGet
  selfDemolish <- BitGet.label "selfDemolish" BitGet.bool
  customDemolish <- BitGet.label "customDemolish" $ CustomDemolish.bitGet version
  pure
    CustomDemolishExtended
      { attackerPri,
        selfDemoFx,
        selfDemolish,
        customDemolish
      }