module Rattletrap.ReplicationValue
( module Rattletrap.ReplicationValue
, module Rattletrap.Replication.Destroyed
, module Rattletrap.Replication.Spawned
, module Rattletrap.Replication.Updated
) where
import Rattletrap.ActorMap
import Rattletrap.ClassAttributeMap
import Rattletrap.Primitive
import Rattletrap.Replication.Destroyed
import Rattletrap.Replication.Spawned
import Rattletrap.Replication.Updated
import qualified Data.Binary.Bits.Get as BinaryBit
import qualified Data.Binary.Bits.Put as BinaryBit
data ReplicationValue
= SpawnedReplicationValue SpawnedReplication
| UpdatedReplicationValue UpdatedReplication
| DestroyedReplicationValue DestroyedReplication
deriving (Eq, Ord, Show)
getReplicationValue ::
(Int, Int)
-> ClassAttributeMap
-> ActorMap
-> CompressedWord
-> BinaryBit.BitGet (ReplicationValue, ActorMap)
getReplicationValue version classAttributeMap actorMap actorId = do
isOpen <- BinaryBit.getBool
if isOpen
then do
isNew <- BinaryBit.getBool
if isNew
then do
(x, newActorMap) <-
getSpawnedReplication version classAttributeMap actorMap actorId
pure (SpawnedReplicationValue x, newActorMap)
else do
x <- getUpdatedReplication version classAttributeMap actorMap actorId
pure (UpdatedReplicationValue x, actorMap)
else do
x <- getDestroyedReplication
pure (DestroyedReplicationValue x, actorMap)
putReplicationValue :: ReplicationValue -> BinaryBit.BitPut ()
putReplicationValue value =
case value of
SpawnedReplicationValue x -> do
BinaryBit.putBool True
BinaryBit.putBool True
putSpawnedReplication x
UpdatedReplicationValue x -> do
BinaryBit.putBool True
BinaryBit.putBool False
putUpdatedReplication x
DestroyedReplicationValue x -> do
BinaryBit.putBool False
putDestroyedReplication x