rattletrap-14.1.4: src/lib/Rattletrap/Type/Initialization.hs
module Rattletrap.Type.Initialization where
import qualified Rattletrap.BitGet as BitGet
import qualified Rattletrap.BitPut as BitPut
import qualified Rattletrap.Schema as Schema
import qualified Rattletrap.Type.Int8Vector as Int8Vector
import qualified Rattletrap.Type.Vector as Vector
import qualified Rattletrap.Type.Version as Version
import qualified Rattletrap.Utility.Json as Json
import qualified Rattletrap.Utility.Monad as Monad
data Initialization = Initialization
{ -- | Not every class has an initial location. See
-- 'Rattletrap.Data.classesWithLocation'.
location :: Maybe Vector.Vector,
-- | Only classes with location can have rotation, but not every one does.
-- See 'Rattletrap.Data.classesWithRotation'.
rotation :: Maybe Int8Vector.Int8Vector
}
deriving (Eq, Show)
instance Json.FromJSON Initialization where
parseJSON = Json.withObject "Initialization" $ \object -> do
location <- Json.optional object "location"
rotation <- Json.optional object "rotation"
pure Initialization {location, rotation}
instance Json.ToJSON Initialization where
toJSON x =
Json.object
[Json.pair "location" $ location x, Json.pair "rotation" $ rotation x]
schema :: Schema.Schema
schema =
Schema.named "initialization" $
Schema.object
[ (Json.pair "location" . Schema.json $ Schema.maybe Vector.schema, False),
( Json.pair "rotation" . Schema.json $ Schema.maybe Int8Vector.schema,
False
)
]
bitPut :: Initialization -> BitPut.BitPut
bitPut initialization =
foldMap Vector.bitPut (location initialization)
<> foldMap Int8Vector.bitPut (rotation initialization)
bitGet :: Version.Version -> Bool -> Bool -> BitGet.BitGet Initialization
bitGet version hasLocation hasRotation = BitGet.label "Initialization" $ do
location <-
BitGet.label "location" $
Monad.whenMaybe hasLocation (Vector.bitGet version)
rotation <-
BitGet.label "rotation" $
Monad.whenMaybe hasRotation Int8Vector.bitGet
pure Initialization {location, rotation}