module Rattletrap.Decode.Vector
  ( decodeVectorBits
  )
where

import Rattletrap.Decode.Common
import Rattletrap.Decode.CompressedWord
import Rattletrap.Type.CompressedWord
import Rattletrap.Type.Vector

decodeVectorBits :: (Int, Int, Int) -> DecodeBits Vector
decodeVectorBits version = do
  size <- decodeCompressedWordBits (if version >= (868, 22, 7) then 21 else 19)
  let
    limit = getLimit size
    bias = getBias size
  Vector size bias
    <$> fmap (fromDelta bias) (decodeCompressedWordBits limit)
    <*> fmap (fromDelta bias) (decodeCompressedWordBits limit)
    <*> fmap (fromDelta bias) (decodeCompressedWordBits limit)

getLimit :: CompressedWord -> Word
getLimit = (2 ^) . (+ 2) . compressedWordValue

getBias :: CompressedWord -> Word
getBias = (2 ^) . (+ 1) . compressedWordValue

fromDelta :: Word -> CompressedWord -> Int
fromDelta bias x = fromIntegral (compressedWordValue x) - fromIntegral bias